jjzjj

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

华为云开发者联盟 2024-04-11 原文

本文分享自华为云社区《移植案例与原理 - 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"

4、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" ]

5、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" ]

6、内核配置文件夹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)

7、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" ]
 ......
}

8、三方软件文件夹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

9、其他

其他还有驱动配置文件夹hdf_config、烧写分区文件夹flash_partition_dir。后续再补充。

参考站点

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

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

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

  1. ruby-on-rails - active_admin 目录中的常量警告重新声明 - 2

    我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA

  2. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  3. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  4. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

  5. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  6. 神州数码无线产品(AC+AP)配置 - 2

    注意:本文主要掌握DCN自研无线产品的基本配置方法和注意事项,能够进行一般的项目实施、调试与运维AP基本配置命令AP登录用户名和密码均为:adminAP默认IP地址为:192.168.1.10AP默认情况下DHCP开启AP静态地址配置:setmanagementstatic-ip192.168.10.1AP开启/关闭DHCP功能:setmanagementdhcp-statusup/downAP设置默认网关:setstatic-ip-routegeteway192.168.10.254查看AP基本信息:getsystemgetmanagementgetmanaged-apgetrouteAP配

  7. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  8. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

  9. Ruby 默认将 IRB 配置为 Pretty_Inspect - 2

    我是ruby​​的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽

  10. ruby - 是否可以将 IRB 提示配置为动态更改? - 2

    我想在IRB中浏览文件系统并让提示更改以反射(reflect)当前工作目录,但我不知道如何在每个命令后进行提示更新。最终,我想在日常工作中更多地使用IRB,让bash溜走。我在我的.irbrc中试过这个:require'fileutils'includeFileUtilsIRB.conf[:PROMPT][:CUSTOM]={:PROMPT_N=>"\e[1m:\e[m",:PROMPT_I=>"\e[1m#{pwd}>\e[m",:PROMPT_S=>"FOO",:PROMPT_C=>"\e[1m#{pwd}>\e[m",:RETURN=>""}IRB.conf[:PROMPT_MO

随机推荐