CMake:执行宏/函数作为add_custom_command的命令

时间:2015-01-14 15:35:00

标签: cmake add-custom-command

我正在使用外部库,该库提供用于自动代码生成的CMake功能,以便在我的CMakeLists中使用。问题是每当我修改CMakeLists时,该函数再次运行,触发重新编译新生成但未更改的源。我需要像add_custom_command这样的东西,可以将CMake函数指定为COMMAND而不是可执行文件,这样只有当自动生成的文件不存在时才运行该函数。 这可行吗?如果没有,是否存在获得相同结果的另一种方式? 感谢。

3 个答案:

答案 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_targetcmake -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"