我正在写一个的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的做一个简单的和正常的方式?
你需要使用set
的,而不是list
影响父范围的变量。
所以替换您的list
使用命令:
set(source_list ${source_list} ${file_path} PARENT_SCOPE)
PARENT_SCOPE只为父母,也不会,如果你有希望看到它,以及其他非父脚本工作。
您需要缓存真正的“全球式”的变量。 在你的情况下,使用方法:
SET(source_list "${source_list}" CACHE INTERNAL "source_list")
另一种方法是使用全局属性。 一旦你设置它:
set_property(GLOBAL PROPERTY source_list_property "${source_list}")
你可以从任何地方阅读:
get_property(source_list GLOBAL PROPERTY source_list_property)
我在上面的不同名称的例子为属性(用于source_list_property
)和变量( source_list
)。 也许最好是使用相同的名称。 但问题是使用属性为全局变量,而不是关于命名。
这种全球性不在缓存中。
在马克西姆苏斯洛夫的答案的基础上,将下面的代码工作了我遇到了类似的问题:
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可以从任何子目录中被调用。