1

我的项目包含一个自定义目标,它通过.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 子进程中重用现有缓存,或者我应该在脚本中编写自己的缓存?

4

1 回答 1

2

您必须区分运行 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)

于 2021-09-13T11:48:39.567 回答