成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析鴻蒙中的 Gn 與 Ninja(一)

系統
鴻蒙系統的編譯構建是基于 Gn 和 Ninja 完成的,那么 Gn 和 Ninjia 有什么關系呢?具體又是如何工作的呢?想必大多數熱衷于應用開發的同學都還沒有深究過,那么今天就借此機會帶著大家扒一扒 Gn 和 Ninja。

[[379811]]

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

鴻蒙系統的編譯構建是基于 Gn 和 Ninja 完成的,那么 Gn 和 Ninjia 有什么關系呢?具體又是如何工作的呢?想必大多數熱衷于應用開發的同學都還沒有深究過,那么今天就借此機會帶著大家扒一扒 Gn 和 Ninja。

我們先來說說 Ninja 吧!

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

在這里強調 make 的 3 個特性:

  • make 只是一個通用程序,它不知道如何具體的完成目標的構建工作
  • make 需要 makefile 中的描述來決定目標構建的具體方案
  • make 需要借助其它工具(如:gcc)才能執行方案,最終完成工作

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

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

接下來通過一個簡單的例子向大家展示 Ninja 的用法!

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


根據 C 程序的編譯方式可知:

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

test.c 編譯后得到目標文件 test.o

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

各個文件在編譯過程中有明顯的上下游關系,即:上游文件影響或者產生下游文件。


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

看到這里,有同學可能存在這樣的疑問:怎么知道文件已經被修改了并觸發相應動作呢?

其實很簡單,可以根據文件修改時間判斷呀!目前幾乎主流的文件系統都會記錄文件被修改的時間,所以結合文件的上下游關系可知:上游文件被修改的時間應該總是 小于等于 下游文件被修改的時間。這樣,只需要遍歷一次上面的構建圖就可以知道執行哪些動作產生最終可執行程序了。


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

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

下面直接上代碼!


解讀:

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 位于同一目錄下


2. 打開命令行定位到源碼目錄,執行 ninja > log.txt


通過編譯輸出(log.txt)以及 test.out 的運行結果可知目標構建成功。

后記:

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

Enjoy it!

©著作權歸作者和HarmonyOS技術社區共同所有,如需轉載,請注明出處,否則將追究法律責任。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com/#zz

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2022-10-21 15:23:41

GN入門示例鴻蒙

2022-10-26 15:33:27

GN鴻蒙

2022-10-24 14:43:31

GN語法GN

2024-01-18 15:24:06

Rust開發鴻蒙OH4.0

2020-11-09 06:38:00

ninja構建方式構建系統

2022-06-10 14:37:24

鴻蒙操作系統

2009-09-14 17:08:02

WebFormView

2009-05-19 17:28:44

深拷貝淺拷貝clone()

2021-05-17 14:37:02

鴻蒙HarmonyOS應用

2022-08-28 20:50:29

算法模型機器學習

2009-06-03 15:52:34

堆內存棧內存Java內存分配

2011-04-15 13:17:52

QoS

2017-10-26 14:59:47

MybatisHibernate數據庫

2021-09-27 22:49:13

GoC 指針

2009-07-01 18:20:29

JSP的優勢

2009-10-14 13:43:12

綜合布線系統

2022-10-27 16:01:41

AbilityStage模型FA模型

2022-07-26 14:05:58

人工智能人機交互心智

2009-07-16 09:54:44

LookupEventSwing線程

2011-07-28 13:08:51

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本中文字幕视频 | 亚洲综合色婷婷 | 日本中文在线 | 日韩av成人在线 | 亚洲精品美女视频 | 蜜桃精品噜噜噜成人av | 久草热播 | 国产精品毛片无码 | 在线观看国产视频 | 国产情侣激情 | 欧美日韩高清在线一区 | 91久久久久 | 在线观看精品视频网站 | 91新视频| 国产精品美女久久久久久免费 | 99久久精品免费看国产高清 | 99精品国产一区二区三区 | 亚洲美女网站 | 三级av网址 | 国产中文字幕网 | 国产三级在线观看播放 | 久久91精品久久久久久9鸭 | 狠狠色网| 中文字幕免费在线 | 毛片a级毛片免费播放100 | 亚洲成人国产综合 | 91在线视频播放 | 日韩久草 | 日韩精品一区二区三区中文字幕 | 欧美五月婷婷 | 亚洲欧美中文日韩在线v日本 | 欧美精品一二三 | 亚洲中国字幕 | 日韩精品久久一区二区三区 | 欧美欧美欧美 | 日韩三区在线观看 | 久久91 | 国产综合久久 | 伊人久久精品一区二区三区 | 欧美一区二区三区大片 | 亚洲福利一区 |