我正在启动一个 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个任务),速度非常慢。我想知道是什么原因导致重建?
顺便说一句,当我修改另一个项目时也会发生这种情况,该项目使用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 "")
)
我已经尝试解决这个问题两天了。非常感谢弗洛里安,这是唯一对我有用的解决方案。我正在 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() 行之前。在我的设置中,它立即起作用了。