那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺析鴻蒙系統(tǒng)中Ninja 的用法!

鴻蒙系統(tǒng)HarmonyOS ? 來源:HarmonyOS技術(shù)社區(qū) ? 作者:HarmonyOS技術(shù)社區(qū) ? 2021-04-23 15:46 ? 次閱讀

我們先來說說 Ninja 吧!

Ninja 是借由 Google Chrome 項(xiàng)目而誕生的一個(gè)構(gòu)建工具,它的誕生目標(biāo)是為了速度。換句話說,在 Google Chrome 項(xiàng)目的開發(fā)過程中,開發(fā)者們認(rèn)為同類型的其它構(gòu)建工具不給力,所以才會(huì)考慮重新開發(fā)更高效的工具。要說同類型,那么不得不提構(gòu)建界的老大哥 make !make 即 GNU Make,一個(gè)用于決定如何使用命令完成最終目標(biāo)構(gòu)建的程序。

在這里強(qiáng)調(diào) make 的 3 個(gè)特性:

make 只是一個(gè)通用程序,它不知道如何具體的完成目標(biāo)的構(gòu)建工作

make 需要 makefile 中的描述來決定目標(biāo)構(gòu)建的具體方案

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

o4YBAGCCek6AX53QAAJ1-wZi_Lo531.png

這是不是跑題了!不是說好的討論 Ninja 嗎?怎么扯到 make 上去了?!

因?yàn)?Ninja 可以看作是一個(gè)更好的 make !而大多數(shù)同學(xué)都熟悉 make ,所以通過對比 make 學(xué)習(xí) Ninja 是一個(gè)非常好的選擇!上述關(guān)于 make 的 3 個(gè)特性對于 Ninjia 同樣適用(理論上,make 有的 Ninjia 都有,并且更好!)。那么,是不是得先學(xué)習(xí) make 再學(xué)習(xí) Ninja 呢?我覺得倒也不是!畢竟我們最終還是在鴻蒙上做應(yīng)用開發(fā),編譯構(gòu)建系統(tǒng)只需要大體了解即可。

Ninja 的用法!

test.c 是一個(gè)簡單的 Hello World 程序,用于打印一個(gè)字符串和頭文件 test.h 中常量 CONST 的值。

pIYBAGCCeluAMlhGAACx5L4IYQI297.png

根據(jù) C 程序的編譯方式可知:

在預(yù)處理階段 test.h 中的代碼直接嵌入test.c 中(頭文件 .h 最終成為源文件 .c 的一部分)

test.c 編譯后得到目標(biāo)文件 test.o

test.o 鏈接后得到最終的可執(zhí)行程序 test.out

各個(gè)文件在編譯過程中有明顯的上下游關(guān)系,即:上游文件影響或者產(chǎn)生下游文件。

pIYBAGCCemiAKlzGAAEXBvxC0ds174.png

上圖即描述了編譯過程,同時(shí)也反映了這樣一個(gè)事實(shí):任何一個(gè)文件被改動(dòng)時(shí)只可能影響下游文件,而不會(huì)影響上游文件。如:test.c 被修改了,那么可能導(dǎo)致編譯得到 test.o 發(fā)生改變,進(jìn)而導(dǎo)致最終的可執(zhí)行程序 test.out 改變。因此,當(dāng) test.c 被修改時(shí),那么應(yīng)該重新觸發(fā)編譯和鏈接這兩個(gè)動(dòng)作。

看到這里,有同學(xué)可能存在這樣的疑問:怎么知道文件已經(jīng)被修改了并觸發(fā)相應(yīng)動(dòng)作呢?

其實(shí)很簡單,可以根據(jù)文件修改時(shí)間判斷呀!目前幾乎主流的文件系統(tǒng)都會(huì)記錄文件被修改的時(shí)間,所以結(jié)合文件的上下游關(guān)系可知:上游文件被修改的時(shí)間應(yīng)該總是 小于等于 下游文件被修改的時(shí)間。這樣,只需要遍歷一次上面的構(gòu)建圖就可以知道執(zhí)行哪些動(dòng)作產(chǎn)生最終可執(zhí)行程序了。

o4YBAGCCenOAM8pjAAGFhp0SlRg247.png

接下來思考這樣一個(gè)問題:如何向構(gòu)建工具 Ninja 描述構(gòu)建圖?

Ninja 的本質(zhì)是一種通用程序。既然是程序,那么擅長的必然是處理結(jié)構(gòu)化文本!因此,可以用結(jié)構(gòu)化文本(Ninja腳本)來描述構(gòu)建圖。

下面直接上代碼!

pIYBAGCCepOAal36AAFCT6IYf10134.png

解讀:

1. Ninja 腳本中的 build 語句描述構(gòu)建圖中的一個(gè)文件上下游關(guān)系。如:build test.o cc test.c 指明 test.o 由 test.c 通過規(guī)則 cc 而構(gòu)建,test.c 在構(gòu)建圖中位于 test.o 的上游,從 test.c 到 test.o 需要執(zhí)行的動(dòng)作通過規(guī)則 cc 定義。Ninja 通過判斷上下游文件的修改時(shí)間決定是否執(zhí)行規(guī)則中定義的動(dòng)作。多個(gè) build 語句共同描述一個(gè)編譯構(gòu)建圖。

