Cmake 和 ninja 重建不必要的文件

问题描述 投票:0回答:2

我正在启动一个 Clang 工具项目,因此我使用 Cmakeninja 从源代码构建了 LLVM/Clang。有两个文件夹 -

src/
build/
。然后我将项目文件夹创建为 src/tools/clang/tools/extra/my-tool 并将
add_subdirectory(my-tool)
添加到 tools/clang/tools/extra/CMakeLists.txt。然而,每次我修改项目文件夹下的文件并在
build/
下运行ninja时,系统有时只构建修改后的文件,但有时会重建所有文件(超过3000个任务),速度非常慢。我想知道是什么原因导致重建?

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

c++ build cmake llvm ninja
2个回答
7
投票

我对

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 "")
)

0
投票

我已经尝试解决这个问题两天了。非常感谢弗洛里安,这是唯一对我有用的解决方案。我正在 Windows 10 上使用 CMake、Ninja (1.11) 和 MinGW (11.4) 编译器套件,使用 VS 代码。如果这有点类似于您当前的设置,请尝试粘贴他的块

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 "")
endif()

进入 CMakeLists.txt,在 cmake_minimum_required() 行之后、project() 行之前。在我的设置中,它立即起作用了。

© www.soinside.com 2019 - 2024. All rights reserved.