2007-10-04 06:24:29 +02:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
FORCE="n"
|
|
|
|
RUN=""
|
|
|
|
MAKEPKG_ARGS="-Ss"
|
|
|
|
|
|
|
|
chrootdir="$CHROOT_SHELL"
|
|
|
|
|
|
|
|
APPNAME=$(basename "${0}")
|
|
|
|
|
|
|
|
if [ ! -f PKGBUILD ]; then
|
|
|
|
echo "This must be run in the directory of a built package."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
source PKGBUILD
|
|
|
|
|
|
|
|
if [ "$EUID" != "0" ]; then
|
|
|
|
echo "This script must be run as root."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
usage ()
|
|
|
|
{
|
|
|
|
echo "usage ${APPNAME} [-h] [-c CHROOT_SHELL] [makepkg args]"
|
|
|
|
echo " Run this script in a PKGBUILD dir to build a package inside a"
|
|
|
|
echo " clean chroot. All unrecognized arguments passed to this script"
|
|
|
|
echo " will be passed to makepkg."
|
|
|
|
echo ""
|
|
|
|
echo "The \$CHROOT_SHELL environment variable is used to determine where"
|
|
|
|
echo " your chroot shell is. The shell consists of the following"
|
|
|
|
echo " directories: \$CHROOT_SHELL/{root, rw, union} but only 'root' is"
|
|
|
|
echo " required by default. The rest will be created as needed"
|
|
|
|
echo ""
|
|
|
|
echo "The chroot shell 'root' directory must be created via the following"
|
|
|
|
echo "command:"
|
2007-10-07 19:31:22 +02:00
|
|
|
echo " mkarchroot \$CHROOT_SHELL base base-devel sudo"
|
2007-10-04 06:24:29 +02:00
|
|
|
echo ""
|
|
|
|
echo "Default makepkg args: $MAKEPKG_ARGS"
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
while getopts 'c:h' arg; do
|
|
|
|
case "${arg}" in
|
|
|
|
c) chrootdir="$OPTARG" ;;
|
|
|
|
h|?) usage ;;
|
|
|
|
*) MAKEPKG_ARGS="$MAKEPKG_ARGS -$arg $OPTARG" ;;
|
|
|
|
esac
|
|
|
|
done
|
|
|
|
|
|
|
|
if [ ! -d "$chrootdir" ]; then
|
|
|
|
echo "No \$CHROOT_SHELL defined, or invalid path"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ ! -d "$chrootdir/root" ]; then
|
|
|
|
echo "Missing \$CHROOT_SHELL root directory."
|
2007-10-07 19:31:22 +02:00
|
|
|
echo "Try using: mkarchroot \$CHROOT_SHELL base base-devel sudo"
|
|
|
|
usage
|
2007-10-04 06:24:29 +02:00
|
|
|
fi
|
|
|
|
|
|
|
|
[ -d "$chrootdir/rw" ] || mkdir "$chrootdir/rw"
|
|
|
|
[ -d "$chrootdir/union" ] || mkdir "$chrootdir/union"
|
|
|
|
|
|
|
|
function cleanup ()
|
|
|
|
{
|
|
|
|
echo "cleaning up unioned mounts"
|
|
|
|
umount "$chrootdir/union"
|
|
|
|
}
|
|
|
|
|
|
|
|
uniondir="$chrootdir/union"
|
|
|
|
echo "building union chroot"
|
|
|
|
modprobe -q unionfs
|
|
|
|
mount -t unionfs none -o "dirs=$chrootdir/rw=rw:$chrootdir/root=ro" "$uniondir"
|
|
|
|
trap 'cleanup' 1 2 15
|
|
|
|
|
|
|
|
echo "moving build files to chroot"
|
|
|
|
[ -d "$uniondir/build" ] || mkdir "$uniondir/build"
|
|
|
|
|
2007-10-07 19:31:22 +02:00
|
|
|
source PKGBUILD
|
|
|
|
cp PKGBUILD "$uniondir/build/"
|
|
|
|
for f in ${source[@]}; do
|
|
|
|
if [ -f "$f" ]; then
|
|
|
|
cp "$f" "$uniondir/build/"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
|
|
|
|
if ! grep "^nobody" "$uniondir/etc/sudoers" >/dev/null 2>&1; then
|
|
|
|
echo "allowing 'nobody' sudo rights in the chroot"
|
|
|
|
echo "nobody ALL=(ALL) NOPASSWD: ALL" >> $uniondir/etc/sudoers
|
|
|
|
fi
|
|
|
|
|
|
|
|
#This is a little gross, but this way the script is recreated every time in the
|
|
|
|
#rw portion of the union
|
|
|
|
(cat <<EOF
|
|
|
|
#!/bin/bash
|
|
|
|
export LANG=$LOCALE
|
2007-10-04 06:24:29 +02:00
|
|
|
cd /build
|
2007-10-07 19:31:22 +02:00
|
|
|
sudo -u nobody makepkg "$MAKEPKG_ARGS"
|
2007-10-04 06:24:29 +02:00
|
|
|
EOF
|
|
|
|
) > "$uniondir/chrootbuild"
|
|
|
|
chmod +x "$uniondir/chrootbuild"
|
|
|
|
|
|
|
|
./mkarchroot -r "/chrootbuild" "$uniondir"
|
|
|
|
|
|
|
|
# TODO move relevant files here
|
|
|
|
echo "build complete... check \$CHROOT_SHELL/build for build results"
|