本文分享自华为云社区《移植案例与原理 - 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 轻量级编译构建系统涉及的配置目录。有些知识点,只能从代码中获取,官方资料里没有提供很详细的说明,希望此文可以对此进行补充。
我们先看些相关的文件的代码片段。
文件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
}
文件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
}
看了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"
在开发产品时,有哪些子系统或部件需要在产品适配目录里放置适配文件呢?我们在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" ]
在开发产品时,有哪些子系统或部件需要在芯片开发板适配目录里放置适配文件呢?我们在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" ]
在产品解决方案根目录下的文件夹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)
如果配置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" ]
......
}
上文已经知道部分部件依赖三方软件,具体是哪些部件依赖三方软件,我们在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
其他还有驱动配置文件夹hdf_config、烧写分区文件夹flash_partition_dir。后续再补充。
参考了下述站点,或者推荐读者阅读下述站点了解更多信息。
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我有一个在Linux服务器上运行的ruby脚本。它不使用rails或任何东西。它基本上是一个命令行ruby脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在
之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m
注意:本文主要掌握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配
1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模
在我让另一个人重做我的前端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
我是ruby的新手,正在配置IRB。我喜欢pretty-print(需要'pp'),但总是输入pp来漂亮地打印它似乎很麻烦。我想做的是默认情况下让它漂亮地打印出来,所以如果我有一个var,比如说,'myvar',然后键入myvar,它会自动调用pretty_inspect而不是常规检查。我从哪里开始?理想情况下,我将能够向我的.irbrc文件添加一个自动调用的方法。有什么想法吗?谢谢! 最佳答案 irb中默认pretty-print对象正是hirb被迫去做。Theseposts解释hirb如何将几乎所有内容转换为ascii表。虽
我想在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