sccache 编译器缓存指南:3分钟装好,重复编译直接跳过
【免费下载链接】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
sccache 是一款类 ccache 的编译器缓存工具。它作为编译器的前置包装器,能跳过重复编译,把结果存到本地磁盘或远程存储,再按需取回。下面的内容只讲两件事:怎么最快装好,怎么真正让缓存生效。
3分钟快速上手 🚀
每个平台一条命令,装完跑一遍sccache --version就算通过。
Linux(需要 Rust 工具链):
cargo install sccache --locked sccache --versionmacOS(Homebrew):
brew install sccache sccache --versionWindows(Scoop 或 Chocolatey 二选一):
scoop install sccache sccache --version✅ 看到版本号输出,就说明装好了,后面所有配置都建立在这一步之上。
选哪种安装方式
别纠结装法,按你的场景对号入座就行:
| 场景 | 推荐方式 | 一句话理由 |
|---|---|---|
| 日常开发 | 包管理器(brew / scoop / cargo install) | 一条命令搞定,升级也方便 |
| CI 流水线 | 包管理器 + 固定缓存目录 | 环境干净,配合缓存持久化命中率最高 |
| 企业受管机器 | 源码编译后走内部分发 | 无外部依赖,符合管控要求 |
| 离线环境 | 有网机器上先cargo build --release,把产物拷过去 | 离线机装不了包管理器 |
提示:源码编译只选需要自定义特性或受限环境时才做,普通场景没必要。各编译器的支持范围可以看 src/compiler/ 目录,里面每种编译器一个文件。
构建系统对接
Rust(Cargo)
Cargo 提供了RUSTC_WRAPPER钩子,指给 sccache 即可。之后每次cargo build都会自动走缓存,不用改任何构建脚本。
export RUSTC_WRAPPER=sccache cargo build --release sccache --show-stats长期项目可以写进项目的.cargo/config.toml,就不用每次 export 了。详见 docs/Rust.md。
CMake
CMake 3.4 起支持编译器启动器,configure 时加两个参数就行。MSVC 用户注意把调试信息设为 Embedded(/Z7),否则 PDB 缓存会失效。
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \ -DCMAKE_CXX_COMPILER_LAUNCHER=sccache -B build想写进工程,就在 CMakeLists.txt 里find_program后设置同样的 launcher 变量。
Makefile
Makefile 没有原生钩子,把编译器变量包一层 sccache 是最直接的办法。这样每个目标文件的编译都会经过缓存。
CC = sccache gcc CXX = sccache g++Autotools 同理,exportCC/CXX再跑./configure即可。
让缓存真正生效 📊
核心变量就下面几个,集中记这一张表,其他地方不用再重复:
| 变量 | 作用 | 示例值 |
|---|---|---|
SCCACHE_DIR | 本地缓存目录 | ~/.cache/sccache |
SCCACHE_CACHE_SIZE | 本地缓存上限,默认 10G | 20G |
SCCACHE_DIRECT | 开启预处理器级直接缓存,速度更快 | true |
SCCACHE_ERROR_LOG | 错误落盘到文件,便于排查 | /tmp/sccache.log |
SCCACHE_LOG | 日志级别,排查时开debug | debug |
RUSTC_WRAPPER | 让 Cargo 把编译交给 sccache | sccache |
两个进阶项各一句话带过:团队共享缓存可指向 Redis 或 Memcached(SCCACHE_REDIS_ENDPOINT、SCCACHE_MEMCACHED_ENDPOINT),S3/GCS/Azure 等云存储也在 docs/Configuration.md 中列全;CI 只读复用已有缓存时,把对应后端的RW_MODE设为READ_ONLY即可。
踩坑与排查 ⚠️
Q1:缓存不命中,总是重新编译,怎么办?先确认编译真的走了 sccache(Cargo 查RUSTC_WRAPPER,CMake 查 launcher 参数)。然后检查路径、编译参数、工具链版本是否和上次一致,任何一项变了都会生成新缓存键。
Q2:CI 里缓存目录应该放哪?别放构建目录里,否则每次构建完就被清掉。放在 CI 提供的可持久化缓存路径,并用SCCACHE_DIR指过去,命中率立刻上来。
Q3:构建时提示连不上 sccache 服务器,直接失败了?sccache 默认在通信失败时让构建失败。想在断线时自动退回本地编译,设置SCCACHE_IGNORE_SERVER_IO_ERROR=1就行。
Q4:Windows 上 MSVC 调试符号缓存不了?把 CMake 的调试信息格式改成 Embedded(即/Z7)并启用 CMP0141 新策略,/Zi的分离 PDB 是无法缓存的。
Q5:想确认缓存到底有没有在工作?跑一次构建后执行sccache --show-stats,看 cache hits / misses 即可;想从零统计就先sccache --zero-stats。
sccache 的使用就到这里:装好、接进构建系统、用--show-stats验证命中,三步闭环。更多细节按需查阅 docs/Local.md、docs/Configuration.md 和 docs/Rust.md。
【免费下载链接】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),仅供参考