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或{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/

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1 基本用法 先看一下我们的例子 $ ls bar.c build.ninja foo.c out special...
    Little熊猫阅读 18,251评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,523评论 19 139
  • GN 使用gn编译项目的过程: 编写.gn文件模块化各个模块,分别写一个build.gn,添加进主目录的build...
    loick阅读 11,046评论 0 2
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,163评论 0 10
  • 1. file n. 文件;v. 保存文件2. command n. 命令指令3. use v. 使用用途4. p...
    喵呜Yuri阅读 4,110评论 0 4