扒一扒鴻蒙中的Gn與Ninja

2021-02-19 51CTO技術棧

關注鴻蒙技術社區,回復【鴻蒙】送價值399元的鴻蒙開發板套件(數量有限,先到先得),還可以免費下載鴻蒙入門資料

👇掃碼立刻關注👇

專注開源技術,共建鴻蒙生態

鴻蒙系統的編譯構建是基於 Gn 和 Ninja 完成的,那麼 Gn 和 Ninjia 有什麼關係呢?具體又是如何工作的呢?

想必大多數熱衷於應用開發的同學都還沒有深究過,那麼今天就藉此機會帶著大家扒一扒 Gn 和 Ninja。

我們先來說說 Ninja 吧!

Ninja 是藉由 Google Chrome 項目而誕生的一個構建工具,它的誕生目標是為了速度。

換句話說,在 Google Chrome 項目的開發過程中,開發者們認為同類型的其它構建工具不給力,所以才會考慮重新開發更高效的工具。

要說同類型,那麼不得不提構建界的老大哥 make !make 即 GNU Make,一個用於決定如何使用命令完成最終目標構建的程序。

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

這是不是跑題了!不是說好的討論 Ninja 嗎?怎麼扯到 make 上去了?!因為 Ninja 可以看作是一個更好的 make !而大多數同學都熟悉 make ,所以通過對比 make 學習 Ninja 是一個非常好的選擇!
上述關於 make 的 3 個特性對於 Ninjia 同樣適用(理論上,make 有的 Ninjia 都有,並且更好)。
那麼,是不是得先學習 make 再學習 Ninja 呢?我覺得倒也不是!畢竟我們最終還是在鴻蒙上做應用開發,編譯構建系統只需要大體了解即可。接下來通過一個簡單的例子向大家展示 Ninja 的用法!

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

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

上圖即描述了編譯過程,同時也反映了這樣一個事實:任何一個文件被改動時只可能影響下遊文件,而不會影響上遊文件。
如:test.c 被修改了,那麼可能導致編譯得到 test.o 發生改變,進而導致最終的可執行程序 test.out 改變。因此,當 test.c 被修改時,那麼應該重新觸發編譯和連結這兩個動作。看到這裡,有同學可能存在這樣的疑問:怎麼知道文件已經被修改了並觸發相應動作呢?其實很簡單,可以根據文件修改時間判斷呀!目前幾乎主流的文件系統都會記錄文件被修改的時間,所以結合文件的上下遊關係可知:上遊文件被修改的時間應該總是 小於等於 下遊文件被修改的時間。

這樣,只需要遍歷一次上面的構建圖就可以知道執行哪些動作產生最終可執行程序了。

接下來思考這樣一個問題:如何向構建工具 Ninja 描述構建圖?Ninja 的本質是一種通用程序。既然是程序,那麼擅長的必然是處理結構化文本!因此,可以用結構化文本(Ninja 腳本)來描述構建圖。

下面直接上代碼:

Ninja 腳本中的 build 語句描述構建圖中的一個文件上下遊關係。
如:build test.o cc test.c 指明 test.o 由 test.c 通過規則 cc 而構建,test.c 在構建圖中位於 test.o 的上遊,從 test.c 到 test.o 需要執行的動作通過規則 cc 定義。Ninja 通過判斷上下遊文件的修改時間決定是否執行規則中定義的動作。多個 build 語句共同描述一個編譯構建圖。Ninja 腳本中通過 rule 定義規則描述構建圖中需要執行的動作。

如:規則 cc 所定義的具體動作是  gcc -c $in -o $out ,其中 $in 指代上遊文件, $out 指代下遊文件。

對於 build test.o cc test.c 而言,最終執行的動作為:gcc -c test.c -o test.o 。由 C 語言及其編譯方式可知:當源文件包含的頭文件改動時,源文件需要重新編譯。因此,在構建圖中頭文件順理成章的成為了源文件的上遊文件,需要考慮的僅僅是如何定義 rule 最終觸發編譯動作。
這裡使用的技巧是通過命令 touh 更新源文件的修改時間,於是可定義 rule dp 的執行動作為 touch $out。
這樣 build test.c : dp test.h 的意思就很清楚了:當 test.h 被修改時,執行 touch test.c 更新修改時間,進而觸發重新編譯。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 的用法。

