0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

浅析鸿蒙系统中Ninja 的用法!

鸿蒙系统HarmonyOS 来源:HarmonyOS技术社区 作者:HarmonyOS技术社区 2021-04-23 15:46 次阅读

我们先来说说 Ninja 吧!

Ninja 是借由 Google Chrome 项目而诞生的一个构建工具,它的诞生目标是为了速度。换句话说,在 Google Chrome 项目的开发过程中,开发者们认为同类型的其它构建工具不给力,所以才会考虑重新开发更高效的工具。要说同类型,那么不得不提构建界的老大哥 make !make 即 GNU Make,一个用于决定如何使用命令完成最终目标构建的程序。

在这里强调 make 的 3 个特性:

make 只是一个通用程序,它不知道如何具体的完成目标的构建工作

make 需要 makefile 中的描述来决定目标构建的具体方案

make 需要借助其它工具(如:gcc)才能执行方案,最终完成工作

o4YBAGCCek6AX53QAAJ1-wZi_Lo531.png

这是不是跑题了!不是说好的讨论 Ninja 吗?怎么扯到 make 上去了?!

因为 Ninja 可以看作是一个更好的 make !而大多数同学都熟悉 make ,所以通过对比 make 学习 Ninja 是一个非常好的选择!上述关于 make 的 3 个特性对于 Ninjia 同样适用(理论上,make 有的 Ninjia 都有,并且更好!)。那么,是不是得先学习 make 再学习 Ninja 呢?我觉得倒也不是!毕竟我们最终还是在鸿蒙上做应用开发,编译构建系统只需要大体了解即可。

Ninja 的用法!

test.c 是一个简单的 Hello World 程序,用于打印一个字符串和头文件 test.h 中常量 CONST 的值。

pIYBAGCCeluAMlhGAACx5L4IYQI297.png

根据 C 程序的编译方式可知:

在预处理阶段 test.h 中的代码直接嵌入test.c 中(头文件 .h 最终成为源文件 .c 的一部分)

test.c 编译后得到目标文件 test.o

test.o 链接后得到最终的可执行程序 test.out

各个文件在编译过程中有明显的上下游关系,即:上游文件影响或者产生下游文件。

pIYBAGCCemiAKlzGAAEXBvxC0ds174.png

上图即描述了编译过程,同时也反映了这样一个事实:任何一个文件被改动时只可能影响下游文件,而不会影响上游文件。如:test.c 被修改了,那么可能导致编译得到 test.o 发生改变,进而导致最终的可执行程序 test.out 改变。因此,当 test.c 被修改时,那么应该重新触发编译和链接这两个动作。

看到这里,有同学可能存在这样的疑问:怎么知道文件已经被修改了并触发相应动作呢?

其实很简单,可以根据文件修改时间判断呀!目前几乎主流的文件系统都会记录文件被修改的时间,所以结合文件的上下游关系可知:上游文件被修改的时间应该总是 小于等于 下游文件被修改的时间。这样,只需要遍历一次上面的构建图就可以知道执行哪些动作产生最终可执行程序了。

o4YBAGCCenOAM8pjAAGFhp0SlRg247.png

接下来思考这样一个问题:如何向构建工具 Ninja 描述构建图?

Ninja 的本质是一种通用程序。既然是程序,那么擅长的必然是处理结构化文本!因此,可以用结构化文本(Ninja脚本)来描述构建图。

下面直接上代码!

pIYBAGCCepOAal36AAFCT6IYf10134.png

解读:

1. Ninja 脚本中的 build 语句描述构建图中的一个文件上下游关系。如:build test.o cc test.c 指明 test.o 由 test.c 通过规则 cc 而构建,test.c 在构建图中位于 test.o 的上游,从 test.c 到 test.o 需要执行的动作通过规则 cc 定义。Ninja 通过判断上下游文件的修改时间决定是否执行规则中定义的动作。多个 build 语句共同描述一个编译构建图。

2. Ninja 脚本中通过 rule 定义规则描述构建图中需要执行的动作。如:规则 cc 所定义的具体动作是 gcc -c $in -o $out ,其中 $in 指代上游文件, $out 指代下游文件。对于 build test.o cc test.c 而言,最终执行的动作为:gcc -c test.c -o test.o 。

3. 由 C 语言及其编译方式可知:当源文件包含的头文件改动时,源文件需要重新编译。因此,在构建图中头文件顺理成章的成为了源文件的上游文件,需要考虑的仅仅是如何定义 rule 最终触发编译动作。这里使用的技巧是通过命令 touh 更新源文件的修改时间,于是可定义 rule dp 的执行动作为 touch $out。这样 build test.c : dp test.h 的意思就很清楚了:当 test.h 被修改时,执行 touch test.c 更新修改时间,进而触发重新编译。

4. default test.out 指明默认构建的目标是 test.out,即: ninja 执行当前脚本时默认编译构建的是 test.out。

实验

理解了 Ninja 脚本的基本构成后就可以通过实验进一步体会了!

1. 将上面的脚本另存为文件,并重命名为 build.ninja,且与 test.c 和 test.h 位于同一目录下

pIYBAGCCeqCAYWP8AAA4DoEvcZE182.png

2. 打开命令行定位到源码目录,执行 ninja 》 log.txt

o4YBAGCCequAM_dnAAFDmr2U8Ak324.png

通过编译输出(log.txt)以及 test.out 的运行结果可知目标构建成功。

后记:

这只是一个 Ninja 的入门级介绍,更多的细节大家可以参考附件中的手册。同时,文中的示例代码也可以在附件中下载。大家可以自己动手修改源码(比如:修改 test.h 中 CONST 的值)然后自行编译体会 Ninja 的用法。

注:著作权归作者和HarmonyOS技术社区共同所有

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 鸿蒙系统
    +关注

    关注

    183

    文章

    2633

    浏览量

    66122
收藏 人收藏

    评论

    相关推荐

    2024款鸿蒙OS 最新HarmonyOS Next_HarmonyOS4.0系列教程分享

    鸿蒙的出现,标志着中国科技的崛起。HarmonyOS就是我们说的华为鸿蒙系统,截止到2023年8月4日已有超过7亿台设备搭载了鸿蒙OS系统
    发表于 02-28 10:29

    机器人操作系统浅析

    机器人操作系统浅析
    发表于 09-28 11:43

    【HarmonyOS HiSpark Wi-Fi IoT 套件】关于鸿蒙应用程序的开发及构建工具的理解

    package manager鸿蒙包管理,可以有旭东共享扩展的代码,在https://hpm.harmonyos.com/#/cn/home整体感觉和RTT-THREAD雷同啊,包括构建系统的工具
    发表于 10-13 12:17

    【HarmonyOS HiSpark Wi-Fi IoT套件】关于鸿蒙应用程序的开发及构建工具的理解

    系统,生成Ninja构建文件。从命令行运行gn,他是depot_tools下的一个脚本,需要确保depot_tools路径包含在环境变量$PATH。比如为了测试,定义一个test输出目录,可以采用如下
    发表于 10-14 18:23

    浅析鸿蒙的 Gn 与 Ninja(一)

    本帖最后由 delphi_tang 于 2021-1-27 17:10 编辑 鸿蒙系统的编译构建是基于 Gn 和 Ninja 完成的,那么 Gn 和 Ninjia 有什么关系呢?具体又是
    发表于 01-27 16:50

    北京鸿蒙与华为鸿蒙系统

    北京鸿蒙与华为鸿蒙系统|雷架来源 |爱笑的架构师(ID:DancingOnYourCode)头图 | CSDN下载自东方IC鸿蒙系统2.0的
    发表于 07-28 08:53

    浅析伺服系统应用的惯量匹配问题

    刚性、惯量、响应时间及伺服增益调整之间的关系 浅析伺服系统应用的惯量匹配问题-惯量匹配
    发表于 09-07 07:01

    鸿蒙系统的编译流程及分析v1.0

    ;amp;amp;amp;quot;2021-04-18 07:38:53" 分别是鸿蒙系统的版本号,和当次编译(内核?系统?)的时间5.构建系统Gn
    发表于 04-07 10:40

    TD_SCDMA系统浅析

    TD_SCDMA系统浅析:
    发表于 05-22 17:19 32次下载
    TD_SCDMA<b class='flag-5'>系统</b><b class='flag-5'>浅析</b>

    鸿蒙系统JS框架的逐行分析

    我在前文中曾经介绍过鸿蒙的 Javascript 框架,这几天终于把 JS 仓库编译通过了,期间踩了不少坑,也给鸿蒙贡献了几个 PR。今天我们就来逐行分析鸿蒙系统
    的头像 发表于 10-21 14:37 1956次阅读

    鸿蒙系统好用吗_鸿蒙系统使用体验

    华为鸿蒙系统与与安卓、iOS系统不同。搭载鸿蒙系统的手机不再是传统意义上的手机,而是变成了一个具有强大功能的
    的头像 发表于 06-17 15:20 1w次阅读

    怎么升级鸿蒙系统-鸿蒙系统怎么更新

    怎么升级鸿蒙系统-鸿蒙系统怎么更新 怎么升级鸿蒙系统鸿蒙
    的头像 发表于 06-21 20:27 4338次阅读

    鸿蒙系统上自定义流式布局

    介绍 在鸿蒙系统上自定义流式布局 我们使用蒹葭网络库来请求服务器, 蒹葭是鸿蒙系统上一款网络请求框架,本质上是从retrofit移植过来的, 蒹葭的
    发表于 03-21 15:03 6次下载
    在<b class='flag-5'>鸿蒙</b><b class='flag-5'>系统</b>上自定义流式布局

    开源300美元实时PCR机器Ninja qPCR

    电子发烧友网站提供《开源300美元实时PCR机器Ninja qPCR.zip》资料免费下载
    发表于 07-06 09:29 4次下载
    开源300美元实时PCR机器<b class='flag-5'>Ninja</b> qPCR

    PipelinethrowIt的用法

    字如其名,来看下PipelinethrowIt的用法,是怎么个丢弃方式。
    的头像 发表于 10-21 16:24 504次阅读
    Pipeline<b class='flag-5'>中</b>throwIt的<b class='flag-5'>用法</b>