Ninja编译介绍

2021-12-12  本文已影响0人  技术笔记

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

基本概念

rule

rule name
    command = echo ${in} > ${out}
    var = str

由一个命令(command)和描述(description)参数(描述只是给人看的,所以你可以知道它在构建你的代码时在做什么)组成。

规则为命令行声明一个简短的名称。

他们由关键字rule和一个规则名称打头的行开始,然后紧跟着一组带缩进格式的 variable = value行组成。

变量

变量有两种,内置变量与自定义变量。 二者都可以通过var = str的方式定义,通过var或{var}的方式引用。

变量类型只有一种,那就是字符串。

内置变量

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/

上一篇 下一篇

猜你喜欢

热点阅读