You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 18:24:31