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

彼得舒尔加林

我的项目包含一个自定义目标,它通过.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_BINARY_DIRcmake 命令的最后一个参数,或传递-B ${CMAKE_BINARY_DIR}-C ${CMAKE_BINARY_DIR}/CMakeCache.txt作为参数等。这些都不起作用。
那么有没有办法在 CMake 子进程中重用现有的缓存,或者我应该在脚本中编写自己的缓存?

彼得_w

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

脚本模式只运行给定 CMake 语言源文件中的命令,不生成构建系统。它不允许定义构建目标或操作的 CMake 命令。
-- cmake-语言(7)

不执行配置或生成步骤并且不修改缓存。
-- cmake(1)

所以在脚本模式 ( -P) 中,CMake 不知道缓存或任何变量/目标/等。在您的常规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
  ...
)

但请注意:

如果使用 定义变量-D,则必须在-P参数之前完成
-- cmake(1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章