sccache - 共有コンパイルキャッシュ チートシート
sccache は Mozilla によるコンパイラキャッシュ (ccache の精神で) で、Rust、C/C++、NVCC をサポートします。コンパイラをラップ、入力をハッシュ、同じコンパイルを前に見たときはキャッシュされたオブジェクトを返します。その区別される特徴は共有ストレージバックエンド — S3、GCS、Redis、Azure — では、チーム全体と CI フロートが 1 つのキャッシュを共有します。これで「CI がすべてをスクラッチから再コンパイル」から「CI がすでに構築したものをダウンロード」に変わります。
インストール
| 方法 | コマンド |
|---|
| Cargo | cargo install sccache --locked |
| macOS (Homebrew) | brew install sccache |
| バイナリ | GitHub リリースからダウンロード |
| 確認 | sccache --version |
Rust で使用
# ワンオフ
RUSTC_WRAPPER=sccache cargo build
# 永続的 (~/.cargo/config.toml の中)
[build]
rustc-wrapper = "sccache"
| 変数 | 目的 |
|---|
RUSTC_WRAPPER=sccache | rustc を sccache 経由でルーティング |
SCCACHE_DIR | ローカルキャッシュディレクトリ |
SCCACHE_CACHE_SIZE | 最大ローカルキャッシュサイズ (例: 20G) |
C/C++ で使用
# CMake
cmake -DCMAKE_C_COMPILER_LAUNCHER=sccache \
-DCMAKE_CXX_COMPILER_LAUNCHER=sccache ..
# Make
make CC="sccache gcc" CXX="sccache g++"
効果を確認
| コマンド | 表示内容 |
|---|
sccache --show-stats | ヒット、ミス、キャッシュサイズ、エラー |
sccache --zero-stats | テスト構築前にカウンターをリセット |
sccache --stop-server | バックグラウンドサーバーを停止 |
sccache --start-server | 明示的に開始 |
# コールド vs ウォーム構築を測定
sccache --zero-stats
cargo build --release
sccache --show-stats # ミスを期待
cargo clean && cargo build --release
sccache --show-stats # ヒットを期待
キー数はキャッシュヒット率。低率は通常、入力内の何かが変わっていることを意味します (フラグ、環境変数、絶対パス)。
共有クラウドバックエンド
# S3
export SCCACHE_BUCKET=my-build-cache
export SCCACHE_REGION=us-east-1
export AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=...
# Redis
export SCCACHE_REDIS=redis://cache.internal:6379
# GCS
export SCCACHE_GCS_BUCKET=my-build-cache
export SCCACHE_GCS_KEY_PATH=/path/to/key.json
| バックエンド | 環境接頭辞 |
|---|
| ローカルディスク | SCCACHE_DIR |
| S3 / S3 互換 | SCCACHE_BUCKET、SCCACHE_ENDPOINT |
| Redis | SCCACHE_REDIS |
| GCS | SCCACHE_GCS_* |
| Azure | SCCACHE_AZURE_* |
| GitHub Actions | SCCACHE_GHA_ENABLED=true |
CI パターン
# GitHub Actions
env:
SCCACHE_GHA_ENABLED: "true"
RUSTC_WRAPPER: "sccache"
steps:
- uses: mozilla-actions/sccache-action@v0.0.5
- run: cargo build --release
- run: sccache --show-stats
キャッシング破壊
| 原因 | 修正 |
|---|
| 出力の絶対パス | --remap-path-prefix を使用 |
変わる RUSTFLAGS | 実行全体でフラグを安定に保つ |
| インクリメンタルコンパイル | キャッシュ使用時に無効化 (CARGO_INCREMENTAL=0) |
| プロシージャマクロ/ビルドスクリプト | 常にキャッシュ可能ではない |
| 異なるコンパイラバージョン | キャッシュキーにコンパイラが含まれる |
sccache 対 代替案
| 側面 | sccache | ccache | Bazel/Buck |
|---|
| 言語 | Rust、C/C++、CUDA | C/C++ | 多数 (フルビルドシステム) |
| 共有キャッシュ | 組み込みクラウドバックエンド | ほぼローカル | リモートキャッシュ/実行 |
| セットアップ | ラッパー環境変数 | ラッパー | 新しいビルドシステムを採用 |
| 最適用途 | 既存構築の高速化 | C/C++ ローカルキャッシング | 大規模モノリポ |
mold とよくペアリングします — sccache はコンパイル時間を短縮、mold はリンク時間を短縮。
リソース