Yocto使用meson构建自定义recipe时do_package阶段QA报错排查
问题根因
报错来自Yocto构建的installed-vs-shipped QA校验规则:
- 你在自定义的
do_install函数里执行了install -d ${D}${libdir},手动在安装临时目录创建了/usr/lib空目录 - 后续你没有往这个目录下放任何文件,也没有将该目录加入任何包的
FILES打包列表 - Yocto检测到所有被安装到临时目录的文件/目录必须被归属到某个输出包,发现无归属的空目录就会直接终止构建
除了直接触发报错的问题,你的recipe还有几个冗余错误配置:
- 重复继承了
autotools类,meson构建体系完全不需要autotools,多余的继承会引入不必要的构建步骤干扰正常流程 - 手动实现
do_install完全多余,Yocto的meson类已经封装了标准的安装逻辑,手动拷贝文件、创建目录很容易出现路径错、漏权限等问题 FILES_${PN}配置存在语法错误,路径字符串里多了多余空格,而且默认配置已经包含${bindir}路径下的可执行文件,不需要重复添加- 源码路径
S配置错误,额外设置MESON_SOURCEPATH属于冗余操作,容易导致meson找不到源码目录下的构建定义
修正方案
直接用下面的精简recipe替换原有配置即可:
inherit meson pkgconfig PRIORITY = "optional" SECTION = "examples" LICENSE = "MIT" LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302" SRC_URI = "file://appxyz/" # 直接指向appxyz源码根目录,meson类默认从该路径读取meson.build S = "${WORKDIR}/appxyz" B = "${WORKDIR}/build"
改动说明:
- 删除了多余的
autotools继承,避免无关逻辑干扰 - 修正源码路径
S,删除冗余的MESON_SOURCEPATH配置,meson类会自动识别源码目录下的构建规则 - 删除了自定义的
do_install函数,meson类会自动执行meson install命令,按照你源码里meson.build定义的安装规则,把可执行文件、依赖库、资源文件正确安装到对应系统路径,不会产生无意义的空目录 - 删除了错误的
FILES_${PN}配置,默认规则已经会自动打包${bindir}下的可执行文件。如果后续需要把编译依赖的.bin格式数据文件打包进镜像,只需要在meson.build里配置好.bin文件的安装路径(比如安装到${datadir}/appxyz/),再在recipe里追加一行配置即可:FILES_${PN} += "${datadir}/appxyz/*.bin"
特殊场景如果确实需要保留手动创建的空目录,两种处理方式二选一:要么在
do_install最后执行rmdir ${D}${libdir}删掉不需要的空目录,要么在FILES_${PN}里追加对应目录路径把它纳入打包范围,绝大多数场景下空目录没有实际作用,优先选择删除冗余目录创建操作。注意要先确保你appxyz源码下的meson.build已经给可执行文件加了
install: true配置,否则meson install不会自动把二进制装到系统目录,不要在recipe里手动用install命令拷贝文件,后续跨架构、版本升级时手动维护安装规则很容易出问题。
内容的提问来源于stack exchange,提问作者user16575152
相关产品推荐
相关产品推荐

