2012-04-05 432 views
7

我正在寫一個的CMakeLists.txt生成文件和編譯生成的文件。我創建了一個函數來將一些文件路徑字符串添加到全局列表變量中。如何在cmake的函數中設置全局變量?

我的CMakeLists.txt:

set(source_list "nothing") 
function(test file_path) 
    list(APPEND source_list ${file_path}) 
endfunction(test) 
test(abc.txt) 
test(def.txt) 
message("At last, the source_list is:\"${source_list}\"") 

CMake的輸出:

At last, the source_list is:"nothing" 

有人建議,而不是使用功能宏,但我確實需要使用局部變量,所以我需要使用該函數代替宏。

我怎樣才能正確地設置全局變量在SOURCE_LIST功能測試()?不能cmake以簡單而正常的方式做到這一點?

回答

11

您需要使用set而不是list影響父範圍的變量。

因此,與更換您list命令:

set(source_list ${source_list} ${file_path} PARENT_SCOPE) 
+0

這不是全球不過,兄弟姐妹不會看到。 – 0xbaadf00d 2017-04-04 06:32:10

12

PARENT_SCOPE僅適用於父,如果您有想看到它,以及其他非父腳本將無法正常工作。

你需要緩存真正的「全球式」的變量。在你的情況下,使用:

SET(source_list "${source_list}" CACHE INTERNAL "source_list") 
+1

它不適用於cmake的第二次運行,因爲值已經在緩存中。構建之前,您必須清理。 – 2016-02-25 07:23:56

+1

'INTERNAL'暗示'FORCE',意思是: 使用'FORCE''選項覆蓋現有的條目, 。 – 2016-02-25 22:49:21

1

另一種方法是使用全局屬性。一旦你設置:

set_property(GLOBAL PROPERTY source_list_property "${source_list}") 

你可以從任何地方閱讀:

get_property(source_list GLOBAL PROPERTY source_list_property) 

我在上面的不同名稱的例子用於物業(source_list_property)和變量(source_list)。也許最好使用相同的名稱。但重點是使用一個屬性作爲全局變量,而不是命名。

這種全球性的特性在高速緩存中。

0

大廈在馬克西姆蘇斯洛夫的答案,下面的代碼工作了我遇到了類似的問題:

set_property(GLOBAL PROPERTY source_list) 
function(add_source) 
    get_property(tmp GLOBAL PROPERTY source_list) 
    foreach(arg ${ARGV}) 
     set(tmp "${tmp} ${arg}") 
    endforeach() 
    set_property(GLOBAL PROPERTY source_list "${tmp}") 
endfunction(add_source) 

add_source(a_file) 
add_source(b_file c_file) 

get_property(local_prop GLOBAL PROPERTY source_list) 
message("list: ${local_prop}") 

功能add_source可以從任何子目錄中被調用。