摘要:本文主要介绍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。后续再补充。

参考站点

参考了下述站点,或者推荐读者阅读下述站点了解更多信息。

点击关注,第一时间了解华为云新鲜技术~

Open Harmony移植:build lite配置目录全梳理的更多相关文章

  1. OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py

    摘要:本文介绍了build lite 轻量级编译构建系统hb命令的源码,主要分析了_\entry__.py文件. 本文分享自华为云社区<移植案例与原理 - build lite源码分析 之 hb ...

  2. TeamCity : Build 基本配置

    前文中我们在 TeamCity 中创建了一个项目 HelloApp,并在这个项目中创建了一个名为 HelloAppDailyBuild 的Build 用来编译 demo 程序.本文我们将详细介绍 Bu ...

  3. X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件

    X-003 FriendlyARM tiny4412 uboot移植之添加相应目录文件 <<<<<<<<<<<<<< ...

  4. r.js build.js配置

    /* * This is an example build file that demonstrates how to use the build system for * require.js. * ...

  5. Eclipse上Maven环境配置使用 (全)

    Eclipse上Maven环境配置使用 (全) 1. 安装配置Maven: 1.1 从Apache网站 http://maven.apache.org/ 下载并且解压缩安装Apache Maven. ...

  6. r.js合并实践 --项目中用到require.js做生产时模块开发 r.js build.js配置详解

    本文所用源代码已上传,需要的朋友自行下载:点我下载 第一步: 全局安装  npm install -g requirejs 第二步: 1.以下例子主要实现功能, 1)引用jq库获取dom中元素文本, ...

  7. Ant之build.xml配置详解【转】

    原文:https://blog.csdn.net/mevicky/article/details/72828554 前言国内关于build.xml的配置资料太零散了,实在是受不了,故而将自己的笔记整理 ...

  8. Android开发之深入理解Android Studio构建文件build.gradle配置

    摘要: 每周一次,深入学习Android教程,TeachCourse今天带来的一篇关于Android Studio构建文件build.gradle的相关配置,重点学习几个方面的内容:1.applica ...

  9. 配置composer全量镜像与主要命令

    配置中国全量镜像 查看当前composer配置的镜像地址 composer config -g repo.packagist 显示如下,显示说明没有配置镜像地址 接下来我使用下面的命令进行查看配置的镜 ...

随机推荐

  1. redis支持哪些数据类型?redis命令大全

    一.redis支持的数据类型 1)String 常用命令:set/get/decr/incr/mget等: 应用场景:String是最常用的一种数据类型,普通的key/value存储都可以归为此类: ...

  2. 如何在 spring 中启动注解装配?

    默认情况下,Spring 容器中未打开注解装配.因此,要使用基于注解装配,我们 必须通过配置 <context:annotation-config/> 元素在 Spring 配置文件 中启 ...

  3. synchronized的原理

    synchronized的使用 synchronized是一个java中的关键字,是基于JVM层面的,用于保证java的多线程安全,它具有四大特性,可用于完全替代volatile: 原子性:所谓原子性 ...

  4. Zookeeper Watcher 机制 -- 数据变更通知 ?

    Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务 端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通 知来实现分布式的通知功 ...

  5. Python学习--21天Python基础学习之旅(Day05、Day06、Day07)

    Day05: Chapter 8 函数 1.1函数定义与调用 1.1.1向函数传递参数 1.2传递实参 1.2.1位置实参:基于实参顺序 1.2.2关键字实参:调用时指出各个实参对应的形参 1.2.3 ...

  6. 单例模式应用 | Shared_ptr引用计数管理器

    在我们模拟设计 shared_ptr 智能指针时发现,不同类型的 Shared_ptr 不能使用同一个引用计数管理器,这显然会造成内存上的浪费.因此我们考虑将其设计为单例模式使其所有的 Shared_ ...

  7. ES6-11学习笔记--解构赋值

    解构赋值:按照一定模式,从数组和对象中提取值,对变量进行赋值.   数组解构 对象解构 字符串解构 应用场景     曾经的赋值噩梦,非解构赋值数组: let arr = [1, 2, 3]; let ...

  8. 论文阅读-Temporal Phenotyping from Longitudinal Electronic Health Records: A Graph Based Framework

  9. 用Python爬取斗鱼网站的一个小案例

    思路解析: 1.我们需要明确爬取数据的目的:为了按热度查看主播的在线观看人数 2.浏览网页源代码,查看我们需要的数据的定位标签 3.在代码中发送一个http请求,获取到网页返回的html(需要注意的是 ...

  10. HashMap和ConcurrentHashMap的原理和实现

    一.线程不安全的HashMap 多线程环境下,使用HashMap进行put操作会引起死循环(jdk1.7 Entry链表形成环形数据结构),导致CPU利用率接近100%. 结构:数组 table[]+ ...