到目前为止,我仍然不明白为具有许多子目录的CMake项目执行此操作的"最佳实践"是什么.
假设我有一个项目层次结构,每个子目录中都有源文件......
--CMake Project Source dir
|-- SubD1
|-- SubSubD1
|-- SubD2
Run Code Online (Sandbox Code Playgroud)
我通常要做的是add_subdirectory(SubD1)分别对根目录的CMakeLists.txt中的D2和SubD1目录的CMakeLists.txt中的子目录进行递归,同时在每个子目录中声明变量并使它们在根目录中可见与PARENT_SCOPE.
这意味着如果文件Source2.cpp存在于`SubSubD1'中,我就是这样做的
set(SUBSUBD1_SOURCES Source2.cpp PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud)
并希望能够在我的SubD1目录中使用SUBSUBD1_SOURCE .随后,说Source.cppSubD1中存在,我会这样做
set(SUBD1_SOURCES ${SUBSUBD1_SOURCES} Source.cpp PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud)
这样所有来源都可以在根目录中看到.
问题当然是当变量到达根目录时不保留文件路径.什么我目前做的是所有的源文件,我set,我包括${CMAKE_CURRENT_LIST_DIR},使它
set(SUBSUBD1_SOURCES ${CMAKE_CURRENT_LIST_DIR}/Source2.cpp PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud)
和
set(SUBD1_SOURCES ${SUBSUBD1_SOURCES} ${CMAKE_CURRENT_LIST_DIR}/Source.cpp PARENT_SCOPE)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我可以说,add_executable(myProg SUBSUBD1_SOURCES)在我的CMake项目的根目录中执行.
有没有更好的方法来执行此操作,然后必须始终在所有源文件前包含CMake变量?