命令行工具 hb (HarmonyOS|OpenHarmony Build 編譯構(gòu)建系統(tǒng)的縮寫(xiě)) 都很熟悉了。這是一個(gè)基于 gn 和 ninja 的構(gòu)建系統(tǒng),以支持 OpenHarmony 組件化開(kāi)發(fā)為目標(biāo),提供以下基本功能:
支持按組件拼裝產(chǎn)品并編譯。
獨(dú)立構(gòu)建單個(gè)組件
工具 hb 對(duì)應(yīng)的開(kāi)源代碼倉(cāng)為 build lite,代碼目錄如下:
```bash build/lite ├── components # 組件描述文件 ├── figure # readme中的圖片 ├── hb # hb pip安裝包源碼 ├── make_rootfs # 文件系統(tǒng)鏡像制作腳本 ├── config # 編譯配置項(xiàng) │ ├── component # 組件相關(guān)的模板定義 │ ├── kernel # 內(nèi)核相關(guān)的編譯配置 │ └── subsystem # 子系統(tǒng)編譯配置 ├── platform # ld腳本 ├── testfwk # 測(cè)試編譯框架 └── toolchain # 編譯工具鏈配置,包括:編譯器路徑、編譯選項(xiàng)、鏈接選項(xiàng)等
本文主要梳理 build lite 輕量級(jí)編譯構(gòu)建系統(tǒng)涉及的配置目錄。有些知識(shí)點(diǎn),只能從代碼中獲取,官方資料里沒(méi)有提供很詳細(xì)的說(shuō)明,希望此文可以對(duì)此進(jìn)行補(bǔ)充。
我們先看些相關(guān)的文件的代碼片段。
1、buildliteohos_var.gni
文件 buildliteohos_var.gni 定義了所有部件的全局變量,該文件還用于讀取產(chǎn)品解決方案的配置文件 config.json 中的配置項(xiàng),解析為 gn 變量。該文件被文件
openharmonybuildliteconfigBUILDCONFIG.gn 包含導(dǎo)入 import。該文件的代碼片段如下,我們主要看下配置的目錄。⑴處表明如果產(chǎn)品解決方案的配置文件 config.json 中定義了 “vendor_adapter_dir”,則環(huán)境變量 ohos_vendor_adapter_dir、ohos_board_adapter_dir 均設(shè)置為所配置的目錄。這個(gè)是開(kāi)發(fā)板適配目錄,從代碼中的注釋 “To be deleted, and will use board config.” 可以看出,不建議使用這個(gè)配置項(xiàng),要?jiǎng)h除,只是為了兼容,還在繼續(xù)保留著吧。實(shí)現(xiàn)同樣功能的配置項(xiàng)是開(kāi)發(fā)板配置文件 config.gni 中的配置項(xiàng) board_adapter_dir,下文會(huì)詳細(xì)分析。
⑵處為產(chǎn)品適配目錄 “product_adapter_dir”,一些和產(chǎn)品相關(guān)的需要適配的部件,會(huì)把適配文件放在在配置的目錄內(nèi)。⑶處 third_party_dir 用于維護(hù)第三方軟件的目錄,雖然我們都知道 openharmony 的第三方目錄為 third_party,部分子系統(tǒng)部件需要明確的指定這個(gè)目錄。
if (product_path != "") { product_config = read_file("${product_path}/config.json", "json") # Board selected by product. board_name = product_config.board device_company = product_config.device_company # Supported kernel: "liteos_a", "liteos_m", "linux" ohos_kernel_type = product_config.kernel_type if (defined(product_config.kernel_is_prebuilt)) { ohos_kernel_is_prebuilt = product_config.kernel_is_prebuilt } # To be deleted, and will use board config. ⑴ if (defined(product_config.vendor_adapter_dir)) { ohos_vendor_adapter_dir = product_config.vendor_adapter_dir ohos_board_adapter_dir = ohos_vendor_adapter_dir } ⑵ ohos_product_adapter_dir = product_config.product_adapter_dir ⑶ ohos_third_party_dir = product_config.third_party_dir }
2、buildliteconfigBUILDCONFIG.gn
文件 buildliteconfigBUILDCONFIG.gn 用于配置編譯構(gòu)建,該文件會(huì) import 導(dǎo)入產(chǎn)品解決方案和芯片開(kāi)發(fā)板解決方案的配置文件。該文件會(huì)解析開(kāi)發(fā)板配置文件 config.gni。如⑴所示,board_adapter_dir 為開(kāi)發(fā)板適配目錄,用于存放 OHOS 部件的適配文件。
從上文已知,產(chǎn)品解決方案的配置文件 config.json 中也能配置開(kāi)發(fā)板適配目錄。到這里,我們可以知道開(kāi)發(fā)板配置文件 config.gni 在的這個(gè)配置選項(xiàng)優(yōu)先級(jí)更高,只要配置了就會(huì)覆蓋 config.json 中的配置的開(kāi)發(fā)板適配目錄。這兩個(gè)配置項(xiàng) ohos_board_adapter_dir 和 ohos_vendor_adapter_dir 用途是一致的,別名吧。
import("http://build/lite/ohos_var.gni") import("${device_path}/config.gni") ...... # Load board adapter dir from board config. ⑴ if (board_adapter_dir != "") { ohos_board_adapter_dir = board_adapter_dir ohos_vendor_adapter_dir = board_adapter_dir }
3、移植案例中配置文件中的目錄配置示例
看了 build lite 相關(guān)的代碼片段之后,我們看下幾個(gè)移植案例的配置文件片段。
文件 openharmonyvendorbearpibearpi_hm_nanoconfig.json 配置的目錄有三方目錄和產(chǎn)品適配目錄 third_party_dir。
"third_party_dir": "http://device/soc/hisilicon/hi3861v100/sdk_liteos/third_party", "product_adapter_dir": "http://vendor/bearpi/bearpi_hm_nano/hals"
文件 openharmonyvendorgoodixgr5515_sk_iotlink_democonfig.json 配置的目錄有芯片開(kāi)發(fā)板適配目錄 vendor_adapter_dir 和產(chǎn)品適配目錄 product_adapter_dir。
"third_party_dir": "", "vendor_adapter_dir": "http://device/soc/goodix/gr551x/adapter", "product_adapter_dir": "http://vendor/goodix/gr5515_sk_iotlink_demo/hals"
在文件 openharmonydeviceboardgoodixgr5515_skliteos_mconfig.gni 中,也配置了開(kāi)發(fā)板適配目錄 board_adapter_dir。兩處配置文件都進(jìn)行了配置,根據(jù)上文分析 build lite 的代碼,只在 config.gni 中配置一次即可。
#Board adapter dir for OHOS components. board_adapter_dir = "http://device/soc/goodix/gr551x/adapter"
3、product_adapter_dir 產(chǎn)品適配目錄
在開(kāi)發(fā)產(chǎn)品時(shí),有哪些子系統(tǒng)或部件需要在產(chǎn)品適配目錄里放置適配文件呢?我們?cè)?OpenHarmony 代碼目錄下執(zhí)行 grep ohos_product_adapter_dir -rn ./,輸出如下??梢钥闯?,當(dāng)前需要適配的部件包含:security 子系統(tǒng)的 permission 權(quán)限管理部件和啟動(dòng)子系統(tǒng)的 syspara_lite 系統(tǒng)參數(shù)部件。對(duì)于 permission 權(quán)限管理部件,需要在產(chǎn)品適配目錄下創(chuàng)建 security/permission_lite 目錄。對(duì)于 syspara_lite 系統(tǒng)參數(shù)部件,需要在產(chǎn)品適配目錄下創(chuàng)建 utils/sys_param,utils/token 目錄。這些目錄不能隨意命名,因?yàn)樵谧酉到y(tǒng)部件的 BUILD.gn 里寫(xiě)死的。需要適配實(shí)現(xiàn)哪些文件,在分析相關(guān)的部件時(shí)提供。
./base/security/permission/services/permission_lite/pms/BUILD.gn:42: "${ohos_product_adapter_dir}/security/permission_lite:hal_pms", ./base/security/permission/services/permission_lite/ipc_auth/BUILD.gn:25: "${ohos_product_adapter_dir}/security/permission_lite/ipc_auth/include", ./base/startup/syspara_lite/frameworks/parameter/src/BUILD.gn:31: deps = [ "$ohos_product_adapter_dir/utils/sys_param:hal_sysparam" ] ./base/startup/syspara_lite/frameworks/parameter/src/BUILD.gn:54: "$ohos_product_adapter_dir/utils/sys_param:hal_sysparam", ./base/startup/syspara_lite/frameworks/token/BUILD.gn:30: "$ohos_product_adapter_dir/utils/token:haltoken_shared", ./base/startup/syspara_lite/frameworks/token/BUILD.gn:47: deps = [ "$ohos_product_adapter_dir/utils/token:hal_token_static" ]
4、board_adapter_dir 芯片開(kāi)發(fā)板適配目錄
在開(kāi)發(fā)產(chǎn)品時(shí),有哪些子系統(tǒng)或部件需要在芯片開(kāi)發(fā)板適配目錄里放置適配文件呢?我們?cè)?OpenHarmony 代碼目錄下執(zhí)行 grep ohos_board_adapter_dir -rn ./,輸出如下??梢钥闯?,當(dāng)前需要適配的部件包含:Utils 子系統(tǒng)的 File 部件、multimedia 子系統(tǒng),communication 子系統(tǒng)的 wifi_aware、wifi_lite、bluetooth 等部件、iot_hardware 子系統(tǒng)、update 子系統(tǒng)的 ota_lite 部件。每個(gè)子系統(tǒng)或部件的適配目錄不能隨意命名,因?yàn)樵谧酉到y(tǒng)部件的 BUILD.gn 里寫(xiě)死的。具體需要哪些目錄,可以參考下面的搜索結(jié)果。需要適配實(shí)現(xiàn)哪些文件,在分析相關(guān)的部件時(shí)提供。
./utils/native/lite/file/BUILD.gn:22: deps = [ "$ohos_board_adapter_dir/hals/utils/file:hal_file_static" ] ./foundation/multimedia/utils/lite/BUILD.gn:42: "$ohos_board_adapter_dir/media:hardware_media_sdk", ./foundation/multimedia/utils/lite/BUILD.gn:43: "$ohos_board_adapter_dir/middleware:middleware_source_sdk", ./foundation/communication/wifi_aware/BUILD.gn:20: "$ohos_board_adapter_dir/hals/communication/wifi_lite/wifiservice/source", ./foundation/communication/wifi_aware/BUILD.gn:22: deps = [ "$ohos_board_adapter_dir/hals/communication/wifi_lite/wifiaware:hal_wifiaware" ] ./foundation/communication/bluetooth/services/bluetooth/BUILD.gn:18: "$ohos_board_adapter_dir/hals/communication/bluetooth/services:btservice", ./base/iot_hardware/peripheral/BUILD.gn:18: "$ohos_board_adapter_dir/hals/iot_hardware/wifiiot_lite:hal_iothardware", ./base/iot_hardware/peripheral/BUILD.gn:25: "$ohos_board_adapter_dir/hals/iot_hardware/wifiiot_lite:hal_iothardware", ./base/update/ota_lite/frameworks/test/unittest/common/BUILD.gn:36: deps += [ "$ohos_board_adapter_dir/hals/update:hal_update_static" ] ./base/update/ota_lite/frameworks/test/unittest/common/BUILD.gn:39: deps += [ "$ohos_board_adapter_dir/update:hal_update" ] ./base/update/ota_lite/frameworks/source/BUILD.gn:36: deps += [ "$ohos_board_adapter_dir/hals/update:hal_update_static" ] ./base/update/ota_lite/frameworks/source/BUILD.gn:64: deps += [ "$ohos_board_adapter_dir/update:hal_update" ]
5、內(nèi)核配置文件夾 kernel_configs
在產(chǎn)品解決方案根目錄下的文件夾 openharmonyvendorgoodixgr5515_sk_iotlink_demokernel_configs,是內(nèi)核內(nèi)核文件夾。目前,下面主要是內(nèi)核特性裁剪配置文件 debug.config、release.config 等等。這個(gè)配置文件夾及下面的文件是如何使用的,從文件 kernelliteos_mliteos.gni 可以找到答案,代碼片段如下??梢钥闯鼍唧w使用哪個(gè)文件,是根據(jù)編譯構(gòu)建類(lèi)型決定的,debug、release、tee 等等。
liteos_config_file = "${ohos_build_type}.config" liteos_config_file = rebase_path(liteos_config_file, "", "$product_path/kernel_configs") print("liteos_config_file:", liteos_config_file)
6、ACE 配置文件夾 ace_lite_config
如果配置 ACE 子系統(tǒng)的 ace_engine_lite 部件,需要在產(chǎn)品解決方案目錄下創(chuàng)建目錄 ace_lite_config,存放相應(yīng)的頭文件對(duì)部件進(jìn)行配置定義。可以查看文件 foundationaceace_engine_liteframeworkstargetsBUILD.gn 中的代碼片段了解更多。
config("ace_lite_target_config") { if (enable_ohos_ace_engine_lite_product_config) { defines = [ "ENABLE_OHOS_ACELITE_PRODUCT_CONFIG=1" ] } include_dirs = [ "$product_path/ace_lite_config" ] ...... }
7、三方軟件文件夾 third_party_dir
上文已經(jīng)知道部分部件依賴(lài)三方軟件,具體是哪些部件依賴(lài)三方軟件,我們?cè)?OpenHarmony 代碼目錄下執(zhí)行 grep ohos_third_party_dir -rn ./,輸出如下??梢钥闯?,當(dāng)前需要適配的部件包含:communication、ota_lite 部件。
./foundation/communication/softbus_lite/discovery/BUILD.gn:32: "$ohos_third_party_dir/lwip_sack/include", ./foundation/communication/softbus_lite/trans_service/BUILD.gn:31: "$ohos_third_party_dir/lwip_sack/include", ./foundation/communication/softbus_lite/trans_service/BUILD.gn:32: "$ohos_third_party_dir/mbedtls/include", ./foundation/communication/softbus_lite/authmanager/BUILD.gn:31: "$ohos_third_party_dir/mbedtls/include", ./base/update/ota_lite/frameworks/source/BUILD.gn:31: "$ohos_third_party_dir/mbedtls/include", ./base/update/ota_lite/frameworks/source/BUILD.gn:32: "$ohos_third_party_dir/lwip_sack/include", ./base/update/ota_lite/frameworks/source/BUILD.gn:55: "$ohos_third_party_dir/mbedtls/include", ./base/update/ota_lite/frameworks/source/BUILD.gn:56: "$ohos_third_party_dir/lwip_sack/include
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
452文章
50200瀏覽量
420723 -
開(kāi)源
+關(guān)注
關(guān)注
3文章
3215瀏覽量
42305 -
開(kāi)發(fā)板
+關(guān)注
關(guān)注
25文章
4895瀏覽量
97040 -
OpenHarmony
+關(guān)注
關(guān)注
25文章
3635瀏覽量
16053
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論