Разрешение зависимостей в среде 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, чтобы он автоматически разрешал зависимости в своей среде?
2 ответа
Глядя на источник для /usr/share/gdebi/GDebi/GDebiCli.py
мы видим, что сценарий pbuilder-dist умирает, когда gdebi пытается выполнить dpkg. Как это бывает, мы можем получить странное OSError: [Errno 2] No such file or directory
при попытке выполнить 32-разрядный исполняемый файл в 64-разрядной системе без libc6:i386
установлены.
Расследование дальше в /usr/lib/pbuilder/pbuilder-satisfydepends-gdebi
мы находим, что gdebi удовлетворяет зависимости извне chroot, выполняя dpkg внутри chroot,
INSTALL=$(/usr/bin/gdebi --quiet --root $CHROOT --apt-line $NO_RECOMMENDS $DEBIAN_CONTROL)
$CHROOTEXEC /usr/bin/apt-get install -y "${APTGETOPT[@]}" $INSTALL
Таким образом, без многоархивных библиотек, необходимых для выполнения 32-битного dpkg на 64-битном хосте, это не получится. Другой вариант - использовать средство распознавания aptitude, которое работает внутри chroot, поэтому в любом случае проблем не должно быть.
Я повторил ту же ошибку в недавней сборке 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