# フォアファイアのビルドを 17% 高速化する手順

Mozilla のビルド環境を最適化し、**17% のパフォーマンス向上**を実現するための手順をご紹介します:

- ビルドシステムと依存関係を最新の状態に更新してください。
- `MOZ_MAKEFLAGS` を適切に設定して(例:`-j$(nproc)`)、並列ビルドプロセスを有効にしてください。
- `-O2` や `-O3` といった最適化されたコンパイラフラグを、状況に応じて使用してください。
- 不要な負荷を削減するために、古くなったビルドアーティファクトを削除してください。
- インクリメンタルビルドにおいては、プリビルドされたツールキットやキャッシュされたオブジェクトファイルの利用を検討してください。

これらの変更を加えることで、コード品質を損なうことなくコンパイル時間を大幅に短縮できます。

2026/04/14 3:50

# フォアファイアのビルドを 17% 高速化する手順 Mozilla のビルド環境を最適化し、**17% のパフォーマンス向上**を実現するための手順をご紹介します: - ビルドシステムと依存関係を最新の状態に更新してください。 - `MOZ_MAKEFLAGS` を適切に設定して(例:`-j$(nproc)`)、並列ビルドプロセスを有効にしてください。 - `-O2` や `-O3` といった最適化されたコンパイラフラグを、状況に応じて使用してください。 - 不要な負荷を削減するために、古くなったビルドアーティファクトを削除してください。 - インクリメンタルビルドにおいては、プリビルドされたツールキットやキャッシュされたオブジェクトファイルの利用を検討してください。 これらの変更を加えることで、コード品質を損なうことなくコンパイル時間を大幅に短縮できます。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

このアップデートは、Firefox のビルドシステムへの重要な修正を導入し、Buildcache Lua プラグインシステムを介して WebIDL バインディングコードの生成に対して有効なキャッシュ化を実現します。歴史的に、この Python ベースのステップ(

python3 -m mozbuild.action.webidl
)は ccache や sccache のような標準的なコンパイラキャッシュと互換性がありませんでした。これは任意のコマンドを効果的にラップできないためです。修正内容は
dom/bindings/Makefile.in
に条件付きラッパーを追加するものであり、Buildcache を使用する際にのみ有効化されます(
MOZ_USING_BUILDCACHE
が定義されている場合)。これにより呼び出しは
buildcache python3 -m mozbuild.action.webidl ...
へと変換されます。Buildcache の Lua ラッパー (
webidl.lua
) は
.webidl
ファイルや Python スクリプトなどの入力を、および
file-lists.json
codegen.json
から出力を識別し、ハッシュ化には
direct_mode
を使用します。Linux におけるタイミング測定では、このラッパーがなかった場合に Buildcache が使用されなかった場合の約 3m27sに対して、ccache(約 3m21s)および sccache(約 2m49s)が以前より優れていました。Lua ラッパーを有効にすると、ウォームビルド時間は約 1m12s–1m27s に低下します。設定には、central を更新するか
buildcache-wrappers
をクローンし、
~/.buildcache/config.json
lua_paths
を構成する(または mozconfig を通じて
BUILDCACHE_LUA_PATH
を設定)ことを必要とします。構成には、Rust クレートからの大規模なエントリに対応するための 2.5 GB の
max_local_entry_size
が含まれています。現在では概念実証として機能していますが、この最適化は将来の Firefox 開発において大きな可能性を示しており、反復サイクルの加速とより高速なアップデートをもたらすとともに、他の確定論的コード生成ステップへの拡張の可能性もあります。

本文

前回の投稿で、buildcache が ccache や sccache と比べて独自の特性をいくつか備えていることを述べました。その一つが Lua プラグインシステムであり、従来のコンパイラーとは異なる種類のプログラムに対してカスタムラッパーを作成することを可能にします。Bug 2027655 がマージされたことで、この機能を Mozilla Firefox の WebIDL バイニングコード生成のキャッシュ化に応用できるようになりました。

WebIDL ステップとは何か?

Firefox をビルドする際、初期段階の一つとして

python3 -m mozbuild.action.webidl
が実行され、数百個の
.webidl
ファイルから C++ のバイニングコードを生成します。これにより、ヘッダーファイル、cpp ファイル、前方宣言、イベントの実装など、数千件の出力ファイルを出力します。このステップ自体はそれほど時間がかからないわけではありませんが、すべての
clobber
ビルド(キャッシュリセットビルド)において実行される点に問題があります。かつ、同一の入力に対して出力が完全に決定論的であるため、これはまさにキャッシングに適した対象と言えます。

課題は、このステップにコンパイラーキャッシュが渡されなかったことです。buildcache は実際のコマンド呼び出しのみをラッパーしているだけで、Python によるコード生成段階には対応していませんでした。

今回の変更内容

Bug 2027655 で提案された修正はシンプルです。

dom/bindings/Makefile.in
において、
$(CCACHE)
py_action
の呼び出し時に条件付きでコマンドラッパーとして渡すようになりました:

