Cmake和忍者重建不必要的文件
Cmake and ninja rebuild unnecessary files
我正在启动一个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个任务),这非常慢。我想知道是什么原因导致重建?
顺便说一句,当我修改另一个使用谷歌 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 "")
)
相关文章:
- 用callgrind追踪不必要的副本
- 不必要的C++代码最终会出现在我完成的程序中吗?
- C++ 读取文件读取文件不正确
- 为什么文件不是由 F 流创建的,或者即使它是输出只是垃圾值?
- 总和的不必要行为C++?
- 合并文本文件不同行中的重复项
- C++:将初始化的对象传递给另一个类的构造函数;需要不必要的构造函数吗?
- 为什么头文件不能相互包含?
- 在这种情况下,使用 string_view 是否会导致不必要的字符串复制?
- 当包含头文件的文件不在根项目文件夹中时,如何包含它
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- DLL:当 SDK 头文件不使用 __declspec(dllexport) 时,我可以使用它吗
- 部署基于 qt 的项目后,我的 sqlite3 文件不会被复制 (android)
- 生成文件不构建对象,我告诉它如何
- 我的项目中某些仅标头文件不能包含使用 CMake 和 Vscode 的"SFML/Graphics.hpp"
- 如何在插入排序中使用 replace() 使语句变得不必要
- C 包装器C++库周围没有不必要的头文件
- Cmake和忍者重建不必要的文件
- 摆脱不必要的输入文件
- NetShareEnum(.)winapi无法删除不必要的共享文件夹