背景:
最近做车载项目仪表的开发,仪表应用都开发个差不多了。但是仪表运行的linux系统却是不尽人意。之前做的项目都是基于buildroot构建的linux。已经习惯了这种方法。但是现在改用yocto,不得不硬着头皮研究下去。
一、芯驰yocto目录架构:
yocto
├── base # 关于芯驰配置yocto的基本配置
├── build-x9hp_ms_a12_vemmc_ap2 # 该目录是构建过程的工作区,包含生成的临时文件、镜像以及构建日志。具体用到再讲
├── downloads -> /home/liuyier/share/downloads # 存储从外部拉取的源代码包或镜像文件。这部分通常由 Yocto 自动管理,此处做软链接省去下载时间
├── meta-openembedded # Yocto 项目中一个非常重要的元层集合(meta-layer collection),包含许多通用的、与硬件无关的扩展功能和包。
├── meta-qt5 # qt5层
├── meta-selinux # 是 Yocto 项目中的一个元层,提供了 SELinux(Security-Enhanced Linux) 的支持。SELinux 是 Linux 内核中内置的强制访问控制(MAC)系统,广泛用于增强系统的安全性。通过 meta-selinux 层,你可以在 Yocto 项目中启用 SELinux,并为目标系统构建和配置所需的工具、库、以及策略文件。
├── meta-semidrive # 芯驰相关的元素集合层,我们要修改的东西大部分都在这里
├── poky # poky 是 Yocto 的参考发行版(reference distribution),它不仅提供了 Yocto 的核心工具和配置,还包含了示例和支持文件,帮助开发者快速开始使用 Yocto 构建嵌入式 Linux 系统。
├── prebuilt # rebuilt 目录通常用于存放预构建的二进制文件或库,这些文件是直接使用的,而不是通过 BitBake 配方从源代码编译生成的
├── README -> base/README # README
├── sd_setup.sh -> base/sd_setup.sh # 芯驰提供的构建yocto编译的脚本
├── setup-environment -> base/setup-environment # 芯驰提供的设置yocto编译的脚本
└── source # 源码存放目录
在本节中,主要讲解如何添加一个自己的应用,主要操作的目录是meta-semidrive。其它目录以后慢慢展开讲。
二、准备自己的可执行程序(此处指的是不带源码的程序/动态库)
2.1)仪表程序的目录结构:
/ClusterBin
├── bin
├── data
├── fonts
├── libs
├── plugins
└── tools
2.2)该目录结构在meta-semidrive下的结构
meta-semidrive/recipes-core/cluster
├── cluster
│ ├── ClusterBin
│ │ ├── bin
│ │ ├── data
│ │ ├── fonts
│ │ ├── libs
│ │ ├── plugins
│ │ └── tools
│ ├── cluster.sh
│ └── COPYING
└── cluster.bb
2.3) bb文件编写内容
SUMMARY = "cluster"
DESCRIPTION = "zs instrument architecturethe ,script for starting cluster"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://COPYING;md5=ff5ef7e3028ec187f108ce21a109eff3"
SRC_URI = "file://COPYING \
file://ClusterBin \
file://cluster.sh \
"
inherit update-rc.d
S = "${WORKDIR}"
INITSCRIPT_PACKAGES = "${PN}"
INITSCRIPT_NAME = "cluster.sh"
INITSCRIPT_PARAMS_${PN} = "defaults 04"
INSANE_SKIP_${PN} += "already-stripped installed-vs-shippedi ldflags file-rdeps"
FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
DEPENDS = "pvr-lib messagecenter"
do_install () {
install -d ${D}${sysconfdir}/init.d
install -d ${D}/ClusterBin
install -d ${D}/ClusterBin/bin
install -d ${D}/ClusterBin/libs
install -d ${D}/ClusterBin/data
install -d ${D}/ClusterBin/fonts
install -d ${D}/ClusterBin/plugins
install -d ${D}/ClusterBin/tools
echo " install -m 0755 cluster.sh .............."
install -m 0755 cluster.sh ${D}${sysconfdir}/init.d
cp -raf ${S}/ClusterBin/* ${D}/ClusterBin/
}
FILES_${PN} += " \
cluster.sh \
ClusterBin \
/ClusterBin/fonts/* \
/ClusterBin/data/* \
/ClusterBin/tools/* \
/ClusterBin/plugins/* \
/ClusterBin/libs/* \
/ClusterBin/data/Sound_Alarm/* \
"
2.4)conf文件的编写
IMAGE_INSTALL_append = " \
rpmsg-echo-test \
can-test \
libdrm-tests \
stressapptest \
csi-test \
bench-es2 \
messagecenter \
cluster \ #主要添加这个
libgpiod \
lib-slots-update \
qtbase qtserialport qtdeclarative qtquickcontrols qtquickcontrols2 qtgraphicaleffects \
audio-ref alsa-lib alsa-utils alsa-state alsa-plugins \
sdshell \
sdlog-tools \
am-plugin \
cluster-demo \
recovery-service \
libhwconverter \
libuser-config \
key-revocation \
sdrv-prop-tools sdrv-propd \
camshare \
avm-cast \
"
三、编译、烧录
make ap2_linux510
四、遇到的问题:
问题一:
ERROR: QA Issue: cluster: Files/directories were installed but not shipped in any package:
/fonts
/data
/tools
/plugins
/libs
/data/Sound_Alarm
/data/Sound_Alarm/buzzerlong.wav
/data/Sound_Alarm/buzzer.wav
/data/Sound_Alarm/ticktack.wav
Please set FILES such that these items are packaged. Alternatively if they are unneeded, avoid installing them or delete them within do_install.
cluster: 9 installed and not shipped files. [installed-vs-shipped]
DEBUG: Python function populate_packages finished
解决方法:
FILES_${PN} += " \
cluster.sh \
ClusterBin \
/ClusterBin/fonts/* \
/ClusterBin/data/* \
/ClusterBin/tools/* \
/ClusterBin/plugins/* \
/ClusterBin/libs/* \
/ClusterBin/data/Sound_Alarm/* \
"
问题二:
clear old dir file .......................
install -m 0755 cluster.sh ..............
install: cannot stat 'cluster.sh': No such file or directory #具体看这句
WARNING: exit code 1 from a shell command.
解决方法和上面一样
问题三:
install: omitting directory '/home/liuyier/semidriver_x9/hs/ptg4.6_dev/ptg4.6/yocto/build-x9hp_ms_a12_vemmc_ap2/tmp/work/aarch64-sdrv-linux/cluster/1.0-r0/ClusterBin/bin'
| install: omitting directory '/home/liuyier/semidriver_x9/hs/ptg4.6_dev/ptg4.6/yocto/build-x9hp_ms_a12_vemmc_ap2/tmp/work/aarch64-sdrv-linux/cluster/1.0-r0/ClusterBin/data'
| install: omitting directory '/home/liuyier/semidriver_x9/hs/ptg4.6_dev/ptg4.6/yocto/build-x9hp_ms_a12_vemmc_ap2/tmp/work/aarch64-sdrv-linux/cluster/1.0-r0/ClusterBin/fonts'
| install: omitting directory '/home/liuyier/semidriver_x9/hs/ptg4.6_dev/ptg4.6/yocto/build-x9hp_ms_a12_vemmc_ap2/tmp/work/aarch64-sdrv-linux/cluster/1.0-r0/ClusterBin/libs'
| install: omitting directory '/home/liuyier/semidriver_x9/hs/ptg4.6_dev/ptg4.6/yocto/build-x9hp_ms_a12_vemmc_ap2/tmp/work/aarch64-sdrv-linux/cluster/1.0-r0/ClusterBin/plugins'
| install: omitting directory '/home/liuyier/semidriver_x9/hs/ptg4.6_dev/ptg4.6/yocto/build-x9hp_ms_a12_vemmc_ap2/tmp/work/aarch64-sdrv-linux/cluster/1.0-r0/ClusterBin/tools'
install -m 不可以安装目录,
在 Yocto 的安装阶段,install -m 命令用于设置文件的权限并将其安装到目标目录。但是,install -m 通常用于文件,而不是用于整个目录。若要安装目录,应该使用 install -d 来创建目录,而不是试图直接用 -m 安装整个目录。