概要
- buildcache は ccache や sccache と異なり、 Luaプラグインシステム を持つ
- WebIDLバインディング生成 のキャッシュ化が可能に
- ビルド時間 短縮を実現、特にウォームキャッシュ時に顕著
- 設定方法 や Luaラッパー 導入手順を解説
- 今後は他のコード生成ステップへの応用も期待
buildcacheのLuaプラグインによるWebIDLコード生成キャッシュ化
- buildcache は ccache や sccache と異なり、 任意コマンドのキャッシュ が可能な Luaプラグインシステム を搭載
- Bug 2027655 のマージにより、 FirefoxのWebIDLバインディングコード生成 ステップもキャッシュ対象に
- WebIDLステップ とは、python3 -m mozbuild.action.webidlを用いて、.webidlファイルからC++バインディングコードを自動生成する処理
- 生成物 はヘッダ、cpp、イベント実装など数千ファイル。出力は 入力が同じなら常に同一 となるためキャッシュに最適
- これまで コンパイラキャッシュ はこのステップに適用されていなかった
変更内容
- dom/bindings/Makefile.in で、条件付きで$(CCACHE)をpy_action呼び出しのラッパーに指定
- MOZ_USING_BUILDCACHEが有効な場合、webidlアクションがbuildcache python3 -m mozbuild.action.webidl ...の形で実行される
- これにより buildcache がこのコマンドを インターセプト 可能に
- ccacheやsccacheは 任意コマンドのキャッシュ機構を持たない ため、buildcache固有の対応
- Luaラッパー を利用し、WebIDLコード生成専用の処理を追加
Luaラッパー(webidl.lua)の仕組み
- mozbuild.action.webidl をコマンド引数から検出し、対象コマンドか判別
- 入力ファイル :全.webidlファイル、Pythonスクリプト(file-lists.json、codegen.jsonから取得)
- 出力ファイル :生成されたバインディングヘッダ、cpp、イベントファイル、状態ファイル(file-lists.jsonから取得)
- direct_mode を利用し、入力ファイルを直接ハッシュ化してキャッシュ判定
- キャッシュにヒットすれば 出力をリプレイ、ミスなら実コマンド実行後に結果を保存
ビルド時間比較
- Linux上での./mach buildによる比較
- ツール | コールド(初回) | ウォーム(キャッシュ有) | プラグイン有
- none | 5m35s | n/a | n/a
- ccache | 5m42s | 3m21s | n/a
- sccache | 9m38s | 2m49s | n/a
- buildcache | 5m43s | 1m27s | 1m12s
- webidl.luaラッパー有効時 はさらに15秒短縮し、 1m12s に
- ウォームキャッシュ時の改善幅 が大きく、編集-コンパイル-テストサイクルが大幅に短縮
セットアップ方法
- machとbuildcache を利用中の場合、Makefileの変更はcentral更新で反映
- Luaラッパー有効化手順
- buildcache-wrappersリポジトリをクローン
- ~/.buildcache/config.jsonのlua_pathsにパスを追加
- 例:
{ "lua_paths": ["/path/to/buildcache-wrappers/mozilla"], "max_cache_size": 10737418240, "max_local_entry_size": 2684354560 }
- 例:
- またはBUILDCACHE_LUA_PATH環境変数をmozconfigで設定
- 例: mk_add_options "export BUILDCACHE_LUA_PATH=/path/to/buildcache-wrappers/mozilla/"
- max_local_entry_size は大きなRustクレート対応のため2.5GB推奨
今後の展望
- Luaプラグインシステム の活用により、 他の決定的なビルドステップ にも同様のキャッシュ化を適用可能
- WebIDLラッパー はあくまで実証例。今後は他のPythonコード生成アクションへの展開を予定
- ビルド高速化 のさらなる可能性
備考
- 計測は単一マシン・単発実行であり、厳密なベンチマークではない点に注意
- 方向性としてbuildcacheがウォームビルドで他ツールを大きく引き離す ことは明確