Open Harmony移植:build lite编译构建过程
摘要:本文介绍了build lite 轻量级编译构建系统编译构建过程,调用依赖关系等等。
本文分享自华为云社区《移植案例与原理 - build lite编译构建过程》,作者: zhushy。
配置完毕产品解决方案、芯片开发板解决方案,就可以执行 hb build进行编译。但是产品解决方案代码是如何被调用编译的?
芯片开发板解决方案代码是如何被调用编译的?内核代码如何被调用编译的?解决了这些疑惑,会对build lite编译构建过程有个更深入的理解。
1、产品解决方案代码是如何被调用编译的
在文件build\lite\BUILD.gn配置文件中的构建目标//build/lite:product的代码片段如下,可以看出产品解决方案是被//build/lite:product调用的。其中⑴处的ohos_build_target,由hb build -T XX 构建参数指定,一般不指定时为空。
group("product") {
deps = []
# build product, skip build single component scenario.
⑴ if (ohos_build_target == "") {
deps += [ "${product_path}" ]
}
}
//build/lite:product 又进一步被什么模块调用?在恒玄的代码配置文件device\soc\bestechnic\bes2600\BUILD.gn中使用了,非恒玄的没有调用//build/lite:product。所以,除了//build/lite:product,还有其他调用编译产品解决方案代码的地方。
以vendor\goodix\gr5515_sk_iotlink_demo为例,来了解下什么地方会调用编译产品解决方案代码。产品解决方案根目录下有文件vendor\goodix\gr5515_sk_iotlink_demo\ohos.build,片段如下。可以看到,有子系统subsystem和部件信息parts。
{
"parts": {
"product_gr5515_sk_iotlink_demo": {
"module_list": [
"//vendor/goodix/gr5515_sk_iotlink_demo:gr5515_sk_iotlink_demo",
"//vendor/goodix/gr5515_sk_iotlink_demo:image"
]
}
},
"subsystem": "product_gr5515_sk_iotlink_demo"
}
在编译构建时,会基于ohos.build文件,解析子系统和部件信息,生成到out\gr5515_sk\gr5515_sk_iotlink_demo\build_configs\parts_info\subsystem_parts.json文件中,片段如下。这些解析出来的子系统和部件信息,编译构建构建hb会组织进行编译构建。
"product_gr5515_sk_iotlink_demo": [
"product_gr5515_sk_iotlink_demo"
],
2、芯片开发板解决方案代码是如何被调用编译的
在文件kernel\liteos_m\BUILD.gn中定义的名为modules构建目标,这个modules构建目标依赖芯片开发板解决方案的代码。。⑴处判断芯片和开发板是否是否进行了文件夹解耦,如果开发板路径包含“/board/”,说明soc和board进行了解耦。根据是否解耦,依赖的芯片开发板的构建配置文件路径是不同的,见⑵。
# board and soc decoupling feature, device_path should contains board
⑴ BOARD_SOC_FEATURE = device_path != string_replace(device_path, "/board/", "")
......
group("modules") {
deps = [
"arch",
"components",
"kal",
"kernel",
"testsuites",
"utils",
HDFTOPDIR,
] ⑵ if (BOARD_SOC_FEATURE) {
deps += [ "//device/board/$device_company" ]
deps += [ "//device/soc/$LOSCFG_SOC_COMPANY" ]
} else {
if (HAVE_DEVICE_SDK) {
deps += [ device_path ]
}
}
}
名为modules构建目标又被libkernel构建目标、进一步被名为kernel的构建目标调用,如下所示。内核的kernel构建目标如何被调用,下一小节分析。
static_library("libkernel") {
deps = [ ":modules" ]
complete_static_lib = false
}
group("kernel") {
deps = [ ":libkernel" ]
}
3、内核代码如何被调用编译的
上文分析了产品解决方案、芯片开发板解决方案如何被调用的。本小节,追踪下内核代码是如何被调用编译的。
在生成的文件out\v200zr\display_demo\build_configs\kernel\liteos_m\BUILD.gn中,会调用名为kernel、build_kernel_image的构建目录。怎么生成的这个文件,需要研究下hb的代码,深入了解下后台的机制,希望后续有时间可以继续深入一些。
import("//build/ohos/ohos_kits.gni")
import("//build/ohos/ohos_part.gni")
import("//build/ohos/ohos_test.gni")
ohos_part("liteos_m") {
subsystem_name = "kernel"
module_list = [
"//kernel/liteos_m:kernel",
"//kernel/liteos_m:build_kernel_image",
]
origin_name = "liteos_m"
variant = "phone"
}
构建目标build_kernel_image可以生成bin文件,该目标依赖copy_liteos,copy_liteos依赖liteos构建目标,该目标会进一步调用//build/lite:ohos。//build/lite:ohos文件会依次调用各个子系统和部件的构建目标。
executable("liteos") {
configs += [
":public",
":los_config",
]
ldflags = [
"-static",
"-Wl,--gc-sections",
"-Wl,-Map=$liteos_name.map",
]
output_dir = target_out_dir
if (liteos_kernel_only) {
deps = [ ":kernel" ]
} else {
deps = [ "//build/lite:ohos" ]
}
}
copy("copy_liteos") {
deps = [ ":liteos" ]
sources = [ "$target_out_dir/unstripped/bin/liteos" ]
outputs = [ "$root_out_dir/$liteos_name" ]
}
build_ext_component("build_kernel_image") {
deps = [ ":copy_liteos" ]
exec_path = rebase_path(root_out_dir)
objcopy = "${compile_prefix}objcopy$toolchain_cmd_suffix"
objdump = "${compile_prefix}objdump$toolchain_cmd_suffix"
command = "$objcopy -O binary $liteos_name $liteos_name.bin"
command +=
" && sh -c '$objdump -t $liteos_name | sort >$liteos_name.sym.sorted'"
command += " && sh -c '$objdump -d $liteos_name >$liteos_name.asm'"
}
4、名为public的config
在文件kernel\liteos_m\BUILD.gn中,名为public的config定义如下。⑴处判断芯片和开发板是否是否进行了文件夹解耦,如果开发板路径包含“/board/”,说明soc和board进行了解耦。根据是否解耦,依赖的public的配置集的位置是不同的,见⑵。在芯片、开发板代码目录中的BUILD.gn文件中并没有发现config(“public”),这个比较奇怪。
# board and soc decoupling feature, device_path should contains board
⑴ BOARD_SOC_FEATURE = device_path != string_replace(device_path, "/board/", "") config("public") {
configs = [
"arch:public",
"kernel:public",
"kal:public",
"components:public",
"utils:public",
] ⑵ if (BOARD_SOC_FEATURE) {
configs += [ "//device/board/$device_company:public" ]
configs += [ "//device/soc/$LOSCFG_SOC_COMPANY:public" ]
} else {
if (HAVE_DEVICE_SDK) {
configs += [ "$device_path:public" ]
}
}
}
参考站点
Open Harmony移植:build lite编译构建过程的更多相关文章
- Open Harmony移植:build lite配置目录全梳理
摘要:本文主要介绍build lite 轻量级编译构建系统涉及的配置目录的用途,分析相关的源代码. 本文分享自华为云社区<移植案例与原理 - build lite配置目录全梳理>,作者:z ...
- OpenHarmony移植案例: build lite源码分析之hb命令__entry__.py
摘要:本文介绍了build lite 轻量级编译构建系统hb命令的源码,主要分析了_\entry__.py文件. 本文分享自华为云社区<移植案例与原理 - build lite源码分析 之 hb ...
- 华为云发布分布式编译构建系统CodeArts Build
摘要:2月14日,华为云发布分布式编译构建系统CodeArts Build,旨在支撑企业实现高效的软件开发,缩短产品上市周期,帮助企业的软件产品快速形成关键竞争力. 本文分享自华为云社区<唯快不 ...
- 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01
百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...
- Android分析应用程序的构建过程
为了方便Android应用开发要求我们Androidproject编制和包装有了更深入的了解,例如,我们知道这是做什么的每一步,境和工具.输入和输出是什么.等等. 在前文<命令行下Android ...
- vue 源码学习(一) 目录结构和构建过程简介
Flow vue框架使用了Flow作为类型检查,来保证项目的可读性和维护性.vue.js的主目录下有Flow的配置.flowconfig文件,还有flow目录,指定了各种自定义类型. 在学习源码前可以 ...
- Linux内核剖析(五)Linux内核的构建过程
参考 一次实验引发的故事 – kernel build system探索—vmlinux是如何炼成的– kernel makefile 深度探索Linux操作系统:系统构建和原理解析.pdf 问题 在 ...
- Build Tool(构建工具)
what: 构建工具能够帮助你创建一个可重复的.可靠的.携带的且不需要手动干预的构建.构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求.假设你想要编译源代码,将生成的clas ...
- Maven的生命周期是为了对所有的构建过程进行了抽象了,便于统一。
Maven的生命周期是为了对所有的构建过程进行了抽象了,便于统一. clean(清理) cleanup(清理所有) 此生命周期旨在给工程做清理工作,它主要包含以下阶段: pre-clean - 执行项 ...
- Docker容器构建过程的安全性分析
来源:嘶吼专业版 ID:Pro4hou DevOps概念的流行跟近些年微服务架构的兴起有很大关系,DevOps是Dev(Development)和Ops(Operations)的结合,Dev负责开发, ...
随机推荐
- k8s Rabbitmq安装部署
安装方式 kubectl apply -f rabbitmq.yaml -n yunda-dev-cache rabbitmq.yaml ##创建PV # 注意更换存储方式 --- apiVersio ...
- HTML5的重要内容-1
HTML学习笔记-1 (一):first-child和:first-of-type :first-child第一个元素 :first-of-type第一个某种类型元素 (二):only-child和: ...
- 文心一言 VS 讯飞星火 VS chatgpt (128)-- 算法导论11.1 3题
三.用go语言,试说明如何实现一个直接寻址表,表中各元素的关键字不必都不相同,且各元素可以有卫星数据.所有三种字典操作(INSERT.DELETE和SEARCH)的运行时间应为O(1)(不要忘记 DE ...
- 一、Linux发展史
一.Linux发展史及红帽认证 红帽授权培训合作伙伴 木兰宽松许可证 1. Linux系统发展史 1. Unix发展历程 上世纪六十年代贝尔实验室(Bell).麻省理工学院(MIT)以及通用电气(GE ...
- Redmi AC2100 路由器 官方固件允许IPv6外网访问下游设备
升级/降级 至 官方固件版本: 2.0.23 稳定版.操作入口在路由器常用设置-系统状态-升级检测处. 开启SSH权限.F12打开浏览器的开发者模式,并切换至终端选项卡,复制以下代码至终端处,并敲回车 ...
- 如何在langchain中对大模型的输出进行格式化
简介 我们知道在大语言模型中, 不管模型的能力有多强大,他的输入和输出基本上都是文本格式的,文本格式的输入输出虽然对人来说非常的友好,但是如果我们想要进行一些结构化处理的话还是会有一点点的不方便. 不 ...
- 外包杯学习进度(一) | 【Android】【Javaweb】Android与JavaWeb服务器交互教程——搭建环境
前言 我们老师留了一个题目,这里就不写了,第一需要攻破的问题就是如何将app中的数据域javaweb进行传递,并可以回弹消息等问题.所以就开始了解一下这方面的信息. 资料积累 参考胡大炮的妖孽人生的博 ...
- 文心一言 VS 讯飞星火 VS chatgpt (149)-- 算法导论12.2 4题
五.用go语言,证明:如果一棵二叉搜索树中的一个结点有两个孩子,那么它的后继没有左孩子,它的前驱没有右孩子. 灵捷3.5 . 文心一言: 为了证明这个性质,我们首先需要明确二叉搜索树(BST)的定义和 ...
- .net 获取客户端真实ip
Nginx 如何设置 情况1 在只有1层nginx代理的情况下,设置nginx配置"proxy_set_header X-Forwarded-For $remote_addr;". ...
- drf实战和源码剖析----学习笔记1
学自:bilibili武沛齐老师. 武老师讲课:清晰,连贯,实用,透彻,真乃名师! # 1. 什么是前后端分离 - 不分离,主要用于后台系统(CRUD)和用户量上的情况,开发起来代价小- 分离,面向用 ...