2016-03-03 31 views
1

我试图创建一个全局列表,我希望它附加在宏中。 这里是我的设置:在宏观范围内的Cmake全局变量

project 
\__. CMakeLists.txt 
\__. level1 
    \__. CMakeLists.txt 
    \__. level2a 
     \__. CMakeLists.txt 
    \__. level2b 
     \__. CMakeLists.txt 

这里是我的最高级别的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 

macro(listappend var) 
    list(APPEND MY_GLOBAL_LIST "${var}") 
    message(STATUS "LIST IN MACRO SCOPE: ${MY_GLOBAL_LIST}") 
endmacro(listappend) 

set(MY_GLOBAL_LIST "") 

add_subdirectory(level1) 
message(STATUS "LIST: ${MY_GLOBAL_LIST}") 

# call something here with the global list 

1级的CMakeLists.txt只需做两个add_subdirectory()。

级别2的CMakeLists.txt如下:

listappend("test2a") 

最后,这里是我的输出:

[[email protected] 17:15:14] ~/tmp/cmake/build$ cmake .. 
-- LIST IN MACRO SCOPE: test2a 
-- LIST IN MACRO SCOPE: test2b 
-- LIST: 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /home/lz/tmp/cmake/build 

我正在寻找一种方式来拥有范围内附加的全局列表而不必将全局列表变量作为宏的参数。 我不确定是否有可能。

我也试过CACHE INTERNAL标志,但它没有帮助。我真的不怎么处理这个问题。

感谢所有帮助:)

+0

有关的CMake的变量范围的一些细节参见[什么是CMake的语法来设置和使用变量?](http://stackoverflow.com/questions/31037882/whats-the-cmake-syntax-to-set-and-use-variables)。 – Florian

回答

5

CMake的GLOBAL属性是实现其在不同级别的修改全局列表的好方法:

# Describe property 
define_property(GLOBAL PROPERTY MY_GLOBAL_LIST 
    BRIEF_DOCS "Global list of elements" 
    FULL_DOCS "Global list of elements") 
# Initialize property 
set_property(GLOBAL PROPERTY MY_GLOBAL_LIST "") 

# Macro for add values into the list 
macro(listappend var) 
    set_property(GLOBAL APPEND PROPERTY MY_GLOBAL_LIST "${var}") 
endmacro(listappend) 

# Do something 
add_subdirectory(level1) 

# Read list content 
get_property(my_list_content GLOBAL PROPERTY MY_GLOBAL_LIST) 
message(STATUS "LIST: ${my_list_content}") 
+0

谢谢。那有帮助的! – Lazao