2026年8月26日時点の結論は、compiler本体を読んだりデバッグしたり変更したりする場合だけbuild-mojoを選び、それ以外はprebuilt-mojoへ回すことです。Macのソースコードビルドについて公式なメモリ下限は公開されていないため、まず小さなビルドで実測し、安定しなければ高メモリのリモートMacへ切り替えるのが今週の推奨手順です。
この記事は、Apple Silicon MacでMojo compilerをステップ実行または改修する開発者、Bazel実行中にシステム終了やスワップ急増を経験したエンジニア、ローカルMacとリモートMacの開発環境を比較しているチーム責任者を対象にしています。
動手前の判断:全量ビルドが必要な範囲
Mojo 1.0のcompilerとtoolchainは、2026年8月18日にApache 2.0ライセンス(LLVM exceptionsを含む)で公開されました。公開されたことと、すべての利用者がcompilerをローカルで再構築すべきことは別です。開発者向けの判断材料は、公式のMojoオープンソース発表と、現在のmodularリポジトリに分けて確認します。
次の条件に当てはまる場合だけbuild-mojoを候補にします。
- compilerの解析、ステップ実行、コード生成のデバッグが必要です。
- compiler本体を変更し、ローカルの変更をビルド結果で検証します。
- Bazelのcompiler関連ターゲットを調査する必要があります。
標準ライブラリの変更、通常のMojoファイルの実行、一般的なサンプル開発では、まずprebuilt-mojoを使います。標準ライブラリを編集した場合でも、compiler本体を変更していないなら、直ちにcompiler全体を再ビルドするとは限りません。対象のビルド手順と依存関係を確認し、変更した層だけを検証する方が、時間とメモリの消費を抑えられます。
なお、現時点ではcompilerおよびtoolingへのコントリビューションは受け付けられていません。年末までに開放する計画は示されていますが、完了した事実ではないため、提出を前提に大規模な環境を準備する判断は避けます。
注意:Mojo開発の一般的なシステム要件にあるメモリ条件は、Apple Silicon Macでcompiler全量をビルドできる保証値ではありません。公式はMacのソースビルドに対する信頼できるメモリ下限を示していないため、容量を断定しないでください。
事前記録:Apple Silicon MacとBazelの基準線
最初に、Apple Silicon Macであること、macOSの要件、XcodeまたはCommand Line Toolsの状態をMojo公式のシステム要件と照合します。リポジトリのコミット、ブランチ、bazelwの実行可否も記録し、環境不足と資源不足を同じエラーとして扱わないようにします。Apple Silicon向けの開発環境を比較する場合は、Macのチップ世代と開発環境の確認記事も、端末選定時の補助資料になります。
ビルド開始前は、次の項目を保存します。
- macOS、XcodeまたはCommand Line Toolsのバージョン。
- リポジトリのコミットハッシュと変更状態。
- 利用可能なユニファイドメモリ、空きディスク容量。
- CPUやメモリを占有しているバックグラウンド処理。
- macOSのメモリプレッシャー、使用済みスワップ、Bazelのログ保存先。
メモリプレッシャーは、単純な空き容量ではなく、OSがメモリを維持する余裕を判断する材料です。確認方法はApple公式のアクティビティモニターメモリ説明に合わせます。空きディスクが少ない場合は、スワップや中間生成物の書き込みが失敗し、メモリ不足に見えることがあります。
最初のビルド:KGENで小さく再現する
いきなり全リポジトリのテストを実行するのではなく、公式の構築説明にあるKGEN関連のmojoターゲットを最初の検証対象にします。build-mojoの入口とターゲット名はリポジトリの変更で変わる可能性があるため、実行前に公式のビルド手順を確認してください。
実行は次の順序にします。
- リポジトリの状態を保存し、未コミットの変更を分離します。
./bazelwが動作することを確認します。- 公式手順にある
--config=build-mojoとKGENの最小ターゲットを実行します。 - 冷たい状態で、開始時刻、終了時刻、最大メモリプレッシャー、スワップ量、終了コードを記録します。
- 失敗した場合は、最初に終了したBazelアクションとログの末尾を保存します。
- 成功後、最小のMojoファイルを実行し、PATHやキャッシュ上の既存バイナリではなく、今回のビルド成果物を参照していることを確認します。
ここで重要なのは、ビルド時間だけを測らないことです。長時間動いていても、スワップが増え続けているなら、次の全量ビルドや並列テストで再現性を失う可能性があります。最小ターゲットで成功しても、compiler全体の安定性を意味しないため、冷たいビルドと増分ビルドを別の記録として扱います。
失敗の切り分け:Bazelの過剰並列とOS終了
「Mojo Bazelビルドがシステムによって終了した」という現象だけでは、原因をメモリ不足と断定できません。次の証拠を分けて確認します。
- システムメモリ圧力:アクティビティモニターでメモリプレッシャーとスワップが上昇し、プロセス終了の記録が残っています。
- Bazelの過剰並列:CPU使用率と同時実行アクションが高く、特定の並列度でだけ再現します。
- ディスク容量不足:空き容量が減り、テンポラリーファイルや中間生成物の書き込みで失敗します。
- 単一アクションの異常:並列度を下げても同じターゲットで停止し、Bazelログに特定アクションのエラーが残ります。
- ツールチェーン不足:Metal関連のツールやSDKの検出に失敗し、メモリプレッシャーが高くない状態でも終了します。
資源が原因なら、まずブラウザーや別のコンパイル、仮想マシンなどの同時負荷を止めます。そのうえでBazelのローカル並列度や利用可能リソースの指定を調整しますが、フラグ名と指定方法は公式Bazelコマンドラインリファレンスの現在の説明に従います。
同じ冷たいビルドを何度も失敗させ、スワップだけを増やして耐える方法は推奨しません。原因が並列度なら設定を下げて再試行し、ディスクやツールチェーンなら先に環境を直します。それでも複数回安定しない場合は、prebuilt-mojoまたは高メモリのリモートMacへ移す方が、原因調査の時間を管理しやすくなります。
MetalとMAX:compilerビルドとは別の経路
Metal toolchainの不足は、メモリ不足とは別の故障経路です。AppleのMetal開発者向け資料に沿って関連SDKとツールを確認し、メモリプレッシャー、終了情報、Bazelログのどれが異常を示しているかを分けます。
さらに、ローカルでビルドしたcompilerを使えばMAX向けターゲットも作れる、とは考えないでください。公式の構築説明では、MAXのkernelやmodelを変更する場合でも、現在はprebuilt-mojoが必要とされています。つまり、compiler本体を研究する経路と、MAXを開発する経路は同じ設定に統一できません。
判定時は、同じ最小サンプルを2つの経路で確認します。片方でbuild-mojoを使い、もう片方でprebuilt-mojoを使った後、実行ファイルの場所、PATH、Bazelキャッシュを記録します。キャッシュやPATHが混ざると、ローカルcompilerで検証したつもりが、既存のprebuiltバイナリを実行していたという誤判定が起きます。
長期運用:一週間分の再現性を残す
チームで継続するなら、成功したという一回限りの結果ではなく、同じ環境で再現できるかを評価します。最低限、コミットハッシュ、macOSとツールチェーンのバージョン、Bazel設定、ビルドターゲット、最大メモリプレッシャー、スワップ状態、終了コードを保存します。
標準ライブラリの変更だけならprebuilt-mojoを日常経路にし、compiler本体の変更がある作業だけbuild-mojoへ切り替える運用が合理的です。チーム内で端末を頻繁に切り替える場合は、環境を固定したリモートMacを共通ビルドノードにし、ローカルではprebuilt版を使う分業も候補になります。
選択表:ローカルMac、リモートMac、prebuilt-mojo
| 作業内容 | 推奨経路 | 主な確認点 | 切り替え条件 |
|---|---|---|---|
| compilerの読解・デバッグ | build-mojo |
最小ターゲット、ログ、成果物のPATH | 複数回の冷たいビルドで資源終了ならリモートMac |
| compiler本体の変更 | build-mojo |
コミット、終了コード、増分ビルド | ローカルで再現性が取れなければ高メモリ環境 |
| 標準ライブラリの開発 | 原則prebuilt-mojo |
変更層と依存ターゲット | compiler変更を伴う場合のみ再判定 |
| Mojoサンプルの実行 | prebuilt-mojo |
実行バイナリとPATH | prebuilt取得が失敗した場合に環境を確認 |
| MAX kernelまたはmodel | prebuilt-mojo |
公式のMAX制約、Metal環境 | ローカルcompilerへ置き換えない |
| 頻繁なチームビルド | リモートMac+prebuilt | 環境固定、ログ共有、権限 | 物理インターフェースが必要ならローカルを維持 |
次の条件分岐で、作業開始前の判断を固定します。
- compiler本体を読む、デバッグする、変更するなら、まず
build-mojoを選びます。 - 標準ライブラリ、サンプル、通常のMojo開発が中心なら、
prebuilt-mojoへ戻します。 - MAXのkernelまたはmodelが対象なら、
prebuilt-mojoを維持します。 - メモリプレッシャーが継続し、並列度を下げても冷たいビルドが安定しないなら、ローカルで粘らずリモートMacを検討します。
- MetalやSDKの検出エラーだけが出ているなら、メモリ増設ではなくツールチェーンを修正します。
- 物理ポートやローカル接続が必須なら、リモート環境へ移す前に要件を残します。
現在のMacで全量ビルドを続ける方法は、端末購入費だけでなく、失敗したビルドの待ち時間、スワップによる他作業の停止、チーム内で環境が揃わないコストも含めて判断します。反対に、長期的な高負荷ビルドを毎日行い、物理環境や固定ストレージが必要なら、Macを購入して専用ノードにする方がレンタルより適する場合もあります。
一方、現在の環境がメモリ圧力で頻繁に止まり、Bazelの調整後も再現性がなく、MAXや通常開発ではprebuilt版で足りるなら、ローカルMacを無理に使い続ける理由は薄くなります。JexMacのMacレンタルの料金と利用条件を確認し、必要な期間だけリモートMacで同じコミットを検証する方が、購入前の比較や一時的なcompiler調査では判断しやすいでしょう。環境を移す場合は、先にコミット、ツールチェーン、Bazelログをそろえ、同じ最小ターゲットで受け入れ確認を行うのが安全です。
メモリ負荷の高いビルドを専用Macへ移しませんか
JexMacなら、16GBメモリを備えた専用の物理Mac miniを、必要な期間だけ利用できます。