Firefoxのビルドを17%速くする方法
概要
- 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がウォームビルドで他ツールを大きく引き離すことは明確