假设我有一个文件info.cmake,它有:
set(a 1)
set(b 2)
set(c 3)
现在一个项目可以通过包含来加载它:
include(../info.cmake)
访问与a
关联的值,但这会用b
和c
的值污染环境。有没有办法只读取a
潜在get_property()
的值?
您可以使用包装器函数添加局部变量范围
function(my_info_wrapper_function)
include(../info.cmake)
set(a "${a}" PARENT_SCOPE)
endfunction()
my_info_wrapper_function()
但这只会封装局部变量。您的CMakeLists.txt
文件仍将被"污染",如果确实如此info.cmake
例如更改缓存变量或添加任何目标。
引用
- 设置和使用变量的 CMake 语法是什么?
正如Florian所提到的,您将不得不求助于使用具有自己作用域的函数。以下是建议的更通用版本,可以给出源文件的路径和要查找的变量:
function(lookup value)
set(options
""
)
set(oneValueArgs
SOURCE
VARIABLE
)
set(multiValueArgs
""
)
cmake_parse_arguments(LOOKUP "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
if(EXISTS "${LOOKUP_SOURCE}")
include("${LOOKUP_SOURCE}")
set(key ${LOOKUP_VARIABLE})
if(NOT ${key})
message(SEND_WARNING "No value was set for ${LOOKUP_VARIABLE} in the source file: ${LOOKUP_SOURCE}")
endif(${key})
set(${value} ${${key}} PARENT_SCOPE)
else()
message(SEND_ERROR "The source file was not found at ${LOOKUP_SOURCE}")
endif()
endfunction()
这是您可以使用它的方式:
lookup(val
SOURCE ../info.cmake
VARIABLE a)
message(SEND_ERROR ${val}) #Will Print 1