0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony 移植:build lite 編譯構(gòu)建過程

王程 ? 來源:jf_75796907 ? 作者:jf_75796907 ? 2024-02-19 16:19 ? 次閱讀

配置完畢產(chǎn)品解決方案、芯片開發(fā)板解決方案,就可以執(zhí)行 hb build 進(jìn)行編譯。但是產(chǎn)品解決方案代碼是如何被調(diào)用編譯的?

芯片開發(fā)板解決方案代碼是如何被調(diào)用編譯的?內(nèi)核代碼如何被調(diào)用編譯的?解決了這些疑惑,會對 build lite 編譯構(gòu)建過程有個更深入的理解。

1、產(chǎn)品解決方案代碼是如何被調(diào)用編譯的

在文件 buildliteBUILD.gn 配置文件中的構(gòu)建目標(biāo) //build/lite:product 的代碼片段如下,可以看出產(chǎn)品解決方案是被 //build/lite:product 調(diào)用的。其中⑴處的 ohos_build_target,由 hb build -T XX 構(gòu)建參數(shù)指定,一般不指定時為空。

  group("product") {
    deps = []

    # build product, skip build single component scenario.
⑴  if (ohos_build_target == "") {
        deps += [ "${product_path}" ]
    }
    }

//build/lite:product 又進(jìn)一步被什么模塊調(diào)用?在恒玄的代碼配置文件 devicesocbestechnicbes2600BUILD.gn 中使用了,非恒玄的沒有調(diào)用 //build/lite:product。所以,除了 //build/lite:product,還有其他調(diào)用編譯產(chǎn)品解決方案代碼的地方。

以 vendorgoodixgr5515_sk_iotlink_demo 為例,來了解下什么地方會調(diào)用編譯產(chǎn)品解決方案代碼。產(chǎn)品解決方案根目錄下有文件 vendorgoodixgr5515_sk_iotlink_demoohos.build,片段如下??梢钥吹?,有子系統(tǒng) subsystem 和部件信息 parts。

{
  "parts": {
    "product_gr5515_sk_iotlink_demo": {
      "module_list": [
        "http://vendor/goodix/gr5515_sk_iotlink_demo:gr5515_sk_iotlink_demo",
        "http://vendor/goodix/gr5515_sk_iotlink_demo:image"
      ]
    }
  },
  "subsystem": "product_gr5515_sk_iotlink_demo"
}

在編譯構(gòu)建時,會基于 ohos.build 文件,解析子系統(tǒng)和部件信息,生成到 outgr5515_skgr5515_sk_iotlink_demobuild_configsparts_infosubsystem_parts.json 文件中,片段如下。這些解析出來的子系統(tǒng)和部件信息,編譯構(gòu)建構(gòu)建 hb 會組織進(jìn)行編譯構(gòu)建。

  "product_gr5515_sk_iotlink_demo": [
    "product_gr5515_sk_iotlink_demo"
  ],

2、芯片開發(fā)板解決方案代碼是如何被調(diào)用編譯的

在文件 kernelliteos_mBUILD.gn 中定義的名為 modules 構(gòu)建目標(biāo),這個 modules 構(gòu)建目標(biāo)依賴芯片開發(fā)板解決方案的代碼。。⑴處判斷芯片和開發(fā)板是否是否進(jìn)行了文件夾解耦,如果開發(fā)板路徑包含 “/board/”, 說明 soc 和 board 進(jìn)行了解耦。根據(jù)是否解耦,依賴的芯片開發(fā)板的構(gòu)建配置文件路徑是不同的,見⑵。

  # 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 += [ "http://device/board/$device_company" ]
        deps += [ "http://device/soc/$LOSCFG_SOC_COMPANY" ]
    } else {
        if (HAVE_DEVICE_SDK) {
        deps += [ device_path ]
        }
    }
    }

名為 modules 構(gòu)建目標(biāo)又被 libkernel 構(gòu)建目標(biāo)、進(jìn)一步被名為 kernel 的構(gòu)建目標(biāo)調(diào)用,如下所示。內(nèi)核的 kernel 構(gòu)建目標(biāo)如何被調(diào)用,下一小節(jié)分析。

static_library("libkernel") {
  deps = [ ":modules" ]
  complete_static_lib = false
}

group("kernel") {
  deps = [ ":libkernel" ]
}

3、內(nèi)核代碼如何被調(diào)用編譯的

