通用makefile是如何煉成的(Ⅸ)整體框架

通用makefile系列收視率比較慘淡,工程本身也進入尾期,這裏直接大躍進嘍

上類圖



類圖畫得不好,所以下面文字簡單解釋

1. 整個通用makefile分爲若干大塊,也就是上面用包表示的部分,主要是產品Product,編譯平臺Platform,操作系統System,模塊Module,編譯目標Target,以及BuildPath這兩塊。

   產品Product,編譯平臺Platform,操作系統System,編譯目標Target 都是獨立的組件,不依賴於module。

2. 對編譯目標Target,Module可以選擇加載裏面的成員,excutable.mk, 或者static-library.mk, 分別表示編譯生成可執行文件或者靜態庫。Target自身不依賴於Module(不過目前實現還是依賴於ModuleName 和ModulePath),但預留了定製接口TARGET_SPECS,Target會自動加載該變量指定的文件。 

3. 對產品Product,主要的信息可以在vendor.mk 以及features.mk中定義,類似於Target,  Product也提供了定製接口PRODUCT_SPECS。

   特別值得一提的是Product另外提供了接口hook__import-product,該接口用於指定產品中的各項信息該如何加載以及組織。該接口的實現在Build組件的utility.mk。當前的實現是可以支持多產品的,各個產品以文件夾分類

4. 對編譯平臺Platform,基本同Product。 稍微有點不同的是支持多平臺的方式不是通過文件夾分類,而是直接按平臺名稱命名,如果x86-linux.mk, arm-linux.mk等等

5. 對Path,主要負責整合各種路徑問題,如obj文件的存放路徑、lib文件的存放路徑等等。這個組件實際是與其他組件緊密耦合的。上面圖中省略了這種耦合關係。(其實將它放到包Build裏面可能比較好)

6. 最終的模塊module。module是一個集大成者。module.mk的實現就相當於是一個簡單的makefile,具體內容包括加載操作系統信息,加載產品信息,加載編譯平臺信息,加載路徑信息,配置自身的模塊信息,調用需要的編譯目標進行編譯。

   另外module是可以對其他模塊做出定製的。以增加特性爲例,如果需要爲A模塊單獨增加某個特性,可以新建一個makefile,將特性定義在其中。然後只要定義PRODUCT_SPECS的值爲剛纔新建的makefile路徑,一切就ok了。

7. Build模塊是整體的容器,通過main.mk 加載指定的module.mk, 總共加載了幾個,就編譯幾個。


下面以加載流程圖結束



over,剩下預計還有兩篇,分別是腳本化,和實際應用。


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