基于hispark_taurus开发板示例学习OpenHarmony编译构建系统 (1)

2022年01月13日 阅读数:0
这篇文章主要向大家介绍基于hispark_taurus开发板示例学习OpenHarmony编译构建系统 (1),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

基于hispark_taurus开发板示例学习OpenHarmony编译构建系统

文中相关设备来源于51CTO 鸿蒙技术社区【开发板漂流计划】node

基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(1)
基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(2)python

以hispark_taurus开发板为例,分两篇短文来学习OpenHarmony的编译构建系统。本文中所涉及的源码,都可以在开源站点https://gitee.com/openharmony 获取。涉及的开发板以hispark_taurus为例。linux

一、轻量级编译构建工具hb

OpenHarmony开源站点提供了一个基于gn和ninja的支持OpenHarmony组件化开发的编译框架。详细信息能够参考该工具的开源站点https://gitee.com/openharmony/build_lite。若是想使用最新的编译工具hb,在一些bugfix或者hb工具新特性合入后,须要卸载从新安装。在OpenHarmony代码根目录下执行以下命令,先卸载再安装,并查询确认下版本号:git

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。构建指导文档详细介绍了组件、芯片解决方案、产品解决方案的配置规则,并提供了新建组件、新建芯片解决方案、新建产品解决方案的使用指导。shell

二、hispark_taurus芯片开发板解决方案-Device

芯片开发板解决方案是指基于某款开发板的完整解决方案,包含驱动、设备侧接口适配、开发板sdk等。芯芯片开发板是一个特殊的组件,源码路径包含SoC和Board两部分,路径规则为:device/soc/{芯片解决方案厂商}/{芯片}和device/board/{开发板厂商}/{开发板}。
hispark_taurus对应的芯片目录在device/soc/hisilicon/hi3516dv300,主要包含芯片的底层处理驱动,为“媒体/图形子系统”提供基础的多媒体处理功能。看起来master最新分支一直在整改,随时会发生变化。当前的文件树以下:json

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配置文件内的构建目标。后文会分析该文件。bash

