跳转至

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 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