如何在自定义目标调用的子进程中使用 CMake 缓存变量?

How to use CMake cached variables inside subprocess called by custom target?

我的项目包含一个自定义目标,它通过 .cmake 脚本生成一些输出。它看起来像这样:

add_custom_target(TargetName
    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake/script.cmake
    BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/generated/output
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
    VERBATIM
)

但现在我想在脚本中设置缓存变量。我试过这样做:

message("MY_CACHE_VARIABLE = ${MY_CACHE_VARIABLE}")
set(MY_CACHE_VARIABLE "VALUE" CACHE INTERNAL "")

而且我遇到了缓存变量没有保存的问题。它总是给我打印空输出:

MY_CACHE_VARIABLE =

我已经尝试将工作目录设置为 CMAKE_BINARY_DIR,或者传递 cmake 命令最后一个参数的 CMAKE_BINARY_DIR,或者传递 -B ${CMAKE_BINARY_DIR}-C ${CMAKE_BINARY_DIR}/CMakeCache.txt 作为参数等. None 其中有效。
那么有什么方法可以在 CMake 子进程中重用现有缓存,或者我应该在脚本中编写自己的缓存?

你必须区分 运行 生成构建文件(用于 Make、Ninja 等)的 CMake 和脚本模式下的 运行 CMake:

Script mode simply runs the commands in the given CMake Language source file and does not generate a build system. It does not allow CMake commands that define build targets or actions.
-- cmake-language(7)

No configure or generate step is performed and the cache is not modified.
-- cmake(1)

因此在脚本模式下 (-P),CMake 不知道缓存或任何 variable/target/etc。在您的常规 CMakeLists.txt 文件中定义。它更类似于执行 bash/shell 脚本而不是处理“常规”CMakeLists.txt.

不过别担心,还是有办法解决你的问题的。您可以简单地将参数作为 -D 选项传递给脚本:

add_custom_target(TargetName
  COMMAND ${CMAKE_COMMAND}
    -DMY_VAR="..."
    -DANOTHER_VAR="..."
    -P ${CMAKE_SOURCE_DIR}/cmake/script.cmake
  ...
)

但请注意:

If variables are defined using -D, this must be done before the -P argument.
-- cmake(1)