關注鴻蒙技術社區,回復【鴻蒙】送價值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 是一個非常好的選擇!test.c 是一個簡單的 Hello World 程序,用於列印一個字符串和頭文件 test.h 中常量 CONST 的值。
各個文件在編譯過程中有明顯的上下遊關係,即:上遊文件影響或者產生下遊文件。
上圖即描述了編譯過程,同時也反映了這樣一個事實:任何一個文件被改動時只可能影響下遊文件,而不會影響上遊文件。這樣,只需要遍歷一次上面的構建圖就可以知道執行哪些動作產生最終可執行程序了。
接下來思考這樣一個問題:如何向構建工具 Ninja 描述構建圖?Ninja 的本質是一種通用程序。既然是程序,那麼擅長的必然是處理結構化文本!因此,可以用結構化文本(Ninja 腳本)來描述構建圖。下面直接上代碼:
①Ninja 腳本中的 build 語句描述構建圖中的一個文件上下遊關係。如:規則 cc 所定義的具體動作是 gcc -c $in -o $out ,其中 $in 指代上遊文件, $out 指代下遊文件。
1. 將上面的腳本另存為文件,並重命名為 build.ninja,且與 test.c 和 test.h 位於同一目錄下。
2. 打開命令行定位到源碼目錄,執行 ninja > log.txt。
通過編譯輸出(log.txt)以及 test.out 的運行結果可知目標構建成功。後記:這只是一個 Ninja 的入門級介紹,更多的細節大家可以參考附件中的手冊。