Skip to content
Latchkey

Ninja vs Make: より速いインクリメンタルビルド?

Ninjaは、CMakeなどのツールによって生成されることを前提とした、ミニマルで非常に高速なビルドバックエンドです。Makeは手書きの定番ビルドツールです。

Ninjaは設計上あえて機能を絞っています。生成されたbuild.ninjaファイルを読み込み、依存グラフを可能な限り高速に実行し、起動が速く並列性にも優れています。Ninjaを手書きすることはめったになく、CMake、Meson、gnが生成します。Makeは人間が記述するもので、言語としてより多機能で普及していますが、大規模なグラフではインクリメンタルビルドがNinjaより遅いのが一般的です。

NinjaMake
記述方法生成される手書き
速度非常に高速大規模グラフでは遅い
言語機能設計上ミニマル豊富(関数、ルール)
一般的な組み合わせCMake / Meson単独または生成
最適な用途高速な生成ビルド手書きのビルドロジック

CIでの利用

CMakeやMesonで駆動される大規模なC/C++ビルドでは、Ninjaを生成することでMakeより高速なインクリメンタルビルドと優れた並列性が得られます。Makeは小規模ビルドや手書きビルドには依然として適しており、どこにでもプリインストールされています。実際には、多くのチームがCMake/Mesonを記述し、速度のためにNinjaを出力させています。

高速化する

ccache/sccacheでコンパイル済みオブジェクトを、build ディレクトリもキャッシュして、インクリメンタルビルドがウォームな状態で始まるようにします。どちらもCIランナー上で実行され、より高速なマネージドランナーはコンパイルとリンクのステップを短縮します。

結論

生成された大規模なC/C++プロジェクトをビルドし、最速のインクリメンタルビルドが欲しい場合: Ninja(CMakeまたはMeson経由)。ビルドロジックを手書きしたり小規模プロジェクトで作業する場合: Makeの方がシンプルで普遍的です。一般的なパターンはCMake/MesonがNinjaを生成する形です。

関連ガイド