構建要素
一般而言,一個工程的構建包含如下幾個要素:
組件化思想
組件化思想是指是功能模塊可以隨意地剪裁,拼接。實際上此思想的實現就主要依附於構建體系,一個組件存在的標誌就是它有一個對應的 .mk 文件。
由於採用組件化管理思想,爲了讓每個組件相互隔離,獨立配置,每一個組件的目錄下放置一個.mk來存放每個組件各異的操作配置。並且組件間通過依賴來指定關聯。而構建系統所有組件統一的操作機制放在build目錄下的.mk中。這樣可以達到組件間變化隔離,修改靈活的效果
總體流程
總體上構建的過程分爲如下三個步驟:
簡言之,第二步中如 config.mk,xx.c_opts,link.opts 就包含了上面所說的要素中除工具鏈鏈外所有所需的信息。所以構建的核心其實就是這些文件的生成和使用。
更詳細的圖示如下:
mk文件內容說明
一個模塊的mk文件中基本上描述了這個組件要如何構建,所以非常關鍵,下面部分舉例來說明其主要內容:
其中全局是指編譯所有組件時都要用到的設置,局部是指僅在編譯本組件時用到。一個mk文件就是描述了一個組件的配置信息。其實配置的設定都可以在 _CFLAGS 和 _LDFLAGS中指定,包括鏈接使用的鏈接腳本。
具體實現說明
下面按照上面所說的要素來展開說明構建體系的具體實現,相關關鍵代碼等:
工具鏈選擇
宿主平臺在aos.py中設置。輔助命令工具在 aos_host_cmd.mk 中設置,目前主要支持 windows 和 linux64 上兩種編譯宿主機平臺。
編譯工具鏈的設置,在 aos_target_xx.mk 和 aos_library_xx.mk中會設置。
找到源文件
編譯命令通常是 app名@board名,app和board即爲查找所有依賴的兩個入口組件。
依賴查找過程遞歸實現:
事實上上面的查找除了找到源文件之外還會解析出mk中定義編譯選項等信息,實際上是在遞歸解析組件的mk文件。爲後面的編譯鏈接步驟做好準備。
config.mk生成
將上面遞歸解析出的mk中的信息存儲在config.mk中:
config.mk 其實就是把所有組件 mk 中的信息彙總到一起。而後面產生的opts文件則是針對每個組件把config.mk中信息重新組合到一起產生的一個獨立的文件。
編譯
編譯命令
每個組件的編譯選項產生
鏈接
鏈接命令
鏈接選項的產生
二進制及其他處理
統一進行的二進制處理如strip等
組件單獨定義的處理
關鍵宏調用關係梳理
FIND_COMPONENT --找到所有需要的組件 參數:所有基本組件,遞歸調用
PREPROCESS_TEST_COMPONENT --將所有測試所需的組件也加入到組件中,無參數
PROCESS_COMPONENT --解析每個組件的 mk,參數:所有組件
PROCESS_ONE_COMPONENT --解析一個組件,參數:某一個組件
WRITE_FILE_CREATE --在config.mk中寫入所有相關信息,包括寫入所有編譯,鏈接選項到opts文件中