2. Ninja 腳本中通過 rule 定義規(guī)則描述構(gòu)建圖中需要執(zhí)行的動(dòng)作。如:規(guī)則 cc 所定義的具體動(dòng)作是 gcc -c $in -o $out ,其中 $in 指代上游文件, $out 指代下游文件。對于 build test.o cc test.c 而言,最終執(zhí)行的動(dòng)作為:gcc -c test.c -o test.o 。

3. 由 C 語言及其編譯方式可知:當(dāng)源文件包含的頭文件改動(dòng)時(shí),源文件需要重新編譯。因此,在構(gòu)建圖中頭文件順理成章的成為了源文件的上游文件,需要考慮的僅僅是如何定義 rule 最終觸發(fā)編譯動(dòng)作。這里使用的技巧是通過命令 touh 更新源文件的修改時(shí)間,于是可定義 rule dp 的執(zhí)行動(dòng)作為 touch $out。這樣 build test.c : dp test.h 的意思就很清楚了:當(dāng) test.h 被修改時(shí),執(zhí)行 touch test.c 更新修改時(shí)間,進(jìn)而觸發(fā)重新編譯。

4. default test.out 指明默認(rèn)構(gòu)建的目標(biāo)是 test.out,即: ninja 執(zhí)行當(dāng)前腳本時(shí)默認(rèn)編譯構(gòu)建的是 test.out。

實(shí)驗(yàn)

理解了 Ninja 腳本的基本構(gòu)成后就可以通過實(shí)驗(yàn)進(jìn)一步體會(huì)了!

1. 將上面的腳本另存為文件,并重命名為 build.ninja,且與 test.c 和 test.h 位于同一目錄下

pIYBAGCCeqCAYWP8AAA4DoEvcZE182.png

2. 打開命令行定位到源碼目錄,執(zhí)行 ninja 》 log.txt

o4YBAGCCequAM_dnAAFDmr2U8Ak324.png

通過編譯輸出(log.txt)以及 test.out 的運(yùn)行結(jié)果可知目標(biāo)構(gòu)建成功。

后記:

這只是一個(gè) Ninja 的入門級(jí)介紹,更多的細(xì)節(jié)大家可以參考附件中的手冊。同時(shí),文中的示例代碼也可以在附件中下載。大家可以自己動(dòng)手修改源碼(比如:修改 test.h 中 CONST 的值)然后自行編譯體會(huì) Ninja 的用法。

注:著作權(quán)歸作者和HarmonyOS技術(shù)社區(qū)共同所有

