【发布时间】:2014-06-14 23:06:26
【问题描述】:
我一直在从事一个使用 cmake 的软件项目,其文件结构如下所示:
- cmake
- 测试
- 构建
- 源
- 模块1
- 模块2
- 模块3
- submod1
- submod2
- 实现
- 后端1
- 后端2
- 实现
每个文件夹都包含一个 CMakeLists.txt,它基本上将更多文件添加到源代码文件列表中,该列表在 src 文件夹中的 CMakeLists.txt 中定义。问题是,使用 PARENT_SCOPE 将所有这些变量沿作用域堆栈向上传递是不切实际的,因此我们为此使用了属性。
在我们决定简化测试之前,它一直运行良好,将每个子模块都构建在静态库上会很有用。所以我一直在处理一个看起来像这样的宏:
macro(define_build_unit unit_name unit_root)
function(${unit_name}_add_sources)
message(STATUS ${ARGN})
file(RELATIVE_PATH _relPath ${unit_root} "${CMAKE_CURRENT_SOURCE_DIR}")
foreach(_src ${ARGN})
if(_relPath)
list(APPEND ${unit_name}_SRCS "${_relPath}/${_src}")
else()
list(APPEND ${unit_name}_SRCS "${_src}")
endif()
endforeach()
if(_relPath)
set_property(GLOBAL APPEND PROPERTY ${unit_name}_SRCS ${${unit_name}_SRCS})
endif()
endfunction()
function(${unit_name}_add_link_deps)
foreach(_dep ${ARGN})
list(APPEND ${unit_name}_DEPS "${_dep}")
endforeach()
set_property(GLOBAL APPEND PROPERTY ${unit_name}_DEPS ${${unit_name}_DEPS})
endfunction()
function(${unit_name}_add_include_dirs)
foreach(_inc ${ARGN})
list(APPEND ${unit_name}_INC_DIRS "${_inc}")
endforeach()
set_property(GLOBAL APPEND PROPERTY ${unit_name}_INC_DIRS ${${unit_name}_INC_DIRS})
endfunction()
endmacro()
问题是 ARGN 是从 define_build_unit 宏中替换的,而不是从相应的函数中替换的。我已经尝试了所有宏/函数的组合,但似乎没有任何效果。
所以,问题是:cmake 中的变量参数是否有比 ARGN 全局变量更好的方法?像宏(my_macro args ...)之类的东西?如果没有,有人知道完成相同任务的等效方法吗?
【问题讨论】:
标签: cmake