的污染容器範圍可以說我有其中有一個文件info.cmake:CMake的:仰望在cmake的文件中的變量,而不與其他文件
set(a 1)
set(b 2)
set(c 3)
現在,一個項目可以通過加載它包括:
include(../info.cmake)
訪問關聯a
價值,但會污染與價值觀的環境b
和c
。有沒有辦法只讀a
的值可能需要get_property()
?
的污染容器範圍可以說我有其中有一個文件info.cmake:CMake的:仰望在cmake的文件中的變量,而不與其他文件
set(a 1)
set(b 2)
set(c 3)
現在,一個項目可以通過加載它包括:
include(../info.cmake)
訪問關聯a
價值,但會污染與價值觀的環境b
和c
。有沒有辦法只讀a
的值可能需要get_property()
?
正如弗洛裏安提到的,你將不得不訴諸使用的功能有自己的範圍。這裏的建議是什麼更普遍的版本,可以給出的路徑到源文件和變量來進行查找:
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
你可以添加一個局部變量的作用域與包裝function
function(my_info_wrapper_function)
include(../info.cmake)
set(a "${a}" PARENT_SCOPE)
endfunction()
my_info_wrapper_function()
但這隻會封裝的局部變量。您的CMakeLists.txt
文件仍然會「污染」,如果info.cmake
確實如此更改緩存的變量或添加任何目標。
參考
剛一個建議:如果值爲'0','OFF','NO','FALSE',則'if(DEFINED $ {key})'將不會發出警告, 'N','IGNORE'或'NOTFOUND'。 – Florian