編輯:hfy

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2638

    瀏覽量

    66715
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

    鴻蒙的出現(xiàn),標(biāo)志著中國科技的崛起。HarmonyOS就是我們說的華為鴻蒙系統(tǒng),截止到2023年8月4日已有超過7億臺(tái)設(shè)備搭載了鴻蒙OS系統(tǒng)
    發(fā)表于 02-28 10:29

    機(jī)器人操作系統(tǒng)淺析

    機(jī)器人操作系統(tǒng)淺析
    發(fā)表于 09-28 11:43

    【HarmonyOS HiSpark Wi-Fi IoT 套件】關(guān)于鴻蒙應(yīng)用程序的開發(fā)及構(gòu)建工具的理解

    package manager鴻蒙包管理,可以有旭東共享擴(kuò)展的代碼,在https://hpm.harmonyos.com/#/cn/home整體感覺和RTT-THREAD雷同啊,包括構(gòu)建系統(tǒng)的工具
    發(fā)表于 10-13 12:17

    【HarmonyOS HiSpark Wi-Fi IoT套件】關(guān)于鴻蒙應(yīng)用程序的開發(fā)及構(gòu)建工具的理解

    系統(tǒng),生成Ninja構(gòu)建文件。從命令行運(yùn)行g(shù)n,他是depot_tools下的一個(gè)腳本,需要確保depot_tools路徑包含在環(huán)境變量$PATH。比如為了測試,定義一個(gè)test輸出目錄,可以采用如下
    發(fā)表于 10-14 18:23

    淺析鴻蒙的 Gn 與 Ninja(一)

    本帖最后由 delphi_tang 于 2021-1-27 17:10 編輯 鴻蒙系統(tǒng)的編譯構(gòu)建是基于 Gn 和 Ninja 完成的,那么 Gn 和 Ninjia 有什么關(guān)系呢?具體又是
    發(fā)表于 01-27 16:50

    北京鴻蒙與華為鴻蒙系統(tǒng)

    北京鴻蒙與華為鴻蒙系統(tǒng)|雷架來源 |愛笑的架構(gòu)師(ID:DancingOnYourCode)頭圖 | CSDN下載自東方IC鴻蒙系統(tǒng)2.0的
    發(fā)表于 07-28 08:53

    淺析伺服系統(tǒng)應(yīng)用的慣量匹配問題

    剛性、慣量、響應(yīng)時(shí)間及伺服增益調(diào)整之間的關(guān)系 淺析伺服系統(tǒng)應(yīng)用的慣量匹配問題-慣量匹配
    發(fā)表于 09-07 07:01

    鴻蒙系統(tǒng)的編譯流程及分析v1.0

    ;amp;amp;amp;quot;2021-04-18 07:38:53" 分別是鴻蒙系統(tǒng)的版本號(hào),和當(dāng)次編譯(內(nèi)核?系統(tǒng)?)的時(shí)間5.構(gòu)建系統(tǒng)Gn
    發(fā)表于 04-07 10:40

    TD_SCDMA系統(tǒng)淺析

    TD_SCDMA系統(tǒng)淺析:
    發(fā)表于 05-22 17:19 ?32次下載
    TD_SCDMA<b class='flag-5'>系統(tǒng)</b><b class='flag-5'>淺析</b>

    鴻蒙系統(tǒng)JS框架的逐行分析

    我在前文中曾經(jīng)介紹過鴻蒙的 Javascript 框架,這幾天終于把 JS 倉庫編譯通過了,期間踩了不少坑,也給鴻蒙貢獻(xiàn)了幾個(gè) PR。今天我們就來逐行分析鴻蒙系統(tǒng)
    的頭像 發(fā)表于 10-21 14:37 ?2048次閱讀

    鴻蒙系統(tǒng)好用嗎_鴻蒙系統(tǒng)使用體驗(yàn)

    華為鴻蒙系統(tǒng)與與安卓、iOS系統(tǒng)不同。搭載鴻蒙系統(tǒng)的手機(jī)不再是傳統(tǒng)意義上的手機(jī),而是變成了一個(gè)具有強(qiáng)大功能的
    的頭像 發(fā)表于 06-17 15:20 ?1w次閱讀

    怎么升級(jí)鴻蒙系統(tǒng)-鴻蒙系統(tǒng)怎么更新

    怎么升級(jí)鴻蒙系統(tǒng)-鴻蒙系統(tǒng)怎么更新 怎么升級(jí)鴻蒙系統(tǒng)鴻蒙
    的頭像 發(fā)表于 06-21 20:27 ?4468次閱讀

    鴻蒙系統(tǒng)上自定義流式布局

    介紹 在鴻蒙系統(tǒng)上自定義流式布局 我們使用蒹葭網(wǎng)絡(luò)庫來請求服務(wù)器, 蒹葭是鴻蒙系統(tǒng)上一款網(wǎng)絡(luò)請求框架,本質(zhì)上是從retrofit移植過來的, 蒹葭的
    發(fā)表于 03-21 15:03 ?6次下載
    在<b class='flag-5'>鴻蒙</b><b class='flag-5'>系統(tǒng)</b>上自定義流式布局

    開源300美元實(shí)時(shí)PCR機(jī)器Ninja qPCR

    電子發(fā)燒友網(wǎng)站提供《開源300美元實(shí)時(shí)PCR機(jī)器Ninja qPCR.zip》資料免費(fèi)下載
    發(fā)表于 07-06 09:29 ?4次下載
    開源300美元實(shí)時(shí)PCR機(jī)器<b class='flag-5'>Ninja</b> qPCR

    PipelinethrowIt的用法

    字如其名,來看下PipelinethrowIt的用法,是怎么個(gè)丟棄方式。
    的頭像 發(fā)表于 10-21 16:24 ?612次閱讀
    Pipeline<b class='flag-5'>中</b>throwIt的<b class='flag-5'>用法</b>
    百家乐官网路单纸下载| 百家乐游戏卡通| 百家乐官网规则好学吗| 百家乐筹码14克粘土| 百家乐官网博赌场娱乐网规则 | 赌场百家乐投注公式| 百家乐官网有作弊的吗| 百家乐桌子租| 百家乐官网红桌布| 定安县| 百家乐庄闲排列| 澳门百家乐官网骗人| 澳门赌场小姐| 百家乐送彩金网络| 最新百家乐官网网评测排名| 太阳城娱乐城申博| 圆梦城百家乐娱乐城| 百家乐官网大娱乐场开户注册 | 瑞丰国际娱乐场| 百家乐技论坛| 广州百家乐官网赌城| 望奎县| 大发888游戏代充值100| 网上百家乐真实度| 新澳博百家乐官网娱乐城| 六合彩网页| 黄金会百家乐赌城| 百家乐官网又称什么| 娱乐城百家乐官网高手| 德州扑克书籍| 百家乐赌博分析网| 百家乐官网牌盒| 太阳城百家乐官网外挂| 棋牌室营业执照| 尊龙百家乐赌场娱乐网规则| 网上百家乐官网乐代理| 澳门百家乐官网娱乐城送体验金 | 澳门赌场| 大发888网页版登陆| 至尊百家乐娱乐场| 择日自学24|