ccacheでコンパイル結果をキャッシュして再ビルド処理を高速化

Last modified: 2020-10-18

ccacheとは

概要

  • ccacheはコンパイル結果を保存(キャッシュ)し、同じコンパイル処理を行ったときにそれを利用して、コンパイルを高速化するためのコマンド
  • カーネルのビルドやgit bisect実行時など、何度も同じコンパイル処理が発生する可能性のある場面では、2回目以降にビルド時間と消費電力を大きく節約できる
  • ディストリのパッケージとしてはccacheという名前でインストール可能

高速化されない場合

以下の場合はコンパイル処理は高速化されない。

  • 一度だけしかビルドしないプログラム
    • 恩恵がないだけでなく、余計な処理やキャッシュも無駄に増えてしまうので、一度しかそのプログラムをビルドしないと分かっている場合には使わないほうがよい
  • リンク処理でコンパイラのコマンドが呼ばれたとき
  • コンパイル時のオプションが変更された後(別のコンパイル処理として扱われる)
  • 使用するコンパイラやそのバージョンが変更された後(OSのアップグレード後などは注意)

Mesonビルドシステムにおけるccache

  • Mesonビルドシステムではシステムにインストールされている場合に検出され、自動的に有効になる
  • アンインストールせずに無効化したい場合はmesonコマンド実行時の環境変数CCCXXによりコンパイラのコマンド名を直接指定する
(ccacheがインストール済みのときにこれをビルドに使用しないための指定例)
$ CC="gcc" CXX="g++" meson ([options...]) [builddir]

インストール

ccacheという名前のパッケージを各ディストリのパッケージマネージャでインストールする。もちろん、別途コンパイラのパッケージも必要となる。

ccacheの使い方

既存のコンパイラのコマンド名を置き換えればよいのだが、2通りの方法がある。

環境変数の指定

ccache [コンパイラのコマンド名]で既存のコンパイラのコマンド名を置き換える方法。

automakeautoconfによるビルドシステム(シェルスクリプトconfigureが存在するもの)ではconfigureの実行時に環境変数CC(C言語)やCXX(C++言語)を指定する。

$ CC="ccache gcc" CXX="ccache g++" ./configure ([options...])

このビルドシステムでは、makeを実行する際に

$ make CC="ccache gcc" CXX="ccache g++"

のように後ろに記述してconfigure実行時に指定されたものから変更することも可能。

シンボリックリンクを使用

ディストリによって具体的な場所が異なるが

  • /usr/lib/ccache/
  • /usr/lib/ccache/bin/

などのディレクトリにはコンパイラのコマンド名と同じ名前でccacheの場所を指し示すシンボリックリンクが用意されており、これを実行することでもccacheが使用できる。

$ ls /usr/lib/ccache/bin/ -l
合計 0
lrwxrwxrwx 1 root root 15 2007-04-25 20:00 c++ -> /usr/bin/ccache
lrwxrwxrwx 1 root root 15 2007-04-25 20:00 g++ -> /usr/bin/ccache
lrwxrwxrwx 1 root root 15 2007-04-25 20:00 gcc -> /usr/bin/ccache
lrwxrwxrwx 1 root root 15 2007-04-25 20:00 x86_64-pc-linux-gnu-c++ -> /usr/bin/ccache
lrwxrwxrwx 1 root root 15 2007-04-25 20:00 x86_64-pc-linux-gnu-g++ -> /usr/bin/ccache
lrwxrwxrwx 1 root root 15 2007-04-25 20:00 x86_64-pc-linux-gnu-gcc -> /usr/bin/ccache

実際の使い方としては、環境変数PATHの先頭にこのディレクトリが来るようにする。

PATH=/usr/lib/ccache/bin:${PATH} make

この方法では、コンパイラを普通に使うのと同じ感覚でccacheが使える。

キャッシュデータの管理

キャッシュデータの保存場所

  • 既定では[ホームディレクトリ]/.ccache/以下にデータが保存される
  • 環境変数CCACHE_DIRを指定することで変更もできる
  • 後述の操作の際にもこの環境変数が参照される

キャッシュデータの統計情報の参照と削除

(統計情報の参照)
$ ccache -s

(統計情報の削除)
$ ccache -z

キャッシュデータの制限の設定と全削除

(全てのキャッシュを削除・-zと一緒に使うとよい)
$ ccache -C

(キャッシュのファイル数の制限・既定で無効・0で無効)
$ ccache -F 99999

(キャッシュの容量の制限・KiB/MiB/GiB指定可)
$ ccache -M 512M

その他、各種オプションや環境変数、より高度な使い方などはmanページを参照。