Cmake и ниндзя восстанавливают ненужные файлы

Я начинаю проект инструмента Clang, поэтому я создал LLVM / Clang из исходного кода, используя Cmake и ninja. Есть две папки - src/ и build/. Затем я создал папку своего проекта как src / tools / clang / tools / extra / my-tool и добавил add_subdirectory(my-tool) в tools / clang / tools / extra / CMakeLists.txt. . Однако каждый раз, когда я изменяю файл в папке своего проекта и запускаю ninja в build /, система иногда создает только измененный файл, но иногда перестраивает все файлы (более 3000 задач), что очень медленно. . Мне интересно, что вызывает перестройку?

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


person platinor    schedule 03.11.2017    source источник
comment
какую ОС и какую версию Ninja вы используете? Возможно, проблема с форматом файла Windows в Ninja ниже версии 1.5.3.   -  person miradham    schedule 03.11.2017
comment
Я использую Ubuntu 16.04 и устанавливаю ninja-build, версия 1.7.1.   -  person platinor    schedule 03.11.2017


Ответы (1)


У меня была аналогичная проблема с ninja и моей инструментальной цепочкой на основе GNU. После множества проб и ошибок я обнаружил, что CMake / ninja сканировал стандартные подключаемые каталоги и иногда приходил к выводу, что эти файлы заголовков изменились.

Таким образом, изменение параметров проверки зависимостей для исключения включения системы решило эту проблему.

Добавьте следующий код CMake - возможно, с некоторыми изменениями для Clang - перед вашей командой project() или внутри файла цепочки инструментов:

if (CMAKE_GENERATOR MATCHES "Ninja")
    file(
        WRITE "${CMAKE_BINARY_DIR}/GNUMakeRulesOverwrite.cmake" 
            "STRING(REPLACE \"-MD\" \"-MMD\" CMAKE_DEPFILE_FLAGS_C \"\${CMAKE_DEPFILE_FLAGS_C}\")\n"
            "STRING(REPLACE \"-MD\" \"-MMD\" CMAKE_DEPFILE_FLAGS_CXX \"\${CMAKE_DEPFILE_FLAGS_CXX}\")\n"
    )
    set(CMAKE_USER_MAKE_RULES_OVERRIDE "${CMAKE_BINARY_DIR}/GNUMakeRulesOverwrite.cmake" CACHE INTERNAL "")
)
person Florian    schedule 03.11.2017