摘要:本文介绍了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编译构建过程的更多相关文章

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

    摘要:本文主要介绍build lite 轻量级编译构建系统涉及的配置目录的用途,分析相关的源代码. 本文分享自华为云社区<移植案例与原理 - build lite配置目录全梳理>,作者:z ...

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

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

  3. 华为云发布分布式编译构建系统CodeArts Build

    摘要:2月14日,华为云发布分布式编译构建系统CodeArts Build,旨在支撑企业实现高效的软件开发,缩短产品上市周期,帮助企业的软件产品快速形成关键竞争力. 本文分享自华为云社区<唯快不 ...

  4. 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 百篇博客分析OpenHarmony源码 | v59.01

    百篇博客系列篇.本篇为: v59.xx 鸿蒙内核源码分析(构建工具篇) | 顺瓜摸藤调试鸿蒙构建过程 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿 ...

  5. Android分析应用程序的构建过程

    为了方便Android应用开发要求我们Androidproject编制和包装有了更深入的了解,例如,我们知道这是做什么的每一步,境和工具.输入和输出是什么.等等. 在前文<命令行下Android ...

  6. vue 源码学习(一) 目录结构和构建过程简介

    Flow vue框架使用了Flow作为类型检查,来保证项目的可读性和维护性.vue.js的主目录下有Flow的配置.flowconfig文件,还有flow目录,指定了各种自定义类型. 在学习源码前可以 ...

  7. Linux内核剖析(五)Linux内核的构建过程

    参考 一次实验引发的故事 – kernel build system探索—vmlinux是如何炼成的– kernel makefile 深度探索Linux操作系统:系统构建和原理解析.pdf 问题 在 ...

  8. Build Tool(构建工具)

    what: 构建工具能够帮助你创建一个可重复的.可靠的.携带的且不需要手动干预的构建.构建工具是一个可编程的工具,它能够让你以可执行和有序的任务来表达自动化需求.假设你想要编译源代码,将生成的clas ...

  9. Maven的生命周期是为了对所有的构建过程进行了抽象了,便于统一。

    Maven的生命周期是为了对所有的构建过程进行了抽象了,便于统一. clean(清理) cleanup(清理所有) 此生命周期旨在给工程做清理工作,它主要包含以下阶段: pre-clean - 执行项 ...

  10. Docker容器构建过程的安全性分析

    来源:嘶吼专业版 ID:Pro4hou DevOps概念的流行跟近些年微服务架构的兴起有很大关系,DevOps是Dev(Development)和Ops(Operations)的结合,Dev负责开发, ...

随机推荐

  1. LINUX基础知识和命令 二

    LINUX alias (别名) 自定义命令=原始命令 原始命令中有特殊符@#%()请打上 引号,单双无所谓 例:vim /etc/sysconfig/network-scripts/ifcfg-en ...

  2. Keepalived高可用软件概述

    Keepalived高可用软件概述: 1)互联网主要的高可用软件:Keepalived.Hearttbeat.其中Keepalived是轻量级的,Keepalived是一款开源.免费的实现网站.数据库 ...

  3. 怎么用Python写一个浏览器集群框架

    这是做什么用的 框架用途 在采集大量新闻网站时,不可避免的遇到动态加载的网站,这给配模版的人增加了很大难度.本来配静态网站只需要两个技能点:xpath和正则,如果是动态网站的还得抓包,遇到加密的还得j ...

  4. GCD Inside: GCD 宏

    1 __OBJC__ __OBJC__宏的定义在 GCD 源码中找不到,它定义在 LLVM 的源码中: // initPreprocessor.cpp static void InitializeSt ...

  5. Mybatis和其他主流框架的整合使用

    Mybatis简介 MyBatis历史 MyBatis最初是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation迁移到了Google ...

  6. python列表之部分列表——切片

    目录 切片 全索引 半索引 负数索引 遍历切片 复制列表 切片 全索引 我们平常可能需要使用一个列表中的子列表,也就是部分元素,这个时候我们就需要用到切片这个功能啦 要创建切片,就如同range()函 ...

  7. 【Spring Boot】【外包杯】学习day02 | 快速搭建一个Spring Boot项目

    1.

  8. springboot操作nosql的mongodb,或者是如何在mongodb官网创建服务器并进行操作

    第一步:在mongodb的官网里面创建云服务器 点进去 这是免费的,由于是一个项目只可以创建一个,这里我已经创建好了 用本地的mongodb服务也是可以的 第二步:点击connect,下载连接mong ...

  9. [VBA] 实现SQLserver数据库的增删改查

    [VBA] 实现 SQLserver数据库的增删改查 问题背景 用于库存管理的简单Excel系统实现,能够让库管员录入每日出入库信息并进能够按日期查询导出数据,生成简要报表,以及数据修改与删除.非科班 ...

  10. SpringBoot测试用例的一些小技巧~

    场景一:不想因为测试而对数据库产生脏数据 @Test public void testInsert() { User user = new User(); user.setUsername(" ...