CMake с помощью PCH перестроит весь проект после добавления/удаления файлов .cpp

#c #cmake #clion

Вопрос:

Я использую CMake для своего большого проекта и target_precompile_headers для создания файла .pch.

Проблема: каждый раз, когда я добавляю или удаляю файл .cpp в списке целевых источников, каждая единица перевода перекомпилируется

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

введите описание изображения здесь

CMakeLists.txt это очень просто:

 cmake_minimum_required(VERSION 3.16)
set(CMAKE_CXX_STANDARD 17)

project(SuperBasicProject)
set(TARGET_NAME ${PROJECT_NAME})

add_executable(${TARGET_NAME} main.cpp empty_cpp1.cpp)

target_include_directories(${TARGET_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_precompile_headers(${TARGET_NAME} PRIVATE my_pch.h)
 

Вывод компилятора после первого запуска:

 Scanning dependencies of target SuperBasicProject
[ 25%] Building CXX object CMakeFiles/SuperBasicProject.dir/cmake_pch.hxx.pch
[ 75%] Building CXX object CMakeFiles/SuperBasicProject.dir/empty_cpp1.cpp.o
[ 75%] Building CXX object CMakeFiles/SuperBasicProject.dir/main.cpp.o
[100%] Linking CXX executable SuperBasicProject
[100%] Built target SuperBasicProject
 

Затем я добавляю еще один исходный файл (empty_cpp2.cpp) для проекта путем изменения строки add_executable:

  add_executable(${TARGET_NAME} main.cpp empty_cpp1.cpp empty_cpp2.cpp)
 

А после этого перезагрузите cmake и нажмите кнопку сборки.

Вывод компилятора:

 Scanning dependencies of target SuperBasicProject
[ 20%] Building CXX object CMakeFiles/SuperBasicProject.dir/cmake_pch.hxx.pch
[ 80%] Building CXX object CMakeFiles/SuperBasicProject.dir/empty_cpp2.cpp.o
[ 80%] Building CXX object CMakeFiles/SuperBasicProject.dir/main.cpp.o
[ 80%] Building CXX object CMakeFiles/SuperBasicProject.dir/empty_cpp1.cpp.o
[100%] Linking CXX executable SuperBasicProject
[100%] Built target SuperBasicProject
 

Почему каждая единица перевода перекомпилируется и как это исправить? Тогда целью является проект с кодовой базой hude, такое поведение неприемлемо. Может быть, я неправильно использую заголовки target_precompile_, или, может быть, есть другой способ, который не будет все перекомпилировать. Я был бы признателен за любую помощь.