Cmake 和 ninja 重建不必要的文件

Cmake and ninja rebuild unnecessary files

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

顺便说一句,当我修改另一个使用Google 的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 "")
)