2012-04-05 436 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可以从任何子目录中被调用。