基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(2) 原创 精华
3、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内核和ext4、jffs2、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为例介绍如何配置芯片、开发板、产品解决方案来构建编译。由于水平有限,如果内容哪里有误,欢迎指正,不胜感激。感谢阅读,有什么问题,请留言。
【开发板漂流计划】