Ninja ist ein Build-System, dessen oberstes Ziel Geschwindigkeit ist: Es baut nur das neu, was sich tatsächlich geändert hat — und das so schnell wie möglich. Entwickelt wurde Ninja von Evan Martin, die erste Veröffentlichung war 2012. Große Projekte wie Chromium, LLVM und viele CMake-basierte Projekte nutzen Ninja als Build-Backend.

Grundlagen

Ninja liest eine deklarative Beschreibung namens build.ninja: Regeln (rule) definieren, wie aus Eingaben Ausgaben entstehen; build-Anweisungen verdrahten konkrete Dateien mit einer Regel. Ninja verwaltet die Abhängigkeiten selbst und vergleicht Dateizeitstempel, um nur veraltete Ziele neu zu bauen.

rule cc
  command = gcc -c $in -o $out

build hello.o: cc hello.c

Wichtige Ninja-Befehle

  • ninja — baut die Standardziele (bzw. ninja ziel ein bestimmtes Ziel)
  • ninja -j 16 — parallele Jobs; -k n weiterbauen trotz Fehlern
  • ninja -v — ausführliche Ausgabe der Kommandos
  • ninja -d explain — zeigt, warum ein Ziel neu gebaut wird
  • ninja -C verzeichnis — im angegebenen Verzeichnis bauen
  • ninja -t clean — Ausgaben löschen; -t targets Ziele auflisten; -t commands Kommandos zeigen; -t query ziel Abhängigkeiten anzeigen; -t graph als DOT-Graph; -t compdb compile_commands.json erzeugen

Typische Elemente in build.ninja

  • build ausgabe: regel eingabe1 eingabe2 — Grundform jeder Kante
  • Implizite Abhängigkeiten per |, Nur-Reihenfolge-Abhängigkeiten per ||
  • depfile in der Regel — nutzt Compiler-Header-Dependencies
  • pool console — begrenzt Jobs und erlaubt direkte Terminalausgabe
  • default ziel — Standardziele; build name: phony abhängigkeit — Aliase

Praxis: Generatoren

Ninja wird kaum von Hand geschrieben, sondern von Konfigurationswerkzeugen erzeugt: CMake mit cmake -G Ninja und Meson nutzen Ninja als Backend. Damit kombiniert man die bequeme Konfiguration von CMake mit der Geschwindigkeit von Ninja. Klassische Makefiles werden so zunehmend abgelöst — auch wenn das Make-Ökosystem mit Autotools (m4) historisch die Basis bildet.

Praxis-Tipps

  • Kein eigenes Konfigurationssystem: Ninja ist bewusst minimal und verlässt sich auf Generatoren.
  • Bei inkrementellen Problemen hilft ninja -d explain, die Neubau-Entscheidung nachzuvollziehen.
  • Wie HCL für Terraform ist Ninja ein schlankes Zielformat, das von mächtigeren Werkzeugen erzeugt wird.