9

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

4

3 回答 3

8

看看这个 SO 帖子

您可以在单独的 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)
于 2016-04-12T17:11:55.303 回答
6

有没有办法将参数传递给separate_script.cmake?

您可以在调用脚本时使用 cmake 变量来传递值,例如

"COMMAND ${CMAKE_COMMAND} -DPARAM=value -P separate_script.cmake" 
于 2019-07-12T14:03:03.757 回答
4

为了防止该函数运行,只需将其包装成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)
于 2015-01-14T17:04:42.053 回答