【问题标题】:Cmake and ninja rebuild unnecessary filesCmake 和 ninja 重建不必要的文件
【发布时间】:2018-04-15 16:21:57
【问题描述】:

我正在启动一个 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 构建系统的项目时,也会发生这种情况。我怀疑文件时间戳是随机更改的?

【问题讨论】:

  • 您使用的是哪个操作系统和哪个版本的忍者? 1.5.3以下ninja中的Windows文件格式可能存在问题
  • 我用的是Ubuntu 16.04,安装了ninja-build,版本是1.7.1。

标签: c++ build cmake llvm ninja


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 2016-07-09
    • 2019-06-25
    相关资源
    最近更新 更多