上文分析了產(chǎn)品解決方案、芯片開發(fā)板解決方案如何被調(diào)用的。本小節(jié),追蹤下內(nèi)核代碼是如何被調(diào)用編譯的。

在生成的文件 outv200zrdisplay_demobuild_configskernelliteos_mBUILD.gn 中,會調(diào)用名為 kernel、build_kernel_image 的構(gòu)建目錄。怎么生成的這個文件,需要研究下 hb 的代碼,深入了解下后臺的機(jī)制,希望后續(xù)有時間可以繼續(xù)深入一些。

import("http://build/ohos/ohos_kits.gni")
import("http://build/ohos/ohos_part.gni")
import("http://build/ohos/ohos_test.gni")

ohos_part("liteos_m") {
subsystem_name = "kernel"
module_list = [
    "http://kernel/liteos_m:kernel",
    "http://kernel/liteos_m:build_kernel_image",
]
origin_name = "liteos_m"
variant = "phone"
}

構(gòu)建目標(biāo) build_kernel_image 可以生成 bin 文件,該目標(biāo)依賴 copy_liteos,copy_liteos 依賴 liteos 構(gòu)建目標(biāo),該目標(biāo)會進(jìn)一步調(diào)用 //build/lite:ohos。//build/lite:ohos 文件會依次調(diào)用各個子系統(tǒng)和部件的構(gòu)建目標(biāo)。

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 = [ "http://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 定義如下。⑴處判斷芯片和開發(fā)板是否是否進(jìn)行了文件夾解耦,如果開發(fā)板路徑包含 “/board/”, 說明 soc 和 board 進(jìn)行了解耦。根據(jù)是否解耦,依賴的 public 的配置集的位置是不同的,見⑵。在芯片、開發(fā)板代碼目錄中的 BUILD.gn 文件中并沒有發(fā)現(xiàn) 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 += [ "http://device/board/$device_company:public" ]
        configs += [ "http://device/soc/$LOSCFG_SOC_COMPANY:public" ]
    } else {
        if (HAVE_DEVICE_SDK) {
        configs += [ "$device_path:public" ]
        }
    }
    }


審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 芯片
    +關(guān)注

    關(guān)注

    455

    文章

    50816

    瀏覽量

    423663
  • 開發(fā)板
    +關(guān)注

    關(guān)注

    25

    文章

    5050

    瀏覽量

    97481
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    657

    瀏覽量

    32872
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3722

    瀏覽量

    16320
