コンテンツにスキップ

sccache - 共有コンパイルキャッシュ チートシート

sccache - 共有コンパイルキャッシュ チートシート

sccache は Mozilla によるコンパイラキャッシュ (ccache の精神で) で、Rust、C/C++、NVCC をサポートします。コンパイラをラップ、入力をハッシュ、同じコンパイルを前に見たときはキャッシュされたオブジェクトを返します。その区別される特徴は共有ストレージバックエンド — S3、GCS、Redis、Azure — では、チーム全体と CI フロートが 1 つのキャッシュを共有します。これで「CI がすべてをスクラッチから再コンパイル」から「CI がすでに構築したものをダウンロード」に変わります。

インストール

方法コマンド
Cargocargo 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=sccacherustc を 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_BUCKETSCCACHE_ENDPOINT
RedisSCCACHE_REDIS
GCSSCCACHE_GCS_*
AzureSCCACHE_AZURE_*
GitHub ActionsSCCACHE_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 対 代替案

側面sccacheccacheBazel/Buck
言語Rust、C/C++、CUDAC/C++多数 (フルビルドシステム)
共有キャッシュ組み込みクラウドバックエンドほぼローカルリモートキャッシュ/実行
セットアップラッパー環境変数ラッパー新しいビルドシステムを採用
最適用途既存構築の高速化C/C++ ローカルキャッシング大規模モノリポ

mold とよくペアリングします — sccache はコンパイル時間を短縮、mold はリンク時間を短縮。

リソース