在 pbuilder 环境内而不是在主机系统上解决依赖关系

在 pbuilder 环境内而不是在主机系统上解决依赖关系

我正在尝试使用 pbuilder 构建一个包,并且不想在主机上安装构建依赖项,这样我就可以保持主机的整洁。每当它尝试构建包时,我都会得到以下输出,因为我没有安装依赖项。

$ pbuilder-dist saucy i386 build nautilus_3.8.2-0ubuntu1.dsc
I: Logging to /home/notgary/pbuilder/saucy-i386_result/last_operation.log
I: using fakeroot in build.
I: Current time: Tue Jul 23 20:52:19 BST 2013
I: pbuilder-time-stamp: 1374609139
I: Building the build Environment
I: extracting base tarball [/home/notgary/pbuilder/saucy-i386-base.tgz]
I: creating local configuration
I: copying local configuration
W: --override-config is not set; not updating apt.conf Read the manpage for details.
I: mounting /proc filesystem
I: mounting /dev/pts filesystem
I: Mounting /var/cache/pbuilder/ccache
I: policy-rc.d already exists
I: Obtaining the cached apt archive contents
I: Setting up ccache
I: Installing the build-deps
Traceback (most recent call last):
  File "/usr/bin/gdebi", line 80, in <module>
    debi = GDebiCli(options)
  File "/usr/share/gdebi/GDebi/GDebiCli.py", line 53, in __init__
    "--print-architecture"], stdout=PIPE).communicate()[0]
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
E: pbuilder-satisfydepends failed.
I: Copying back the cached apt archive contents
I: unmounting /var/cache/pbuilder/ccache filesystem
I: unmounting dev/pts filesystem
I: unmounting proc filesystem
I: cleaning the build env 
I: removing directory /var/cache/pbuilder/build//9113 and its subdirectories

我如何更新 pbuilder 以便它能够在自己的环境中自动解决依赖关系?

答案1

查看源代码,/usr/share/gdebi/GDebi/GDebiCli.py我们发现当 gdebi 尝试执行 dpkg 时,pbuilder-dist 脚本会终止。碰巧的是,当我们尝试在未安装的OSError: [Errno 2] No such file or directory64 位系统上执行 32 位可执行文件时,会出现奇怪的情况。libc6:i386

进一步研究后/usr/lib/pbuilder/pbuilder-satisfydepends-gdebi,我们发现 gdebi 满足以下依赖项外部通过执行 dpkg 来 chroot里面chroot,

INSTALL=$(/usr/bin/gdebi --quiet --root $CHROOT --apt-line $NO_RECOMMENDS $DEBIAN_CONTROL)
$CHROOTEXEC /usr/bin/apt-get install -y "${APTGETOPT[@]}" $INSTALL

因此,如果没有在 64 位主机上执行 32 位 dpkg 所需的多架构库,这将失败。另一个选择是使用 aptitude 解析器,它可以工作里面chroot,所以无论如何都不会有问题。

答案2

我在最近的 pbuilder 构建中遇到了同样的错误,并将以下代码片段添加到 ~/.pbuilderrc 文件中,以便当主机和客户机架构不同时它会自动安装并使用 aptitude 解析器。

if [ "${ARCH}" = "$(dpkg --print-architecture)" ]; then
    #gdebi resolution, requires gdebi-core
    if command -v "gdebi" >/dev/null 2>&1; then
        PBUILDERSATISFYDEPENDSCMD="/usr/lib/pbuilder/pbuilder-satisfydepends-gdebi" || true
        rm -rf "${HOOKDIR}/D01install_aptitude_resolver"
    else
        printf "%s\\n" '#!/bin/sh' > "${HOOKDIR}/D01install_aptitude_resolver"
        printf "%s\\n" 'apt-get install -y --no-install-recommends aptitude' >> "${HOOKDIR}/D01install_aptitude_resolver"
        chmod +x "${HOOKDIR}/D01install_aptitude_resolver"
    fi
else
    printf "%s\\n" '#!/bin/sh' > "${HOOKDIR}/D01install_aptitude_resolver"
    printf "%s\\n" 'apt-get install -y --no-install-recommends aptitude' >> "${HOOKDIR}/D01install_aptitude_resolver"
    chmod +x "${HOOKDIR}/D01install_aptitude_resolver"
fi

相关内容