blob: 207782398887ddaf009a27544d762da7cf012889 (
plain)
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
|
#!/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:"
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"
trap 'cleanup' 1 2 15
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
cd /build
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"
|