基于hispark_taurus开发板示例学习OpenHarmony编译构建系统 (1) 原创 精华
基于hispark_taurus开发板示例学习OpenHarmony编译构建系统
文中相关设备来源于51CTO 鸿蒙技术社区【开发板漂流计划】
基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(1)
基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(2)
以hispark_taurus开发板为例,分两篇短文来学习OpenHarmony的编译构建系统。本文中所涉及的源码,均可以在开源站点https://gitee.com/openharmony 获取。涉及的开发板以hispark_taurus
为例。
1、轻量级编译构建工具hb
OpenHarmony开源站点提供了一个基于gn和ninja的支持OpenHarmony组件化开发的编译框架。详细信息可以参考该工具的开源站点https://gitee.com/openharmony/build_lite。如果想使用最新的编译工具hb,在一些bugfix或者hb工具新特性合入后,需要卸载重新安装。在OpenHarmony代码根目录下执行如下命令,先卸载再安装,并查询确认下版本号:
python3 -m pip uninstall ohos-build
python3 -m pip install --user build/lite
hb --version
build_lite代码仓只提供了工具的简单readme介绍,更加丰富的编译框架知识、构建指导需要访问docs文档仓获取,地址为https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/subsystems/subsys-build-mini-lite.md。构建指导文档详细介绍了组件、芯片解决方案、产品解决方案的配置规则,并提供了新建组件、新建芯片解决方案、新建产品解决方案的使用指导。
2、hispark_taurus芯片开发板解决方案-Device
芯片开发板解决方案是指基于某款开发板的完整解决方案,包含驱动、设备侧接口适配、开发板sdk等。芯芯片开发板是一个特殊的组件,源码路径包含SoC和Board两部分,路径规则为:device/soc/{芯片解决方案厂商}/{芯片}和device/board/{开发板厂商}/{开发板}。
hispark_taurus对应的芯片目录在device/soc/hisilicon/hi3516dv300,主要包含芯片的底层处理驱动,为“媒体/图形子系统”提供基础的多媒体处理功能。看起来master最新分支一直在整改,随时会发生变化。当前的文件树如下:
device/soc/hisilicon/hi3516dv300:
├── sdk_linux
│ ├── BUILD.gn
│ ├── build.sh
│ ├── config.gni
│ ├── drv
│ ├── out
│ └── usr
├── sdk_liteos
│ ├── BUILD.gn
│ ├── hdf_config # HDF驱动配置文件
│ └── mpp # Hi3516DV300芯片的媒体库文件、模块驱动库文件
└── uboot # uboot二进制文件
└── u-boot-hi3516dv300_emmc.bin
hispark_taurus对应的开发板目录在device/board/hisilicon/hispark_taurus,主要包含对linux内核和liteo_a内核的适配。当前的文件树如下:
device/board/hisilicon/hispark_taurus
├── BUILD.gn # BUILD.gn gn编译构建配置文件
├── linux # 开发板对linux内核的适配
│ ├── BUILD.gn
│ ├── config.gni
│ ├── LICENSE
│ ├── ohos.build
│ ├── system
│ └── updater
├── liteos_a # 开发板对liteos内核的适配
│ ├── board
│ ├── BUILD.gn
│ ├── config.gni
│ └── drivers
├── ohos.build # hb构建配置文件
└── uboot # uboot二进制文件
2.1 hb构建配置文件
ohos.build配置文件是最近新增加的,由hb构建系统进行解析,对描述的子系统和部件进行编译。这个配置文件在开发板目录和产品解决方案目录下都需要。我们先打开开发板目录下的配置文件device\board\hisilicon\hispark_taurus\ohos.build看一下,如下所示。部件parts部分定义了一个子系统subsystem,名称为device_hispark_taurus,命名风格以device开头,接开发板名称。module_list属性配置的信息为同文件夹下BUILD.gn配置文件内的构建目标。后文会分析该文件。
{
"parts": {
"device_hispark_taurus": {
"module_list": [
"//device/hisilicon/hispark_taurus:hispark_taurus"
]
}
},
"subsystem": "device_hispark_taurus"
}
类似的在产品解决方案目录下的配置文件vendor\hisilicon\hispark_taurus\ohos.build,内容如下。部件下面配置的子系统的名称的规则为,product开头,后接product_name。
{
"parts": {
"product_ipcamera_hispark_taurus": {
"module_list": [
"//vendor/hisilicon/hispark_taurus:hispark_taurus"
]
}
},
"subsystem": "product_ipcamera_hispark_taurus"
}
2.2 BUILD.gn编译构建配置文件
编译构建配置文件device\board\hisilicon\hispark_taurus\BUILD.gn的内容如下。根据是轻量系统、标准系统类型,还是linux内核、liteos_a内核,分别构建目标组hispark_taurus。
# Copyright (C) 2021 Hisilicon (Shanghai) Technologies Co., Ltd. All rights reserved.
if (defined(ohos_lite)) {
group("hispark_taurus") {
deps = []
if (ohos_kernel_type == "linux") {
deps += [ "//device/soc/hisilicon/hi3516dv300/sdk_linux:hispark_taurus_sdk" ]
} else if (ohos_kernel_type == "liteos_a") {
deps += [ "//device/soc/hisilicon/hi3516dv300/sdk_liteos/mpp:copy_mpp_libs" ]
}
}
} else {
group("hispark_taurus") {
deps = [ "linux:hi3516dv300_group" ]
deps += [
"//device/soc/hisilicon/common/hal/media:hardware_group",
"//device/soc/hisilicon/common/hal/middleware:middleware_group",
]
}
}
2.3 开发板内核编译配置文件config.gni
config.gni为开发板编译相关的配置,编译时会采用该配置文件中的参数编译所有OS组件,编译阶段系统全局可见。config.gni的关键字段介绍如下:
kernel_type: 开发板使用的内核类型,例如:“liteos_a”, “liteos_m”, “linux”。
kernel_version: 开发使用的内核版本,例如:“4.19”。
board_cpu: 开发板CPU类型,例如:“cortex-a7”, “riscv32”。
board_arch: 开发芯片arch, 例如: “armv7-a”, “rv32imac”。
board_toolchain: 开发板自定义的编译工具链名称,例如:“gcc-arm-none-eabi”。若为空,则使用默认为ohos-clang。
board_toolchain_prefix:编译工具链前缀,例如:“gcc-arm-none-eabi”。
board_toolchain_type: 编译工具链类型,目前支持gcc和clang。例如:“gcc” ,“clang”。
board_cflags: 开发板配置的c文件编译选项。
board_cxx_flags: 开发板配置的cpp文件编译选项。
board_ld_flags: 开发板配置的链接选项。
以liteos_a内核为例,文件位置在device\board\hisilicon\hispark_taurus\liteos_a\config.gni,内容如下。
# Kernel type, e.g. "linux", "liteos_a", "liteos_m".
kernel_type = "liteos_a"
# Kernel version.
kernel_version = ""
# Board CPU type, e.g. "cortex-a7", "riscv32".
board_cpu = "cortex-a7"
# Board arch, e.g. "armv7-a", "rv32imac".
board_arch = ""
# Toolchain name used for system compiling.
# E.g. gcc-arm-none-eabi, arm-linux-harmonyeabi-gcc, ohos-clang, riscv32-unknown-elf.
# Note: The default toolchain is "ohos-clang". It's not mandatory if you use the default toolchain.
board_toolchain = ""
# The toolchain path installed, it's not mandatory if you have added toolchain path to your ~/.bashrc.
board_toolchain_path = ""
# Compiler prefix.
board_toolchain_prefix = ""
# Compiler type, "gcc" or "clang".
board_toolchain_type = "clang"
# Board related common compile flags.
board_cflags = [
"-mfloat-abi=softfp",
"-mfpu=neon-vfpv4",
]
board_cxx_flags = [
"-mfloat-abi=softfp",
"-mfpu=neon-vfpv4",
]
board_ld_flags = []
# Board related headfiles search path.
board_include_dirs = []
# Board adapter dir for OHOS components.
board_adapter_dir = "//device/soc/hisilicon/common/hal"
# Sysroot path.
board_configed_sysroot = ""
# Board storage type, it used for file system generation.
storage_type = "emmc"
【开发板漂流计划】