如何设置在cmake的功能全局变量?(How to set the global variable

2019-06-23 10:20发布

我正在写一个的CMakeLists.txt生成文件和编译生成的文件。 我创建一个函数来一些文件路径字符串添加到全局列表变量。

我的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的做一个简单的和正常的方式?

Answer 1:

你需要使用set的,而不是list影响父范围的变量。

所以替换您的list使用命令:

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


Answer 2:

PARENT_SCOPE只为父母,也不会,如果你有希望看到它,以及其他非父脚本工作。

您需要缓存真正的“全球式”的变量。 在你的情况下,使用方法:

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


Answer 3:

另一种方法是使用全局属性。 一旦你设置它:

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

你可以从任何地方阅读:

get_property(source_list GLOBAL PROPERTY source_list_property)

我在上面的不同名称的例子为属性(用于source_list_property )和变量( source_list )。 也许最好是使用相同的名称。 但问题是使用属性为全局变量,而不是关于命名。

这种全球性不在缓存中。



Answer 4:

在马克西姆苏斯洛夫的答案的基础上,将下面的代码工作了我遇到了类似的问题:

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



文章来源: How to set the global variable in a function for cmake?
标签: cmake