相關焦點

  • 我是如何實現鴻蒙系統編譯、燒錄不跨平臺的?
    下面和我一來起操作,簡單低級的東西可以直接略過,轉載請註明出處及作者。2)下載:https://repo.huaweicloud.com/HarmonyOS/compiler/gn/1523/linux/gn.1523.tar        https://repo.huaweicloud.com/harmonyos/compiler/ninja/1.9.0/linux/ninja.1.9.0.tar
  • 扒一扒《聽雪樓》中的美女
    《聽雪樓》正在熱播中,雖然很多原著黨痛斥劇情和人設改的太多,但其場景製作精良,演員演技在線,還是令不少網友愛上這部劇,目前此劇已播出大半,劇中重要角色都已上線,其中一些女性角色頗受觀眾喜愛,那麼接下來扒一扒劇中的美人。
  • 扒一扒《鳳弈》中的女明星
    《鳳弈》正在熱播中,很多小夥伴被男女主不互相猜疑全心全意相信對方,為對方著想的愛情所感動。劇已播出一半,劇中的人物也逐漸上線,相信很多小夥伴對劇中的女性角色都印象深刻,那麼接下來為大家扒一扒劇中的女明星。
  • 章魚扒一扒呼市羽毛球館——開篇
    商務合作QQ:15904879847  微信:nmghwok章魚扒一扒呼市羽毛球館——開篇 「內蒙古體育圈」小編章魚即將推出小欄目——章魚扒一扒呼市羽毛球館          「扒一扒」曾在天涯論壇著名板塊「文娛八卦
  • 扒一扒《讓子彈飛》中的小細節
    那就來扒一扒其中我們沒注意到的細節,相信小夥伴們有興趣可以在重溫這部經典。1:片中並沒有交代黃四郎是一定死了,只是隨著一聲爆炸聲作為結束,如果有第二部完全可以讓黃四郎有一個比較好的藉口在次演繹一場經常的對決。2:湯師爺嘴裡所說的秘密,也並未在片中說明白,也是留下一個懸念。
  • 扒一扒高端霸氣上檔次的「Elie Saab」
    小黑就意識到了,現在高奢品牌越來越流入人們的生活中了,高奢兒童服裝的夏天就要來了!!所以,我們今天的【扒一扒】欄目就來扒這樣一個高端奢侈品童裝:Elie Saab"您對您女兒真好啊,我先回辦公室寫文章...額額「」回到辦公室,我深深的呼了一口氣,從剛剛的驚嚇中緩過來,覺得現在山寨真的害了好多人啊,作為走在時尚尖端的我,有義務好好給各位廣大觀眾普及品牌知識,所以再一次下定決心在今天,我要好好扒一扒
  • 扒一扒張馨予與範冰冰的明爭暗鬥
    自從李晨範冰冰疑似相戀後,張馨予就把範冰冰當作「勢不兩立」的「情敵」,開始在各種場合與範冰冰明爭暗鬥,「冰晨戀」公開後,戰火更是愈燃俞烈,雖然屢戰屢敗,但卻屢敗屢戰。下面就來扒扒扒扒張馨予與範冰冰明爭暗鬥的事件。9月8日晚,有網友在微博侮辱範冰冰是「公交婊」,沒想到張馨予卻手滑的點了個贊,從而引發網友吐槽:「心機真重,說你情商低我現在不相信!」
  • 扒一扒selina與阿中離婚內幕
    扒一扒selina與阿中離婚內幕時間:2019-11-30 14:33   來源:昕薇網   責任編輯:沫朵 川北在線核心提示:原標題:selina燒傷後不能生育是真的嗎?扒一扒selina與阿中離婚內幕 前段時間參加《女兒們的戀愛》中的selina,在網上再次引起了網友的熱議,不少網友表示,Selina離婚是不是不會生育,selina不會生育是不是與自己燒傷有關,關於selina不會懷孕的原因到底是怎麼樣的   原標題:selina燒傷後不能生育是真的嗎?
  • 閒來無事,最後再扒一扒古琴數字理論中的「五音論」
    前幾天扒了扒古琴琴器方面的數字理論,今天再開個新坑,來扒一扒古琴音樂中的數字學「五音論」。
  • 扒一扒葉羅麗中的龍套角色:封銀沙的媽媽有藝術天賦 糖果店店長最...
    扒一扒葉羅麗中的龍套角色:封銀沙的媽媽有藝術天賦 糖果店店長最勵志時間:2020-08-22 16:36   來源:盛夏說動漫   責任編輯:沫朵 川北在線核心提示:原標題:扒一扒葉羅麗中的龍套角色:封銀沙的媽媽有藝術天賦 糖果店店長最勵志 暑期檔的精靈夢葉羅麗第八季如約而至,我們也從半年的漫長等待和追番漫畫中來到了新劇情之中
  • 扒一扒胺基酸洗髮水的好處
    扒一扒胺基酸洗髮水的好處市面上的洗護產品種類繁多,但讓人眼花繚亂,消費者在嘗試過多種洗髮產品後卻得不到滿意的效果,反而付出了頭髮嚴重受損、頭皮敏感脆弱等代價。但可喜的是,洗髮水在近年來迎來革命,開啟了胺基酸洗髮水時代。咔拉寶寶洗髮要慎重,現在就為大家扒一扒胺基酸洗髮水的好處!
  • 扒一扒為什麼MLB能站在棒球帽界的頂峰
    各位爸爸媽媽好,又到了小黑每周二的【扒一扒】時間了。由於我們最近扒的都是一些歐美的大牌,風格都比較成熟一點。雖然受到廣大觀眾的喜愛....哈哈哈哈哈!!!【扒一扒】時間,現在馬上開始....好的~~馬上進入今天的最後一個環節▼這個問題真的有很多人都問過我,所以在此時此刻,小黑就來給大家扒一扒如何區分MLB正品與盜版的區別▼
  • 早早領盒飯卻人氣超高 扒一扒《魔道祖師》中那些閃閃惹人愛的配角
    早早領盒飯卻人氣超高 扒一扒《魔道祖師》中那些閃閃惹人愛的配角時間:2020-08-19 15:32   來源:動漫星際   責任編輯:沫朵 川北在線核心提示:原標題:早早領盒飯卻人氣超高 扒一扒《魔道祖師》中那些閃閃惹人愛的配角 哈咯大家好,歡迎來到圓子的魔道時間。
  • 扒一扒在1818黃金眼「出道」的帥哥
    扒一扒在1818黃金眼「出道」的帥哥時間:2020-09-23 10:07   來源:遊俠網   責任編輯:沫朵 川北在線核心提示:原標題:1818黃金眼男團橫空出世! 扒一扒在1818黃金眼出道的帥哥 小張被浴室玻璃門割傷手今天(9月22日)下午意外登上熱搜榜第一,可能會有人覺得意外,這又是那位明星?
  • 扒一扒那些被做成性愛娃娃的明星
    一!個!都!不!認!接下來畫風逆轉,讓我們嚴肅起來,扒一扒那些被做成性愛娃娃的明星們作為完整嚴謹卓越的AV產業鏈中的最重要的一個節點,AV女優們從影像作品到部位倒模到性愛娃娃,各種周邊開發得十分周全,所以AV女優們的性愛娃娃在世面上一直深受喜愛。雖然我國偉大的盜版商們出爐的作品個個慘不忍睹,充滿類後現代印象野獸派的狂野,倒也順理成章。
  • 鴻蒙OS開原始碼精要解讀之——init
    最近幾篇公眾號預計會和鴻蒙開源部分的代碼解讀有關。有很多開發者願意為鴻蒙搖旗吶喊,未來可期!說明  中科創達OpenHarmony研究組第一時間對https://codechina.csdn.net/openharmony上開源的代碼進行了詳盡的代碼研讀和學習。
  • 扒一扒胡歌的三段情史
    但男神也是普通人,也有自己的七情六慾,所以我們今天就來扒一扒胡歌的三段情史。不過愛情只是生活中很小的一部分。胡歌如今雖然37歲,但他也有自己的朋友圈、有自己的工作。
  • 扒一扒《武媚娘傳奇》中那些花裡胡哨的頭飾,觀眾:大頭娃娃傳奇
    扒一扒《武媚娘傳奇》中那些花裡胡哨的頭飾,觀眾:大頭娃娃傳奇《武媚娘傳奇》大家都很熟悉吧,就是由範冰冰主演的一部古裝劇啦,雖然範冰冰現在因為逃稅的事情現在很少出現在大眾的眼前,但是還是忘不了她的顏值啊,但在這部《武媚娘傳奇》中,雖然範冰冰演的武媚娘非常的漂亮,但是那些頭飾小編今天不得不來吐槽一下了
  • 扒一扒娛樂圈那些讓人咋舌的老少戀
    據悉,紫豔18歲就和他在一起了,並且認定他是自己人生中唯一的男人,是父親也是戀人的存在。消息一出,網友們都炸開了鍋。醜聞一出,桂文枝事業恐怕受到衝擊,目前正在主持的節目《歡迎新婚夫婦》(暫譯)中,他在觀眾心中維持的一直是愛妻形象,不想卻陷入祖孫戀長達20年,除了節目可能不保之外,演藝事業或將斷送。
  • 扒一扒 韓劇《Doctors》你不知道的同款
    距上次扒熱劇《太陽的後裔》同款後就再也沒扒過其它劇,因為它完結後,我覺得就再也沒出現過能吸引我的韓劇了,一瘦下來氣質提升了不少,走哪哪帶光芒!所以說你不減肥永遠不知道瘦下來的自己有多驚豔    樸信惠一改以往清純傻白甜形象,切換為霸道妹子,多少人因為樸信惠的打戲被撩的神魂顛倒?你看看這嫻熟的動作