Ninja编译介绍
因为webrtc是用ninja编译的,所以学习了下Ninja。
Ninja是一种类似GNU make的编译系统。 就像make有Makefile,它也有自己的编译配置文件。 相对来说,Ninja文件没有分支、循环的流程控制,本质上就是纯粹的配置文件,所以要比Makefile简单得多。
读音:ning者,ning是一声,找不到合适的一声ning字注音,所以用拼音,者是三声。
一个简单的例子
cc=gcc cflags= -g -c
rule cc
command = $cc $cflags $in -o $out
rule link
command = $cc $in -o $out
rule cleanup
command = rm -rf *.exe *.o
build func.o : cc func.c
build main.o : cc main.c
build app.exe : link main.o func.o
build all: phony || app.exe
build clean: cleanup
基本概念
- edge 边,即build语句,指定目标(输出)、规则与输入,是编译过程拓扑图中的一条边(edge)。
- targe 目标,编译过程需要产生的目标,由build语句指定。
- output 输出,build语句的前半段,是target的另一种称呼。
- input 输入,build语句的后半段,用来产生output的文件或目,标,另一种称呼是依。
- rule 规则,通过指定command与一些内置变量,决定如何从输入产生输出。
- pool 池,一组rule或edge,通过指定其depth,可以控制并行上限。
- scope 作用域,变量的作用范围,有rule与build语句的块级,也有文件级别。rule也有scope。
rule
rule name
command = echo ${in} > ${out}
var = str
由一个命令(command)和描述(description)参数(描述只是给人看的,所以你可以知道它在构建你的代码时在做什么)组成。
规则为命令行声明一个简短的名称。
他们由关键字rule和一个规则名称打头的行开始,然后紧跟着一组带缩进格式的 variable = value行组成。
变量
变量有两种,内置变量与自定义变量。 二者都可以通过var = str的方式定义,通过 v a r 或 var或 var或{var}的方式引用。
变量类型只有一种,那就是字符串。
内置变量
- builddir 指定一些文件的输出目录。
- ninja_required_version 指定ninja命令的最低版本。
- command 定义一个规则所必备的变量,指定实际执行的命令。
- description command的说明,会替代command在无-v时打印。
- generator 指定后,这条rule生成的文件不会被默认清理。
- in 空格分割的input列表。
- in_newline 换行符分割的input列表。c
- out 空格分割的output列表。
- depfile 指定一个Makefile文件作为额外的显式依赖。
- deps 指定gcc或msvc方式的依赖处理。
build
build foo: phony bar
var = str
foo就是output,bar就是input,:后面第一个位置的phony就是rule,var就是自定义变量。
pool
pool的意义,在于限制一些非常消耗硬件资源的edge同时执行。
pool example
depth = 2
rule echo_var
command = echo ${var} >> ${out}
pool = example
通过pool = example,在rule或build代码块中指定对应的edge所属的pool为example。 由于example的depth = 2,所以a、b、c三个target最多只有2个可以同时生成。
目前,Ninja只有一个内置的pool,名为console。 这个pool的depth等于1,只能同时执行1个edge。 它的特点是,可以直接访问stdin、stdout、stderr三个特殊stream。
参考
https://note.qidong.name/2017/08/ninja-syntax/
更多推荐
所有评论(0)