diff options
Diffstat (limited to 'pbuilder-satisfydepends-funcs')
-rwxr-xr-x | pbuilder-satisfydepends-funcs | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/pbuilder-satisfydepends-funcs b/pbuilder-satisfydepends-funcs new file mode 100755 index 0000000..029d0e1 --- /dev/null +++ b/pbuilder-satisfydepends-funcs @@ -0,0 +1,154 @@ +#!/bin/bash +# pbuilder -- personal Debian package builder +# Copyright (C) 2001,2002,2003,2005-2007 Junichi Uekawa +# Copyright (C) 2007 Loïc Minier +# +# 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; common functions + + +function package_versions() { + local PACKAGE="$1" + ( $CHROOTEXEC /usr/bin/apt-cache show "$PACKAGE" ) | sed -n 's/^Version: \(.*\)$/\1/p' +} + +function candidate_version() { + local PACKAGE="$1" + LC_ALL=C $CHROOTEXEC apt-cache policy "$PACKAGE" | sed -n 's/ *Candidate: *\(.*\)/\1/p' +} + +function checkbuilddep_versiondeps () { + local PACKAGE="$1" + local COMPARESTRING="$2" + local DEPSVERSION="$3" + local PACKAGEVERSIONS=$( package_versions "$PACKAGE" | xargs) + # no versioned provides. + if [ "${FORCEVERSION}" = "yes" ]; then + return 0; + fi + for PACKAGEVERSION in $PACKAGEVERSIONS ; do + if dpkg --compare-versions "$PACKAGEVERSION" "$COMPARESTRING" "$DEPSVERSION"; then + # satisfies depends + return 0; + fi + done + echo " Tried versions: $PACKAGEVERSIONS" + # cannot satisfy depends + return 1; +} + +function expand_arch () { + local ARCH="$1" + local EXPANDED_ARCH + + # just keep the original behavior. + echo "$ARCH" + return + + # the following may be used if dpkg change is set to stone. + if echo "$ARCH" | grep "-" > /dev/null; then + EXPANDED_ARCH=$ARCH + else + EXPANDED_ARCH="linux-$ARCH" + fi + local WC1=$(echo $EXPANDED_ARCH | sed 's/^[^-]*/any/') + local WC2=$(echo $EXPANDED_ARCH | sed 's/[^-]*$/any/') + echo "$ARCH\\|$EXPANDED_ARCH\\|$WC1\\|$WC2" +} + +function checkbuilddep_archdeps () { + # returns FALSE on INSTALL + local INSTALLPKG="$1" + local ARCH="$2" + if echo "$INSTALLPKG" | sed 's/.*\(\[.*\]\)/\1/' | grep "[[/][!]\($(expand_arch $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 "[[/]\($(expand_arch $ARCH)\)[]/]" > /dev/null; then + # if $ARCH does not exist, ERROR. + return 0; + fi + fi + return 1; +} + +function checkbuilddep_provides () { + local PACKAGENAME="$1" + # PROVIDED needs to be used outside of this function. + 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}') +} + +# returns either "package=version", to append to an apt-get install line, or +# package +function versioneddep_to_aptcmd () { + local INSTALLPKG="$1" + + local PACKAGE + local PACKAGE_WITHVERSION + local PACKAGEVERSIONS + local CANDIDATE_VERSION + local COMPARESTRING + local DEPSVERSION + + PACKAGE="$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//')" + PACKAGE_WITHVERSION="$PACKAGE" + + # if not versionned, we skip directly to outputting $PACKAGE + if echo "$INSTALLPKG" | grep '[(]' > /dev/null; then + # package versions returned by APT, in reversed order + PACKAGEVERSIONS="$( package_versions "$PACKAGE" | tac | xargs )" + CANDIDATE_VERSION="$( candidate_version "$PACKAGE" )" + + COMPARESTRING="$(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*([ ]*\(<<\|<=\|>=\|=\|<\|>>\|>\)[ ]*\(.*\)).*$/\1/')" + DEPSVERSION="$(echo "$INSTALLPKG" | tr "/" " " | sed 's/^.*([ ]*\(<<\|<=\|>=\|=\|<\|>>\|>\)[ ]*\(.*\)).*$/\2/')" + # if strictly versionned, we skip to outputting that version + if [ "=" = "$COMPARESTRING" ]; then + PACKAGE_WITHVERSION="$PACKAGE=$DEPSVERSION" + else + # try the candidate version, then all available versions (asc) + for VERSION in $CANDIDATE_VERSION $PACKAGEVERSIONS; do + if dpkg --compare-versions "$VERSION" "$COMPARESTRING" "$DEPSVERSION"; then + if [ $VERSION != $CANDIDATE_VERSION ]; then + PACKAGE_WITHVERSION="$PACKAGE=$VERSION" + fi + break; + fi + done + fi + fi + + echo "$PACKAGE_WITHVERSION" +} + +function print_help () { + # print out help message + cat <<EOF +pbuilder-satisfydepends -- satisfy dependencies +Copyright 2002-2007 Junichi Uekawa <dancer@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 +} + |