1. 程式人生 > 其它 >Open Harmony移植:build lite配置目錄全梳理

Open Harmony移植:build lite配置目錄全梳理

摘要:本文主要介紹build lite 輕量級編譯構建系統涉及的配置目錄的用途,分析相關的原始碼。

本文分享自華為雲社群《移植案例與原理 - build lite配置目錄全梳理》,作者:zhushy 。

命令列工具hb(HarmonyOS|OpenHarmony Build 編譯構建系統的縮寫)都很熟悉了。這是一個基於gn和ninja的構建系統,以支援OpenHarmony元件化開發為目標,提供以下基本功能:

  • 支援按元件拼裝產品並編譯。
  • 獨立構建晶片解決方案廠商原始碼。
  • 獨立構建單個元件

工具hb對應的開原始碼倉為build lite,程式碼目錄如下:

build/lite
├── components                  # 元件描述檔案
├── figure                      # readme中的圖片
├── hb                          # hb pip安裝包原始碼
├── make_rootfs                 # 檔案系統映象製作指令碼
├── config                      # 編譯配置項
│   ├── component               # 元件相關的模板定義
│   ├── kernel                  # 核心相關的編譯配置
│   └── subsystem               # 子系統編譯配置
├── platform                    # ld指令碼
├── testfwk                     # 測試編譯框架
└── toolchain                   # 編譯工具鏈配置,包括:編譯器路徑、編譯選項、連結選項等

本文主要梳理build lite 輕量級編譯構建系統涉及的配置目錄。有些知識點,只能從程式碼中獲取,官方資料裡沒有提供很詳細的說明,希望此文可以對此進行補充。

我們先看些相關的檔案的程式碼片段。

1、build\lite\ohos_var.gni

檔案build\lite\ohos_var.gni定義了所有部件的全域性變數,該檔案還用於讀取產品解決方案的配置檔案config.json中的配置項,解析為gn變數。該檔案被檔案
openharmony\build\lite\config\BUILDCONFIG.gn包含匯入import。該檔案的程式碼片段如下,我們主要看下配置的目錄。⑴處表明如果產品解決方案的配置檔案config.json中定義了“vendor_adapter_dir”,則環境變數ohos_vendor_adapter_dir、ohos_board_adapter_dir均設定為所配置的目錄。這個是開發板適配目錄,從程式碼中的註釋“To be deleted, and will use board config.”可以看出,不建議使用這個配置項,要刪除,只是為了相容,還在繼續保留著吧。實現同樣功能的配置項是開發板配置檔案config.gni中的配置項board_adapter_dir,下文會詳細分析。

⑵處為產品適配目錄“product_adapter_dir”,一些和產品相關的需要適配的部件,會把適配檔案放在在配置的目錄內。⑶處third_party_dir用於維護第三方軟體的目錄,雖然我們都知道openharmony的第三方目錄為third_party,部分子系統部件需要明確的指定這個目錄。

    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、build\lite\config\BUILDCONFIG.gn

檔案build\lite\config\BUILDCONFIG.gn用於配置編譯構建,該檔案會import匯入產品解決方案和晶片開發板解決方案的配置檔案。該檔案會解析開發板配置檔案config.gni。如⑴所示,board_adapter_dir為開發板適配目錄,用於存放OHOS部件的適配檔案。

從上文已知,產品解決方案的配置檔案config.json中也能配置開發板適配目錄。到這裡,我們可以知道開發板配置檔案config.gni在的這個配置選項優先順序更高,只要配置了就會覆蓋config.json中的配置的開發板適配目錄。這兩個配置項ohos_board_adapter_dir和ohos_vendor_adapter_dir用途是一致的,別名吧。

   import("//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相關的程式碼片段之後,我們看下幾個移植案例的配置檔案片段。

檔案openharmony\vendor\bearpi\bearpi_hm_nano\config.json配置的目錄有三方目錄和產品適配目錄third_party_dir。

  "third_party_dir": "//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party",
    "product_adapter_dir": "//vendor/bearpi/bearpi_hm_nano/hals"

檔案openharmony\vendor\goodix\gr5515_sk_iotlink_demo\config.json配置的目錄有晶片開發板適配目錄vendor_adapter_dir和產品適配目錄product_adapter_dir。

  "third_party_dir": "",
  "vendor_adapter_dir": "//device/soc/goodix/gr551x/adapter",
  "product_adapter_dir": "//vendor/goodix/gr5515_sk_iotlink_demo/hals"

在檔案openharmony\device\board\goodix\gr5515_sk\liteos_m\config.gni中,也配置了開發板適配目錄board_adapter_dir。兩處配置檔案都進行了配置,根據上文分析build lite的程式碼,只在config.gni中配置一次即可。

# Board adapter dir for OHOS components.
board_adapter_dir = "//device/soc/goodix/gr551x/adapter"

3、product_adapter_dir產品適配目錄

在開發產品時,有哪些子系統或部件需要在產品適配目錄裡放置適配檔案呢?我們在OpenHarmony程式碼目錄下執行 grep ohos_product_adapter_dir -rn ./,輸出如下。可以看出,當前需要適配的部件包含:security子系統的permission許可權管理部件和啟動子系統的syspara_lite系統引數部件。對於permission許可權管理部件,需要在產品適配目錄下建立security/permission_lite目錄。對於syspara_lite系統引數部件,需要在產品適配目錄下建立utils/sys_param,utils/token目錄。這些目錄不能隨意命名,因為在子系統部件的BUILD.gn裡寫死的。需要適配實現哪些檔案,在分析相關的部件時提供。

./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晶片開發板適配目錄

在開發產品時,有哪些子系統或部件需要在晶片開發板適配目錄裡放置適配檔案呢?我們在OpenHarmony程式碼目錄下執行 grep ohos_board_adapter_dir -rn ./,輸出如下。可以看出,當前需要適配的部件包含:Utils子系統的File部件、multimedia子系統,communication子系統的wifi_aware、wifi_lite、bluetooth等部件、iot_hardware子系統、update子系統的ota_lite部件。每個子系統或部件的適配目錄不能隨意命名,因為在子系統部件的BUILD.gn裡寫死的。具體需要哪些目錄,可以參考下面的搜尋結果。需要適配實現哪些檔案,在分析相關的部件時提供。

./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、核心配置資料夾kernel_configs

在產品解決方案根目錄下的資料夾openharmony\vendor\goodix\gr5515_sk_iotlink_demo\kernel_configs,是核心核心資料夾。目前,下面主要是核心特性裁剪配置檔案debug.config、release.config等等。這個配置資料夾及下面的檔案是如何使用的,從檔案kernel\liteos_m\liteos.gni可以找到答案,程式碼片段如下。可以看出具體使用哪個檔案,是根據編譯構建型別決定的,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子系統的ace_engine_lite部件,需要在產品解決方案目錄下建立目錄ace_lite_config,存放相應的標頭檔案對部件進行配置定義。可以檢視檔案foundation\ace\ace_engine_lite\frameworks\targets\BUILD.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

上文已經知道部分部件依賴三方軟體,具體是哪些部件依賴三方軟體,我們在OpenHarmony程式碼目錄下執行 grep ohos_third_party_dir -rn ./,輸出如下。可以看出,當前需要適配的部件包含: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

8、其他

其他還有驅動配置資料夾hdf_config、燒寫分割槽資料夾flash_partition_dir。後續再補充。

參考站點

參考了下述站點,或者推薦讀者閱讀下述站點了解更多資訊。

 

點選關注,第一時間瞭解華為雲新鮮技術~