[GN] 使用GN+Ninja替代MDK進行編譯

背景

在單片機開發者中,使用MDK一直是一個較爲普遍的選擇,但是當工程變的越來越大之後,MDK開始力不從心,編譯速度下降,配置複雜,編譯過程中添加自定義行爲困難等問題開始顯露出來,因此選擇一個更好的編譯工具就變成了一個需要提上日程的需求。

工具選擇

  1. make
    make屬於第一代構建系統。經常在linux下開發的開發者對於makefile應該相當熟悉,使用makefile來做工程編譯管理是很多人的選擇,通過makefile可以將編譯過程極大的簡化,但是同樣的,makefile的語法比較複雜,寫一個可靠且運行速度良好的make構建系統出來也是一個相當蛋疼的工作,而且極容易出現問題。當工程越來越大,make進行依賴分析的時間也會越來越長,可以達到幾十秒甚至幾分鐘的程度,這讓人很難接受。
  2. automake
    第二代的構建系統,linux的構建基於該系統,該系統在make的基礎上添加了對環境以來的檢查等項目,但是執行效率並沒有太大改善
  3. cmake,scons
    這兩個典型的工具是第三代的構建系統,但是與前兩代相比,這一代開始叫做元構建系統,以cmake爲例,cmake本身並不會執行構建工作,cmake將更高層次的抽象(即cmakelists文件)描述構建依賴關係轉換成make或其他的更底層的構建系統,該過程會屏蔽掉平臺依賴,這樣就可以在不同平臺上進行構建。同樣的使用該工具生成的makefile將會儘可能的照顧其並行性,因爲這部分內容並不需要人去看,只需要按照make能看得懂的方式書寫即可,這樣既降低了make分析依賴關係需要的時間,又提高了並行性,從而極大的降低了構建時間而不需要寫一些非常難以維護的makefile。但是同樣cmake作爲一個開源的項目,其易用性一直受人詬病。文檔質量差,過於複雜的語法和部分難以理解的依賴關係處理,讓編寫描述文件非常痛苦,生成過多的中間文件和需要進行安裝才能使用的特性讓強迫症難以接受。
  4. ninja
    ninja是谷歌研發的新一代構建系統,其提供了無與倫比的構建速度和依賴性支持,本身爲C++編寫,執行效率極高。其實現極爲緊湊和精練,拋棄了make中過於複雜的隱含規則等特性從而獲得了極佳的依賴分析速度,其設計之初的目標就是極盡所能的提高構建速度。但是ninja的語法決定其並不適合手工編寫,因此一般選擇元構建系統來生成ninja文件,如cmake就支持ninja的生成,相對於makefile,其構建速度一般會有2倍以上的提升,依賴分析速度更是可以達到幾十倍的量級。
  5. gn
    其詳細名稱猜測爲generate ninja,看名稱就知道了這個是專用於生成ninja文件的元構建系統。目前gn被用於管理chromium,一個超過500萬行代碼的超大型項目。且項目中使用了非常多的開源項目,有很多甚至有自己的分支或者patch,爲了管理好這樣一個項目並且提高構建效率,谷歌開發了gn這個工具。相對於cmake來說,gn擁有更友好的依賴描述規則,完善的內置文檔,易用性max,對於其設計理念甚至可以稱之爲第四代構建系統。

看標題也知道最終的選擇是GN+Ninja的組合了,原因我是強迫症接受不了cmake需要安裝的蛋疼事實,也接受不了其生成巨多中間文件的特性。

GN

由於gn是元構建系統,因此對於其底層的ninja其實不需要太多的關注,主要學習gn的語法即可。

下面會分幾個專題來一步步學習並寫出一個自己的構建框架,推薦按順序閱讀!

[GN] 官方文檔

[GN] 配置armcc工具鏈

[GN] 工程架構

[GN] 讓構建更快更快以及更快

[GN] 生成bin和hex

拒絕伸手黨,根據此係列文檔應該就能自己搭建一個可用的demo出來了。

如果你犯懶,可以選擇付費購買該系列文檔說明所使用的demo工程,但不提供技術支持!鑑於CSDN蛋疼的打賞規則,通過郵件發送的方式出售,詳情可郵件諮詢[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章