CMake:执行 macro/function 作为 add_custom_command 的命令

CMake: execute a macro/function as the command of add_custom_command

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

要防止该函数 运行,只需将其包装到 if:

if(NOT EXISTS ${CMAKE_BINARY_DIR}/blah-blah/generated.cpp)
   run_your_provided_command(BLAH_BLAH)
endif()

简单!

Update: 运行 当配置文件改变时,只需要使用更复杂的条件:

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)

看看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)

Is there a way to pass a parameter to the separate_script.cmake?

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

"COMMAND ${CMAKE_COMMAND} -DPARAM=value -P separate_script.cmake"