aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordancer <dancer>2002-03-12 16:27:48 +0000
committerdancer <dancer>2002-03-12 16:27:48 +0000
commitafb79b8c279baa57e1c2e9409acf0d0ddb017d7c (patch)
tree431b9e0a86db1da7b98aaac4e4d2528f2b5f32d9
parent8312841f1ca8c1bba4cf01c108c13cf90714afeb (diff)
downloadpbuilder-afb79b8c279baa57e1c2e9409acf0d0ddb017d7c.tar
pbuilder-afb79b8c279baa57e1c2e9409acf0d0ddb017d7c.tar.gz
created pbuilder-satisfydepends, and many changes today.
Improvement generally.
-rw-r--r--ChangeLog24
-rw-r--r--Makefile1
-rw-r--r--debian/TODO11
-rw-r--r--debian/changelog11
-rwxr-xr-xpbuilder-buildpackage142
-rw-r--r--pbuilder-satisfydepends236
-rw-r--r--pbuilder.12
7 files changed, 284 insertions, 143 deletions
diff --git a/ChangeLog b/ChangeLog
index b37dbb3..f4a601f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/Makefile b/Makefile
index ebed5ad..0095f6d 100644
--- a/Makefile
+++ b/Makefile
@@ -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
diff --git a/pbuilder.1 b/pbuilder.1
index 3d9873c..ef8b8e1 100644
--- a/pbuilder.1
+++ b/pbuilder.1
@@ -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" "]"