电子说
命令行工具 hb (HarmonyOS|OpenHarmony Build 编译构建系统的缩写) 都很熟悉了。这是一个基于 gn 和 ninja 的构建系统,以支持 OpenHarmony 组件化开发为目标,提供以下基本功能:
支持按组件拼装产品并编译。
独立构建芯片解决方案厂商源码。
独立构建单个组件
工具 hb 对应的开源代码仓为 build lite,代码目录如下:
```bash build/lite ├── components # 组件描述文件 ├── figure # readme中的图片 ├── hb # hb pip安装包源码 ├── make_rootfs # 文件系统镜像制作脚本 ├── config # 编译配置项 │ ├── component # 组件相关的模板定义 │ ├── kernel # 内核相关的编译配置 │ └── subsystem # 子系统编译配置 ├── platform # ld脚本 ├── testfwk # 测试编译框架 └── toolchain # 编译工具链配置,包括:编译器路径、编译选项、链接选项等
本文主要梳理 build lite 轻量级编译构建系统涉及的配置目录。有些知识点,只能从代码中获取,官方资料里没有提供很详细的说明,希望此文可以对此进行补充。
我们先看些相关的文件的代码片段。
1、buildliteohos_var.gni
文件 buildliteohos_var.gni 定义了所有部件的全局变量,该文件还用于读取产品解决方案的配置文件 config.json 中的配置项,解析为 gn 变量。该文件被文件
openharmonybuildliteconfigBUILDCONFIG.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、buildliteconfigBUILDCONFIG.gn
文件 buildliteconfigBUILDCONFIG.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 相关的代码片段之后,我们看下几个移植案例的配置文件片段。
文件 openharmonyvendorbearpibearpi_hm_nanoconfig.json 配置的目录有三方目录和产品适配目录 third_party_dir。
"third_party_dir": "//device/soc/hisilicon/hi3861v100/sdk_liteos/third_party", "product_adapter_dir": "//vendor/bearpi/bearpi_hm_nano/hals"
文件 openharmonyvendorgoodixgr5515_sk_iotlink_democonfig.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"
在文件 openharmonydeviceboardgoodixgr5515_skliteos_mconfig.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
在产品解决方案根目录下的文件夹 openharmonyvendorgoodixgr5515_sk_iotlink_demokernel_configs,是内核内核文件夹。目前,下面主要是内核特性裁剪配置文件 debug.config、release.config 等等。这个配置文件夹及下面的文件是如何使用的,从文件 kernelliteos_mliteos.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,存放相应的头文件对部件进行配置定义。可以查看文件 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
上文已经知道部分部件依赖三方软件,具体是哪些部件依赖三方软件,我们在 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
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !