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

    文章

    2598

    浏览量

    65128
收藏 人收藏

    评论

    相关推荐

    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 套件试用连连载】关于鸿蒙应用程序的开发及构建工具的理解

    雷同啊,包括构建系统的工具,鸿蒙本身也采用了scons,后来又成了gn。不是很理解啊,所以补了一些构建系统的知识。 编译一段代码只需要执行命令gcc helloworld.c即可。几十个源代码文件
    发表于 10-13 11:40

    【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

    华为鸿蒙系统

    华为鸿蒙系统(HUAWEI Harmony OS),是华为公司在2019年8月9日于东莞举行的华为开发者大会(HDC.2019)上正式发布的操作系统。 华为鸿蒙
    发表于 11-02 19:39

    TD_SCDMA系统浅析

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

    鸿蒙系统怎么样 安卓和鸿蒙系统哪个厉害

    距离鸿蒙系统的发布已经有一段时间了,那么,鸿蒙系统怎么样?安卓和鸿蒙系统哪个厉害?
    的头像 发表于 06-16 09:23 5678次阅读

    鸿蒙系统有啥用 鸿蒙分布式系统的好处

    鸿蒙系统2.0已正式上线,也有许多用户使用鸿蒙系统一段时间了,那么我们接下来盘点下鸿蒙系统有啥用
    的头像 发表于 07-06 17:10 3225次阅读

    鸿蒙比安卓好吗 鸿蒙系统有哪些优势

    6月2号,鸿蒙系统正式发布,到现在,华为已经有很多机型都能够升级鸿蒙系统了,升级了的用户还调侃到“从此安卓是路人”。那么问题来了,鸿蒙比安卓
    的头像 发表于 07-07 15:51 1.7w次阅读

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

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