每次添加新的源子文件夹时,Cmake都会重新编译所有内容

时间:2015-02-14 23:55:11

标签: c++ cmake organization

我有一个项目树,如下所示:

MyProjects/ - build - project1 - CMakeLists.txt
            |       | project2 - CMakeLists.txt
            |
            | src - project1 - Project1Class1.h
                             | Project1Class1.cpp
                             | Project1Class2.h
                             | Project1Class2.cpp
                             | more subdirectories ...
                    project2 - Project2Class1.h
                             | Project2Class1.cpp
                             | more subdirectories ...

想象一下,project2依赖于project1。然后project2直接使用project1文件,不使用静态或动态project1库。 然后project2 / CMakeLists.txt找出project1和project2源文件,并通过GLOB_RECURSE包含它们:

file(
    GLOB_RECURSE
    source_files
    ../../project1/
    ../../project2/
)

这是正确构建我的项目的意义上的。

每次我在新文件夹中添加新的源文件时,例如在src / project2 /中输入MyNewFolder / myTest.cpp,然后输入

~/MyProjects/build/project2/$  cmake .
~/MyProjects/build/project2/$  make

然后cmake正确考虑了该文件。但是,我的问题是每个文件都会重新编译。

当我在project1中更改源文件并尝试编译project2时,同样如此。

请注意,我大大简化了CMakeLists.txt中的实际内容。所以我的问题是:根据我对它的解释,CMake预计会做什么?如果是的话,它背后的基本原理是什么,我应该怎样做才能make只编译新文件?我无法在互联网上找到任何关于它的文档。

注意:请随意讨论整个源构建文件组织。请注意,我希望将构建配置与src /文件夹分开。

编辑:我发现this解释了为什么GLOB和GLOB_RECURSE阻止它起作用。

编辑2:即使没有GLOB,编译也是从其他情况开始的(参见this问题)

1 个答案:

答案 0 :(得分:3)

您正在观察file(GLOB_RECURSE ...)的已知副作用。我不确定为什么会发生这种情况,但为了避免这种情况,大多数基于CMake的项目明确地列出了它们的来源:

set(source_files
  ../../project1/Project1Class1.cpp
  ../../project1/Project1Class2.cpp
  ...
  ../../project2/Project2Class1.cpp
  ../../project2/Project2Class1.cpp
  ...
)