如何在自定义目标调用的子进程中使用 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)
我的项目包含一个自定义目标,它通过 .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)