Ccache によるビルド高速化

Ccache によるビルド高速化#

Ccache は、C/C++ のコンパイル時に生成されるオブジェクトファイルをキャッシュして、同じ条件によるコンパイルの処理をなくすことにより、リビルドの時間を短くすることができるツールである。ソースコードと #include で読み込まれるヘッダの内容をもとにキャッシュを作るため、環境を作り直したりしてソースコードやヘッダのタイムスタンプが変化しても、ファイルの内容自体が変わっていなければキャッシュが使われるようになっている。そのため、CI における C/C++ のビルドを高速化するのに活用できる。

なお、今回試したコンパイル時間が長い numerical-collection-cpp リポジトリでは、リビルドを 40 倍高速化できた [1]

インストール方法#

Ubuntu 上では、apt install ccache コマンドでインストールできる。また、公式ホームページでは Windows 用のバイナリも用意されている。

設定#

ここで、今回 ccache を使用した際に調整した設定項目を列挙しておく。なお、いずれも環境変数で設定する。

CCACHE_DIR

キャッシュを保存するディレクトリ。

CCACHE_COMPILERCHECK

コンパイラが同一かどうかをチェックする方法を指定する。デフォルトではタイムスタンプが使用されるが、 Docker コンテナや CI 環境で使用する場合はタイムスタンプよりもコンパイラのバイナリによる比較を行う content の方が都合が良い。(Docker コンテナを作り直しても、コンパイラが完全に一致すれば同じコンパイラとして扱う。)

CMake への適用#

CMake でビルドを行う場合、 CMAKE_C_COMPILER_LAUNCHER, CMAKE_CXX_COMPILER_LAUNCHER という 2 つの変数に ccache コマンドを指定することで、 Ccache を適用できる。

Visual Studio の場合#

GCC, Clang を使用する場合は上記だけで良いが、 Visual Studio を使用する場合は少し工夫が必要となる。 CMake に指定する generator として Visual Studio を指定すると CMAKE_C_COMPILER_LAUNCHER, CMAKE_CXX_COMPILER_LAUNCHER の設定が無視される。しかし、以下の例のように Visual Studio のコンパイラの情報を読み込むスクリプトを実行してから generator として Ninja を指定して cmake コマンドを実行すると設定が反映される [2]

ci_win.cmd#
call "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\VC\\Auxiliary\\Build\\vcvarsall.bat" x86_x64

cmake .. ^
    -G Ninja ^
    -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ^
    -DCMAKE_TOOLCHAIN_FILE=..\vcpkg\scripts\buildsystems\vcpkg.cmake ^
    -DCMAKE_BUILD_TYPE=Release

cmake --build . --config Release --parallel

Caution

1 行目の処理は power shell でなくコマンドプロンプトを使用するバッチファイルにおいてしか実行できない。

Footnotes