我目前在项目根目录的${SRCS}
文件中定义了一个CMakeLists.txt
变量,列出了我的可执行文件所需的每个源文件:
SET (SRCS main.cpp
dir1/file1.cpp
dir1/file2.cpp
dir2/file3.cpp
dir2/file4.cpp)
如何在每个子目录中的CMakeLists.txt
文件中分发此列表?那就是:
CMakeLists.txt
Adds main.cpp to SRCS and subdirectories dir1 and dir2
dir1/CMakeLists.txt
Adds file1.cpp, file2.cpp to SRCS
dir2/CMakeLists.txt
Adds file3.cpp, file4.cpp to SRCS
答案 0 :(得分:28)
最好隐藏在CMake macro中设置变量SRCS
的所有详细信息。然后可以在所有项目CMake列表文件中调用宏以添加源。
在项目根文件夹的CMakeLists.txt
中,添加以下宏定义:
macro (add_sources)
file (RELATIVE_PATH _relPath "${PROJECT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
foreach (_src ${ARGN})
if (_relPath)
list (APPEND SRCS "${_relPath}/${_src}")
else()
list (APPEND SRCS "${_src}")
endif()
endforeach()
if (_relPath)
# propagate SRCS to parent directory
set (SRCS ${SRCS} PARENT_SCOPE)
endif()
endmacro()
add_sources(main.cpp)
add_subdirectory(dir1)
add_subdirectory(dir2)
message(STATUS "${SRCS}")
宏首先计算源文件相对于每个参数的项目根目录的路径。如果从项目子目录内调用宏,则需要使用PARENT_SCOPE选项将变量SRCS的新值传播到父文件夹。
在子目录中,您只需添加一个宏调用,例如在dir1/CMakeLists.txt
添加:
add_sources(file1.cpp file2.cpp)
在dir2/CMakeLists.txt
添加:
add_sources(file3.cpp file4.cpp)
答案 1 :(得分:2)
在dir1 / CMakeLists.txt中输入:
set(SRCS ${SRCS} file1.cpp PARENT_SCOPE)
如果这不起作用,唯一的解决方案是
set(DIR1_SRCS "file1.cpp" PARENT_SCOPE)
然后在./CMakeLists.txt
set(SRCS ${DIR1_SRCS} ${DIR2_SRCS})
答案 2 :(得分:2)
类似于sakra建议的宏,由Michael Wild [1]发布在CMake邮件列表上。它使用全局属性而不是向上传播变量。
[1] http://www.cmake.org/pipermail/cmake/2010-March/035992.html