https://ninja-build.org/

makeのようなmakeよりも軽いビルド支援ツール。高速で動き、他のビルドツールと連携を前提としたツール。Chromiumプロジェクトから生まれた。1つのファイルに変更を加えたときのビルドが遅すぎるので速くするしたかった。

ディレクトリのbuild.ninjaファイルを読み込みビルドする。

help

usage: ninja [options] [targets...]

if targets are unspecified, builds the 'default' target (see manual).

options:
  --version  print ninja version ("1.7.2")

  -C DIR   change to DIR before doing anything else
  -f FILE  specify input build file [default=build.ninja]

  -j N     run N jobs in parallel [default=6, derived from CPUs available]
  -k N     keep going until N jobs fail [default=1]
  -l N     do not start new jobs if the load average is greater than N
  -n       dry run (don't run commands but act like they succeeded)
  -v       show all command lines while building

  -d MODE  enable debugging (use -d list to list modes)
  -t TOOL  run a subtool (use -t list to list subtools)
    terminates toplevel options; further flags are passed to the tool
  -w FLAG  adjust warnings (use -w list to list warnings)

Makeとの比較

どちらもタイムスタンプをみてビルドを決めが、makeにはもっといろいろな機能があり、メイクファイルは人間が書くことを想定している。ninjaは上位ツール(ChromiumではGN)が複雑なbuild.ninjaファイルを書き、それを単純に実行する。

ninja実行時の挙動

  1. カレントディレクトリからbuild.ninjaを読み込む。build.ninjaはルールのリストを提供する。ルールは長いコマンドを短くした名前のこと。長いコマンドとはコンパイルコマンドのようなもの。

buildステートメントはプロジェクトの依存グラフを記述している。一方ruleステートメントは与えられたグラフのエッジのファイルを生成する方法を記述している。

サンプル.ninjaファイル

cflags = -Wall

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

build foo.o: cc foo.c

cflagsはグローバルの変数、$で参照する。変更は不可。 ccというルールを定義している。commandに値を設定して実行すべきコマンドを指定する。$inは入力ファイルに変換される(foo.c)。$outは出力ファイルに変換される(foo.o)。 buildステートメントは入力と出力の関係を記述している。

phonyルール

特別なルールであるphonyは他のターゲットのエイリアスとして使われる。

build foo: phony some/file/in/a/faraway/subdir/foo

長いパスがfooで表せる。

Page last modified on November 24, 2020, at 03:55 PM
Powered by PmWiki