Newer
Older
# 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; version 2 of the License.
#
# 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.
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
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:"
echo " mkarchroot \$CHROOT_SHELL base base-devel sudo"
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."
echo "Try using: mkarchroot \$CHROOT_SHELL base base-devel sudo"
usage
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"
echo "moving build files to chroot"
[ -d "$uniondir/build" ] || mkdir "$uniondir/build"
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
sudo -u nobody makepkg "$MAKEPKG_ARGS"
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"