我正在启动一个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个任务),这很慢。我想知道重建的原因是什么?
答案 0 :(得分:2)
我遇到了与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 "")
)