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 zielein bestimmtes Ziel)ninja -j 16— parallele Jobs;-k nweiterbauen trotz Fehlernninja -v— ausführliche Ausgabe der Kommandosninja -d explain— zeigt, warum ein Ziel neu gebaut wirdninja -C verzeichnis— im angegebenen Verzeichnis bauenninja -t clean— Ausgaben löschen;-t targetsZiele auflisten;-t commandsKommandos zeigen;-t query zielAbhängigkeiten anzeigen;-t graphals DOT-Graph;-t compdbcompile_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|| depfilein der Regel — nutzt Compiler-Header-Dependenciespool console— begrenzt Jobs und erlaubt direkte Terminalausgabedefault 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.