2016-04-19 33 views

回答

0

正如弗洛裏安提到的,你將不得不訴諸使用的功能有自己的範圍。這裏的建議是什麼更普遍的版本,可以給出的路徑到源文件和變量來進行查找:

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 
+2

剛一個建議:如果值爲'0','OFF','NO','FALSE',則'if(DEFINED $ {key})'將不會發出警告, 'N','IGNORE'或'NOTFOUND'。 – Florian

1

你可以添加一個局部變量的作用域與包裝function

function(my_info_wrapper_function) 
    include(../info.cmake) 
    set(a "${a}" PARENT_SCOPE) 
endfunction() 

my_info_wrapper_function() 

但這隻會封裝的局部變量。您的CMakeLists.txt文件仍然會「污染」,如果info.cmake確實如此更改緩存的變量或添加任何目標。

參考