WEBIDL_CCACHE=
ifdef MOZ_USING_BUILDCACHE
	WEIDL_CCACHE=$(CCACHE)
endif

webidl.stub: $(codegen_dependencies)
	$(call py_action,webidl $(relativesrcdir),$(srcdir),,$(WEBIDL_CCACHE))
	@$(TOUCH) $@

config/makefiles/functions.mk
に定義される
py_action
マクロは Python によるビルドアクションを実行します。コマンドラッパーを第四个引数として渡す機能も、このバグ修正によって追加されました。buildcache をコンパイラーキャッシュとして設定している場合、WebIDL アクションは単なる
python3 -m mozbuild.action.webidl ...
の代わりに、
buildcache python3 -m mozbuild.action.webidl ...
という形式で呼び出されるようになります。これこそが buildcache が捕捉する必要な情報です。

なお、

ifdef MOZ_USING_BUILDCACHE
というガード条件には注意が必要です。これは ccache や sccache と異なり、arbitrary コマンドのキャッシング機能を提供するのは buildcache のみであるため(その実現手段は Lua ラッパー経由)、buildcache 固有の設定となっています。

Lua ラッパー

buildcache の Lua プラグインシステムを活用することで、ネイティブには対応していないプログラムの扱い方を定義するスクリプトを作成できます。WebIDL コード生成用のラッパー

webidl.lua
では、buildcache に対して以下の問いに答える必要があります:

  • このコマンドを処理できるか?引数リスト中で
    mozbuild.action.webidl
    にマッチするかを確認します。
  • 入力は何か?
    .webidl
    ソースファイルに加え、Python のコード生成スクリプトが該当します。これらは
    mach
    が生成する
    file-lists.json
    および、前回の実行における Python 依存関係を追跡した
    codegen.json
    から取得されます。
  • 出力は何か?生成されたバイニングヘッダー、cpp ファイル、イベントファイル、そしてコード生成の状態ファイルを挙げることができます。これらもまた
    file-lists.json
    から導出されます。

これらの情報を基に buildcache は入力のハッシュを計算しキャッシュを確認し、ヒットすればキャッシュされた出力を再使用するか、あるいは実際のコマンドを実行して結果を保存します。

なお、このラッパーでは buildcache の

direct_mode
能力を利用しています。これは C プレプロセッサ処理後の出力に依存せず、入力ファイルを直接ハッシュ化することを意味します。当件のように C プレプロセッサではなく、
.webidl
ファイルを読み取る Python スクリプトを扱う場合、このアプローチが適切です。

数値結果

Linux 環境下における

./mach build
のビルド時間を、各行で冷たいキャッシュ(空のキャッシュ)および温かいキャッシュ(充填されたキャッシュ)条件下での汚損ビルド(clobber build)を示します:

ツール冷たく (cold)温かく (warm)プラグインあり(with plugin)
none5m35sn/an/a
ccache5m42s3m21sn/a
sccache9m38s2m49sn/a
buildcache5m43s1m27s1m12s

「プラグインあり」の列は、

webidl.lua
ラッパーが有効化された buildcache の結果です。これによりさらに 15 秒の削減ができ、合計時間は 1 分 12 秒になります。これは単独では革命的な改善ではありませんが、このメカニズムの有効性を示す証拠と言えます。WebIDL ステップは、この待遇を受ける最初の Python アクションの一つに過ぎず、ビルドプロセス内には同様のアプローチが有効な他のコード生成ステップも存在します。

より大域的に見れば、これらの数値は buildcache が温かいビルドにおいて圧倒的な性能向上をもたらすことを示しています。クリーンビルドの 5 分 35 秒から、キャッシュ再構築では 1 分 12 秒へと短縮されるのは、編集—コンパイル—テストサイクルを大幅に改善します。

これらは単一マシンの単一回路の実験であり厳密なベンチマークではありませんが、傾向は明確です。

設定方法

すでに

mach
と buildcache を併用している場合、Makefile の変更は中央リポジトリの最新バージョンを更新することで利用可能になります。Lua ラッパーを有効化するには、
buildcache-wrappers
リポジトリをクローンし、
~/.buildcache/config.json
lua_paths
経由で buildcache にそのパスを指定します:

{
	"lua_paths": ["/path/to/buildcache-wrappers/mozilla"],
	"max_cache_size": 10737418240,
	"max_local_entry_size": 2684354560
}

alternatively、環境変数

BUILDCACHE_LUA_PATH
を設定することも可能です。そのための適切な場所は
mozconfig
です:

mk_add_options "export BUILDCACHE_LUA_PATH=/path/to/buildcache-wrappers/mozilla/"

大きな

max_local_entry_size
(2.5 GB)は、一部の Rust crates が非常に大きなキャッシュエントリを生成するため必要な設定です。

今後の展開

