当只有一个文件的选项发生变化时,为什么CMake会重新编译所有库源?

时间:2017-03-10 09:46:07

标签: c++ build cmake recompile

所以,我有一个简单的项目,从两个源编译库,可执行文件依赖于这个库:

./a.cpp
#include "a.h"
int a() {
    return X;
}

./a.h
int a();

./b.cpp
#include "b.h"
int b() {
    return 2;
}

./b.h
int b();

./c.cpp
#include "a.h"
#include "b.h"
#include "c.h"
int c() {
    return a() + b();
}

int main() {
    return c();
}

./c.h
int c();

./CMakeLists.txt
cmake_minimum_required(VERSION 2.8)

set_property(
    SOURCE a.cpp
    APPEND
    PROPERTY COMPILE_DEFINITIONS
    "X=${X}"
)
add_library(ab a.cpp b.cpp)
add_executable(c c.cpp)
target_link_libraries(c ab)

我通过(在build dir中)编译它

cmake .. -DX=4
make

然后我想将X改为5,我做

cmake .. -DX=5
make

我希望重新编译文件a.cpp,并重新链接abc(因为它们都依赖于此cpp文件),但我希望不会重新编译其他cpp&# 39;因为他们的编译选项没有改变,他们不依赖于a.cpp

我得到的是a.cppb.cpp都被重新编译(并且c.cpp未正确重新编译)

所以我的问题是:

  • 是预期的行为吗?如果是这样,为什么?
  • 如何构建项目,以便更改1个文件的编译选项不会重新编译库中的每个文件?

在Linux上尝试CMake 3.5.1,在MacOS上尝试CMake 3.7.2

1 个答案:

答案 0 :(得分:1)

是的,这是预期的。 CMake不会为宏生成依赖性信息,因为它们太复杂而无法处理。

generate多个配置文件是可能的;以这种方式,它被视为简单的标头时间戳依赖关系。