【问题标题】:Can I install a .deb during a BitBake Build?我可以在 BitBake 构建期间安装 .deb 吗?
【发布时间】:2016-07-05 13:00:58
【问题描述】:

问题定义

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

实施尝试:从.debpackage_deb.bbclass 构建

根据安装说明,安装rosjava真正需要做的事情如下:

sudo apt-get install ros-indigo-rosjava

这在我的构建机器上运行良好。我想如果我可以只指向一个 .deb 并使用 Poky 元数据类 package_deb,它将为我完成所有繁重的工作,所以我在 Yocto 项目邮件中制作了以下适用于 this posting 的简单配方列表:

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 进行安装来规避上述方法的问题,该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 指定构建主机的 sysroot 目录的 /usr/bin 子目录的路径。

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

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

【问题讨论】:

    标签: deb yocto bitbake openembedded


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      package_deb 是存储 deb 包的包装机制的地方,它不是你要在配方中继承的东西,但应该列在 PACKAGE_CLASSES 中。

      当您将.deb 放入SRC_URI 时,提取器将尝试解压缩它以便您可以访问内容:假设您要将内容重新打包为原生 Yocto 配方。

      如果这是您想要做的,那么首先您需要修复解包逻辑(在 bitbake/lib/bb/fetch2/__init__.py 中)以处理带有 xz 压缩数据的 .debs。这是 bitbake 中的一个错误,欢迎提供错误报告和/或补丁。

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

      【讨论】:

      • 感谢您的反馈!回想起来,当我继承 package_deb 时,我不知道自己在想什么。我在问题末尾添加了另一个可能的解决方案的更新,非常感谢您提供的任何想法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多