0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony 移植:build lite 编译构建过程

王程 来源:jf_75796907 作者:jf_75796907 2024-02-19 16:19 次阅读

配置完毕产品解决方案、芯片开发板解决方案,就可以执行 hb build 进行编译。但是产品解决方案代码是如何被调用编译的?

芯片开发板解决方案代码是如何被调用编译的?内核代码如何被调用编译的?解决了这些疑惑,会对 build lite 编译构建过程有个更深入的理解。

1、产品解决方案代码是如何被调用编译的

在文件 buildliteBUILD.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 又进一步被什么模块调用?在恒玄的代码配置文件 devicesocbestechnicbes2600BUILD.gn 中使用了,非恒玄的没有调用 //build/lite:product。所以,除了 //build/lite:product,还有其他调用编译产品解决方案代码的地方。

以 vendorgoodixgr5515_sk_iotlink_demo 为例,来了解下什么地方会调用编译产品解决方案代码。产品解决方案根目录下有文件 vendorgoodixgr5515_sk_iotlink_demoohos.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 文件,解析子系统和部件信息,生成到 outgr5515_skgr5515_sk_iotlink_demobuild_configsparts_infosubsystem_parts.json 文件中,片段如下。这些解析出来的子系统和部件信息,编译构建构建 hb 会组织进行编译构建。

  "product_gr5515_sk_iotlink_demo": [
    "product_gr5515_sk_iotlink_demo"
  ],

2、芯片开发板解决方案代码是如何被调用编译的

在文件 kernelliteos_mBUILD.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、内核代码如何被调用编译的

上文分析了产品解决方案、芯片开发板解决方案如何被调用的。本小节,追踪下内核代码是如何被调用编译的。

在生成的文件 outv200zrdisplay_demobuild_configskernelliteos_mBUILD.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

在文件 kernelliteos_mBUILD.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" ]
        }
    }
    }


审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 芯片
    +关注

    关注

    447

    文章

    47788

    浏览量

    409123
  • 开发板
    +关注

    关注

    25

    文章

    4429

    浏览量

    93992
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32392
  • OpenHarmony
    +关注

    关注

    23

    文章

    3290

    浏览量

    15159
收藏 人收藏

    评论

    相关推荐

    如何让OpenHarmony编译速度“狂飙”

    OpenHarmony 有两种编译方式,一种是通过 hb 工具编译,一种是通过 build.sh 脚本编译。本文笔者将提升
    的头像 发表于 02-14 09:31 1528次阅读

    使用OpenHarmonyNDK移植三方库Speexdsp

    加入了OpenHarmony编译体系(基于ninja和gn),Speexdsp在linux下是使用构建工具configure、makefile构建的。
    的头像 发表于 05-16 10:18 1239次阅读
    使用<b class='flag-5'>OpenHarmony</b>NDK<b class='flag-5'>移植</b>三方库Speexdsp

    OpenHarmony 移植build lite 配置目录全梳理

    命令行工具 hb (HarmonyOS|OpenHarmony Build 编译构建系统的缩写) 都很熟悉了。这是一个基于 gn 和 ninja 的
    的头像 发表于 02-18 16:42 554次阅读

    鸿蒙南向开发—OpenHarmony技术编译构建框架

    概述 OpenHarmony编译子系统是以GN和Ninja构建为基座,对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能扩展的系统,该系统提供以下基本功能: 以
    发表于 01-04 16:47

    从零开始移植OpenHarmony轻量系统

    摘要:本文简单介绍OpenHarmony轻量系统移植,如何使用移植示例适合群体:想自己动手移植OpenHarmony轻量系统的朋友经过几天的
    发表于 02-09 18:58

    OpenHarmony v3.1-Release编译ModuleNotFound报错怎么解决

    /OpenHarmony/build/lite/hb_internal/build/build.py”,第 21 行 从 hb_inter
    发表于 04-14 11:34

    浅析基于HI3516的OpenHarmony编译固件

    └── vendor开始编译cd ~/ohos/openharmonybash build.sh编译成功后,固件将生成到如下位置ohos/openh
    发表于 05-23 17:50

    OpenHarmony轻量和小型系统编译构建指导

    构建流程hb set: 设置OpenHarmony源码目录和要编译的产品。hb build: 编译产品、开发板或者组件。
    发表于 05-25 10:46

    三步就能在OpenHarmony中实现车牌识别

    buildmake -j$processorcp lib/* $1/libs/创建Gn文件在 OpenCV 源码根目录新增 BUILD.gn 将 OpenCV 库加入编译构建
    发表于 06-28 10:15

    三步就能在OpenHarmony中实现车牌识别

    OpenCV 源码根目录新增 BUILD.gn 将 OpenCV 库加入编译构建移植EasyPR下载源码获取源码 EasyPR 库源码放在源码根目录下的 third_party 下
    发表于 07-06 11:20

    4步成功将三方库——speexdsp移植OpenHarmony

    归)进行分享,他在完成了一个三方库在OpenHarmony标准系统上的移植工作后,总结了以下经验。四步实现三方库移植:1、在Linux下编译移植
    发表于 09-27 12:02

    剖析OpenHarmony3.0编译构建流程

       早就打算研究下 OH3.0 的编译框架了,最近一直在搞移植,总算有点进展了,抽个空来分析下 3.0 的编译框架。    大体看了下和 2.0 的差别不是特别大:《 OpenHarmony
    的头像 发表于 12-07 10:54 2851次阅读

    OpenHarmony应用的编译构建过程

    2022 年 3 月 31 日发布了最新的 IDE 工具 DevEco Studio 3.0 Beta3,仔细阅读文档后发现最新 OpenHarmony 应用的编译构建过程已经公开。
    的头像 发表于 04-21 08:13 3179次阅读

    OpenHarmony技术论坛:OpenHarmony移植技术分享

    、芯片移植适配、开发板移植适配。 2.OpenHarmony北向共建:日志子系统开发、JS API构建、开源组件及核心库支持。 3.OpenHarm
    的头像 发表于 04-25 16:53 2476次阅读
    <b class='flag-5'>OpenHarmony</b>技术论坛:<b class='flag-5'>OpenHarmony</b><b class='flag-5'>移植</b>技术分享

    开箱即用!教你如何正确使用华为云编译构建服务CodeArts Build

    在数字化时代,软件编译构建效率关系着企业能否快速响应客户需求,提供更好的客户体验。华为云编译构建服务CodeArts Build,旨在支撑企
    的头像 发表于 10-29 15:50 408次阅读
    开箱即用!教你如何正确使用华为云<b class='flag-5'>编译</b><b class='flag-5'>构建</b>服务CodeArts <b class='flag-5'>Build</b>!