Yocto构建时安装预编译.ipk包遇do_unpack错误求助
问题:Yocto构建阶段安装预编译.ipk包时do_unpack报错
背景与操作步骤
因代码隔离政策要求,需在Yocto镜像构建阶段(非运行时)安装由Yocto编译生成的预编译.ipk包。参考Yocto文档采用bin_package类实现,以nano包为例操作如下:
- 通过meta-openembedded中的recipe编译nano源码,生成
nano_6.2-r0_core2-64.ipk - 将该.ipk文件移至
/workdir/example2/poky/build/prebuild目录 - 创建测试recipe
nano2.bb,内容如下:
SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk;subpath=${BP}" inherit bin_package
执行报错信息
执行bitbake nano2时触发do_unpack错误,日志如下:
DEBUG: Executing python function do_unpack DEBUG: Executing python function base_do_unpack NOTE: Unpacking /workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk to /workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/ tar (child): xz: Cannot exec: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now ERROR: Bitbake Fetcher Error: UnpackError('Unpack command PATH="/workdir/example2/poky/build/tmp/sysroots-uninative/x86_64-linux/usr/bin:/workdir/example2/poky/scripts:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/usr/bin/x86_64-poky-linux:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot/usr/bin/crossscripts:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/usr/sbin:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/usr/bin:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/sbin:/workdir/example2/poky/build/tmp/work/core2-64-poky-linux/nano2/1.0-r0/recipe-sysroot-native/bin:/workdir/example2/poky/bitbake/bin:/workdir/example2/poky/build/tmp/hosttools" ar x /workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk data.tar.xz && tar --extract --no-same-owner -p -f data.tar.xz && rm data.tar.xz failed with return value 2', 'file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk;subpath=nano2-1.0') DEBUG: Python function base_do_unpack finished DEBUG: Python function do_unpack finished
已确认信息
.ipk文件存在且路径正确- 解压目录已生成
data.tar.xz文件 - 在主机环境手动执行报错日志中的unpack命令,无任何错误
排查思路与解决方案
1. 核心问题定位
报错显示tar (child): xz: Cannot exec: No such file or directory,说明Bitbake构建环境的PATH中找不到xz工具。手动执行成功是因为主机环境的PATH包含xz,但Bitbake的任务执行在隔离的native sysroot环境中,该环境默认可能未包含xz。
2. 具体修复步骤
(1)添加native依赖
在nano2.bb中添加xz-native依赖,确保构建环境包含解压工具:
DEPENDS += "xz-native" SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk;subpath=${BP}" inherit bin_package
(2)修正SRC_URI的subpath参数
${BP}对应nano2-1.0,但预编译.ipk是nano的产物,内部路径与nano2无关,移除subpath参数尝试:
SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk" inherit bin_package
(3)调试构建环境PATH
若仍有问题,可在recipe中添加调试代码,确认xz是否在PATH中:
do_unpack_prepend() { echo "Current build PATH: $PATH" which xz || echo "xz not found in build environment" } SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk" inherit bin_package
(4)手动实现解压逻辑(备选)
如果bin_package类的默认逻辑存在兼容性问题,可跳过该类,手动实现unpack和install任务:
inherit base SRC_URI = "file:///workdir/example2/poky/build/prebuild/nano_6.2-r0_core2-64.ipk" do_unpack() { ar x ${WORKDIR}/nano_6.2-r0_core2-64.ipk data.tar.xz tar xJf data.tar.xz --no-same-owner -p rm data.tar.xz } do_install() { cp -r ${WORKDIR}/* ${D} }
内容的提问来源于stack exchange,提问作者balrogwhip
相关产品推荐
相关产品推荐

