2016-04-19 17 views
1

のそれとコンテナスコープを汚染することなく、cmakeのファイルで変数を見ると、私が持っているファイルinfo.cmakeを考えてみましょう:CMAKE:他のファイル

set(a 1) 
set(b 2) 
set(c 3) 

今プロジェクトは経てそれを読み込むことができます含める:

include(../info.cmake) 

aに関連する値にアクセスするには、それがbcの値で環境を汚染します。潜在的にthorugh aの値だけを読み取る方法はありますかget_property()

答えて

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」、または「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がそうであれば "汚染された"でしょう。キャッシュされた変数を変更するか、ターゲットを追加します。

参照