#! /bin/bash # pbuilder -- personal Debian package builder # Copyright (C) 2001,2002 Junichi Uekawa # # 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA export LANG=C export LC_ALL=C set -e function copydsc () { local DSCFILE="$1" local TARGET="$2" for FILE in \ "$DSCFILE" \ $(cat "$DSCFILE" | \ awk 'BEGIN{p=0} /^$/ {p=0} {if (p){print "'$(dirname "$DSCFILE")'/" $3}} /^Files:/{p=1}' ) ; do echo " -> copying [$FILE]" cp "$FILE" "$TARGET" ; done } function checkbuilddep_versiondeps () { local PACKAGE="$1" local COMPARESTRING="$2" local DEPSVERSION="$3" local PACKAGEVERSION=$($CHROOTEXEC usr/bin/apt-cache show $PACKAGE | grep "^Version:" | sort | head -1 | sed 's/^Version: \(.*\)$/\1/') # no versioned provides. if dpkg --compare-versions "$PACKAGEVERSION" "$COMPARESTRING" "$DEPSVERSION"; then # satisfies depends return 0; else # cannot satisfy depends return 1; fi } function checkbuilddep_archdeps () { # returns FALSE on INSTALL local INSTALLPKG="$1" local ARCH="$2" if echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[[/][!]$ARCH[]/]" > /dev/null; then # if !$ARCH exists in there, ERROR. return 0; fi if ! echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[!]" > /dev/null; then if ! echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[[/]$ARCH[]/]" > /dev/null; then # if $ARCH does not exist, ERROR. return 0; fi fi return 1; } function checkbuilddep_provides () { local PACKAGENAME="$1" PROVIDED=$($CHROOTEXEC usr/bin/apt-cache showpkg $PACKAGENAME | awk '{p=0}/^Reverse Provides:/,/^$/{p=1}{if(p && ($0 !~ "Reverse Provides:")){PACKAGE=$1}} END{print PACKAGE}') } function checkbuilddep_internal () { # Use this function to fulfill the dependency (almost) local ARCH=$(dpkg --print-architecture) echo " -> Attempting to parse the build-deps by myself" for INSTALLPKGMULTI in $(awk '/^[^ ]*:/{p=0}/^Build-Depends:/{p=1} /^Build-Depends-Indep:/{p=1} {if(p) {print $0}}' < "$BUILDPLACE/"tmp/buildd/*/debian/control | \ sed 's/^[^:]*: //' | \ tr " " "/" | \ awk 'BEGIN{RS=","} {print}'); do echo " -> Considering "$(echo $INSTALLPKGMULTI | tr "/" " " | awk '{print $1}' ) SATISFIED="no" for INSTALLPKG in $(echo "$INSTALLPKGMULTI" | \ awk 'BEGIN{RS="|"} {print}'); do if echo "$INSTALLPKG" | grep '\[' > /dev/null ; then if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then SATISFIED="yes" echo " -> This package is not for this architecture" continue; fi fi if echo "$INSTALLPKG" | grep '[(]' > /dev/null; then #echo "Debug: $INSTALLPKG" if ! checkbuilddep_versiondeps $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') \ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*(\(<<\|<=\|>=\|=\|<\|>>\|>\)[ ]*\(.*\)).*$/\1/') \ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*(\(<<\|<=\|>=\|=\|<\|>>\|>\)[ ]*\(.*\)).*$/\2/') ; then echo " -> Does not satisfy version, not trying" continue; fi fi echo " -> Installing "$(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') if $CHROOTEXEC usr/bin/apt-get -y install $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}'); then SATISFIED="yes" else # package could not be found. -- looking for alternative. PROVIDED="" checkbuilddep_provides $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') if [ -n "$PROVIDED" ]; then # something provides this package echo " -> Installing $PROVIDED to satisfy the dependency " if $CHROOTEXEC usr/bin/apt-get -y install $PROVIDED; then SATISFIED="yes"; fi fi fi if [ "$SATISFIED" = "yes" ]; then break; fi done; if [ "$SATISFIED" = "no" ]; then echo Could not satisfy build-dependency. umountproc_cleanbuildplace exit 1 fi done; # start processing build-conflicts. for INSTALLPKG in $(awk '/^[^ ]*:/{p=0}/^Build-Conflicts:/{p=1} /^Build-Conflicts-Indep:/{p=1} {if(p) {print $0}}' < "$BUILDPLACE/"tmp/buildd/*/debian/control | \ sed 's/^[^:]*: //' | \ tr " " "/" | \ awk 'BEGIN{RS=","} {print}'); do echo " -> Considering "$(echo $INSTALLPKG | tr "/" " " | awk '{print $1}' ) if echo "$INSTALLPKG" | grep '\[' > /dev/null ; then # this package has arch-conflicts. if checkbuilddep_archdeps "$INSTALLPKG" "$ARCH"; then echo "I: Ignoring other-arch" continue; fi fi if echo "$INSTALLPKG" | grep '[(]' > /dev/null ; then # this package has version-conflicts if ! checkbuilddep_versiondeps $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') \ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*(\(<<\|<=\|>=\|=\|<\|>>\|>\)[ ]*\(.*\)).*$/\1/') \ $(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*(\(<<\|<=\|>=\|=\|<\|>>\|>\)[ ]*\(.*\)).*$/\2/'); then echo "I: Satisfies version, not trying" continue; fi fi # if package exists, remove it. if $CHROOTEXEC usr/bin/dpkg -s $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') 2>&1 | grep ^Package: > /dev/null; then if ! $CHROOTEXEC usr/bin/apt-get -y remove $(echo "$INSTALLPKG" | tr "/" " " | awk '{print $1}') ; then echo "E: Could not satisfy build-conflicts" >&2 umountproc_cleanbuildplace exit 1 fi else echo "I: This package is not installed." fi done } function checkbuilddep () { checkbuilddep_internal; } . /usr/lib/pbuilder/pbuilder-checkparams PACKAGENAME="$1" CHROOTEXEC="chroot $BUILDPLACE " if [ ! -f "$PACKAGENAME" ]; then echo "Command line parameter [$PACKAGENAME] is not a valid .dsc file name" >&2 exit 1; fi; extractbuildplace echo Copying source file copydsc "$PACKAGENAME" "$BUILDPLACE/tmp/buildd" echo Extracting source if ! $CHROOTEXEC /bin/bash -c "( cd tmp/buildd; /usr/bin/dpkg-source -x $(basename $PACKAGENAME) )"; then echo pbuilder: Failed extracting the source >&2 umountproc_cleanbuildplace exit 1; fi if [ -n "$APTCACHE" ]; then echo "Obtaining the cached apt archive contents" if [ "$APTCACHEHARDLINK" = "yes" ]; then ln "$APTCACHE"/*.deb "$BUILDPLACE/var/cache/apt/archives/" || true else cp "$APTCACHE"/*.deb "$BUILDPLACE/var/cache/apt/archives/" || true fi fi echo Installing the build-deps checkbuilddep if [ -n "$APTCACHE" ]; then echo "Copying back the cached apt archive contents" mkdir -p "$APTCACHE" ; for A in "$BUILDPLACE/var/cache/apt/archives/"*.deb; do if [ ! -f "$APTCACHE/"$(basename "$A") ]; then echo " -> new cache content "$(basename "$A")" added" if [ "$APTCACHEHARDLINK" = "yes" ]; then ln "$A" "$APTCACHE/" else cp "$A" "$APTCACHE/" fi fi done fi echo Building the package export PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin" if [ -z "$DEBEMAIL" ]; then if ! $CHROOTEXEC /bin/bash -c "cd tmp/buildd/*/; dpkg-buildpackage -us -uc $DEBBUILDOPTS"; then echo "pbuilder: Failed autobuilding of package" >&2 umountproc_cleanbuildplace exit 1; fi else if ! $CHROOTEXEC /bin/bash -c "cd tmp/buildd/*/; dpkg-buildpackage -us -uc \"-m$DEBEMAIL\" $DEBBUILDOPTS"; then echo "pbuilder: Failed autobuilding of package" >&2 umountproc_cleanbuildplace exit 1; fi fi umountproc if [ -n "$BUILDRESULT" ]; then mkdir -p "$BUILDRESULT" if [ -d "$BUILDRESULT" ]; then cp "$BUILDPLACE"/tmp/buildd/* "$BUILDRESULT" || true else echo "Error: BUILDRESULT=[$BUILDRESULT] and is not a directory." >&2 fi fi cleanbuildplace