OpenHarmony開發入門—潤和智能家居套件-輕量系統的編譯構建
openharmony的編譯構建系統
1、概念
一個基于gn和ninja的、以支持OpenHarmony組件化開發為目標的現代化編譯構建系統。
ninja:一個專注于速度的小型編譯構建系統.
gn:一種現代化的跨平臺的編輯構建工具,Generate ninja 的縮寫,用于產生ninja文件.
hb:OpenHarmony的命令行工具,用來執行編譯命令.
2、基本功能
- 獨立構建單個組件
- 獨立構建芯片解決方案廠商源碼(開發板)
- 支持按組件拼裝產品并編譯
3、核心理念
子系統
一個邏輯概念,由一個或多個具體組件構成。
OpenHarmony系統功能按"系統">“子系統”>"組件"逐級展開,支持裁剪子系統或組件。
組件
可復用、可配置、可裁剪的系統最小功能單元。
APP也是組件的一種。
組件目錄獨立,可并行開發、單獨編譯、單獨測試。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
最頂層的openharmony是一個操作系統,他由多個系統或者叫做子系統集構成,而每個系統又是由多個子系統構成,每個子系統又包括了多個組件,子系統和組件,都是可以被裁剪的。
(裁剪,就是去掉它不要,在最終的構建中不包括他)下面我們來看一下build/lite下的目錄結構。
打開vscode,從虛擬機中獲取1.1.3版本的源碼。獲取源碼的步驟可以看我上一篇博客:https://ost.51cto.com/posts/25292。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
├── components-------//組件描述文件
├── config-------------//編譯相關的配置項
│ ├── component------//組件相關的模板定義
│ ├── kernel---------//內核的編譯配置參數
│ └── subsystem------//子系統模版
├── figures------------//readme中的圖片
├── hb-----------------//hb pip安裝包源碼
├── make_rootfs--------//文件系統鏡像制作腳本
├── ndk----------------//Native API相關編譯腳本與配置參數
├── platform-----------//ld腳本
├── testfwk------------//測試編譯框架
├── toolchain----------//編譯工具鏈配置,包括編譯器路徑、編譯選項、鏈接選項等
4、編譯構建流程
編譯構建流程主要分為兩步:設置(hb set) 和 編譯(hb build)。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
hb set用來設置Openharmony源碼目錄和要編譯的目標。
比如在如下圖中,我們選擇編譯的產品是wifiiot_hispark_pegasus
hb build 編譯開發板、產品或組件。
主要過程:
- 讀取編譯配置:根據產品選擇的開發板,讀取開發板config.gni文件內容,主要包括編譯工具鏈、編譯鏈接命令和選項等。
- 調用gn:調用"gn gen",讀取產品配置,生成產品解決方案out目錄和ninja文件。
- 調用ninja: 調用"ninja -C out/board/product"啟動編譯。
- 系統鏡像打包:將組件編譯產物打包,設置文件屬性和權限,制作文件系統鏡像。
注意: 在輕量系統中,組件作為一個單獨的模塊,不能夠直接燒錄到開發板中,他必須加入到一個產品或者是一個開發板方案中,作為一個完整的固件之中的一個功能點。
編譯構建系統的配置規則
概述:為了實現組件、芯片解決方案、產品解決方案與OpenHarmony是解耦的、可插拔(可裁剪)的,組件、芯片解決方案和產品解決方案的路徑、目錄樹和配置需遵循一定的規則。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
何為目錄樹呢:
一般情況下我們會為一個組件建立一個單獨的目錄。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
- 組件源碼路徑不能隨意亂來,要分為三個層級:{領域}/{子系統}/{組件}。
- 領域:子系統集。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
確定好組件目錄的具體位置后,相當于組件就有了一個家,而這個家需要簡單的裝修一下,劃分一下功能區。
就像我們的家里有客廳,廚房,臥室等等。組件的家也需要有一定的結構,這個結構就是目錄樹。下面我們來看一個例子:
- 源碼分析: loT外圍設備控制組件。
- 這個組件的源碼路徑為:base/iot hardware/peripheral。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
打開vscode,找到這個路徑。顯示如下:
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
正是符合上圖的源碼目錄樹規則:
- kits目錄下存放了應用接口。
- 擴展名是.h的文件正是接口頭文件,使用具體的接口時,要去include他們。
- BUILD.gn是組件編譯腳本。
至此,我們對Openharmony編譯構建系統的理解已經邁進了一大步。
組件的定義
作為一個組件,必須要注冊到一個子系統中,Openharmony才會意識到你的存在。
定義的位置:build/lite/components/<對應子系統>.json。
打開vscode,找到這個路徑,顯示如下:
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
可以看到,這里存放了很多json文件,而每一個json文件都對應了一個子系統。
在定義子系統的json文件時,我們要把自己的基本情況告訴這個子系統。
注意:新增組件時需要在對應子系統json文件中添加相應的組件定義。產品所配置的組件必須在某個子系統中被定義過,否則會校驗失敗。
下面我們來看一下需要定義的內容有哪些。
- 名稱
- 功能簡介
- 是否必選
- 源碼路徑
- 編譯目標
- RAM
- ROM
- 編譯輸出
- 已適配的內核、
- 可配置的特性和依賴等。
我們繼續來看一個例子。還是剛剛的IoT外圍設備控制組件,在build/lite/components/iot_hardware.json中。
組件的編譯目標(編譯入口)
其實就是組件定義中的targets參數。
格式:
- “targets”:[“路徑:目標”]。
- 路徑:采用絕對路徑表示,以"http://"開頭,從源碼根目錄開始。
- 目標:由"路徑/BUILD.gn"定義。
舉個例子:
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
“targets”:[“//base/iot_hardware/peripheral:iothardware”]
- 路徑: //base/iot_hardware/peripheral
- 目標: iothardware Openharmony會去這個路徑下找到BUILD.gn文件,在這個文件中,找到iothardware這個目標部分,按這部分的要求進行編譯。
下面我們就來看一下BUILD.gn文件如何編寫。
組件的編譯腳本
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
類型
- 靜態庫 (.a) : static_library
- 動態庫 (.so) : shared_library
- 可執行文件 (bin 文件 ) : executable
- 組: group
目標:編譯目標名稱(官方建議與組件一致)
- sources :源文件列表
- include_dirs : include 目錄列表
舉個例子:IoT外圍設備控制組件。
先從組件定義的json文件中找到編譯目標: build\lite\components\iot_hardware.json -> targets。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
再根據targets中的路徑找到BUILD.gn編譯腳本:base\iot_hardware\peripheral\BUILD.gn。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
注意:此腳本負責整個 IoT 專有硬件服務子系統的編譯。通過subsystem_components( 子系統組件 ) 方式指定 IoT 外圍設備控制組件,指向下級編譯腳本。 “$ohos_vendor_adapter_dir” 表示 “device\hisilicon\hispark_pegasushi3861_adapter” 目錄。
我們再跟蹤到 device\hisilicon\hispark_pegasus\hi3861_adapter\hals\iot_hardware\wifiiot_liteBUILD.gn,如下正是組件的編譯腳本內容。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
下面我們再看一個例子,kv_store 組件(鍵值存儲),他位于 build\lite\components\utils.json 中的第 1 個組件。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
編譯腳本: utils\native\lite\kv_store\BUILD.gn。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
注意:此腳本通過 lite_component( 組件 ) 的 features( 模塊 ) 方式。
指定 utils_kv_store 模塊,指向下級編譯腳本。
我們跟蹤到utils\native\lite\kv_store\src\BUILD.gn,如下正是組件編譯腳本。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
到這,我們編譯構建系統的配置規則也就學習完了,相信同學們會對Openharmony的構建編譯系統有更深一步的理解。
下面附上子系統的構建模型。
【openharmony開發入門】潤和智能家居套件-輕量系統的編譯構建-開源基礎軟件社區
小編將會在下一篇博客中講解如何新增組件和輕量系統的數據持久化。