
v61.03 鸿蒙内核源码分析(忍者ninja) | 忍者的特点就是一个字 原创 精华
司马牛问君子。子曰:“君子不忧不惧。”曰:“不忧不惧,斯谓之君子已乎?”子曰:“内省不疚,夫何忧何惧?” 《论语》:颜渊篇
百篇博客分析.本篇为: (忍者ninja篇) | 忍者的特点就是一个字
编译构建相关篇为:
- v50.03 鸿蒙内核源码分析(编译环境) | 编译鸿蒙防掉坑指南
- v57.02 鸿蒙内核源码分析(编译过程) | 简单案例说透中间过程
- v58.03 鸿蒙内核源码分析(环境脚本) | 编译鸿蒙原来很简单
- v59.04 鸿蒙内核源码分析(构建工具) | 顺瓜摸藤调试构建过程
- v60.04 鸿蒙内核源码分析(gn应用) | 如何构建鸿蒙系统
- v61.03 鸿蒙内核源码分析(忍者ninja) | 忍者的特点就是一个字
ninja | 忍者
ninja
是一个叫 Evan Martin
的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome
的构建,Martin
给它取名 ninja
(忍者)的原因是因为它strikes quickly
(快速出击).这是忍者的特点,可惜Martin
不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin
自己的话说是当一个文件被修改后,ninja
从发现到编译速度是make
的十倍.有没有十倍不是本篇讨论的重点,人家做出来了,就算是牛皮也该人家吹.本篇是要对鸿蒙如何使用ninja做一个比较详细的阐述.
ninja
是一个重视速度的构建系统,与其对标的是Make
,它们都依赖于文件的时间戳进行检测重编.
- 它的设计目的是让更高级别的构建系统生成其输入端文件,其并不希望你手动去编
.ninja
文件,可以生成.ninja
的工具有gn
,cmake
,premake
,甚至你自己都可以写个ninja
生成工具. ninja
非常高效,可理解为构建系统中的汇编语言。ninja
文件没有分支、循环的流程控制,是被指定了一堆规则的文件,所以要比Makefile
简单很多- 目前已知的
GoogleChrome
,Android
的一部分,LLVM
,V8
, 方舟编译器, 鸿蒙 等大型系统都使用到了ninja
构建.
基本概念
简单的ninja
首先 ninja
一定是简单的,呆板的.凡是能被工具生成的东西,一定是在不断的重复某种简单,众多的简单按一定的规则有效叠加起来就能解决复杂的问题,请仔细想想是不是这个道理.ninja
简单到没什么语法,只是几个概念和规则. 以至于 ninja参考手册 比 gn参考手册 简单的太多.
看个示例:
解读
cflags
:定义一个用户变量,用于给规则传参.rule
:定义一个叫cc
的规则.command
:将生成bash命令,接收外部三个参数
- 第一个
build
,将foo.c
用cc
规则编译成foo.o
- 最终编译选项:
gcc -Wall -Werror -c foo.c -o foo.o
- 最终编译选项:
- 第二个
build
,将special.c
用cc
规则编译成special.o
- 最终编译选项:
gcc -Wall -c foo.c -o foo.o
- 最终编译选项:
in
,out
是ninja
的两个内置变量.
phony规则
跟称呼弗拉基米尔·弗拉基米罗维奇·普京
为普总
一样,
有些文件路径会很长,ninja
提供取别名的功能,这仅仅是为了方便.
有了上面的铺垫,读懂鸿蒙的ninja
部分应该没多大障碍了.
鸿蒙 | ninja
在[v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 ]篇的末尾已说明通过 gn gen
生成了以下文件和目录
args.gn
:一些参数build.ninja
:ninja
的主文件build.ninja.d
:记录生成所有.ninja
所依赖的BUILD.gn文件路劲列表,一个BUILD.gn就生成一个.ninja文件- obj :各组件模块构建/编译文件输出地.
- toolchain :放置ninja规则,将被 subninja 进 build.ninja
build.ninja
build.ninja
内容如下:
解读
- 前面部分是定义一个
gn
规则,用于干嘛呢? 重新生成一遍*ninja
文件 subninja
相当于#include
文件default all
,指定默认的一个或多个target
toolchain | 定义规则
toolchain.ninja
定义了编译c,c++,汇编器,链接,静态/动态链接库,时间戳,拷贝等规则. 内容如下:
-
注意这些规则中的描述
description
字段,其后面的内容会打到控制台上,每一条输出都是一次build
,如图所示,通过这些描述就知道使用了什么规则去构建.
组件编译
本篇以编译ability
组件为例说明 ninja
对组件的编译情况.每个组件都有自己的.ninja
,描述组件的编译细节.而整个鸿蒙系统就是由众多的类似.ninja
构建编译完成的.
ability.ninja
内容如下:
解读
-
defines
,include_dirs
,cflags_cc
都是用户自定义变量,为了给rule cxx
准备参数,对.cpp
的编译使用了这个规则 -
in
,out
是两个内置变量,无须定义,值由build
提供,如此就编译成了一个个的.o
文件. -
在最后在当前目录下使用了
solink
规则,生成一个动态链接库libability.so
.
ability | 最终生成文件
百篇博客分析.深挖内核地基
- 给鸿蒙内核源码加注释过程中,整理出以下文章。内容立足源码,常以生活场景打比方尽可能多的将内核知识点置入某种场景,具有画面感,容易理解记忆。说别人能听得懂的话很重要! 百篇博客绝不是百度教条式的在说一堆诘屈聱牙的概念,那没什么意思。更希望让内核变得栩栩如生,倍感亲切.确实有难度,自不量力,但已经出发,回头已是不可能的了。 😛
- 与代码有bug需不断debug一样,文章和注解内容会存在不少错漏之处,请多包涵,但会反复修正,持续更新,v**.xx 代表文章序号和修改的次数,精雕细琢,言简意赅,力求打造精品内容。
按功能模块:
- 前因后果 >> 总目录 | 调度故事 | 内存主奴 | 源码注释 | 源码结构 | 静态站点 | 注释文档 |
- 基础工具 >> 双向链表 | 位图管理 | 用栈方式 | 定时器 | 原子操作 | 时间管理 |
- 加载运行 >> ELF格式 | ELF解析 | 静态链接 | 重定位 | 进程映像 |
- 进程管理 >> 进程管理 | 进程概念 | Fork | 特殊进程 | 进程回收 | 信号生产 | 信号消费 | Shell编辑 | Shell解析 |
- 编译构建 >> 编译环境 | 编译过程 | 环境脚本 | 构建工具 | gn应用 | 忍者ninja |
- 进程通讯 >> 自旋锁 | 互斥锁 | 进程通讯 | 信号量 | 事件控制 | 消息队列 |
- 内存管理 >> 内存分配 | 内存管理 | 内存汇编 | 内存映射 | 内存规则 | 物理内存 |
- 任务管理 >> 时钟任务 | 任务调度 | 任务管理 | 调度队列 | 调度机制 | 线程概念 | 并发并行 | CPU | 系统调用 | 任务切换 |
- 文件系统 >> 文件概念 | 文件系统 | 索引节点 | 挂载目录 | 根文件系统 | 字符设备 | VFS | 文件句柄 | 管道文件 |
- 硬件架构 >> 汇编基础 | 汇编传参 | 工作模式 | 寄存器 | 异常接管 | 汇编汇总 | 中断切换 | 中断概念 | 中断管理 |
百万汉字注解.精读内核源码
四大码仓中文注解 . 定期同步官方代码
鸿蒙研究站( weharmonyos ) | 每天死磕一点点,原创不易,欢迎转载,请注明出处。若能支持点赞则更佳,感谢每一份支持。
