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

12
我正在使用一个外部库,它提供了一个CMake函数用于自动代码生成,可用于我的CMakeLists。问题是,每当我修改CMakeLists时,该函数会再次运行,触发重新编译新生成的但未更改的源文件。我需要类似于add_custom_command的东西,并且可以指定CMake函数作为COMMAND,这样只有在自动生成的文件不存在时才运行函数。 是否可行?如果不行,是否存在其他方法可以获得相同的结果? 谢谢。
3个回答

11
请查看这个Stack Overflow文章
您可以在一个单独的CMake脚本中调用您的函数,使用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)

3
有没有办法将参数传递给 separate_script.cmake? - Rich von Lehe

8
有没有方法可以将参数传递给 separate_script.cmake? 你可以在调用脚本时使用cmake变量来传递值,例如:
"COMMAND ${CMAKE_COMMAND} -DPARAM=value -P separate_script.cmake" 

6
为了防止该函数运行,只需将其包装到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)

谢谢,这在很大程度上解决了我的问题。但是由于该函数读取配置文件以生成代码,所以当配置文件更改时,我需要重新运行它。这就是为什么我要求类似于 add_custom_command 支持依赖项的东西。 - Nicola Mori
哇,我不知道IS_NEWER_THAN。更新后的答案是我的问题的完整解决方案,谢谢! - Nicola Mori
你不需要在使用IS_NEWER_THAN时添加额外的NOT EXISTS检查,因为后者已经隐含了前者。 - bjhend
add_dependencies 只能用于目标,而不能用于任意外部文件。我不得不采用 cmake -Dvar=value -P=script 方法。 - Burak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接