我可以在BitBake Build中安装.deb吗?

时间:2016-03-18 16:54:00

标签: deb yocto bitbake openembedded

问题定义

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

实施尝试:使用.deb

package_deb.bbclass构建

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

sudo apt-get install ros-indigo-rosjava

在我的构建机器上完美运行。我想如果我可以指向一个.deb并使用Poky元数据类package_deb,它将为我完成所有繁重的工作,因此我在{{3}上制作了以下简单的配方在Yocto Project邮件列表上:

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_deb变量中添加了PACKAGE_CLASSES,在package-management中添加了IMAGE_FEATURES。我尝试过其他安装失败的方法;我认为这种方法对于了解如何实施非常有用。

更新 - 3/22

我试图通过ROOTFS_POSTPROCESS_COMMAND进行安装来解决上述方法的问题,我已经从论坛帖子this posting改编了

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}路径中的命令,因此失败。 like this表示:

  

STAGING_BINDIR_NATIVE指定构建主机的sysroot目录的/usr/bin子目录的路径。

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

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

2 个答案:

答案 0 :(得分:2)

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

虽然我个人要么继承bin_package并提取他们提供的deb,然后将其重新打包为OE中的标准包,或者理想地编写一个合适的配方来构建rosjava并将其提交给meta-ros({{ 3}})。

答案 1 :(得分:1)

package_deb是存储deb软件包的包装机器的地方,它不是你在配方中继承的东西,而应该列在PACKAGE_CLASSES中。

当您在.deb中放置SRC_URI时,抓取器会尝试将其解压缩以便您可以访问内容:假设您要将内容重新打包为本机Yocto配方

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

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