2011-06-22 07:50:36 +00:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# polystrap - create a foreign architecture rootfs using multistrap, fakeroot,
|
|
|
|
# fakechroot and qemu usermode emulation
|
|
|
|
#
|
|
|
|
# Copyright (C) 2011 by Johannes 'josch' Schauer <j.schauer@email.de>
|
|
|
|
#
|
|
|
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
# of this software and associated documentation files (the "Software"), to deal
|
|
|
|
# in the Software without restriction, including without limitation the rights
|
|
|
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
# copies of the Software, and to permit persons to whom the Software is
|
|
|
|
# furnished to do so, subject to the following conditions:
|
|
|
|
#
|
|
|
|
# The above copyright notice and this permission notice shall be included in
|
|
|
|
# all copies or substantial portions of the Software.
|
|
|
|
#
|
|
|
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
# FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
|
|
# IN THE SOFTWARE.
|
|
|
|
|
2011-06-29 09:03:43 +00:00
|
|
|
set -e
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
usage() {
|
2011-06-30 06:52:44 +00:00
|
|
|
echo "Usage: $0: [-n] [-s suite] [-a arch] [-d directory] [-m mirror] [-p packages] platform\n" >&2
|
2011-06-22 07:50:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
export DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C
|
2011-06-29 08:47:48 +00:00
|
|
|
export PATH=$PATH:/usr/sbin:/sbin
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
if [ "$FAKEROOTKEY" = "" ]; then
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: re-executing script inside fakeroot"
|
2011-06-30 06:49:28 +00:00
|
|
|
fakeroot "$0" "$@";
|
|
|
|
exit
|
2011-06-22 07:50:36 +00:00
|
|
|
fi
|
|
|
|
|
2011-06-30 06:52:44 +00:00
|
|
|
MSTRAP_SIM=
|
|
|
|
while getopts s:a:d:m:p:n opt; do
|
2011-06-22 07:50:36 +00:00
|
|
|
case $opt in
|
|
|
|
s) _SUITE="$OPTARG";;
|
|
|
|
a) _ARCH="$OPTARG";;
|
|
|
|
d) _ROOTDIR="$OPTARG";;
|
|
|
|
m) _MIRROR="$OPTARG";;
|
|
|
|
p) _PACKAGES="$OPTARG";;
|
2011-06-30 06:52:44 +00:00
|
|
|
n) MSTRAP_SIM="--simulate";;
|
2011-06-22 07:50:36 +00:00
|
|
|
?) usage; exit 1;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
shift $(($OPTIND - 1))
|
|
|
|
|
2011-06-29 08:45:57 +00:00
|
|
|
[ "$#" -ne 1 ] && { echo "too many positional arguments" >&2; usage; exit 1; }
|
2011-06-22 07:50:36 +00:00
|
|
|
|
2011-07-17 11:48:06 +00:00
|
|
|
BOARD="$1"
|
2011-06-22 07:50:36 +00:00
|
|
|
|
2011-07-17 11:48:06 +00:00
|
|
|
[ ! -r "$BOARD" ] && { echo "cannot find target directory: $BOARD" >&2; exit 1; }
|
|
|
|
[ ! -r "$BOARD/multistrap.conf" ] && { echo "cannot read multistrap config: $BOARD/multistrap.conf" >&2; exit 1; }
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
# source default options
|
|
|
|
. "default/config"
|
|
|
|
|
|
|
|
# overwrite default options by target options
|
2011-07-17 11:48:06 +00:00
|
|
|
[ -r "$BOARD/config" ] && . "$BOARD/config"
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
# overwrite target options by commandline options
|
|
|
|
SUITE=${_SUITE:-$SUITE}
|
|
|
|
ARCH=${_ARCH:-$ARCH}
|
|
|
|
ROOTDIR=${_ROOTDIR:-$ROOTDIR}
|
|
|
|
MIRROR=${_MIRROR:-$MIRROR}
|
|
|
|
|
2011-07-17 11:48:06 +00:00
|
|
|
if [ "$_PACKAGES" = "" ] && [ -r "$BOARD/packages" ]; then
|
2011-06-22 07:50:36 +00:00
|
|
|
# if no packages were given by commandline, read from package files
|
2011-07-17 11:48:06 +00:00
|
|
|
for f in $BOARD/packages/*; do
|
2011-06-22 07:50:36 +00:00
|
|
|
while read line; do PACKAGES="$PACKAGES $line"; done < "$f"
|
|
|
|
done
|
|
|
|
else
|
|
|
|
# otherwise set as given by commandline
|
|
|
|
PACKAGES="$_PACKAGES"
|
|
|
|
fi
|
|
|
|
|
|
|
|
# binutils must always be installed for objdump for fake ldd
|
|
|
|
PACKAGES="$PACKAGES binutils"
|
|
|
|
|
2011-10-18 14:34:59 +00:00
|
|
|
export QEMU_LD_PREFIX="`readlink -m "$ROOTDIR"`"
|
|
|
|
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: --------------------------"
|
|
|
|
echo "I: suite: $SUITE"
|
|
|
|
echo "I: arch: $ARCH"
|
|
|
|
echo "I: rootdir: $ROOTDIR"
|
|
|
|
echo "I: mirror: $MIRROR"
|
|
|
|
echo "I: pkgs: $PACKAGES"
|
|
|
|
echo "I: --------------------------"
|
2011-06-22 07:50:36 +00:00
|
|
|
|
2011-06-29 08:45:57 +00:00
|
|
|
[ -e "$ROOTDIR.tar" ] && { echo "tarball still exists" >&2; exit 1; }
|
2011-10-18 13:25:46 +00:00
|
|
|
[ -e "$ROOTDIR" ] && { echo "root directory $ROOTDIR still exists" >&2; exit 1; }
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
# create multistrap.conf
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: create multistrap.conf"
|
2011-06-24 22:07:21 +00:00
|
|
|
MULTISTRAPCONF=`tempfile -d . -p multistrap`
|
|
|
|
echo -n > "$MULTISTRAPCONF"
|
2011-06-22 07:50:36 +00:00
|
|
|
while read line; do
|
2011-06-30 06:49:28 +00:00
|
|
|
eval echo $line >> "$MULTISTRAPCONF"
|
2011-07-17 11:48:06 +00:00
|
|
|
done < $BOARD/multistrap.conf
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
# download and extract packages
|
2011-06-29 09:03:43 +00:00
|
|
|
echo "I: run multistrap" >&2
|
2011-06-30 06:52:44 +00:00
|
|
|
multistrap $MSTRAP_SIM -f "$MULTISTRAPCONF"
|
|
|
|
[ -z "$MSTRAP_SIM" ] || exit 0
|
|
|
|
|
2011-06-24 22:07:21 +00:00
|
|
|
rm -f "$MULTISTRAPCONF"
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
# backup ldconfig and ldd
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: backup ldconfig and ldd"
|
2011-06-22 07:50:36 +00:00
|
|
|
mv $ROOTDIR/sbin/ldconfig $ROOTDIR/sbin/ldconfig.REAL
|
|
|
|
mv $ROOTDIR/usr/bin/ldd $ROOTDIR/usr/bin/ldd.REAL
|
|
|
|
|
|
|
|
# copy initial directory tree - dereference symlinks
|
2011-07-17 11:48:06 +00:00
|
|
|
echo "I: copy initial directory root tree $BOARD/root/ to $ROOTDIR/"
|
|
|
|
if [ -r "$BOARD/root" ]; then
|
|
|
|
cp --recursive --dereference $BOARD/root/* $ROOTDIR/
|
2011-06-22 08:38:04 +00:00
|
|
|
fi
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
# preseed debconf
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: preseed debconf"
|
2011-07-17 11:48:06 +00:00
|
|
|
if [ -r "$BOARD/debconfseed.txt" ]; then
|
|
|
|
cp "$BOARD/debconfseed.txt" $ROOTDIR/tmp/
|
2011-06-22 07:50:36 +00:00
|
|
|
fakechroot chroot $ROOTDIR debconf-set-selections /tmp/debconfseed.txt
|
|
|
|
rm $ROOTDIR/tmp/debconfseed.txt
|
|
|
|
fi
|
|
|
|
|
|
|
|
# run preinst scripts
|
|
|
|
for script in $ROOTDIR/var/lib/dpkg/info/*.preinst; do
|
2011-06-30 06:49:28 +00:00
|
|
|
[ "$script" = "$ROOTDIR/var/lib/dpkg/info/bash.preinst" ] && continue
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: run preinst script ${script##$ROOTDIR}"
|
2011-06-30 06:49:28 +00:00
|
|
|
fakechroot chroot $ROOTDIR ${script##$ROOTDIR} install
|
2011-06-22 07:50:36 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
# run dpkg --configure -a twice because of errors during the first run
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: configure packages"
|
2011-06-22 07:50:36 +00:00
|
|
|
fakechroot chroot $ROOTDIR /usr/bin/dpkg --configure -a || fakechroot chroot $ROOTDIR /usr/bin/dpkg --configure -a
|
|
|
|
|
|
|
|
# source hooks
|
2011-07-17 11:48:06 +00:00
|
|
|
if [ -r "$BOARD/hooks" ]; then
|
|
|
|
for f in $BOARD/hooks/*; do
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: run hook $f"
|
2011-06-22 08:38:04 +00:00
|
|
|
. $f
|
|
|
|
done
|
|
|
|
fi
|
2011-06-22 07:50:36 +00:00
|
|
|
|
|
|
|
#cleanup
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: cleanup"
|
2011-06-22 07:50:36 +00:00
|
|
|
rm $ROOTDIR/sbin/ldconfig $ROOTDIR/usr/bin/ldd
|
|
|
|
mv $ROOTDIR/sbin/ldconfig.REAL $ROOTDIR/sbin/ldconfig
|
|
|
|
mv $ROOTDIR/usr/bin/ldd.REAL $ROOTDIR/usr/bin/ldd
|
|
|
|
rm $ROOTDIR/usr/sbin/policy-rc.d
|
|
|
|
|
|
|
|
# need to generate tar inside fakechroot so that absolute symlinks are correct
|
|
|
|
# tar is clever enough to not try and put the archive inside itself
|
2011-07-03 07:41:01 +00:00
|
|
|
echo "I: create tarball $ROOTDIR.tar"
|
2011-06-22 07:50:36 +00:00
|
|
|
fakechroot chroot $ROOTDIR tar -cf $ROOTDIR.tar -C / .
|
|
|
|
mv $ROOTDIR/$ROOTDIR.tar .
|