我可以在 BitBake 构建期间安装 .deb 吗?

Can I install a .deb during a BitBake Build?

问题定义

我正在尝试调整 these rosjava installation instructions 以便我可以在由 BitBake 构建系统构建的目标图像上包含 rosjava。我正在使用 Poky 的 jethro 分支。

实施尝试:从 .deb 构建 package_deb.bbclass

根据安装说明,安装 rosjava 真正需要做的是:

sudo apt-get install ros-indigo-rosjava

这在我的构建机器上运行得非常好。我认为如果我可以指向一个 .deb 并使用 Poky 元数据 class package_deb,它会为我完成所有繁重的工作,所以我制作了以下简单的食谱改编于this posting 在 Yocto 项目邮件列表上:

inherit package_deb

SRC_URI = "http://packages.ros.org/ros/ubuntu/pool/main/r/ros-indigo-rosjava/ros-indigo-rosjava_0.2.1-0trusty-20160207-031808-0800_amd64.deb"
SRC_URI[md5sum] = "2020ccc8b4a67dd918a9a2c426eece0b"
SRC_URI[sha256sum] = "ab9493fabe1285b0d21aab031348d0d733d116b0b2470bae90025709b303b649"

我在上述食谱 do_unpack 中得到的错误的相关部分是:

| no entry data.tar.gz in archive
|
| gzip: stdin: unexpected end of file
| tar: This does not look like a tar archive
| tar: Exiting with failure status due to previous errors
| DEBUG: Python function base_do_unpack finished
| DEBUG: Python function do_unpack finished

以下命令产生以下输出:

$ ar t python-rosdistro_0.4.5-1_all.deb
debian-binary
control.tar.gz
data.tar.xz

你可以看到这里有一个data.tar.xz,而不是data.tar.gz。我能做些什么来纠正这个错误并从这个特定的 .deb?

安装

我在我的 PACKAGE_CLASSES 变量中包含了 package_deb,在我的 IMAGE_FEATURES 中包含了 package-management。我试过其他安装方法都失败了;我认为这个方法特别有用,知道如何实现。

更新 - 3/22

我试图通过 ROOTFS_POSTPROCESS_COMMAND 进行安装来规避上述方法的问题,我从论坛帖子 like this

改编而来
install_rosjava() {
  ${STAGING_BINDIR_NATIVE}/dpkg \
     --root=${IMAGE_ROOTFS}/  \
     --admindir=${IMAGE_ROOTFS}/var/lib/dpkg/ \
     -L /var/cache/apt/archives/ros-indigo-rosjava_0.2.1-0trusty-20160207-031808-0800_amd64.deb
}
ROOTFS_POSTPROCESS_COMMAND +=  " install_rosjava() ; "

但是,由于 dpkg 不是在 ${STAGING_BINDIR_NATIVE} 路径中找到的命令,所以失败了。 Yocto Project Reference Manual 指出:

STAGING_BINDIR_NATIVE Specifies the path to the /usr/bin subdirectory of the sysroot directory for the build host.

查看此目录会产生很多命令,但不会产生 dpkg(配方取决于 dpkg 包,构建完成后可以在我的目标 rootfs 中找到此命令完成;我也尝试指向 ${IMAGE_ROOTFS}/usr/bin/dpkg 产生相同的结果)。根据我对 BitBake 进程的了解,此命令可能在另一个 sysroot 中,但我必须承认这是我的理解崩溃的地方。

  1. 我可以调整此方法以使其起作用,还是我需要从头开始安装源代码?
  2. 也许我可以考虑使用完全不同的方法?

package_deb 是存储 deb 包的打包机制的地方,它不是你在食谱中继承的东西,但应该列在 PACKAGE_CLASSES.

当您将 .deb 放入 SRC_URI 中时,提取程序将尝试解压缩它以便您可以访问内容:假设您要将内容重新打包为本机内容Yocto 食谱。

如果那是你想要做的,那么首先你需要修复解包逻辑(在 bitbake/lib/bb/fetch2/__init__.py 中)以处理 .debs 与 xz 压缩数据。这是 bitbake 中的错误和错误报告 and/or 补丁将不胜感激。

另一种方法是直接使用他们的 deb,但我不建议这样做,因为依赖项可能不匹配。最好的长期解决方案是直接从源代码构建它,而不是尝试将包用于另一个发行版。

如果您真的想直接安装他们的 deb,那么您的 rootfs 后处理是一种解决方案。它不起作用,因为取决于 dpkg 将为您构建一个 dpkg 用于目标 但您想要一个将 运行 在主机 [=18] 上的 dpkg =].添加对 dpkg-native 的依赖到你的图像。

尽管我个人会继承 bin_package 并提取他们提供的 deb,然后将其重新打包为 OE 中的标准包,或者理想情况下编写适当的配方来构建 rosjava 并将其提交给 meta- ros (https://github.com/bmwcarit/meta-ros).