Cmake 和 ninja 重建不必要的文件

pla*_*nor 3 c++ build cmake llvm ninja

我正在启动一个 Clang 工具项目,因此我使用Cmakeninja从源代码构建了LLVM/Clang。有两个文件夹 -和。然后我将项目文件夹创建为src/tools/clang/tools/extra/my-tool并添加到tools/clang/tools/extra/CMakeLists.txt。但是,每次我修改项目文件夹下的文件并在build/下运行时,系统有时只构建修改后的文件,但有时会重建所有文件(超过 3000 个任务),速度非常慢。我想知道是什么原因导致重建?src/build/add_subdirectory(my-tool)ninja

顺便说一句,当我修改另一个使用 Google 的 Bazel 构建系统的项目时,也会发生这种情况。我怀疑文件时间戳是随机更改的?

Flo*_*ian 7

我的基于 GNU 的工具链也有类似的问题ninja。经过大量的试验和错误,我发现 CMake/ninja扫描了标准包含目录,有时得出结论,这些头文件已更改。

因此,更改依赖项检查选项以排除系统包含确实解决了这个问题。

project()在命令之前或工具链文件内添加以下 CMake 代码(可能对 Clang 进行一些更改) :

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 "")
)
Run Code Online (Sandbox Code Playgroud)