1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
#! /bin/bash
# pbuilder -- personal Debian package builder
# Copyright © 2003-2009 Junichi Uekawa <dancer@debian.org>
#
# 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
###############################################################################
# invoke this as
# pbuilder execute pdebuild-internal --bindmount "${pwd}/.." "$1"
# does not support --buildresult, but should that be required ?
#
# Risk: May corrupt your files depending on how user-mode-linux works, if used inside UML.
# Will take longer if your package does not successfully run 'debian/rules clean'
#
# This script is running inside chroot under 'pbuilder execute' as root.
set -e
# I am probably running as root; make sure I have pbuilder installed here.
# passwd is needed as well because of useradd and groupadd calls.
apt-get install -q -y "${APTGETOPT[@]}" pbuilder passwd
# I'm not going to have the same LOGNAME as outside, I'm root.
export LOGNAME=root
cd "$1"
shift;
# dummy function that does enough, real one is defined elsewhere.
# We don't deal with LOGLEVEL here, though.
# We can't just source the modules and use log.{i,w,e} since we don't know if
# the pbuilder version inside the chroot is new enough.
function log() {
echo "$*"
}
while [ -n "$1" ]; do
case "$1" in
--debbuildopts)
# append to DEBBUILDOPTS or reset to empty if $2 isn't set
DEBBUILDOPTS="${2:+${DEBBUILDOPTS:+$DEBBUILDOPTS }$2}";
log "I: Setting DEBBUILDOPTS=$DEBBUILDOPTS"
shift; shift;
;;
--source-only-changes)
SOURCE_ONLY_CHANGES=yes
shift
;;
--uid)
BUILDRESULTUID=$2
shift; shift;
;;
--gid)
BUILDRESULTGID=$2
shift; shift;
;;
--pbuildersatisfydepends)
PBUILDERSATISFYDEPENDSCMD=$2
shift; shift;
;;
--debug)
PBUILDER_DEBUGMODE=yes
set -x
shift;
;;
--*)
log "E: Unknown option [$1] was specified "
exit 1;
;;
*)
break;
;;
esac
done
# Calling pbuilder-runhooks; we try to fix up enough to fool
# pbuilder-runhooks. The following source call depends on
# pbuilder-runhook inside the chroot, which might be different from
# the version outside the chroot.
. /usr/lib/pbuilder/pbuilder-runhooks
# fool pbuilder-runhooks to use / as buildplace, since I am already
# inside chroot.
BUILDPLACE=/
# chroot command will just chroot to /, which will effectively chdir
# to / and nothing else.
CHROOTEXEC="chroot $BUILDPLACE "
# make HOOKDIR contain something if there is a hook, to fool HOOKDIR
# check inside pbuilder-runhooks that there is HOOKDIR
# configuration. We don't call loadhooks or unloadhooks ourselves,
# pbuilder execute will do that for you, so we should be okay.
# TODO: handle when --hookdir was not initially specified.
if [ -d "/$hookdir" ]; then
HOOKDIR="/$hookdir"
fi
executehooks "D"
export PBUILDER_OPERATION="pdebuild"
export PBCURRENTCOMMANDLINEOPERATION="pdebuild"
"$PBUILDERSATISFYDEPENDSCMD"
apt-get install -q -y "${APTGETOPT[@]}" fakeroot
# set home directory to ..
export HOME=$(readlink -f $(pwd)/../)
if [ -z "${HOME}" ]; then
echo "E: Failed to obtain reasonable HOME from pwd"
fi
# create the user similar to that used outside.
# TODO: what about id -G output? if other groups than the designated
# is used, we're stuffed.
groupadd -g "${BUILDRESULTGID}" -o pbgroup
useradd -g pbgroup -u "${BUILDRESULTUID}" -d "${HOME}" -o pbuser
executehooks "A"
# do build with that user.
# $DEBBUILDOPTS is expanded here, but split inside the su, to ensure the
# options are de-quoted (and de-escaped) like pbuilder-buildpackage.
export DEBBUILDOPTS
CMD="env PATH=$PATH dpkg-buildpackage -rfakeroot -us -uc $DEBBUILDOPTS"
if [ "${SOURCE_ONLY_CHANGES:-no}" = "yes" ]; then
PKG_SOURCENAME=$(dpkg-parsechangelog -S Source)
PKG_VERSION=$(dpkg-parsechangelog -S Version|sed 's/.*://')
SOURCE_CHANGES="${PKG_SOURCENAME}_${PKG_VERSION}_source.changes"
CMD="$CMD && env PATH=$PATH dpkg-genchanges -S $(get_changes_options) > ../$SOURCE_CHANGES"
fi
echo "I: Running $CMD"
# This command should be ran with current directory as bind-mounted
# package source directory
if echo "$CMD" | \
su -p pbuser;
then
# build was successful
:
else
executehooks "C"
exit 1
fi
executehooks "B"
|