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‘: 系统找不到指定的文件。