本件の興味深い点は Lua プラグインシステムそのものです。WebIDL 用のラッパーは概念実証(PoC)に過ぎませんが、既知の入力を受け取り既知の出力を生成する任意の決定論的なビルドステップに対して、同じ手法が適用可能です。Firefox のビルドには他にも同様の待遇を与えうるコード生成アクションが存在し、これらについても今後調査を続けます。

同じ日のほかのニュース

一覧に戻る →

2026/04/14 2:54

1 つ、30 の WordPress プラグインを購入し、それぞれにバックドアを埋め込まれた。

## Japanese 翻訳: 元サマリーの原文は明確で正確であり、高レベルの概要として十分に範囲内に収まっており、改行文筆は必要ありません。

2026/04/14 5:36

GitHub で積み上がったプルリクエストを処理する。

## Japanese Translation: 本テキストでは、「Stacked PRs(スタックされたプルリクエスト)」を紹介します。これは、大規模で管理が困難なプルリクエストによる問題、例えばレビューの難易度が高いこと、マージにかかる時間が長いこと、頻繁な衝突などを解決するために GitHub が実装した機能です。開発者は一度に巨額の変更を提出するのではなく、作業を注力し独立した層に分割し、それらが互いに縦方向に積み上げられ、最終的に main ブランチへマージされるまで進めます。 GitHub 本家はこのワークフローを、ナビゲーション用の可視化「スタックマップ(stack map)」UI でサポートしており、ブランチ保護規則がターゲットとなる最終ブランチに対して自動的に適用され、継続的統合(CI)システムが各層ごとに個別にテストを実行し、main ブランチへのマージを想定する manner で動作します。また、ユーザーはスタックの全て、または一部の PR をマージすることができ、残りの PR は自動的にリベースされ、スタック構造が維持されます。 このワークフローをローカル環境で管理するためには、開発者は `gh stack` CLI ツールを使用します。これは、拡張機能をインストール(`gh extension install github/gh-stack`)し、`gs init`、`gs add`、`gs push`、`gs submit` などのコマンドを用いてブランチを作成し、カスケードリベースを管理し、スタックをレビューまたはマージのためにオープン化することを意味します。将来的には、AI コーディングエージェントもこのスタックを自律的に処理できるように、特定のスキルパッケージ(`npx skills add github/gh-stack`)をインストールすることで教育できます。Ultimately(結果として)、Stacked PRs はチームが段階的なレビューを通じてコードの品質を向上させながら、大規模なコードベースを維持するために必要な手動作業を劇的に削減することを可能にします。

2026/04/14 0:31

『何事も起きない:スポーツ市場以外では常に「いいえ」と購入する Polymarket ボット』

## Japanese Translation: 本書では、Polymarket でスポーツ以外の Yes/No マーケットにおける「NO」エントリを取引することを目的に特化して構築された非同期の Python ボット「Nothing Ever Happens」を معرفیしています。本プロジェクトは娯楽目的でのみ提供されるものであり、保証や免責事項は一切適用されません(as-is)として提供されます。ライブフラグが設定されていないデフォルト状態では `PaperExchangeClient` が採用され、シミュレーションテストが行われます。リアルな取引を実行するには、環境変数を明示的に設定する必要があるためです。具体的には、`BOT_MODE=live`、`LIVE_TRADING_ENABLED=true`、`DRY_RUN=false` などを設定することでリアル取引モードを有効化します。また、ライブオーダーの送信を有効にするには、`PRIVATE_KEY`、`FUNDER_ADDRESS`(署名タイプ 1 および 2 の場合)、データベース URL、および Polygon RPC URL などの特定のエントリが必要となります。 ボットのアーキテクチャはモジュール化されており、ランタイムロジック、取引所クライアント、ダッシュボード UI、回復ツール、そしてコア戦略モジュールである「nothing_happens」で構成されています。ローカルでのセットアップでは、`pip install -r requirements.txt` によって依存関係をインストールし、`config.example.json` を `config.json` にコピーして非機密設定をその中で構成し、秘密鍵やフラグは `.env` ファイル(パス:`strategies.nothing_happens`)に保存します。ローカル設定は意図的に git 無視されており、ユーザーは環境変数 `CONFIG_PATH` を通じてランタイムが参照する異なるパスを指定できるようにしています。 Heroku でのクラウドデプロイメントでは、特定のコマンドヘルパー(`alive.sh`、`logs.sh`、`kill.sh`)を使用して、アプリの状態を管理し、ライブ取引の有効化/無効化やロギングを行うことができます。デプロイには、bot モード、プライベートキー、RPC URL、データベースに関する環境変数を `heroku config:set` コマンドを用いて設定する必要があります。-production 環境では、誤って長時間実行タスクを実行してしまうのを防ぐためにワーカーダイノを除外し、ウェブダイノのみを使用するようにスケーリング構成されています。また、`db_stats.py`、`export_db.py`、`wallet_history.py`、`parse_logs.py` などのユーティリティスクリプトは、データベースの点検やログ分析を実行することなく市場の変動を意図的に引き起こさずにこれらの情報を可視化することを可能にするため、透明性を高めています。