diff options
author | dancer <dancer> | 2002-03-12 16:27:48 +0000 |
---|---|---|
committer | dancer <dancer> | 2002-03-12 16:27:48 +0000 |
commit | afb79b8c279baa57e1c2e9409acf0d0ddb017d7c (patch) | |
tree | 431b9e0a86db1da7b98aaac4e4d2528f2b5f32d9 | |
parent | 8312841f1ca8c1bba4cf01c108c13cf90714afeb (diff) | |
download | pbuilder-afb79b8c279baa57e1c2e9409acf0d0ddb017d7c.tar pbuilder-afb79b8c279baa57e1c2e9409acf0d0ddb017d7c.tar.gz |
created pbuilder-satisfydepends, and many changes today.
Improvement generally.
-rw-r--r-- | ChangeLog | 24 | ||||
-rw-r--r-- | Makefile | 1 | ||||
-rw-r--r-- | debian/TODO | 11 | ||||
-rw-r--r-- | debian/changelog | 11 | ||||
-rwxr-xr-x | pbuilder-buildpackage | 142 | ||||
-rw-r--r-- | pbuilder-satisfydepends | 236 | ||||
-rw-r--r-- | pbuilder.1 | 2 |
7 files changed, 284 insertions, 143 deletions
@@ -1,3 +1,27 @@ +2002-03-12 Junichi Uekawa <dancer@debian.org> + + * pbuilder-satisfydepends: created + Modified/forked pbuilder-buildpackage. + Should be possible to install build-dependency outside of + chroot, for usual operation. + -- Do you trust pbuilder parser ? + Instead of dpkg --print-architecture, use + dpkg-architecture -qDEB_HOST_ARCH + It is now possible to debug dependency with + pbuilder-satisfydepends --echo --force-version --control controlfile + + * pbuilder-buildpackage: only run apt-get -y + install ${EXTRAPACKAGES} when ${EXTRAPACKAGES} is not "" + + * debian/TODO: updated, non-root builds using fakeroot + are now supported. + document $TMPDIR and $HOME problems. + + * pbuilder-buildpackage: only handle Build-Depends / Control + found in Source section and ignore any such entry in package + sections.. + + 2002-03-10 Junichi Uekawa <dancer@debian.org> * debian/changelog: add new bug # to changelog. @@ -22,6 +22,7 @@ install: $(INSTALL_EXECUTABLE) pbuilder-modules $(DESTDIR)/usr/lib/pbuilder/ $(INSTALL_EXECUTABLE) pbuilder $(DESTDIR)/usr/sbin $(INSTALL_EXECUTABLE) pdebuild $(DESTDIR)/usr/bin + $(INSTALL_EXECUTABLE) pbuilder-satisfydepends $(DESTDIR)/usr/lib/pbuilder/ $(INSTALL_FILE) pbuilderrc $(DESTDIR)/etc $(INSTALL_FILE) pbuilderrc $(DESTDIR)/usr/share/pbuilder diff --git a/debian/TODO b/debian/TODO index b931a7e..a6d0db7 100644 --- a/debian/TODO +++ b/debian/TODO @@ -34,10 +34,15 @@ TODO and possible bugs: * Do not install Build-*-Indep: targets for binary-arch building. - * Run the build target with a non-root user. - Create a random entry inside the chroot ? - * $HOME etc. environment vars are set to bogus values + * $HOME, $TMP, $TMPDIR, etc. environment vars are set to bogus + values * Lock-filing of $BASETGZ between processes. + * Running build as normal user, and using real root when running + binary target ? + + * check cross-compile support, maybe adding support for dpkg-cross + into build-depends checker. + $Id$ diff --git a/debian/changelog b/debian/changelog index 12294eb..df0d6ca 100644 --- a/debian/changelog +++ b/debian/changelog @@ -7,8 +7,15 @@ pbuilder (0.24.prerelease.20020304) unstable; urgency=low it was set to "nobody@nowhere", but that shouldn't be necessary. (closes: #136628, #137411) * pbuilderrc: change the default config so that binary and source is built - - -- Junichi Uekawa <dancer@debian.org> Sun, 10 Mar 2002 00:19:51 +0900 + * ignore build-depends in package lines and only use those found in the + source lines. + * debian/TODO: updated. + * pbuilder-satisfydepends: split out the dependency satisfaction + code, so that it can be used genericly. Or replaced with other + programs, such as sbuild. However, sbuild reads .dsc files, while + pbuilder parses debian/control. + + -- Junichi Uekawa <dancer@debian.org> Tue, 12 Mar 2002 19:06:55 +0900 pbuilder (0.24) unstable; urgency=low diff --git a/pbuilder-buildpackage b/pbuilder-buildpackage index bacd86a..6ad6d9c 100755 --- a/pbuilder-buildpackage +++ b/pbuilder-buildpackage @@ -32,147 +32,13 @@ function copydsc () { 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 -rn | 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 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}') -} - -function checkbuilddep_internal () { -# Use this function to fulfill the dependency (almost) - local ARCH=$(dpkg --print-architecture) - local INSTALLPKG - local INSTALLPKGMULTI - local CURRENTREALPKGNAME - echo " -> Attempting to parse the build-deps by myself" - for INSTALLPKGMULTI in $(cat "$BUILDPLACE/"tmp/buildd/*/debian/control | \ - awk '/^[^ ]*:/{p=0} tolower($0) ~ /^build-depends:/{p=1} tolower($0) ~ /^build-depends-indep:/{p=1} {if(p) {print $0}}' | \ - sed 's/^[^:]*: //' | \ - tr " " "/" | \ - awk 'BEGIN{RS=","} {print}'); do - echo " -> Considering "$(echo $INSTALLPKGMULTI | tr "/" " " | awk '{print $0}' ) - SATISFIED="no" - for INSTALLPKG in $(echo "$INSTALLPKGMULTI" | \ - awk 'BEGIN{RS="|"} {print}'); do - CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//') - 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 ${CURRENTREALPKGNAME} \ - $(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 "${CURRENTREALPKGNAME} - - if $CHROOTEXEC usr/bin/apt-get -y install ${CURRENTREALPKGNAME}; then - SATISFIED="yes" - else - # package could not be found. -- looking for alternative. - PROVIDED="" - checkbuilddep_provides ${CURRENTREALPKGNAME} - 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 "E: pbuilder: Could not satisfy build-dependency." >&2 - saveaptcache_umountproc_cleanbuildplace - exit 1 - fi - done; - - # start processing build-conflicts. - for INSTALLPKG in $(cat "$BUILDPLACE/"tmp/buildd/*/debian/control | \ - awk '/^[^ ]*:/{p=0} tolower($0) ~ /^build-conflicts:/{p=1} tolower($0) ~ /^build-conflicts-indep:/{p=1} {if(p) {print $0}}' | \ - sed 's/^[^:]*: //' | \ - tr " " "/" | \ - awk 'BEGIN{RS=","} {print}'); do - CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//') - echo " -> Considering "${CURRENTREALPKGNAME} - - 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 ${CURRENTREALPKGNAME} \ - $(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 ${CURRENTREALPKGNAME} ; then - echo "E: Could not satisfy build-conflicts" >&2 - saveaptcache_umountproc_cleanbuildplace - exit 1 - fi - else - echo "I: This package is not installed." - fi - done -} - function checkbuilddep () { + /usr/lib/pbuilder/pbuilder-satisfydepends --control "$BUILDPLACE/"tmp/buildd/*/debian/control --chroot "$BUILDPLACE" checkbuilddep_internal # install extra packages to the chroot - $CHROOTEXEC usr/bin/apt-get -y install ${EXTRAPACKAGES} + if [ -n "$EXTRAPACKAGES" ]; then + $CHROOTEXEC usr/bin/apt-get -y install ${EXTRAPACKAGES} + fi } function echobacktime () { diff --git a/pbuilder-satisfydepends b/pbuilder-satisfydepends new file mode 100644 index 0000000..e36c61a --- /dev/null +++ b/pbuilder-satisfydepends @@ -0,0 +1,236 @@ +#!/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 +# +# module to satisfy dependency. + +set -e + +function checkbuilddep_versiondeps () { + local PACKAGE="$1" + local COMPARESTRING="$2" + local DEPSVERSION="$3" + local PACKAGEVERSION=$($CHROOTEXEC /usr/bin/apt-cache show $PACKAGE | grep "^Version:" | sort -rn | head -1 | sed 's/^Version: \(.*\)$/\1/') + # no versioned provides. + if [ "${FORCEVERSION}" = "yes" ]; then + return 0; + fi + 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 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}') +} + +function checkbuilddep_internal () { +# Use this function to fulfill the dependency (almost) +#requires: +# CHROOTEXEC = how to run chroot +# + local ARCH=$(dpkg-architecture -qDEB_HOST_ARCH) + local INSTALLPKG + local INSTALLPKGMULTI + local CURRENTREALPKGNAME + local SATISFIED + echo " -> Attempting to parse the build-deps by myself" + for INSTALLPKGMULTI in $(cat ${DEBIAN_CONTROL} | \ + awk ' +BEGIN{source=1} +/^$/ {source=0} +/^[^ ]*:/ {p=0} +tolower($0) ~ /^'"${BD_REGEXP}"':/ {p=1} +{if(p && source) {print $0}}' | \ + sed 's/^[^:]*: //' | \ + tr " " "/" | \ + awk 'BEGIN{RS=","} {print}'); do + echo " -> Considering "$(echo $INSTALLPKGMULTI | tr "/" " " | awk '{print $0}' ) + SATISFIED="no" + for INSTALLPKG in $(echo "$INSTALLPKGMULTI" | \ + awk 'BEGIN{RS="|"} {print}'); do + CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//') + 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 ${CURRENTREALPKGNAME} \ + $(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 "${CURRENTREALPKGNAME} + + if $CHROOTEXEC /usr/bin/apt-get -y install ${CURRENTREALPKGNAME}; then + SATISFIED="yes" + else + # package could not be found. -- looking for alternative. + PROVIDED="" + checkbuilddep_provides ${CURRENTREALPKGNAME} + 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 "E: pbuilder: Could not satisfy build-dependency." >&2 + saveaptcache_umountproc_cleanbuildplace + exit 1 + fi + done; + + # start processing build-conflicts. + for INSTALLPKG in $(cat "${DEBIAN_CONTROL}" | \ + awk 'BEGIN{source=1} +/^$/ {source=0} +/^[^ ]*:/{p=0} +tolower($0) ~ /^'"${BC_REGEXP}"':/ {p=1} +{if(p && source) {print $0}}' | \ + sed 's/^[^:]*: //' | \ + tr " " "/" | \ + awk 'BEGIN{RS=","} {print}'); do + CURRENTREALPKGNAME=$(echo "$INSTALLPKG" | sed -e 's/^[/]*//' -e 's/[[/(].*//') + echo " -> Considering "${CURRENTREALPKGNAME} + + 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 ${CURRENTREALPKGNAME} \ + $(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 ${CURRENTREALPKGNAME} ; then + echo "E: Could not satisfy build-conflicts" >&2 + saveaptcache_umountproc_cleanbuildplace + exit 1 + fi + else + echo "I: ${CURRENTREALPKGNAME} package is not installed, no need to remove" + fi + done +} + + +function print_help () { + # print out help message + cat <<EOF +pbuilder-satisfydepends -- satisfy dependencies + +--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. +EOF +} + + +DEBIAN_CONTROL=debian/control +CHROOTEXEC="" +BD_REGEXP="build-(depends|depends-indep)" +BC_REGEXP="build-(conflicts|conflicts-indep)" +FORCEVERSION="" + + +while [ -n "$1" ]; do + case "$1" in + --control|-c) + DEBIAN_CONTROL="$2" + shift; shift + ;; + --chroot) + CHROOTEXEC="chroot $2 " + shift; shift + ;; + --binary-all) + BD_REGEXP='build-(depends|depends-indep)' + BC_REGEXP='build-(conflicts|conflicts-indep)' + shift + ;; + --binary-arch) + BD_REGEXP='build-depends' + BC_REGEXP='build-conflicts' + shift + ;; + --echo) + CHROOTEXEC="echo " + shift + ;; + --force-version) + FORCEVERSION="yes" + shift; + ;; + --help|-h) + print_help + exit 1 + ;; + esac +done + + +checkbuilddep_internal
\ No newline at end of file @@ -230,6 +230,8 @@ Specifies that dpkg-buildpackage be called with instead of default value specified in the environmental variable, or pbuilderrc +.B "This option is obsolete, use debbuildopts instead" + .TP .BI "--debbuildopts [" "options" "]" |