自从ccache
在我们的 CI 服务器上使用以来,我们发现构建时间方面的瓶颈现在是我们的静态分析通道,它使用clang-tidy
. 有谁知道以clang-tidy
类似于ccache
使用常规编译器的方式加速的方法?
3 回答
我在这里发现了另一个重要的细节:
https://gitlab.kitware.com/cmake/cmake/-/merge_requests/1791/diffs
在这里使用:
https://reviews.bitcoinabc.org/D5150?id=15995
因此,为了能够在使用集成 clang-tidy 时缓存编译器的输出: set(CMAKE_CXX_CLANG_TIDY ...
方法你需要使用COMPILER_LAUNCHER方法来配置ccache
find_program(CCACHE ccache)
if(CCACHE)
set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE})
set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE})
endif(CCACHE)
而不是启动器规则方法:
find_program(CCACHE ccache)
if(CCACHE)
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ${CCACHE})
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ${CCACHE})
endif(CCACHE)
有clang-tidy-cache虽然我不知道它是如何与 ccache 一起工作的。
最后,我找到了一个解决方案:它将构建系统切换到bazel。bazel 是一个非常通用的构建系统,它定义了一个动作图。基本上每个动作都有一组输入和输出。根据输入,可以缓存输出。因此,bazel 从根本上解决了问题。
可以在此处找到以可缓存方式集成 clang-tidy 的必要规则:https ://github.com/erenon/bazel_clang_tidy
为了使用缓存,您需要设置远程缓存。这可以使用 docker-compose 脚本来完成。必要的 docker 容器已经存在。让它运行的命令可以在这里找到:https ://github.com/buchgr/bazel-remote/
最后,bazel还解决了链接阶段结果的缓存问题。
不仅如此,bazel 还允许构建其他语言,例如 java。因此,在复杂的项目中,它允许用单个构建系统替换所有其他构建系统。
最后,bazel 还允许在集群上并行构建。