sccache 一篇搞定:用编译器缓存把编译等待砍掉一半
【免费下载链接】sccacheSccache is a ccache-like tool. It is used as a compiler wrapper and avoids compilation when possible. Sccache has the capability to utilize caching in remote storage environments, including various cloud storage options, or alternatively, in local storage.项目地址: https://gitcode.com/GitHub_Trending/sc/sccache
如果你也受够了cargo build或cmake --build之后的漫长等待,sccache 就是为你准备的。这个编译器缓存工具挡在编译器和构建系统中间,同样的代码重新编译时,直接从缓存取结果。大项目里它能省下五成以上编译时间,CI 流水线同样受益。
为什么需要编译缓存
你有没有这种体验:改了一行代码,重新构建,又要盯着进度条。因为多数构建系统把每次编译都当"第一次"来做,解析、预处理、代码生成,全走一遍。可实际上,那 90% 的目标文件根本没变。
sccache 干的事,就是把编译结果做个哈希封装:源码内容、编译器版本、编译参数合在一起。下次同样的输入组合再来,它不重新编译,直接把结果交给你。它支持 C、C++ 和 Rust,也支持 S3、Redis 这类远端后端,缓存可以在多台机器间共享。对一天构建好几次的人来说,这就是"等"和"完"的区别。
一次装好,快速上手
10 秒选对安装路径
🧩 sccache 安装路径其实没几条,别看包管理器,看一个东西就行:谁来维护它。
macOS 上你只需要一条命令:brew install sccache。Homebrew 包维护得不错,这是最省心的路径。Windows 用scoop install sccache或choco install sccache,都是一条命令的事。Linux 先看你发行版有没有现成包(也有 snap 版本),没有的话直接拿预编译二进制丢进 PATH 就行。
想自己锁版本、或者只开特定云后端,就走源码编译,这条路径最可控:
cargo install sccache --locked没有 Rust 工具链就先装一个,跟着官方文档走即可。
装没装好,一条命令验证
✅ 能看到版本号,就算装好了:
sccache --version顺手把后台服务预热一下:sccache --start-server。其实 sccache 需要时会自动拉起服务,这一步只是给喜欢一次到位的人准备的。
真正要记的只有 3 个环境变量
🔑 sccache 配置项很多,官方文档里能翻出几十个(见完整配置说明),但日常真正要记的只有 3 个:
SCCACHE_DIR:缓存放哪。想把缓存挪到更快的盘或网盘,改它。SCCACHE_CACHE_SIZE:缓存上限,默认 10G。构建产物大就调大。SCCACHE_BASEDIRS:算哈希前把构建目录从路径里剥掉。不同检出目录、不同 CI 机器能共用一份缓存,是跨机器复用的关键。
前两个管"本地调优",第三个管"跨机复用",其余的用到再查。
把缓存接进你的构建系统
🎯 装好只是开始,下一步是让 sccache 站到编译器前面。按构建系统分三种接法:
Rust / Cargo 项目
Cargo 原生支持编译器包装器,指向 sccache 后,每次 rustc 调用都会被包一层。这也是 Rust 编译加速最直接的路径。写进项目的.cargo/config.toml,一次生效:
[build] rustc-wrapper = "sccache"注意:编译器版本变了不用慌,缓存键里带着版本信息,换工具链不会污染旧缓存。更多细节见 Rust 集成文档。
CMake 项目
CMake 3.4 起有原生的编译器启动器机制,CMake 编译缓存基本只需要 configure 时多传两个参数:
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=sccache -B build注意:MSVC 的 Debug 构建留意/Zi调试信息格式问题,新版 CMake 可用CMAKE_MSVC_DEBUG_INFORMATION_FORMAT处理。
Makefile 与其他传统构建
没有启动器机制的构建系统,最稳妥的办法是把 sccache 挂在编译器变量前面:
CC = sccache gcc CXX = sccache g++注意:autoconf 系项目同理,configure 时用CC="sccache gcc" ./configure覆盖即可。
怎么证明它真的在加速
📈 别信感觉,信数字。三步走:
- 清零基线:
sccache --zero-stats。 - 连续构建两次:第一次全是未命中,第二次应当全命中。
- 看统计确认:
sccache --zero-stats # 中间连续构建两次 sccache --show-stats看两个数:Hits 和 Misses。重复构建命中率能到八成以上,就说明缓存接对了。如果 Misses 一直在涨,先查两件事:编译路径变没变(SCCACHE_BASEDIRS就是治这个的),编译器版本变没变。
进阶场景(按需展开)
🚀 三个场景,用到哪个看哪个:
- 多机共享缓存:设
SCCACHE_REDIS_ENDPOINT或 S3 端点,缓存搬到远端后端,CI 跑机第一次未命中,第二台机器就能命中。细节看 分布式缓存文档。 - CI 容错:设
SCCACHE_IGNORE_SERVER_IO_ERROR=1,sccache 连不上服务时自动退回本地编译,不让构建失败。 - 排障:怀疑没命中说不清为什么时,把
SCCACHE_ERROR_LOG指到文件、SCCACHE_LOG=debug,服务日志一目了然。
别怕试错,缓存未命中最坏不过按老样子编译。现在就去跑一次sccache --show-stats,看看你上一次构建是不是真的走了缓存。
【免费下载链接】sccacheSccache is a ccache-like tool. It is used as a compiler wrapper and avoids compilation when possible. Sccache has the capability to utilize caching in remote storage environments, including various cloud storage options, or alternatively, in local storage.项目地址: https://gitcode.com/GitHub_Trending/sc/sccache
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考