build.ninja 文件¶
build.ninja文件要有一个EOF文件结束标志,这意味着最后一行要有个空行,否则会报错:`unexpected EOF`
ninja 的基本由 3 种语句组成: 1. 变量定义:定义可以重复使用的变量 2. rule 规则:定义可以执行的命令 3. build 规则:定义生成的目标文件
ninja_required_version = 1.3
cflags=-o0 -Wall -Werror
rule cc
command = gcc $cflags -fpic -shared $in -o $out
build libmymath.so: cc mymath.cc
1 变量¶
- 语法:
- 变量定义:
变量名=value
- 变量使用:
$var
或者${var}
- 变量定义:
- 规则:
- 变量以字符展开,类似 c 中的宏展开。
- 变量值前后的空格将会忽略,即
var1 = A B
等价于var=A B
- 示例
cflags=-o0 -Wall -Werror
rule cc
command = gcc $cflags -fpic -shared $in -o $out
1.1 builddir¶
builddir 变量定义了 ninja 构建生成的日志文件的位置,如 builddir= build
,将会在当前目录下 build 目标存放.ninja_log 文件。
1.2 ninja 版本号¶
版本号变量名为 ninja_required_version
ninja_required_version = 1.1
2 rule 规则¶
Rule 规则声明命令行的短名称。它们以 rule 关键字和规则名称组成的行开始。然后跟随一组缩进的 variable = value
。
2.1 phony rule¶
作用和 make 中 .PHONY
一样。
1. 用于为其他目标创建别名,如 build foo: phony some/file/in/a/faraway/subdir/foo
2. 用于为构建时可能不存在的文件创建虚拟目标。
- 示例
rule touch
command = touch $out
build file_that_always_exists.dummy: touch
build dummy_target_to_follow_a_pattern: phony file_that_always_exists.dummy
3 build 表达式¶
- 语法:
build outputs: rulename inputs
build
是关键字outputs
是输出目标,类似 make 中的目标,由 rule 中的$out
变量接收rulename
是 rule 规则中定义的 rule 名inputs
是给 rule 的输入参数,由 rule 中的$in
变量接收
- build 表达式后面还能跟着一些
key = value
对,这可以重写 rule 中 command 行使用的变量。
cflags = -Wall -Werror
rule cc
command = gcc $cflags -c $in -o $out
## If left unspecified, builds get the outer $cflags.
build foo.o: cc foo.c
## But you can shadow variables like cflags for a particular build.
build special.o: cc special.c
cflags = -Wall
## The variable was only shadowed for the scope of special.o;
## Subsequent build lines get the outer (original) cflags.
build bar.o: cc bar.c
3.1 default 默认构建目标¶
- 语法:
default targets
default
:关键字targets
:目标名列表
- 规则:
- default 目标表达式需要放在 build 定义的目标之后,否则会报错
unknown target
- 如果不指定 default 或者 ninja 命令行不指定目标,默认会把所有 build 表达式执行,这和 make 只执行第一个目标不同
- default 目标表达式需要放在 build 定义的目标之后,否则会报错
- 示例
default foo bar
default baz
- 示例
ninja_required_version = 1.3
cflags=-o0 -Wall -Werror
rule cco
command = gcc $cflags -c $in -o $out
rule ccso
command = gcc $cflags -fpic -shared $in -o $out
build libmymath.so: ccso mymath.cc
build mymath.o: cco mymath.cc
default libmymath.so