Cmake和忍者重建不必要的文件

Cmake and ninja rebuild unnecessary files

本文关键字:文件 不必要 重建 忍者 Cmake      更新时间:2023-10-16

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

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

我在ninja和基于GNU的工具链上遇到了类似的问题。经过大量的试验和错误,我发现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 "")
)