ninja build系统介绍

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ninja build系统介绍相关的知识,希望对你有一定的参考价值。

参考技术A 1 基本用法

先看一下我们的例子

$ ls

bar.c build.ninja foo.c out special.c

Build.ninja文件的内如如下:

cflags  =  -Wall

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

# 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

build foo :  phony out/build.ninja

执行编译命令:

$ ninja -f build.ninja

[3/3] gcc -Wall -c foo.c -o foo.o

foo.c: In function ‘main’:

foo.c:4: warning: control reaches end of non-void function

[3/3] gcc -Wall -c special.c -o special.o

special.c: In function ‘main’:

special.c:4: warning: control reaches end of non-void function

[3/3] gcc -Wall -c bar.c -o bar.o

bar.c: In function ‘main’:

bar.c:4: warning: control reaches end of non-void function

最后按照规则生成三个.o文件

ninja$ ls

bar.c bar.o build.ninja foo.c foo.o out special.c special.o

2 More details

1. phony: 主要是用来创建给目标创建别名

build foo: phony some/file/in/a/faraway/subdir/foo

比如在android out目录下的combined-sp9850ka_1h10_native.ninja

builddir = out

include out/build-sp9850ka_1h10_native.ninja

include out/soong/build.ninja

build out/combined-sp9850ka_1h10_native.ninja: phony out/soong/build.ninja

如下面我们的例子

build bar.o: cc bar.c

build test_phony: phony

build all: phony test_phony bar.o

当我们执行ninja all的时候,bar.o和test_phony build被执行。

2 default

build test_phony: phony

build all: phony test_phony bar.o

default all

当执行ninja –f build.ninja不指定目标的时候,默认编译default下的规则

3 ninja log

在当前的编译目录下存放这.ninja_log

4 depfile

rule cc

depfile = $out.d

command = gcc -MMD -MF $out.d [other gcc flags here]

--MMD 告诉gcc output header dependencies, -MF 告诉在哪写入这些dependencies

5 deps

rule g.cc.aidl

command = $g.cc.aidlCmd -d$out.d -ninja $aidlFlags $in $outDir $out

depfile = $out.d

deps = gcc

deps=gcc 输出gcc-style dependencies

6 词法语法

$ followed by a newline

行连接符,同shell中的\

$ followed by text

如$g.bootstrap.srcDir/Android.bp | $builder 变量 |后面是编译规则

$varname

同 $变量

$ followed by space

后面跟着一个空格,表示一个空格

$:

表示一个:

$$

表示一个$符号

7 其他语法 的使用详见: https://ninja-build.org/manual.html#_the_literal_phony_literal_rule

[openharmony]liteos-a系统编译之ninja

参考技术A 在 文章 中已经分析openharmony的小型系统(liteos-a)编译过程,最主要的就是调用gn/ninja/makefs三个命令最终生成可烧录的镜像文件
在 文章 详细介绍了liteos-a系统编译时gn命令的原理,本文中针对liteos-a编译时ninja的使用做一些详细说明
通过前面文章中可以看到调用的ninja命令如下

ninja工具源码及文档路径为 https://github.com/ninja-build/ninja
网上也有很多中文版的资料,如 Ninja - chromium核心构建工具

类似gn工具需要在根目录下有一个.gn以及BUILD.gn文件,ninja工具运行需要根目录下有一个build.ninja文件,也即ninja编译规则的入口,此文件所在路径可以通过选项 -C dir 来指定,例如liteos-a中使用的就是gn的out路径 /home/itsenlin/code/ohos_3.0/out/hispark_taurus/ipcamera_hispark_taurus

此文件是ninja编译工具的入口,类似于make的makefile;相对于makefile,ninja文件规则、依赖更简单,编译速度也会更快
打开此文件可以看到主要包含以下几块内容

这样在执行ninja命令时,就会默认build这个 all ,然后根据前面这个依赖关系进而编译整个系统

但是有一个问题,查看这个文件内容,并没有看到各模块目录下ninja的信息,这个是怎么关联进来的呢?

查看这个文件内容,这里面不仅仅有编译工具链相关的定义,还有对编译所需要的各模块的 .ninja 文件的关联也在这里,以及build.gn中定义的一些规则也转换成rule放在这个文件中了,如下

这样就关联上了编译所需要的所有的ninja文件,然后 ninja就会对每个依赖项进行编译,最终生成 .o 、 .a 、 .so 、 .bin 等文件

当前openharmony编译系统中不仅仅使用了gn+ninja,还使用了make+makefile。
举个例子,linux kernel的编译就是通过make编译的;而liteos kernel两者都有用,编译的文件也不一样,后面再详细分析吧

是怎么实现使用两种编译工具同时编译的呢?看生成的ninja文件(或者gn中的定义)不难看出是通过执行bash脚本来实现的,以liteos-a的make为例:
gn中有下面这个定义

转换成ninja规则如下

从上面定义看,就是ninja在编译到这个build的时候就会执行 //kernel/liteos-a/build.sh 脚本,而此脚本最后就是执行的 make 命令,如下

以上是关于ninja build系统介绍的主要内容,如果未能解决你的问题,请参考以下文章

meson+ninja build系统,使用meson & ninja 编译C工程

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

我的C/C++语言学习进阶之旅解决使用ninja命令的时候报错:ninja: error: loading ‘build.ninja‘: 系统找不到指定的文件。

鸿蒙源码构建工具Gn 与 Ninja 的介绍及使用入门

WebRTC编译系统之gn files