收藏 人收藏

    評論

    相關(guān)推薦

    如何讓OpenHarmony編譯速度“狂飆”

    OpenHarmony 有兩種編譯方式,一種是通過 hb 工具編譯,一種是通過 build.sh 腳本編譯。本文筆者將提升
    的頭像 發(fā)表于 02-14 09:31 ?1986次閱讀

    使用OpenHarmonyNDK移植三方庫Speexdsp

    加入了OpenHarmony編譯體系(基于ninja和gn),Speexdsp在linux下是使用構(gòu)建工具configure、makefile構(gòu)建的。
    的頭像 發(fā)表于 05-16 10:18 ?2061次閱讀
    使用<b class='flag-5'>OpenHarmony</b>NDK<b class='flag-5'>移植</b>三方庫Speexdsp

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

    命令行工具 hb (HarmonyOS|OpenHarmony Build 編譯構(gòu)建系統(tǒng)的縮寫) 都很熟悉了。這是一個基于 gn 和 ninja 的
    的頭像 發(fā)表于 02-18 16:42 ?947次閱讀

    鴻蒙南向開發(fā)—OpenHarmony技術(shù)編譯構(gòu)建框架

    概述 OpenHarmony編譯子系統(tǒng)是以GN和Ninja構(gòu)建為基座,對構(gòu)建和配置粒度進(jìn)行部件化抽象、對內(nèi)建模塊進(jìn)行功能增強(qiáng)、對業(yè)務(wù)模塊進(jìn)行功能擴(kuò)展的系統(tǒng),該系統(tǒng)提供以下基本功能: 以
    發(fā)表于 01-04 16:47

    從零開始移植OpenHarmony輕量系統(tǒng)

    摘要:本文簡單介紹OpenHarmony輕量系統(tǒng)移植,如何使用移植示例適合群體:想自己動手移植OpenHarmony輕量系統(tǒng)的朋友經(jīng)過幾天的
    發(fā)表于 02-09 18:58

    OpenHarmony v3.1-Release編譯ModuleNotFound報錯怎么解決

    /OpenHarmony/build/lite/hb_internal/build/build.py”,第 21 行 從 hb_inter
    發(fā)表于 04-14 11:34

    OpenHarmony輕量和小型系統(tǒng)編譯構(gòu)建指導(dǎo)

    構(gòu)建流程hb set: 設(shè)置OpenHarmony源碼目錄和要編譯的產(chǎn)品。hb build: 編譯產(chǎn)品、開發(fā)板或者組件。
    發(fā)表于 05-25 10:46

    三步就能在OpenHarmony中實(shí)現(xiàn)車牌識別

    OpenCV 源碼根目錄新增 BUILD.gn 將 OpenCV 庫加入編譯構(gòu)建移植EasyPR下載源碼獲取源碼 EasyPR 庫源碼放在源碼根目錄下的 third_party 下
    發(fā)表于 07-06 11:20

    4步成功將三方庫——speexdsp移植OpenHarmony

    歸)進(jìn)行分享,他在完成了一個三方庫在OpenHarmony標(biāo)準(zhǔn)系統(tǒng)上的移植工作后,總結(jié)了以下經(jīng)驗(yàn)。四步實(shí)現(xiàn)三方庫移植:1、在Linux下編譯移植
    發(fā)表于 09-27 12:02

    剖析OpenHarmony3.0編譯構(gòu)建流程

    ?? 早就打算研究下 OH3.0 的編譯框架了,最近一直在搞移植,總算有點(diǎn)進(jìn)展了,抽個空來分析下 3.0 的編譯框架。 ?? 大體看了下和 2.0 的差別不是特別大:《 OpenHarmony
    的頭像 發(fā)表于 12-07 10:54 ?3249次閱讀

    多媒體音頻LITE組件的教程案例

    簡介 AUDIO_LITE組件提供音頻能力的支持。 圖 1 媒體子系統(tǒng)架構(gòu)(藍(lán)色虛線框是audio_lite) 使用說明 單倉的編譯構(gòu)建,在根目錄下進(jìn)行單倉的
    發(fā)表于 04-06 09:54 ?1次下載
    多媒體音頻<b class='flag-5'>LITE</b>組件的教程案例

    OpenHarmony應(yīng)用的編譯構(gòu)建過程

    2022 年 3 月 31 日發(fā)布了最新的 IDE 工具 DevEco Studio 3.0 Beta3,仔細(xì)閱讀文檔后發(fā)現(xiàn)最新 OpenHarmony 應(yīng)用的編譯構(gòu)建過程已經(jīng)公開。
    的頭像 發(fā)表于 04-21 08:13 ?3923次閱讀

    OpenHarmony技術(shù)論壇:OpenHarmony移植技術(shù)分享

    、芯片移植適配、開發(fā)板移植適配。 2.OpenHarmony北向共建:日志子系統(tǒng)開發(fā)、JS API構(gòu)建、開源組件及核心庫支持。 3.OpenHarm
    的頭像 發(fā)表于 04-25 16:53 ?2812次閱讀
    <b class='flag-5'>OpenHarmony</b>技術(shù)論壇:<b class='flag-5'>OpenHarmony</b><b class='flag-5'>移植</b>技術(shù)分享

    鴻蒙OpenHarmony【標(biāo)準(zhǔn)系統(tǒng) 編譯】(基于RK3568開發(fā)板)

    OpenHarmony支持hb和build.sh兩種編譯方式。此處介紹hb方式,build.sh腳本編譯方式請參考[使用
    的頭像 發(fā)表于 05-08 17:37 ?1145次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>【標(biāo)準(zhǔn)系統(tǒng) <b class='flag-5'>編譯</b>】(基于RK3568開發(fā)板)

    鴻蒙OpenHarmony開發(fā):【編譯構(gòu)建指導(dǎo)】

    OpenHarmony編譯子系統(tǒng)是以GN和Ninja構(gòu)建為基座,對構(gòu)建和配置粒度進(jìn)行部件化抽象、對內(nèi)建模塊進(jìn)行功能增強(qiáng)、對業(yè)務(wù)模塊進(jìn)行功能擴(kuò)展的系統(tǒng),該系統(tǒng)提供以下基本功能
    的頭像 發(fā)表于 05-13 09:31 ?1798次閱讀
    鴻蒙<b class='flag-5'>OpenHarmony</b>開發(fā):【<b class='flag-5'>編譯</b><b class='flag-5'>構(gòu)建</b>指導(dǎo)】