生きてるとプロダクトで 1ミリも知らない build.ninja
が現れて、それをなんとか読んだりすることもあると思う
そんなときのためにninjaについてメモっておく
# ファイルのコピー用ルール
rule copy
command = cat $in > $out
build file1 : copy file2
ninjaでは大体 rule
とbuild
を定義することでやっていく
あと、#
以降がコメントになる
build ${出力ファイル}... : ${つかうrule} ${入力ファイル}...
- 依存関係の定義
- つかうruleの定義
を行う
rule ${ルール名}
${なんかいろいろ設定1} = ${文字列1}
${なんかいろいろ設定2} = ${文字列2}
- 入力と出力に対し行う処理
- ほか色々
の設定を行う
cflags = -Wall
# C用ルール
rule cc
cflags = -Wall -Wextra
command = gcc $cflags -c $in -o $out
build foo.o: cc foo.c
ninjaには変数がある。定数と言ってもいいかもしれない
cflags =
や command =
の部分が変数の代入、
$cflags
$in
$out
の部分が変数の展開にあたる
同じ変数が複数ある場合、scopeが近い方が参照される
- if文は?
- 関数は?
- パターンマッチ(
%.c
)は? - サフィックスルールは?
無いよ。build.ninja
自動生成するレイヤーでどうにかして
makeででてきた
を行う
「出力するファイルが存在しないとき」もしくは「タイムスタンプが 出力するファイル < 入力するファイル」の時、buildを行う
入力するファイル についても何らかのbuild
が存在する場合、それについても再帰的に判断する