【问题标题】:How to use CMake cached variables inside subprocess called by custom target?如何在自定义目标调用的子进程中使用 CMake 缓存变量?
【发布时间】:2021-09-13 19:48:39
【问题描述】:

我的项目包含一个自定义目标,它通过.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作为参数等等。这些都不起作用。
那么有没有办法在 CMake 子进程中重用现有缓存,或者我应该在脚本中编写自己的缓存?

【问题讨论】:

    标签: cmake add-custom-target cmake-cache


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多