我正在使用一个外部库,它提供了一个CMake函数用于自动代码生成,可用于我的CMakeLists。问题是,每当我修改CMakeLists时,该函数会再次运行,触发重新编译新生成的但未更改的源文件。我需要类似于add_custom_command的东西,并且可以指定CMake函数作为COMMAND,这样只有在自动生成的文件不存在时才运行函数。
是否可行?如果不行,是否存在其他方法可以获得相同的结果?
谢谢。
add_custom_target
调用此脚本,然后向您的二进制文件添加一个依赖项:add_custom_target(run_script COMMAND ${CMAKE_COMMAND} -P separate_script.cmake)
add_executable(your_binary ...)
# or add_library(your_binary ...)
add_dependencies(your_binary run_script)
"COMMAND ${CMAKE_COMMAND} -DPARAM=value -P separate_script.cmake"
if
中即可:if(NOT EXISTS ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp)
run_your_provided_command(BLAH_BLAH)
endif()
很容易!
更新: 当配置文件改变时运行它,只需使用稍微复杂一些的条件:
if(
NOT EXISTS ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp OR
${CMAKE_SOURCE_DIR}/blah-blah.config IS_NEWER_THAN ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp
)
...
使用add_dependencies
命令,确保在配置文件修改的情况下重新构建二进制文件:
add_executable(
YourBinary
...
${CMAKE_BINARY_DIR}/blah-blah/generated.cpp
)
add_dependencies(YourBinary ${CMAKE_SOURCE_DIR}/blah-blah.config)
IS_NEWER_THAN
时添加额外的NOT EXISTS
检查,因为后者已经隐含了前者。 - bjhendadd_dependencies
只能用于目标,而不能用于任意外部文件。我不得不采用 cmake -Dvar=value -P=script
方法。 - Burak