我正在使用外部库,该库提供用于自动代码生成的CMake功能,以便在我的CMakeLists中使用。问题是每当我修改CMakeLists时,该函数再次运行,触发重新编译新生成但未更改的源。我需要像add_custom_command这样的东西,可以将CMake函数指定为COMMAND而不是可执行文件,这样只有当自动生成的文件不存在时才运行该函数。 这可行吗?如果没有,是否存在获得相同结果的另一种方式? 感谢。
答案 0 :(得分:3)
要阻止该功能运行,只需将其包装到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)
答案 1 :(得分:2)
看看this SO post。
您可以在单独的CMake脚本中调用您的函数,使用add_custom_target
和cmake -P
调用此脚本,然后为您的二进制文件添加依赖项:
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)
答案 2 :(得分:0)
有没有一种方法可以将参数传递给eparate_script.cmake?
您可以在调用脚本时使用cmake变量来传递值,例如
"COMMAND ${CMAKE_COMMAND} -DPARAM=value -P separate_script.cmake"