单个CMakeLists.txt足以支持我的项目?

pok*_*che 7 cmake

我试图将我的旧CMake移植到现代CMake(CMake 3.0.2或更高版本).在旧设计中,我有多个CMakelists.txt,每个目录都包含一个CMakeLists.txt文件.

我当前项目的目录结构如下:

.
??? VizSim.cpp
??? algo
??? contacts
?   ??? BoundingVolumeHierarchies
?   ?   ??? AABBTree.h
?   ??? SpatialPartitoning
??? geom
?   ??? Geometry.h
??? math
?   ??? Tolerance.h
?   ??? Vector3.cpp
?   ??? Vector3.h
??? mesh
?   ??? Edge.h
?   ??? Face.h
?   ??? Mesh.cpp
?   ??? Mesh.h
?   ??? Node.h
??? util
|   |__ Defines.h
|   |__ Math.h
|
??? viz
    ??? Renderer.h
Run Code Online (Sandbox Code Playgroud)

我打算做的只是使用一个CMakelists.txt并将所有cpp文件放在SOURCE中,并将所有标题放在HEADER中并使用add_executable.

set (SOURCE
    ${SOURCE}
    ${CMAKE_CURRENT_SOURCE_DIR}/src/mesh/Mesh.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/math/Vector3.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/src/VizSim.cpp
    ....
)

set (HEADER
    ${HEADER}
    ${CMAKE_CURRENT_SOURCE_DIR}/src/mesh/Mesh.h
    ${CMAKE_CURRENT_SOURCE_DIR}/src/math/Vector3.h
    .... 
)

add_library(${PROJECT_NAME} SHARED ${SOURCE})
Run Code Online (Sandbox Code Playgroud)

这样做我担心如果使用单个CMakeLists.txt是一个好习惯.那么单个CMakeLists.txt就足够了,还是每个文件夹需要一个CMakeLists.txt?

我只能想到在我的项目中有多个CMakeLists.txt的一个很好的理由,那就是模块化.

考虑到我的项目最终会成长.

Sch*_*eff 2

对于评论来说有点长——所以我把它作为一个答案:

在我的一个项目(一个库)中,我有很多源,我开始将其中一些源移动到子目录中util。

为此,我创建了单独的变量:

file(GLOB headers *.h)
file(GLOB sources *.cc)
file(GLOB utilHeaders
  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}/util/*.h)
file(GLOB utilSources
  RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}/util/*.cc)
Run Code Online (Sandbox Code Playgroud)

为了使其在 VisualStudio 中美观/更方便,我插入了source_groups ,它在 VS 项目中生成适当的子文件夹。我相信它们被称为“过滤器”。

source_group("Header Files\\Utilities" FILES ${utilHeaders})
source_group("Source Files\\Utilities" FILES ${utilSources})
Run Code Online (Sandbox Code Playgroud)

当然,我必须考虑变量utilHeaders以及utilSources必须提供来源的地方:

add_library(libName
  ${sources} ${headers}
  ${utilSources} ${utilHeaders})
Run Code Online (Sandbox Code Playgroud)

就是这样。


Fred在评论中提醒我不要忘记提及它file(GLOB有一定的弱点(尽管我发现它在我们的日常工作中非常有价值)。CMake 文档中甚至提到了这一点。:

注意:我们不建议使用 GLOB 从源树中收集源文件列表。如果添加或删除源时 CMakeLists.txt 文件没有更改,则生成的构建系统无法知道何时要求 CMake 重新生成。该CONFIGURE_DEPENDS标志可能无法在所有生成器上可靠地工作,或者如果将来添加不支持它的新生成器,则使用它的项目将被卡住。即使CONFIGURE_DEPENDS工作可靠,每次重建时执行检查仍然会产生成本。

因此,使用 时file(GLOB,您不应该忘记在添加、移动或删除文件后重新运行 CMake。另一种选择是直接在生成的内置脚本(例如 VS 项目文件)中添加、移动、删除文件,并依赖于下一次重新运行 CMake 也将覆盖这些文件。最后但并非最不重要的git pull一点是,值得考虑重新运行 CMake。