summaryrefslogtreecommitdiff
path: root/src/chroot-tools
diff options
context:
space:
mode:
authorLuke Shumaker <LukeShu@sbcglobal.net>2013-08-25 14:18:14 -0400
committerLuke Shumaker <LukeShu@sbcglobal.net>2013-09-11 15:43:30 -0400
commitf3030244f64699021ec0d9cd9e4b4d67244d9df1 (patch)
tree2a2ed877b15799cbc33111528e286e6796c45e78 /src/chroot-tools
parentdabf1a9cf520d725f8eb767bb0112990f99fde05 (diff)
Make common-devtools.mk unnecessary. Move devtools chroot stuff into chroot-tools
Diffstat (limited to 'src/chroot-tools')
-rw-r--r--src/chroot-tools/.gitignore3
-rw-r--r--src/chroot-tools/Makefile34
-rw-r--r--src/chroot-tools/makechrootpkg.sh.patch275
3 files changed, 310 insertions, 2 deletions
diff --git a/src/chroot-tools/.gitignore b/src/chroot-tools/.gitignore
new file mode 100644
index 0000000..fbb07f7
--- /dev/null
+++ b/src/chroot-tools/.gitignore
@@ -0,0 +1,3 @@
+makechrootpkg.sh*
+!makechrootpkg.sh.patch
+archroot* \ No newline at end of file
diff --git a/src/chroot-tools/Makefile b/src/chroot-tools/Makefile
index 27030e3..7f6a7ea 100644
--- a/src/chroot-tools/Makefile
+++ b/src/chroot-tools/Makefile
@@ -1,3 +1,33 @@
-libre_execdir=$(sbindir)
-libre_confdir=$(sysconfdir)/libretools.d
+# The makechrootpkg flow is:
+# $(devtoolsdir)/*.in -> *.sh.in + *.sh.patch -> *.sh.ugly -> *.sh
+
+copy_files = makechrootpkg.sh.in archroot.in
+libs = makechrootpkg.sh
+progs = archroot
+clean_files = makechrootpkg.sh.ugly* *~
include ../../common.mk
+
+# Copy ###############################################################
+
+makechrootpkg.sh.in: %.sh.in: $(devtoolsdir)/%.in
+ cp $< $@
+
+archroot.in: $(devtoolsdir)/mkarchroot.in
+ cp $< $@
+
+# Build ##############################################################
+
+makechrootpkg.sh.ugly: %.ugly: %.in %.patch Makefile
+ @echo "GEN $@"
+ @cp $*.in $@
+ @patch $@ $*.patch || { rm -f -- '$@'; false; }
+
+makechrootpkg.sh: %: %.ugly Makefile
+ @echo "GEN $@"
+ @$(edit) <"$<" >"$@" || { rm -f -- '$@'; false; }
+ $(call indent,$@) || { rm -f -- '$@'; false; }
+
+archroot: %: %.in Makefile
+ @echo "GEN $@"
+ @$(edit) <"$<" >"$@" || { rm -f -- '$@'; false; }
+ @chmod 755 "$@" || { rm -f -- '$@'; false; }
diff --git a/src/chroot-tools/makechrootpkg.sh.patch b/src/chroot-tools/makechrootpkg.sh.patch
new file mode 100644
index 0000000..505b96a
--- /dev/null
+++ b/src/chroot-tools/makechrootpkg.sh.patch
@@ -0,0 +1,275 @@
+--- makechrootpkg.sh.in
++++ makechrootpkg.sh.ugly
+@@ -12,12 +12,7 @@
+
+ shopt -s nullglob
+
+-# So that usage conflicts between upstream and -par mkarchroot don't get hidden
+-# silently in a merge.
+-archroot() {
+- mkarchroot "$@"
+-}
+-
++init_variables() {
+ makepkg_args='-s --noconfirm -L'
+ repack=false
+ update_first=false
+@@ -28,13 +23,14 @@
+ temp_chroot=false
+ chrootdir=
+ passeddir=
+-declare -a install_pkgs
+-declare -i ret=0
++declare -ag install_pkgs
++declare -ig ret=0
+
+ copy=$USER
+ [[ -n $SUDO_USER ]] && copy=$SUDO_USER
+ [[ -z "$copy" || $copy = root ]] && copy=copy
+ src_owner=${SUDO_USER:-$USER}
++}
+
+ usage() {
+ echo "Usage: ${0##*/} [options] -r <chrootdir> [--] [makepkg args]"
+@@ -69,6 +65,7 @@
+ exit 1
+ }
+
++parse_options_init() {
+ while getopts 'hcudr:I:l:nT' arg; do
+ case "$arg" in
+ h) usage ;;
+@@ -129,8 +126,20 @@
+ # Note this is the same FD number as in mkarchroot
+ lock_open_write 9 "$copydir" \
+ "Waiting for existing lock on chroot copy to be released: [$copy]"
++}
++
++# Usage: chroot_sync $CHROOTDIR/$CHROOT [$CHROOTCOPY|$copydir]
++chroot_sync() {
++ local chrootdir=$1
++ local copy=$2
++ local copydir=''
++ if [[ ${copy:0:1} = / ]]; then
++ copydir=$copy
++ else
++ copydir="$chrootdir/$copy"
++ fi
++ local chroottype=$(stat -f -c %T "$chrootdir")
+
+-if [[ ! -d $copydir ]] || $clean_first; then
+ # Get a read lock on the root chroot to make
+ # sure we don't clone a half-updated chroot
+ lock_open_read 8 "$chrootdir/root" \
+@@ -152,9 +161,16 @@
+
+ # Drop the read lock again
+ lock_close 8
+-fi
++}
++
++# Usage: chroot_install_pkgs $copydir $pkgs...
++chroot_install_pkgs() {
++ local copydir=$1
++ shift
++ declare -i ret=0
++ declare -a install_pkgs=("$@")
++ local pkgname
+
+-if [[ -n "${install_pkgs[*]}" ]]; then
+ for install_pkg in "${install_pkgs[@]}"; do
+ pkgname="${install_pkg##*/}"
+ cp "$install_pkg" "$copydir/$pkgname"
+@@ -165,10 +181,10 @@
+ rm "$copydir/$pkgname"
+ done
+
+- # If there is no PKGBUILD we have done
+- [[ -f PKGBUILD ]] || exit $ret
+-fi
++ return $ret
++}
+
++func1() {
+ $update_first && archroot -u "$copydir"
+
+ mkdir -p "$copydir/build"
+@@ -230,14 +246,24 @@
+ # Set target CARCH as it might be used within the PKGBUILD to select correct sources
+ eval $(grep '^CARCH=' "$copydir/etc/makepkg.conf")
+ export CARCH
++}
+
++# Usage: chroot_copy_in $copydir
++# Environment:
++# - In the dirctory of a PKGBUILD
++# - $SRCDEST is set
++chroot_copy_in() {
++local copydir=$1
+ # Copy PKGBUILD and sources
+-cp PKGBUILD "$copydir/build/"
++for recipe in PKGBUILD SRCBUILD; do
++if [[ -f $recipe ]]; then
++cp $recipe "$copydir/build/"
+ (
+- source PKGBUILD
+- for file in "${source[@]}"; do
++ source $recipe
++ for file in "${source[@]}" "${mksource[@]}"; do
+ file="${file%%::*}"
+ file="${file##*://*/}"
++ file="${file##*://}"
+ if [[ -f $file ]]; then
+ cp "$file" "$copydir/srcdest/"
+ elif [[ -f $SRCDEST/$file ]]; then
+@@ -251,18 +277,30 @@
+ # evaluate any bash variables used
+ eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\"
+ [[ -f $file ]] && cp "$file" "$copydir/build/"
+- done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
++ done < <(sed -n "s/^[[:space:]]*$i=//p" $recipe)
+ done
+ )
++fi
++done
+
+ chown -R nobody "$copydir"/{build,pkgdest,srcdest}
++}
+
++# Usage: chroot_let_nobody_use_pacman $copydir
++chroot_let_nobody_use_pacman() {
++local copydir=$1
+ cat > "$copydir/etc/sudoers.d/nobody-pacman" <<EOF
+ Defaults env_keep += "HOME"
+ nobody ALL = NOPASSWD: /usr/bin/pacman
+ EOF
+ chmod 440 "$copydir/etc/sudoers.d/nobody-pacman"
++}
+
++# Usage: chroot_build $copydir $makepkg_args $run_namcap
++chroot_build() {
++local copydir=$1
++local makepkg_args=$2
++local run_namcap=$3
+ # This is a little gross, but this way the script is recreated every time in the
+ # working copy
+ cat >"$copydir/chrootbuild" <<EOF
+@@ -284,37 +322,62 @@
+ exit 0
+ EOF
+ chmod +x "$copydir/chrootbuild"
++archroot -r "$copydir" "/chrootbuild"
++}
+
+-if archroot -r "$copydir" "/chrootbuild"; then
++# Usage: chroot_add_to_local_repo $copydir $pkgfiles...
++chroot_add_to_local_repo() {
++ local copydir=$1; shift
+ mkdir -p "$copydir/repo"
+- for pkgfile in "$copydir"/pkgdest/*.pkg.tar.?z; do
+- if $add_to_db; then
++ for pkgfile in "$@"; do
+ cp "$pkgfile" "$copydir/repo"
+ pushd "$copydir/repo" >/dev/null
+ repo-add repo.db.tar.gz "${pkgfile##*/}"
+ popd >/dev/null
+- fi
++ done
++}
+
++# Usage: chroot_copy_out_pkgs $copydir $user
++# Environment:
++# - $PKGDEST is set
++chroot_copy_out_pkgs() {
++ local copydir=$1
++ local src_owner=$2
++ for pkgfile in "$copydir"/pkgdest/*.pkg.tar*; do
+ chown "$src_owner" "$pkgfile"
+ mv "$pkgfile" "$PKGDEST"
++ if [[ $PKGDEST != . ]]; then
++ ln -sf "$PKGDEST/${pkgfile##*/}" .
++ fi
+ done
++}
+
+- for l in "$copydir"/build/*-{build,check,namcap,package,package_*}.log; do
++# Usage: chroot_copy_out_pkgs $copydir $user
++chroot_copy_out_logs() {
++ local copydir=$1
++ local src_owner=$2
++ for l in "$copydir"/build/*.log; do
+ chown "$src_owner" "$l"
+ [[ -f $l ]] && mv "$l" .
+ done
+-else
+- # Just in case. We returned 1, make sure we fail
+- ret=1
+-fi
++}
+
++# Usage: chroot_copy_out_srcs $copydir $user
++# Environment:
++# - $SRCDEST is set
++chroot_copy_out_srcs() {
++local copydir=$1
++local src_owner=$2
+ for f in "$copydir"/srcdest/*; do
+ chown "$src_owner" "$f"
+ mv "$f" "$SRCDEST"
+ done
++}
+
+-if $temp_chroot; then
+- stat_busy "Removing temporary directoy [$copy]"
++# Usage: chroot_delete $copydir
++chroot_delete() {
++ local chroottype=$(stat -f -c %T "$copydir")
++ stat_busy "Removing chroot copy [$copydir]"
+ if [[ "$chroottype" == btrfs ]]; then
+ btrfs subvolume delete "$copydir" >/dev/null ||
+ die "Unable to delete subvolume $copydir"
+@@ -326,8 +389,39 @@
+ # remove lock file
+ rm --force "$copydir.lock"
+ stat_done
+-elif (( ret != 0 )); then
+- die "Build failed, check $copydir/build"
+-else
+- true
+-fi
++}
++
++main() {
++ init_variables
++ parse_options_init "$@"
++ if [[ ! -d $copydir ]] || $clean_first; then
++ chroot_sync "$chrootdir" "$copy"
++ fi
++ if [[ -n "${install_pkgs[*]}" ]]; then
++ chroot_install_pkgs "$copydir" "${install_pkgs[@]}"
++ ret=$?
++ # If there is no PKGBUILD we have done
++ [[ -f PKGBUILD ]] || exit $ret
++ fi
++ func1
++ chroot_copy_in "$copydir"
++ chroot_let_nobody_use_pacman "$copydir"
++ chroot_build "$copydir" "$makepkg_args" "$run_namcap"
++ func2
++ if chroot_build; then
++ chroot_add_to_local_repo "$copydir" "$copydir"/pkgdest/*.pkg.tar*
++ chroot_copy_out_pkgs "$copydir" "$src_owner"
++ chroot_copy_out_logs "$copydir" "$src_owner"
++ else
++ # Just in case. We returned 1, make sure we fail
++ ret=1
++ fi
++ chroot_copy_out_srcs "$copydir" "$src_owner"
++ if $temp_chroot; then
++ chroot_delete "$copydir"
++ elif (( ret != 0 )); then
++ die "Build failed, check $copydir/build"
++ else
++ true
++ fi
++}