編譯構建指導
概述
OpenHarmony編譯子系統是以GN和Ninja構建為基座,對構建和配置粒度進行部件化抽象、對內建模塊進行功能增強、對業務模塊進行功能擴展的系統,該系統提供以下基本功能:
適用范圍
本指導適用于輕量、小型、標準三種系統。[芯片解決方案配置規則]與[新增并編譯芯片解決方案]主要和輕量系統、小型系統相關,其他內容都是通用的。
基本概念及包含關系
在了解編譯構建子系統的能力前,應了解如下基本概念:
- 平臺:開發板和內核的組合,不同平臺支持的子系統和部件不同。
- 產品:產品是包含一系列部件的集合,編譯后產品的鏡像包可以運行在不同的開發板上。
- 子系統:OpenHarmony整體遵從分層設計,從下向上依次為:內核層、系統服務層、框架層和應用層。系統功能按照“系統 > 子系統 > 部件”逐級展開,在多設備部署場景下,支持根據實際需求裁剪某些非必要的子系統或部件。子系統是一個邏輯概念,它具體由對應的部件構成。
- 部件:對子系統的進一步拆分,可復用的軟件單元,它包含源碼、配置文件、資源文件和編譯腳本;能獨立構建,以二進制方式集成,具備獨立驗證能力的二進制單元。需要注意的是下文中的芯片解決方案本質是一種特殊的部件。
- 模塊:模塊就是編譯子系統的一個編譯目標,部件也可以是編譯目標。
- 特性:特性是部件用于體現不同產品之間的差異。
- GN:Generate Ninja的縮寫,用于產生Ninja文件。
- Ninja:Ninja是一個專注于速度的小型構建系統。
- hb:OpenHarmony的命令行工具,用來執行編譯命令。
基于以上概念,編譯子系統通過配置來實現編譯和打包,該子系統主要包括:模塊、部件、子系統、產品。
圖1 產品、子系統、部件和模塊間關系
圖1體現了編譯子系統的各部分關系,主要體現為:
- 子系統是某個路徑下所有部件的集合,一個部件只能屬于一個子系統。
- 部件是模塊的集合,一個模塊只能歸屬于一個部件。
- 通過產品配置文件配置一個產品包含的部件列表,部件不同的產品配置可以復用。
- 部件可以在不同的產品中實現有差異,通過變體或者特性feature實現。
- 模塊就是編譯子系統的一個編譯目標,部件也可以是編譯目標。
運作機制
編譯構建可以編譯產品、部件和模塊,但是不能編譯子系統。編譯構建流程如下圖所示,主要分設置和編譯兩步:
圖2 編譯構建流程
- hb set: 設置要編譯的產品。
- hb build: 編譯產品、開發板或者部件。編譯主要過程如下:
- 讀取編譯配置:根據產品選擇的開發板,讀取開發板config.gni文件內容,主要包括編譯工具鏈、編譯鏈接命令和選項等。
- 調用GN:調用gn gen命令,讀取產品配置生成產品解決方案out目錄和Ninja文件。
- 調用Ninja:調用ninja -C out/board/product啟動編譯。
- 系統鏡像打包:將部件編譯產物打包,設置文件屬性和權限,制作文件系統鏡像。
約束限制
編譯環境目前主要支持Ubuntu18.04和Ubuntu20.04(Ubuntu22.04暫不支持)。
環境配置
安裝編譯所需的程序包。 安裝命令:
安裝方式一:使用腳本,在當前工程目錄執行
./build/build_scripts/env_setup.sh
安裝方式二:apt-get和pip3 install命令安裝
apt-get update -y apt-get install -y # 如果是ubuntu20.04系統請直接安裝python3.9,如果是ubuntu18.04請改為安裝python3.8 apt-get install -y apt-utils binutils bison flex bc build-essential make mtd-utils gcc-arm-linux-gnueabi u-boot-tools python3.9 python3-pip git zip unzip curl wget gcc g++ ruby dosfstools mtools default-jre default-jdk scons python3-distutils perl openssl libssl-dev cpio git-lfs m4 ccache zlib1g-dev tar rsync liblz4-tool genext2fs binutils-dev device-tree-compiler e2fsprogs git-core gnupg gnutls-bin gperf lib32ncurses5-dev libffi-dev zlib* libelf-dev libx11-dev libgl1-mesa-dev lib32z1-dev xsltproc x11proto-core-dev libc6-dev-i386 libxml2-dev lib32z-dev libdwarf-dev apt-get install -y grsync xxd libglib2.0-dev libpixman-1-dev kmod jfsutils reiserfsprogs xfsprogs squashfs-tools pcmciautils quota ppp libtinfo-dev libtinfo5 libncurses5 libncurses5-dev libncursesw5 libstdc++6 gcc-arm-none-eabi vim ssh locales doxygen apt-get install -y libxinerama-dev libxcursor-dev libxrandr-dev libxi-dev # python需要安裝以下模塊,repo文件在上一章節約束與限制的源碼獲取中得到。 chmod +x /usr/bin/repo pip3 install --trusted-host https://repo.huaweicloud.com -i https://repo.huaweicloud.com/repository/pypi/simple requests setuptools pymongo kconfiglib pycryptodome ecdsa ohos-build pyyaml prompt_toolkit==1.0.14 redis json2html yagmail python-jenkins pip3 install esdk-obs-python --trusted-host pypi.org pip3 install six --upgrade --ignore-installed six #還需要安裝llvm,hc-gen,gcc_riscv32,Ninja,node-v14.15.4-linux-x64,GN,如果用戶使用的shell環境不是bash或者zsh的配置,則需要配置以下環境變量: # export PATH=/home/tools/llvm/bin:$PATH # export PATH=/home/tools/hc-gen:$PATH # export PATH=/home/tools/gcc_riscv32/bin:$PATH # export PATH=/home/tools/ninja:$PATH # export PATH=/home/tools/node-v12.20.0-linux-x64/bin:$PATH # export PATH=/home/tools/gn:$PATH # export PATH=~/.local/bin:$PATH
注意 :上述安裝ohos-build的過程中會安裝編譯工具hb,但有時會出現hb安裝不成功的情況,若安裝不成功,則按照[hb安裝]重新安裝。
配置規則
為了實現芯片解決方案、產品解決方案與OpenHarmony是解耦的、可插拔的,子系統、產品、部件、芯片解決方案、模塊、特性和系統能力需遵循一定的規則,具體配置規則見如下鏈接:
- [產品配置規則]
- [子系統配置規則]
- [部件配置規則]
- [模塊配置規則])
- [Rust模塊配置規則]
- [芯片解決方案配置規則]
- [特性配置規則]
- [系統能力配置規則]
編譯構建使用指導
目錄結構
/build # 編譯構建主目錄
├── __pycache__
├── build_scripts/ # 編譯相關的python腳本
├── common/
├── config/ # 編譯相關的配置項
├── core
│ ├── gn/ # 編譯入口BUILD.gn配置
└── build_scripts/
├── docs
gn_helpers.py*
lite/ # hb和preloader入口
misc/
├── ohos # OpenHarmony編譯打包流程配置
│ ├── kits # kits編譯打包模板和處理流程
│ ├── ndk # ndk模板和處理流程
│ ├── notice # notice模板和處理流程
│ ├── packages # 版本打包模板和處理流程
│ ├── sa_profile # sa模板和處理流程
│ ├── sdk # sdk模板和處理流程,包括sdk中包含的模塊配置
│ └── testfwk # 測試相關的處理
├── ohos.gni* # 匯總了常用的gni文件,方便各個模塊一次性import
├── ohos_system.prop
├── ohos_var.gni*
├── prebuilts_download.sh*
├── print_python_deps.py*
├── scripts/
├── subsystem_config.json
├── subsystem_config_example.json
├── templates/ # c/c++編譯模板定義
├── test.gni*
├── toolchain # 編譯工具鏈配置
├── tools # 常用工具
├── version.gni
├── zip.py*
`HarmonyOS與OpenHarmony鴻蒙文檔籽料:mau123789是v直接拿`
編譯命令
首先,在源碼根目錄下執行prebuilts腳本進行預編譯,安裝編譯器及二進制工具。
bash build/prebuilts_download.sh
接著,使用命令行方式或hb方式執行編譯命令。
1.命令行方式
代碼根目錄下執行全量版本的編譯命令:
Release版本 :./build.sh --product-name {product_name}
Debug版本 :
./build.sh --product-name {product_name} --gn-args is_debug=true
注意: Debug全版本因鏡像大小限制,全量編譯可能無法燒錄,建議單模塊編譯Debug二進制。使用如下命令單獨編譯模塊:
./build.sh --product-name {product_name} --gn-args is_debug=true --build-target {target_name}
{product_name}為當前版本支持的平臺。比如:hispark_taurus_standard等。
編譯完成后,結果鏡像保存在 out/{device_name}/packages/phone/images/ 目錄下。編譯命令支持選項:./build.sh
-h, --help # 顯示幫助信息并退出 --source-root-dir=SOURCE_ROOT_DIR # 指定路徑 --product-name=PRODUCT_NAME # 指定產品名 --device-name=DEVICE_NAME # 指定裝置名稱 --target-cpu=TARGET_CPU # 指定CPU --target-os=TARGET_OS # 指定操作系統 -T BUILD_TARGET, --build-target=BUILD_TARGET # 指定編譯目標,可以指定多個 --gn-args=GN_ARGS # GN參數,支持指定多個 --ninja-args=NINJA_ARGS # Ninja參數,支持指定多個 -v, --verbose # 生成時顯示所有命令行 --keep-ninja-going # 讓Ninja持續到1000000個工作失敗 --jobs=JOBS --export-para=EXPORT_PARA --build-only-gn # 只做GN解析,不運行Ninja --ccache # 可選 如果使用ccache,需要本地安裝ccache --fast-rebuild # 快速重建,默認值為False --log-level=LOG_LEVEL # 指定編譯期間的日志級別','三個級別可選:debug, info and error,default='info' --device-type=DEVICE_TYPE # 指定設備類型,默認值為'default' --build-variant=BUILD_VARIANT # 指定設備操作模式,默認值為'user'
2.hb方式
hb是OpenHarmony的命令行工具,用來執行編譯命令。以下對hb的常用命令進行說明。
hb set
設置要編譯的產品
hb set -h
usage: hb set [-h] [-root [ROOT_PATH]] [-p]
optional arguments:
-h, --help show this help message and exit
-root [ROOT_PATH], --root_path [ROOT_PATH]
Set OHOS root path
-p, --product Set OHOS board and kernel
- hb set 后無參數,進入默認設置流程
- hb set -root dir可直接設置代碼根目錄
- hb set -p設置要編譯的產品
hb env
查看當前設置信息
hb env
[OHOS INFO] root path: xxx
[OHOS INFO] board: hispark_taurus
[OHOS INFO] kernel: liteos
[OHOS INFO] product: ipcamera
[OHOS INFO] product path: xxx/vendor/hisilicon/ipcamera
[OHOS INFO] device path: xxx/device/hisilicon/hispark_taurus/sdk_linux_4.19
hb build
編譯產品、部件、模塊或芯片解決方案。
hb build -h
usage: hb build [-h] [-b BUILD_TYPE] [-c COMPILER] [-t [TEST [TEST ...]]] [-cpu TARGET_CPU] [--dmverity] [--tee]
[-p PRODUCT] [-f] [-n] [-T [TARGET [TARGET ...]]] [-v] [-shs] [--patch] [--compact-mode]
[--gn-args GN_ARGS] [--keep-ninja-going] [--build-only-gn] [--log-level LOG_LEVEL] [--fast-rebuild]
[--device-type DEVICE_TYPE] [--build-variant BUILD_VARIANT]
[component [component ...]]
positional arguments:
component name of the component, mini/small only
optional arguments:
-h, --help show this help message and exit
-b BUILD_TYPE, --build_type BUILD_TYPE
release or debug version, mini/small only
-c COMPILER, --compiler COMPILER
specify compiler, mini/small only
-t [TEST [TEST ...]], --test [TEST [TEST ...]]
compile test suit
-cpu TARGET_CPU, --target-cpu TARGET_CPU
select cpu
--dmverity enable dmverity
--tee Enable tee
-p PRODUCT, --product PRODUCT
build a specified product with {product_name}@{company}
-f, --full full code compilation
-n, --ndk compile ndk
-T [TARGET [TARGET ...]], --target [TARGET [TARGET ...]]
compile single target
-v, --verbose show all command lines while building
-shs, --sign_haps_by_server
sign haps by server
--patch apply product patch before compiling
--compact-mode compatible with standard build system set to false if we use build.sh as build entrance
--gn-args GN_ARGS specifies gn build arguments, eg: --gn-args="foo="bar" enable=true blah=7"
--keep-ninja-going keeps ninja going until 1000000 jobs fail
--build-only-gn only do gn parse, do not run ninja
--log-level LOG_LEVEL
specifies the log level during compilationyou can select three levels: debug, info and error
--fast-rebuild it will skip prepare, preloader, gn_gen steps so we can enable it only when there is no change
for gn related script
--device-type DEVICE_TYPE
specifies device type
--build-variant BUILD_VARIANT
specifies device operating mode
- hb build后無參數,會按照設置好的代碼路徑、產品進行編譯,編譯選項使用與之前保持一致。-f 選項將刪除當前產品所有編譯產品,等同于hb clean + hb build.
- hb build {component_name}:基于設置好的產品對應的單板、內核,單獨編譯部件(e.g.:hb build kv_store)。
- hb build -p ipcamera@hisilicon:免set編譯產品,該命令可以跳過set步驟,直接編譯產品。
- 在device/board/device_company下單獨執行hb build會進入內核選擇界面,選擇完成后會根據當前路徑的單板、選擇的內核編譯出僅包含內核、驅動的鏡像。
hb clean
清除out目錄對應產品的編譯產物,僅保留args.gn、build.log。清除指定路徑可輸入路徑參數:hb clean out/board/product,默認將清除當前hb set的產品對應out路徑。
hb clean
usage: hb clean [-h] [out_path]
positional arguments:
out_path clean a specified path.
optional arguments:
-h, --help show this help message and exit
說明:
- 設備開發過程中詳細的編譯環境搭建及編譯步驟請參考[快速入門中的環境搭建及編譯章節。]
- OpenHarmony還為開發者提供了Docker編譯環境,可以省略編譯工具的安裝,具體使用請參考[Docker編譯指導。]
新增并編譯不同配置
根據上一節的配置規則新增相應配置并進行編譯,主要包含產品、部件、芯片解決方案和模塊四個粒度。具體如下:
- [新增并編譯產品]
- [新增并編譯部件]
- [新增并編譯模塊]
- [新增并編譯芯片解決方案]
常見問題
- [常見編譯問題和解決方法]
參考信息
- [關于deps、external_deps的使用]
- [Sanitizer使用說明]
- [開源軟件Notice收集策略說明]
- [加快本地編譯的一些參數]
- [查看NinjaTrace]
- [定制打包chip_prod鏡像使用說明]
審核編輯 黃宇
-
編譯
+關注
關注
0文章
661瀏覽量
33040 -
鴻蒙
+關注
關注
57文章
2392瀏覽量
43050 -
OpenHarmony
+關注
關注
25文章
3744瀏覽量
16577
發布評論請先 登錄
相關推薦
OpenHarmony 移植:build lite 編譯構建過程
鴻蒙OpenHarmony開發板解析:【Rust模塊配置規則和指導】
![<b class='flag-5'>鴻蒙</b><b class='flag-5'>OpenHarmony</b><b class='flag-5'>開發</b>板解析:【Rust模塊配置規則和<b class='flag-5'>指導</b>】](https://file1.elecfans.com/web2/M00/E4/89/wKgaomY814aAXIR1AAA01VxEKNI913.jpg)
鴻蒙開發:【OpenHarmony 4.0 Release指導】
![<b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>:【<b class='flag-5'>OpenHarmony</b> 4.0 Release<b class='flag-5'>指導</b>】](https://file1.elecfans.com/web2/M00/C5/D1/wKgZomYChGOAUaiiAADe1d8SeRY102.jpg)
鴻蒙南向開發—OpenHarmony技術編譯構建框架
鴻蒙開發【編譯構建】講解
鴻蒙OpenHarmony南向/北向快速開發教程-迅為RK3568開發板
OpenHarmony輕量和小型系統編譯構建指導
openharmony和鴻蒙區別
詳解OpenHarmony的編譯和燒錄
![詳解<b class='flag-5'>OpenHarmony</b>的<b class='flag-5'>編譯</b>和燒錄](https://file.elecfans.com/web2/M00/1B/CC/pYYBAGGIikeAKLYgAAAaAchmgeo871.png)
OpenHarmony應用的編譯構建過程
[鴻蒙]OpenHarmony4.0的Rust開發
![[<b class='flag-5'>鴻蒙</b>]<b class='flag-5'>OpenHarmony</b>4.0的Rust<b class='flag-5'>開發</b>](https://file1.elecfans.com/web2/M00/C1/DB/wKgaomXbKX-AAe6rAADEW5Pyw8c913.png)
瑞芯微RK3566鴻蒙開發板OpenHarmony標準系統應用兼容性測試指導
![瑞芯微RK3566<b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>板<b class='flag-5'>OpenHarmony</b>標準系統應用兼容性測試<b class='flag-5'>指導</b>](https://file1.elecfans.com/web2/M00/06/CC/wKgaombfwriAd7r-AACXgQwhofQ225.png)
OpenHarmony源碼編譯后燒錄鏡像教程,RK3566鴻蒙開發板演示
![<b class='flag-5'>OpenHarmony</b>源碼<b class='flag-5'>編譯</b>后燒錄鏡像教程,RK3566<b class='flag-5'>鴻蒙</b><b class='flag-5'>開發</b>板演示](https://file1.elecfans.com/web3/M00/04/41/wKgZO2dyAH2AFFx6AAB2FN45Lh8124.png)
評論