【发布时间】:2015-07-21 12:00:17
【问题描述】:
到目前为止,我仍然不太了解对于具有许多子目录的 CMake 项目执行此操作的“最佳实践”是什么。
假设我有一个项目层次结构,每个子目录中都有源文件......
--CMake Project Source dir
|-- SubD1
|-- SubSubD1
|-- SubD2
我通常会做的是add_subdirectory(SubD1)和分别对根目录的CMakeLists.txt中的D2和SubD1目录的CMakeLists.txt中的子目录进行递归,同时在每个子目录中声明变量并制作它们在根目录中可见,PARENT_SCOPE。
这意味着如果 `SubSubD1' 中存在文件 Source2.cpp,我会这样做
set(SUBSUBD1_SOURCES Source2.cpp PARENT_SCOPE)
并希望能够在我的SubD1 目录中使用 SUBSUBD1_SOURCE。
随后,说 Source.cpp 存在于 SubD1 中,我会这样做
set(SUBD1_SOURCES ${SUBSUBD1_SOURCES} Source.cpp PARENT_SCOPE)
以便所有源在根目录中可见。
问题是当然是当变量到达根目录时文件路径没有保留。我目前正在做的是我set 的所有源文件,我包括${CMAKE_CURRENT_LIST_DIR},使其成为
set(SUBSUBD1_SOURCES ${CMAKE_CURRENT_LIST_DIR}/Source2.cpp PARENT_SCOPE)
和
set(SUBD1_SOURCES ${SUBSUBD1_SOURCES} ${CMAKE_CURRENT_LIST_DIR}/Source.cpp PARENT_SCOPE)
在这种情况下,我可以说,在我的 CMake 项目的根目录中执行 add_executable(myProg SUBSUBD1_SOURCES)。
有没有更好的方法来做到这一点,然后必须总是在所有源文件前面包含一个 CMake 变量?
【问题讨论】: