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的方式定义,通过{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/

你可能感兴趣的:(Ninja编译介绍)