分类: LINUX
2009-05-26 09:43:27
building system 包括幾種重要的設定檔,
.mk 是 module 和 package 的設定檔,每個 module/package 的目錄下都會有一個 .mk。 所謂的 module 是指系統的 native code ,相對於用 Java 寫成的 application 稱為 package。
AndroidProducts.mk 則設定 product 配置。 product 即特定 系統版本,透過編譯不同 product ,產生不同軟體配置內容,安裝不同的 application。 Product 可視為特定專案,產生特定規格系統。
BoardConfig.mk 是為 product 主板做設定,像是 driver 選擇、
設定。*
buildspec.mk 是位於 source 根目錄下,為進行編譯者所做之額外設定。 例如,可在此選擇要產生的 product 、平台、額外的 module/package 等。
build/envsetup.sh 實作一個 mm 指令,以編譯單一 module,不需編譯整個 source tree。ONE_SHOT_MAKEFILE 這個 makefile 變數/參數就是用以實作這個功能。使用 方法是在執行 make 時,將該變數指定為 module 的 .mk。
透過定義 CREATE_MODULE_INFO_FILE , building system 會將所有 module 資訊 列在 $(PRODUCT_OUT)/module-info.txt 檔案裡。
設定 BUILD_TINY_ANDROID=true , building system 產生一個簡單的 image , 以測試硬體的可用度。此功能用於移植的早期階段,以快速 bring up 。
HOST_BUILD_TYPE 和 TARGET_BUILD_TYPE 指定 building system 產生 binary 的目的為 debug 或 release 。透過設定此二變數,能產生包含 debug information 的 binry 。
這些參數,也可設於 buildspec.mk 裡,以避免開發過程不斷的重新指定。
一般編輯整個 系統,就是使用 droid 這個 goal。 droid 會產生一個 完整的系統,包括 bootloader、kernel、系統程式、模組和程式。
showcommands 和 droid 功能相同,但 droid 在編譯過程不顯示所使用的指令。 透過 showcommands 這個 goal, building system 顯示過程中每一個步驟的詳細 指令。
以上的主要流程都是由 build/core/main.mk 所安排。
由 build/core/config.mk 所進行。 build/core/envsetup.mk 檢查 developer 的設定 (buildspec.mk) , 並檢查執行環境,以決定輸出目錄、項目。
build/core/config.mk 本身還依據參數,決定解譯時的相關參數。像是 compiler 的路徑、flags, lex 、yacc 的路徑參數等。
關於 product 的相關設定,則是由 build/core/product_config.mk 所處理, 使用 build/core/product.mk 提供之 macro 載入。根據 AndroidProduct.mk 的內容, product_config.mk 決定了
product 的設定來自於 build/target/product/AndroidProduct.mk 和
vendor 子目錄下的 AndroidProduct.mk 。 building system 透過 find 指令,
找出所有可能的 AndroidProduct.mk。 AndroidProduct.mk 裡定義
PRODUCT_MAKEFILES 變數,列舉所有實際定義 product 的 makefile。
這些 makefile 各自定義獨立的 product 。product 相關參數,存成
PRODUCTS.
Module 是指 native code 的軟體元件,而 Java application 則被稱為 package。 build/core/definitions.mk 定義 module/package 相關 macro ,讀取、檢查 module/package 定義檔;分散 source tree 各處的 .mk 檔案。 build/core/main.mk 使用 find 指令,在這些子目錄下找出所有 .mk , 並將路徑存在 subdir_makefiles 變數裡。最後,include 這些檔案。
這些 .mk 會 include 定義成變數 BUILD_SHARED_LIBRARY 、BUILD_PACKAGE 等,
和其目的相配的 makefile。這些 makefile 會變 .mk 定義之內容,存成
ALL_MODULES.
Search .mk 的路徑,基本上會是整個 source tree 。但會依特定的 goal , 選擇性只找尋特定目錄。例如 SDK 只需特定目錄下的 .mk 。
和目標平台主板相關之設定,例如使用了什麼裝置、driver 等,或是是否需要編譯 bootloader 、 kernel 等,都是在 BoardConfig.mk 裡設定。同樣,每張主板 可以有不同設定,存在不同目錄下的 BoardConfig.mk ,以 find 尋找如下檔案:
在 module 的定義檔 .mk 裡,可定義 module 的 tag, LOCAL_MODULE_TAGS, 以分類這些 module。 每一個 product 可以指定需要的 tag (PRODUCT_TAGS),使 building system 只編譯標示這些 tag 的 module。在 build/core/main.mk 裡,所有標示特定 tag 的 module 收集為 ALL_DEFAULT_INSTALLED_MODULES ,並 include build/core/Makefile 處理。
build/core/Makefile 為這些 module 產生 rule ,並使產生 image 的 goal depend on 這些 rule ,使這些 module 被編譯。
的 building system 其實不是那麼複雜。在了解之後,也不是那麼難修改。 但, GNU make 的一些語法,所 building system 使用一些不是那麼直覺的用法, 使的 building system 較難了解。但,花點心思就能克服。