diff options
-rwxr-xr-x | makechrootpkg | 92 | ||||
-rwxr-xr-x | mkarchroot | 22 |
2 files changed, 107 insertions, 7 deletions
diff --git a/makechrootpkg b/makechrootpkg new file mode 100755 index 0000000..e7d772c --- /dev/null +++ b/makechrootpkg @@ -0,0 +1,92 @@ +#!/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" + 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" + exit 1 +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" + +( +cat <<EOF +#!/bin/sh +su nobody +cd /build +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" @@ -1,14 +1,17 @@ #!/bin/sh FORCE="n" -BZIP2="" -GZIP="" RUN="" working_dir="" APPNAME=$(basename "${0}") +if [ "$EUID" != "0" ]; then + echo "This script must be run as root." + exit 1 +fi + usage () { echo "usage ${APPNAME} [options] working-dir package [package [package..]]" @@ -20,9 +23,8 @@ usage () } while getopts 'r:fh' arg; do - echo "getopts $arg" case "${arg}" in - r) echo "run=>$OPTARG"; RUN="$OPTARG" ;; + r) RUN="$OPTARG" ;; f) FORCE="y" ;; h|?) usage ;; *) echo "invalid argument '${arg}'"; usage ;; @@ -30,7 +32,13 @@ while getopts 'r:fh' arg; do done shift $(($OPTIND - 1)) -[ $# -lt 1 ] && echo "missing arguments" && usage +if [ "$RUN" == "" -a $# -lt 2 ]; then + echo "you must specify a directory and one or more packages" + usage +elif [ $# -lt 1 ]; then + echo "you must specify a directory" + usage +fi working_dir="$(readlink -f ${1})" shift 1 @@ -86,8 +94,8 @@ if [ "$RUN" != "" ]; then chroot_mount - echo "starting chroot (using \$SHELL)" - chroot "${working_dir}" "${SHELL}" + echo "starting chroot ($RUN)" + chroot "${working_dir}" "${RUN}" # }}} else |