我正在编写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"
有人建议使用宏而不是函数,但我确实需要使用局部变量,所以我需要使用函数而不是宏。
如何在函数test()中正确设置全局变量source_list?不能以简单和正常的方式做到这一点吗?
答案 0 :(得分:16)
PARENT_SCOPE仅适用于父级,如果您有其他想要查看的非父级脚本,它将无效。
您需要缓存真正的“类似全局”的变量。在您的情况下,请使用:
SET(source_list "${source_list}" CACHE INTERNAL "source_list")
答案 1 :(得分:13)
您需要使用set
代替list
来影响父作用域中的变量。
所以用{
>替换你的list
命令
set(source_list ${source_list} ${file_path} PARENT_SCOPE)
答案 2 :(得分:8)
另一种方法是使用全局属性。设置后:
set_property(GLOBAL PROPERTY source_list_property "${source_list}")
你可以从任何地方阅读它:
get_property(source_list GLOBAL PROPERTY source_list_property)
我在上面的示例中使用了属性(source_list_property
)和变量(source_list
)的不同名称。也许最好使用相同的名称。但重点是使用属性作为全局变量,而不是命名。
此类全局属性不在缓存中。
答案 3 :(得分:2)
解决此问题的另一种方法是使用sub 1 2 3
math 50 60 80
phy 60 80 90
chem 21 22 23
而不是select *
from mrks
pivot
(
max(maths)
for id in ([1], [2], [3])
) piv
-这样,宏内的所有变量都将在调用方的上下文中求值。
答案 4 :(得分:1)
以Maxim Suslov的回答为基础,以下代码适用于我遇到的类似问题:
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。