Cmake 和 ninja 重建不必要的文件
Cmake and ninja rebuild unnecessary files
我正在启动一个 Clang 工具项目,所以我使用 Cmake 和 忍者。有两个文件夹 -- 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 "")
)
我正在启动一个 Clang 工具项目,所以我使用 Cmake 和 忍者。有两个文件夹 -- 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 "")
)