multistrap/empbuilderlib
2010-03-24 21:44:43 +00:00

223 lines
6.6 KiB
Text

# empbuilderlib : shell library to support building chroots for Emdebian.
#
# Copyright (C) 2006-2010 Neil Williams <codehelp@debian.org>
# Copyright (C) 2001-2007 Junichi Uekawa
#
# This package 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 3 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, see <http://www.gnu.org/licenses/>.
#
# This shell library requires perl and pbuilder (which means bash!) !
# Draws in POSIX shell functions from emrootfslib to be able to call
# in functions from first_stage_install within debootstrap. The only
# reasons to continue putting new functions in here are if:
# 1. the functions are only useful to create cross-building chroots OR
# 2. the functions need to call pbuilder code directly.
# There should be no need to call pbuilder code within scripts that
# generate a root filesystem.
# Intended solely for use on the build machine. Do not use these functions
# in second_stage_install !
. /usr/share/emdebian-tools/emrootfslib
. /usr/lib/pbuilder/pbuilder-modules
WORKPLACE="${WORKDIR}/pbuilder"
BASETGZ="${WORKDIR}/emdebian.tgz"
#pbuilder base values
DEBIAN_BUILDARCH=$ARCH
# cross-building chroot is same arch as host.
BUILDRESULT="$WORKPLACE/result/"
# tidy up // to /
BUILDRESULT=`echo $BUILDRESULT | tr -s \/`
APTCACHE="$WORKPLACE/aptcache/"
# tidy up // to /
APTCACHE=`echo $APTCACHE | tr -s \/`
AUTO_DEBSIGN=yes
APTCACHEHARDLINK="no"
BUILDPLACE="$WORKPLACE/build"
# the default is to add a PID in the buildplace.
BASEBUILDPLACE="$BUILDPLACE"
if [ "${PRESERVE_BUILDPLACE}" != "yes" ]; then
BUILDPLACE="$BUILDPLACE/$$"
fi
function extractembuildplace () {
# after calling this function, umountproc, and cleanbuildplace
# needs to be called. Please trap it.
if [ ! \( "${PRESERVE_BUILDPLACE}" = "yes" -a -d "$BUILDPLACE" \) ]; then
cleanbuildplace
echo "Building the Emdebian build Environment"
if ! mkdir -p "$BUILDPLACE"; then
echo "E: failed to build the directory to chroot"
exit 1
fi
echo " -> extracting base tarball [${BASETGZ}]"
if [ ! -f "$BASETGZ" ]; then
echo "E: failed to find $BASETGZ, have you created your base tarball yet?"
exit 1
fi
if ! (cd "$BUILDPLACE" && tar xfzp "$BASETGZ"); then
echo "E: failed to extract $BASETGZ to $BUILDPLACE"
exit 1
fi
echo " -> creating local configuration"
if [ $CROSS -a $CROSS != $ARCH ]; then
hostname -f > "$BUILDPLACE/etc/mailname"
else
echo "emdebian-$ARCH" > "$BUILDPLACE/etc/mailname"
fi
if [ ! -f "$BUILDPLACE/etc/apt/apt.conf.d/10disablerecommends" ]; then
disable_apt_recommends
fi
fi
copy_local_configuration
mountproc
mkdir -p "$BUILDPLACE/tmp/buildd"
chmod 1777 "$BUILDPLACE/tmp"
if [ "$OVERRIDE_APTLINES" = "yes" ]; then
installaptlines
fi
}
function autoclean_aptcache() {
if [ -n "$APTCACHE" ]; then
echo " -> Cleaning the cached apt archive"
chroot $BUILDPLACE /usr/bin/apt-get autoclean || true
find "$APTCACHE/" -maxdepth 1 -name \*.deb | \
while read A; do
if [ ! -f "$BUILDPLACE/var/cache/apt/archives/"$(basename "$A") -a \
-f "$A" ]; then
echo " -> obsolete cache content "$(basename "$A")" removed"
rm -f "$A" || true
fi
done
fi
}
# intended only for chroots
function copy_host_configuration () {
echo " -> copying local configuration"
if [ $CROSS -a $CROSS != $ARCH ]; then
for a in hosts hostname resolv.conf; do
sudo rm -f "$BUILDPLACE/etc/$a"
if [ ! -f "/etc/$a" ]; then
echo "E: /etc/$a does not exist, your setup is insane. fix it" >&2
sudo cp $( readlink -f "/etc/$a" ) "$BUILDPLACE/etc/$a";
fi
done
else
# sandboxes need a different hostname
mkdir -p "$BUILDPLACE"/etc/
cat > "$BUILDPLACE"/etc/hostname << EOF
emdebian-$ARCH
EOF
fi
}
function createemchroot()
{
if [ $SUITE == testing ]; then
BASETGZ="${WORKDIR}/emdebian-testing.tgz"
SUITE=testing
. /usr/share/emdebian-tools/embootstrap --arch $ARCH testing
echo "Creating an embootstrap testing chroot"
else
BASETGZ="$WORKDIR/emdebian.tgz"
. /usr/share/emdebian-tools/embootstrap --arch $ARCH
fi
}
function checkembuilddep () {
# call satisfydepends
local BUILDOPT="--binary-all"
case "${BINARY_ARCH}" in
yes) BUILDOPT="--binary-arch";;
*) ;;
esac
PBUILDERSATISFYDEPENDSCMD=/usr/lib/pbuilder/pbuilder-satisfydepends
CONTROL=$BUILDPLACE/trunk/$SVN/debian/control
# this version parses debian/control, NOT the .dsc
# so that when Emdebian removes dependencies, the chroot does too.
echo "Running: $PBUILDERSATISFYDEPENDSCMD --control $CONTROL --chroot $BUILDPLACE ${BUILDOPT}"
if "$PBUILDERSATISFYDEPENDSCMD" --control "$CONTROL" --chroot "${BUILDPLACE}" "${BUILDOPT}" ; then
echo " -> installed ${HOST_ARCH} dependencies."
else
echo "E: pbuilder-satisfydepends failed." >&2
exit 2
fi
# install extra packages to the chroot
if [ -n "$EXTRAPACKAGES" ]; then
if echo "DEBIAN_FRONTEND=noninteractive usr/bin/apt-get -y --force-yes install ${EXTRAPACKAGES}" | chroot $BUILDPLACE /bin/sh; then
:
else
# if apt failed (maybe update needs to be run), save so far and exit cleanly
save_aptcache
umountproc
cleanbuildplace
exit 1;
fi
fi
}
# get $ARCH .deb and put into /var/cache/apt/archives to
# allow these to be saved between builds.
function save_aptcrosscache() {
# save the current aptcache archive
# it is safe to call this function several times.
local doit
if [ -n "$APTCACHE" ]; then
echo "Copying back the cached apt-cross archive contents"
mkdir -p "$APTCACHE" ;
if [ "$APTCACHEHARDLINK" = "yes" ]; then
doit=ln
else
doit=cp
fi
# apt-cross puts the archives in the chroot /
find "$BUILDPLACE/" -maxdepth 1 -name \*.deb | \
while read A ;do
if [ ! -f "$APTCACHE/"$(basename "$A") -a -f "$A" ]; then
echo " -> new cache content "$(basename "$A")" added"
$doit "$A" "$APTCACHE/" || true
fi
done
fi
}
function get_aptcross_dir ()
{
if [ -z "$HOME" -o ! -d $HOME ]; then
HOME="/tmp";
fi
path="$HOME/.apt-cross";
if [ ! -d $path ]; then
mkdir $path;
fi
}
function get_primary ()
{
get_aptcross_dir
if [ -f "$path/emsource.conf" ]; then
PRIMARY=`grep primary $path/emsource.conf|cut -d: -f2|tr -d ' '`
else
if [ -f "/etc/emsource.conf" ]; then
PRIMARY=`grep primary /etc/emsource.conf|cut -d: -f2|tr -d ' '`
else
PRIMARY="ftp.uk.debian.org"
fi
fi
}