Package: pbuilder Version: 0.215 Severity: wishlist Tags: patch I have written an apt based dependency resolver for pbuilder.
It's based on the aptitude one with two differences (aside from not using aptitude obviously): - It ignores alternative build-dependencies similar to sbuild. - It uses a local repository for the dependency package instead of installing it with dpkg -i --foce-... I didn't bother with generating a key and signing the repository. Instead I marked it as trusted in the source.list entry. This has the limitation that it requires apt >= 0.8.16~exp3. Regards, Felix
--- /dev/null +++ b/pbuilder-satisfydepends-apt @@ -0,0 +1,216 @@ +#!/bin/bash +# pbuilder -- personal Debian package builder +# Copyright (C) 2001,2002,2003,2005-2007 Junichi Uekawa +# Copyright (C) 2007 Loïc Minier +# Copyright (C) 2013 Felix Geyer +# Copyright (C) 2005 Ryan Murray +# Copyright (C) 2005-2010 Roger Leigh +# Copyright (C) 2008 Simon McVittie +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +# module to satisfy build dependencies; apt flavor + +set -e + +export PBUILDER_PKGLIBDIR="${PBUILDER_PKGLIBDIR:-$PBUILDER_ROOT/usr/lib/pbuilder}" + +. "$PBUILDER_PKGLIBDIR"/pbuilder-satisfydepends-funcs + + +# filter out dependencies sent on input not for this arch; deps can have +# multiple lines; output is on a single line or "" if empty +function filter_arch_deps() { + local arch="$1" + local INSTALLPKGMULTI + local INSTALLPKG + + # split on "," + sed 's/[[:space:]]*,[[:space:]]*/\n/g' | + while read INSTALLPKGMULTI; do + echo "$INSTALLPKGMULTI" | + # split on "|" + sed 's/[[:space:]]*|[[:space:]]*/\n/g' | + while read INSTALLPKG; do + if echo "$INSTALLPKG" | grep -q '\['; then + if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then + continue + fi + fi + # output the selected package + echo "$INSTALLPKG" + done | + # remove the arch list and add " | " between entries + sed 's/\[.*\]//; $,$! s/$/ |/' | + xargs --no-run-if-empty + done | + # add ", " between entries + sed '$,$! s/$/,/' | + xargs --no-run-if-empty +} + +function filter_alternative_deps() { + local arch="$1" + local INSTALLPKGMULTI + local INSTALLPKG + local FIRSTPKGNAME + local PKGNAME + + + # Filter out all but the first alternative except in special + # cases. + + # split on "," + sed 's/[[:space:]]*,[[:space:]]*/\n/g' | + while read INSTALLPKGMULTI; do + FIRSTPKGNAME="" + echo "$INSTALLPKGMULTI" | + # split on "|" + sed 's/[[:space:]]*|[[:space:]]*/\n/g' | + while read INSTALLPKG; do + # Allow foo (rel x) | foo (rel y) as the only acceptable + # form of alternative. i.e. where the package is the + # same, but different relations are needed, since these + # are effectively a single logical dependency. + PKGNAME=$(echo "$INSTALLPKG" | cut -d ' ' -f 1) + if [ -z "$FIRSTPKGNAME" ]; then + FIRSTPKGNAME="$PKGNAME" + elif [ "$PKGNAME" != "$FIRSTPKGNAME" ]; then + continue + fi + # output the selected package + echo "$INSTALLPKG" + done | + # remove the arch list and add " | " between entries + sed 's/\[.*\]//; $,$! s/$/ |/' | + xargs --no-run-if-empty + done | + # add ", " between entries + sed '$,$! s/$/,/' | + xargs --no-run-if-empty +} + +function setup_archive() { + local DUMMY_ARCHIVE_DIR="/tmp/apt_archive" + local DUMMY_ARCHIVE_DIR_LIST="_tmp_apt%5farchive_." + + $CHROOTEXEC sh -c "cat >\"$DUMMY_ARCHIVE_DIR/conf\"" <<EOF +Dir { + ArchiveDir "$DUMMY_ARCHIVE_DIR"; +}; + +Default { + Packages::Compress ". gzip"; +}; + +BinDirectory "$DUMMY_ARCHIVE_DIR" { + Packages "Packages"; +}; + +APT::FTPArchive::Release::Origin "pbuilder-build-depends-archive"; +APT::FTPArchive::Release::Label "pbuilder-build-depends-archive"; +APT::FTPArchive::Release::Suite "invalid"; +APT::FTPArchive::Release::Codename "invalid"; +APT::FTPArchive::Release::Description "pbuilder Build Dependency Temporary Archive"; +EOF + $CHROOTEXEC apt-ftparchive -q=2 generate $DUMMY_ARCHIVE_DIR/conf + $CHROOTEXEC sh -c "apt-ftparchive -q=2 -c $DUMMY_ARCHIVE_DIR/conf release $DUMMY_ARCHIVE_DIR >\"$DUMMY_ARCHIVE_DIR/Release\"" + + # [trusted=yes] requires apt >= 0.8.16~exp3 + $CHROOTEXEC sh -c "echo \"deb [trusted=yes] file://$DUMMY_ARCHIVE_DIR ./\" >/etc/apt/sources.list.d/pbuilder-dummy.list" + + # Update only our dummy dependency repository + for f in Packages Release; do + $CHROOTEXEC cp $DUMMY_ARCHIVE_DIR/$f /var/lib/apt/lists/${DUMMY_ARCHIVE_DIR_LIST}_${f} + done + + $CHROOTEXEC apt-cache gencaches +} + +function checkbuilddep_internal () { +# Use this function to fulfill the dependency (almost) + local ARCH=$($CHROOTEXEC dpkg-architecture -qDEB_HOST_ARCH) + local BUILD_DEP_DEB_DIR + local BUILD_DEP_DEB_CONTROL + local DEPENDS + local CONFLICTS + local DUMMY_ARCHIVE_DIR="/tmp/apt_archive" + + echo " -> Attempting to satisfy build-dependencies" + DEPENDS="$(get_build_deps | filter_arch_deps "$ARCH" | filter_alternative_deps)" + CONFLICTS="$(get_build_conflicts | filter_arch_deps "$ARCH")" + + echo " -> Creating pbuilder-satisfydepends-dummy package" + BUILD_DEP_DEB_DIR="/tmp/satisfydepends-apt" + BUILD_DEP_DEB_CONTROL="$BUILD_DEP_DEB_DIR/pbuilder-satisfydepends-dummy/DEBIAN/control" + $CHROOTEXEC mkdir -p "$BUILD_DEP_DEB_DIR/pbuilder-satisfydepends-dummy/DEBIAN/" + $CHROOTEXEC sh -c "cat >\"$BUILD_DEP_DEB_CONTROL\"" <<EOF +Package: pbuilder-satisfydepends-dummy +Version: 0.invalid.0 +Architecture: $ARCH +Maintainer: Debian Pbuilder Team <pbuilder-ma...@lists.alioth.debian.org> +Description: Dummy package to satisfy dependencies with apt - created by pbuilder + This package was created automatically by pbuilder to satisfy the + build-dependencies of the package being currently built. +EOF + if [ -n "$DEPENDS" ]; then + $CHROOTEXEC sh -c "echo \"Depends: $DEPENDS\" >>\"$BUILD_DEP_DEB_CONTROL\"" + fi + if [ -n "$CONFLICTS" ]; then + $CHROOTEXEC sh -c "echo \"Conflicts: $CONFLICTS\" >>\"$BUILD_DEP_DEB_CONTROL\"" + fi + $CHROOTEXEC sh -c "cat \"$BUILD_DEP_DEB_CONTROL\"" + $CHROOTEXEC sh -c "dpkg-deb -b \"$BUILD_DEP_DEB_DIR/pbuilder-satisfydepends-dummy\"" + + $CHROOTEXEC mkdir -p "$DUMMY_ARCHIVE_DIR" + $CHROOTEXEC mv "$BUILD_DEP_DEB_DIR/pbuilder-satisfydepends-dummy.deb" "$DUMMY_ARCHIVE_DIR/" + setup_archive + + $CHROOTEXEC apt-get \ + -qyf \ + --no-install-recommends \ + --purge \ + "${APTGETOPT[@]}" \ + install \ + pbuilder-satisfydepends-dummy + # check whether the apt's resolver kept the package + if ! $CHROOTEXEC dpkg -l pbuilder-satisfydepends-dummy 2>/dev/null | grep -q ^ii; then + echo "apt couldn't satisfy the build dependencies" + exit 1 + fi + echo " -> Finished parsing the build-deps" +} + + +function print_help () { + # print out help message + cat <<EOF +pbuilder-satisfydepends -- satisfy dependencies +Copyright 2002-2007 Junichi Uekawa <dan...@debian.org> + +--help: give help +--control: specify control file (debian/control, *.dsc) +--chroot: operate inside chroot +--binary-all: include binary-all +--binary-arch: include binary-arch only +--echo: echo mode, do nothing. (--force-version required for most operation) +--force-version: skip version check. +--continue-fail: continue even when failed. + +EOF +} + +. "$PBUILDER_PKGLIBDIR"/pbuilder-satisfydepends-checkparams + --- a/pbuilder-updatebuildenv +++ b/pbuilder-updatebuildenv @@ -45,8 +45,11 @@ case "`readlink -e "$PBUILDERSATISFYDEPE *-aptitude) EXTRAPACKAGES="$EXTRAPACKAGES aptitude" ;; + *-apt) + EXTRAPACKAGES="$EXTRAPACKAGES apt-utils" + ;; *) - EXTRAPACKAGES="$EXTRAPACKAGES aptitude-" + EXTRAPACKAGES="$EXTRAPACKAGES aptitude- apt-utils-" ;; esac --- a/Makefile +++ b/Makefile @@ -50,6 +50,7 @@ pbuilder-loadconfig \ pbuilder-modules \ pbuilder-runhooks \ + pbuilder-satisfydepends-apt \ pbuilder-satisfydepends-aptitude \ pbuilder-satisfydepends-checkparams \ pbuilder-satisfydepends-classic \