Зачем CMake перекомпилировать все библиотечные источники, когда изменились только параметры для одного файла?

Итак, у меня есть простой проект с библиотекой, скомпилированной из двух источников, и исполняемый файл зависит от этой библиотеки:

./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)

Я компилирую это (внутри сборки dir)

cmake .. -DX=4
make

Затем я хочу изменить X на 5, я делаю

cmake .. -DX=5
make

Я ожидаю файл a.cpp перекомпилироваться и ab а также c быть повторно связанными (потому что они оба зависят от этого файла cpp), но я не ожидаю никакой перекомпиляции других cpp, потому что их параметры компиляции не изменились, и они не зависят от a.cpp

Что я получаю, так это a.cpp а также b.cpp оба перекомпилированы (и c.cpp правильно не перекомпилировано)

Итак, мои вопросы:

  • Это ожидаемое поведение. Если так, то почему?
  • Как структурировать проект, чтобы изменение параметров компиляции для одного файла не перекомпилировало каждый файл в библиотеке?

Пробовал CMake 3.5.1 на Linux и CMake 3.7.2 на MacOS

2

Решение

Да, это ожидается. CMake не генерирует информацию о зависимости для макросов, так как они слишком сложны, чтобы иметь с ними дело.

Можно генерировать несколько конфигурационных файлов; таким образом, он рассматривается как простые временные зависимости заголовка.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]