我一直在一个使用 cmake 的软件项目中工作,其中文件结构如下所示:
每个文件夹都包含一个 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() …Run Code Online (Sandbox Code Playgroud) cmake ×1