{
"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。markdown

{
  "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。app

# 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"

三、hispark_taurus产品解决方案-Vendor

文中相关设备来源于51CTO 鸿蒙技术社区【开发板漂流计划】

基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(1)
基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(2)

产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、组件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为:vendor/{产品解决方案厂商}/{产品名称}_。_产品解决方案也是一个特殊的组件。

hispark_taurus对应的产品解决方案目录在vendor\hisilicon\hispark_taurus,主要包含init进程启动配置init_configs(可选,仅linux内核须要)、产品解决方案OS适配hals、产品编译脚本BUILD.gn、产品配置文件config.json、文件系统打包配置fs.yml、hb构建配置文件ohos.build、内核特性裁剪配置文件kernel_configs。当前的文件树以下:

vendor\hisilicon\hispark_taurus
                    ├── BUILD.gn
                    ├── config.json
                    ├── fs.yml
                    ├── hals
                    ├── hdf_config
                    ├── init_configs
                    ├── kernel_configs
                    │   ├── debug.config
                    │   ├── debug_tee.config
                    │   ├── release.config
                    │   └── release_tee.config
                    └── ohos.build

3.1 产品编译脚本BUILD.gn

产品编译的入口,主要用于编译解决方案厂商源码和拷贝启动配置文件。若是某个产品被选择为要编译的产品,那么对应产品目录下的BUILD.gn会默认编译。文件vendor\hisilicon\hispark_taurus\BUILD.gn的内容以下。group[ target名称hispark_taurus须要为所在目录的名称。
文件中依赖init_configs目录下BUILD.gn里定义的targets。

# Copyright (C) 2020 Hisilicon (Shanghai) Technologies Co., Ltd. All rights reserved.

group("hispark_taurus") {
  deps = [
    "init_configs:init_configs",
    "init_configs:init_configs_mksh",
  ]
}

3.2 产品配置文件config.json

config.json为编译构建的主入口,包含了开发板、OS组件和内核等配置信息。文件vendor\hisilicon\hispark_taurus\config.json的内容以下。

  • "product_name": "ipcamera", # 产品名称,h b set时会显示这个名称
  • "version": "3.0", # config.json的版本号, 固定"3.0"
  • "type": "small", # 系统类型, 可选[mini, small, standard]
  • "ohos_version": "OpenHarmony 1.0", # 选择的OS版本
  • "device_company": "hisilicon", # 芯片厂商
  • "board": "hispark_taurus", # 开发板名称
  • "kernel_type": "liteos_a", # 选择的内核类型
  • "kernel_version": "3.0.0", # 选择的内核版本
{
    "product_name": "ipcamera_hispark_taurus",
    "version": "3.0",
    "type": "mini",
    "ohos_version": "OpenHarmony 1.0",
    "device_company": "hisilicon",
    "board": "hispark_taurus",
    "kernel_type": "liteos_a",
    "kernel_version": "",
    "subsystems": [
      {
        "subsystem": "aafwk",
        "components": [
          { "component": "aafwk_lite", "features":[ "enable_ohos_appexecfwk_feature_ability = true" ] }
        ]
      },
      {
        "subsystem": "applications",
        "components": [
          { "component": "camera_sample_app", "features":[] },
          { "component": "camera_sample_ai", "features":[] },
          { "component": "camera_screensaver_app", "features":[] }
        ]
      },
      ......
    ],
    "third_party_dir": "//third_party",
    "product_adapter_dir": "//vendor/hisilicon/hispark_taurus/hals"
  }

介绍下产品配置文件和开发板配置文件的关系。当执行hb set,输入项目根目录而且回车后,遍历全部vendor/<product_company>/<product_name>目录下的config.json,给出可选产品编译选项。config.json的product_name用于显示产品名,device_company和board用于关联出device/board/<device_company>/<board>目录,而且匹配<any_dir_name>/config.gni文件。若是可以匹配多个文件,表示该单板适配了多个内核,那么能够根据config.json的kernel_type和kernel_version来惟一匹配config.gni的kernel_type和kernel_version,这样就能够肯定了须要编译适配了哪一个内核的单板。

3.3 文件系统打包配置fs.yml

fs.yml是可选的,对于没有文件系统的设备可不配置。该文件用于配置文件系统镜像制做过程,将编译产物打包成文件系统镜像,好比用户态根文件系统rootfs.img和可读写的userfs.img。它由多个列表组成,每一个列表对应一个文件系统。字段说明以下:

fs_dir_name: 必填,声明文件系统文件名, 如rootfs、userfs
fs_dirs:     选填,配置out下文件目录与文件系统文件目录的映射关系,每一个文件目录对应一个列表
source_dir:  选填,out下目标文件目录,若缺失则将根据target_dir在文件系统下建立空目录
target_dir:  必填,文件系统下对应文件目录
ignore_files:选填,声明拷贝忽略文件
dir_mode:    选填,文件目录权限,默认755
file_mode:   选填,该文件目录下全部文件的权限,默认555
fs_filemode: 选填,配置须要特殊声明权限的文件,每一个文件对应一个列表
file_dir:    必填,文件系统下具体文件路径
file_mode:   必填,文件权限声明
fs_symlink:  选填,配置文件系统软链接
fs_make_cmd: 必填,配置须要制做文件系统脚本,OS提供的脚本在build/lite/make_rootfs下, 支持linux,liteos内核和ext四、jffs二、vfat格式。也支持芯片解决方案厂商自定义。
fs_attr:     选填,根据配置项动态调整文件系统

其中fs_symlink、fs_make_cmd字段支持如下变量:

  • ${root_path}
    代码根目录,对应gn的${ohos_root_path}

  • ${out_path}
    产品out目录,对应gn的${root_out_dir}

  • ${fs_dir}
    文件系统目录,由如下变量拼接而成:${root_path}、${fs_dir_name}。

对于hispark_taurus产品解决方案,能够自行阅读查看vendor\hisilicon\hispark_taurus\fs.yml文件。

3.4 init进程启动配置init_configs

init进程启动服务的配置文件,当前支持解析的命令有:

  • start: 启动某个服务
  • mkdir: 建立文件夹
  • chmod: 修改指定路径/文件的权限
  • chown: 修改指定路径/文件的属组
  • mount: 挂载命令
{
    "jobs" : [{                                                     # job数组,一个job对应一个命令集合。job的执行顺序:pre-init -> init -> post-init。
            "name" : "pre-init",
            "cmds" : [
                "mkdir /storage/data",                              # 建立目录
                "chmod 0755 /storage/data",                         # 修改权限,权限值的格式为0xxx, 如0755
                "mkdir /storage/data/log",
                "chmod 0755 /storage/data/log",
                "chown 4 4 /storage/data/log",                      # 修改属组,第一个数字为uid, 第二个数字为gid
                ......
                "mount vfat /dev/mmcblock0 /sdcard rw,umask=000"    # 挂载,格式为: mount [文件系统类型] [source] [target] [flags] [data]
                                                                    # 其中flags仅支持:nodev、noexec、nosuid和rdonly
            ]
        }, {
            "name" : "init",
            "cmds" : [                                              # 按cmds数组顺序启动启动服务
                "start shell",                                      # 注意:start与服务名称之间有且只有一个空格
                ......
                "start service1"
            ]
        }, {
            "name" : "post-init",                                   # 最后执行的job, init进程启动完成后的处理(如驱动初始化后再mount设备)
            "cmds" : []
        }
    ],
    "services" : [{                                                 # service数组,一个service对应一个进程
            "name" : "shell",                                       # 服务名称
            "path" : ["/sbin/getty", "-n", "-l", "/bin/sh", "-L", "115200", "ttyS000", "vt100"],    # 可执行文件全路径,path必须为第一个元素
            "uid" : 0,                                              # 进程的uid,须与二进制文件的uid保持一致
            "gid" : 0,                                              # 进程的gid,须与二进制文件的gid保持一致
            "once" : 0,                                             # 是否为一次性进程,1:进程退出后,init不在从新拉起。0:常驻进程,进程若退出,init将从新拉起
            "importance" : 0,                                       # 是否为关键进程,1:是关键进程,若进程退出,init将会重启单板。0:非关键进程,若进程退出,init不会重启单板
            "caps" : [4294967295]
        }, 
        ......
    ]
}

小结

本文先简单介绍了hb编译构建工具,而后分别以开发板hispark_taurus为例介绍如何配置芯片、开发板、产品解决方案来构建编译。因为水平有限,若是内容哪里有误,欢迎指正,不胜感激。感谢阅读,有什么问题,请留言。
【开发板漂流计划】

想了解更多关于鸿蒙的内容,请访问:

51CTO和华为官方合做共建的鸿蒙技术社区

https://harmonyos.51cto.com/#bkwz

::: hljs-center

21_9.jpg

:::