summaryrefslogtreecommitdiff
path: root/src/chroot-tools
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@lukeshu.com>2017-02-15 18:55:25 -0500
committerLuke Shumaker <lukeshu@lukeshu.com>2017-04-11 13:02:27 -0400
commit74067d389c204cd40906980391680724380667c0 (patch)
tree654f7aaed07e8fe019893337256929db87a017a1 /src/chroot-tools
parent2e798795833af72ba0618f5577f15488b201b0fa (diff)
Expect devtools files to already be patched.
Diffstat (limited to 'src/chroot-tools')
-rw-r--r--src/chroot-tools/.gitignore1
-rw-r--r--src/chroot-tools/Makefile6
-rw-r--r--src/chroot-tools/arch-nspawn.patch71
-rw-r--r--src/chroot-tools/makechrootpkg.sh.patch344
-rw-r--r--src/chroot-tools/mkarchroot.patch67
5 files changed, 4 insertions, 485 deletions
diff --git a/src/chroot-tools/.gitignore b/src/chroot-tools/.gitignore
index f0969c7..8054d28 100644
--- a/src/chroot-tools/.gitignore
+++ b/src/chroot-tools/.gitignore
@@ -1,4 +1,5 @@
makechrootpkg.sh*
+makechrootpkg.in
arch-nspawn*
mkarchroot*
!*.patch
diff --git a/src/chroot-tools/Makefile b/src/chroot-tools/Makefile
index 93655d7..055b40e 100644
--- a/src/chroot-tools/Makefile
+++ b/src/chroot-tools/Makefile
@@ -3,14 +3,14 @@ include $(topsrcdir)/build-aux/Makefile.head.mk
pkglibexecdir = $(libexecdir)/libretools/chroot
-libretools.src.devtools = makechrootpkg.sh.in mkarchroot.in arch-nspawn.in
+libretools.src.devtools = makechrootpkg.in mkarchroot.in arch-nspawn.in
libretools.out.bins = chcleanup librechroot libremakepkg
libretools.out.libexecs = arch-nspawn chcleanup distcc-tool indent mkarchroot
libretools.out.libs = $(libretools.src.sh) makechrootpkg.sh
files.out.int += chcleanup.lib
-$(srcdir)/makechrootpkg.sh.in: $(srcdir)/%.sh.in: $(devtoolsdir)/%.in
- cp $< $@
+$(srcdir)/makechrootpkg.sh.in: $(srcdir)/makechrootpkg.in
+ sed '/^\s*main "$$@"\s*$$/d' < $< > $@
$(outdir)/chcleanup: $(srcdir)/chcleanup.in $(outdir)/chcleanup.lib
m4 -I$(@D) -P $< | $(libretools.edit) | install -m755 /dev/stdin $@
diff --git a/src/chroot-tools/arch-nspawn.patch b/src/chroot-tools/arch-nspawn.patch
deleted file mode 100644
index dc4cb25..0000000
--- a/src/chroot-tools/arch-nspawn.patch
+++ /dev/null
@@ -1,71 +0,0 @@
---- arch-nspawn.in 2016-05-10 13:48:14.303797115 -0400
-+++ arch-nspawn.ugly 2016-05-10 13:48:23.296957958 -0400
-@@ -1,4 +1,6 @@
- #!/bin/bash
-+# License: GNU GPLv2
-+#
- # 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.
-@@ -14,6 +16,8 @@
-
- working_dir=''
-
-+files=()
-+
- usage() {
- echo "Usage: ${0##*/} [options] working-dir [systemd-nspawn arguments]"
- echo "A wrapper around systemd-nspawn. Provides support for pacman."
-@@ -22,17 +26,21 @@
- echo ' -C <file> Location of a pacman config file'
- echo ' -M <file> Location of a makepkg config file'
- echo ' -c <dir> Set pacman cache'
-+ echo ' -f <file> Copy file from the host to the chroot'
-+ echo ' -s Do not run setarch'
- echo ' -h This message'
- exit 1
- }
-
- orig_argv=("$@")
-
--while getopts 'hC:M:c:' arg; do
-+while getopts 'hC:M:c:f:s' arg; do
- case "$arg" in
- C) pac_conf="$OPTARG" ;;
- M) makepkg_conf="$OPTARG" ;;
- c) cache_dir="$OPTARG" ;;
-+ f) files+=("$OPTARG") ;;
-+ s) nosetarch=1 ;;
- h|?) usage ;;
- *) error "invalid argument '%s'" "$arg"; usage ;;
- esac
-@@ -78,6 +86,12 @@
- [[ -n $pac_conf ]] && cp $pac_conf "$working_dir/etc/pacman.conf"
- [[ -n $makepkg_conf ]] && cp $makepkg_conf "$working_dir/etc/makepkg.conf"
-
-+ local file
-+ for file in "${files[@]}"; do
-+ mkdir -p "$(dirname "$working_dir$file")"
-+ cp -T "$file" "$working_dir$file"
-+ done
-+
- sed -r "s|^#?\\s*CacheDir.+|CacheDir = $(echo -n ${cache_dirs[@]})|g" -i "$working_dir/etc/pacman.conf"
- }
- # }}}
-@@ -92,6 +106,7 @@
- fi
-
- build_mount_args
-+cache_dirs+=('/repo/')
- copy_hostconf
-
- eval $(grep '^CARCH=' "$working_dir/etc/makepkg.conf")
-@@ -99,6 +114,8 @@
- armv7h) CARCH=armv7l;;
- esac
-
-+[[ -z $nosetarch ]] || unset CARCH
-+
- exec ${CARCH:+setarch "$CARCH"} systemd-nspawn -q \
- -D "$working_dir" \
- --register=no \
diff --git a/src/chroot-tools/makechrootpkg.sh.patch b/src/chroot-tools/makechrootpkg.sh.patch
deleted file mode 100644
index 648f574..0000000
--- a/src/chroot-tools/makechrootpkg.sh.patch
+++ /dev/null
@@ -1,344 +0,0 @@
---- makechrootpkg.sh.in 2017-01-29 23:29:48.520332237 -0500
-+++ makechrootpkg.sh.ugly 2017-01-29 23:31:17.341897626 -0500
-@@ -1,4 +1,6 @@
- #!/bin/bash
-+# License: GNU GPLv2
-+#
- # 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.
-@@ -12,6 +14,7 @@
-
- shopt -s nullglob
-
-+init_variables() {
- default_makepkg_args=(-s --noconfirm -L --holdver)
- makepkg_args=("${default_makepkg_args[@]}")
- repack=false
-@@ -29,9 +32,10 @@
- bindmounts_rw=()
-
- copy=$USER
--[[ -n $SUDO_USER ]] && copy=$SUDO_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]"
-@@ -68,13 +72,21 @@
- }
-
- # {{{ functions
-+# Usage: load_vars $makepkg_conf
-+# Globals:
-+# - SRCDEST
-+# - SRCPKGDEST
-+# - PKGDEST
-+# - LOGDEST
-+# - MAKEFLAGS
-+# - PACKAGER
- load_vars() {
- local makepkg_conf="$1" var
-
- [[ -f $makepkg_conf ]] || return 1
-
- for var in {SRC,SRCPKG,PKG,LOG}DEST MAKEFLAGS PACKAGER; do
-- [[ -z ${!var} ]] && eval $(grep "^${var}=" "$makepkg_conf")
-+ [[ -z ${!var:-} ]] && eval $(grep "^${var}=" "$makepkg_conf")
- done
-
- return 0
-@@ -135,16 +147,31 @@
- btrfs subvolume delete "$dir"
- }
-
--create_chroot() {
-- # Lock the chroot we want to use. We'll keep this lock until we exit.
-- lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
-+# Usage: sync_chroot $CHROOTDIR/$CHROOT <$CHROOTCOPY|$copydir>
-+sync_chroot() {
-+ local chrootdir=$1
-+ local copy=$2
-+ local copydir=''
-+ if [[ ${copy:0:1} = / ]]; then
-+ copydir=$copy
-+ else
-+ copydir="$chrootdir/$copy"
-+ fi
-+
-+ if [[ "$chrootdir/root" -ef "$copydir" ]]; then
-+ error 'Cannot sync copy with itself: %s' "$copydir"
-+ return 1
-+ fi
-+
-+ # Detect chrootdir filesystem type
-+ 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
-- slock 8 "$chrootdir/root.lock" "Locking clean chroot"
-+ slock 8 "$chrootdir/root.lock" \
-+ "Locking clean chroot [%s]" "$chrootdir/root"
-
-- stat_busy "Creating clean working copy [%s]" "$copy"
-+ stat_busy "Synchronizing chroot copy [%s] -> [%s]" "$chrootdir/root" "$copydir"
- if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
- if [[ -d $copydir ]]; then
- btrfs_subvolume_delete "$copydir" >/dev/null ||
-@@ -160,14 +187,18 @@
-
- # Drop the read lock again
- lock_close 8
-- fi
-
- # Update mtime
- touch "$copydir"
- }
-
--clean_temporary() {
-- stat_busy "Removing temporary copy [%s]" "$copy"
-+# Usage: delete_chroot $copydir
-+delete_chroot() {
-+ local copydir=$1
-+ # Detect chrootdir filesystem type
-+ local chroottype=$(stat -f -c %T "$copydir")
-+
-+ stat_busy "Removing chroot copy [%s]" "$copydir"
- if [[ "$chroottype" == btrfs ]] && ! mountpoint -q "$copydir"; then
- btrfs_subvolume_delete "$copydir" >/dev/null ||
- die "Unable to delete subvolume %s" "$copydir"
-@@ -182,9 +213,14 @@
- stat_done
- }
-
-+# Usage: install_packages $copydir $pkgs...
- install_packages() {
-+ local copydir=$1
-+ local install_pkgs=("${@:2}")
-+ declare -i ret=0
- local pkgname
-
-+ local install_pkg
- for install_pkg in "${install_pkgs[@]}"; do
- pkgname="${install_pkg##*/}"
- cp "$install_pkg" "$copydir/$pkgname"
-@@ -197,11 +233,19 @@
- rm "$copydir/$pkgname"
- done
-
-- # If there is no PKGBUILD we are done
-- [[ -f PKGBUILD ]] || exit $ret
-+ return $ret
- }
-
-+# Usage: prepare_chroot $copydir $HOME $repack $run_namcap
-+# Globals:
-+# - MAKEFLAGS
-+# - PACKAGER
- prepare_chroot() {
-+ local copydir=$1
-+ local USER_HOME=$2
-+ local repack=$3
-+ local run_namcap=$4
-+
- $repack || rm -rf "$copydir/build"
-
- mkdir -p "$copydir/build"
-@@ -248,12 +292,12 @@
- printf 'builduser:x:%d:100:builduser:/build:/bin/bash\n' "$builduser_uid" >>"$copydir/etc/passwd"
- chown -R "$builduser_uid" "$copydir"/{build,pkgdest,srcpkgdest,logdest,srcdest,startdir}
-
-- if [[ -n $MAKEFLAGS ]]; then
-+ if [[ -n ${MAKEFLAGS:-} ]]; then
- sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf"
- echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf"
- fi
-
-- if [[ -n $PACKAGER ]]; then
-+ if [[ -n ${PACKAGER:-} ]]; then
- sed -i '/^PACKAGER=/d' "$copydir/etc/makepkg.conf"
- echo "PACKAGER='${PACKAGER}'" >> "$copydir/etc/makepkg.conf"
- fi
-@@ -266,10 +310,25 @@
- chmod 440 "$copydir/etc/sudoers.d/builduser-pacman"
- fi
-
-+ if ! grep -q '^\[repo\]' "$copydir/etc/pacman.conf"; then
-+ local line=$(grep -n '^\[' "$copydir/etc/pacman.conf" |grep -Fv ':[options]'|sed 's/:.*//;1q')
-+ local ins='[repo]
-+SigLevel = Optional TrustAll
-+Server = file:///repo
-+'
-+ sed -i "${line}i${ins//$'\n'/\\n}" "$copydir/etc/pacman.conf"
-+ fi
-+
- # This is a little gross, but this way the script is recreated every time in the
- # working copy
- {
- printf '#!/bin/bash\n'
-+ declare -f _chrootprepare
-+ printf '_chrootprepare "$@"\n'
-+ } > "$copydir/chrootprepare"
-+ chmod +x "$copydir/chrootprepare"
-+ {
-+ printf '#!/bin/bash\n'
- declare -f _chrootbuild
- printf '_chrootbuild "$@" || exit\n'
-
-@@ -286,13 +345,19 @@
- chmod +x "$copydir/chrootbuild"
- }
-
-+# Usage: download_sources $copydir $src_owner
-+# Globals:
-+# - SRCDEST
- download_sources() {
-+ local copydir=$1
-+ local src_owner=$2
-+
- local builddir="$(mktemp -d)"
- chmod 1777 "$builddir"
-
- # Ensure sources are downloaded
-- if [[ -n $SUDO_USER ]]; then
-- sudo -u $SUDO_USER env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
-+ if [[ $USER != $src_owner ]]; then
-+ sudo -u $src_owner env SRCDEST="$SRCDEST" BUILDDIR="$builddir" \
- makepkg --config="$copydir/etc/makepkg.conf" --verifysource -o
- else
- ( export SRCDEST BUILDDIR="$builddir"
-@@ -302,10 +367,10 @@
- (( $? != 0 )) && die "Could not download sources."
-
- # Clean up garbage from verifysource
-- rm -rf $builddir
-+ rm -rf "$builddir"
- }
-
--_chrootbuild() {
-+_chrootprepare() {
- # This function isn't run in makechrootpkg,
- # so no global variables
-
-@@ -314,6 +379,7 @@
- shopt -s nullglob
-
- # XXX: Workaround makepkg disliking read-only dirs
-+ rm -rf -- /srcdest/* /startdir/*
- ln -sft /srcdest /srcdest_host/*
- ln -sft /startdir /startdir_host/*
-
-@@ -343,15 +409,42 @@
- exit 1
- fi
-
-- sudo -u builduser makepkg "$@"
-+ # Sync deps now, as networking may be disabled during _chrootbuild
-+ cp /repo/repo.db /var/lib/pacman/sync/repo.db
-+ sudo -u builduser makepkg "$@" --nobuild
-+}
-+
-+_chrootbuild() {
-+ # This function isn't run in makechrootpkg,
-+ # so no global variables
-+
-+ . /etc/profile
-+ export HOME=/build
-+ shopt -s nullglob
-+
-+ cd /startdir
-+
-+ sudo -u builduser makepkg "$@" --noextract --noprepare
- }
-
-+# Usage: move_products $copydir $owner
-+# Globals:
-+# - PKGDEST
-+# - LOGDEST
- move_products() {
-+ local copydir=$1
-+ local src_owner=$2
-+
-+ local pkgfile
- for pkgfile in "$copydir"/pkgdest/*; do
- chown "$src_owner" "$pkgfile"
- mv "$pkgfile" "$PKGDEST"
-+ if [[ $PKGDEST != $PWD ]]; then
-+ ln -sf "$PKGDEST/${pkgfile##*/}" .
-+ fi
- done
-
-+ local l
- for l in "$copydir"/logdest/*; do
- [[ $l == */logpipe.* ]] && continue
- chown "$src_owner" "$l"
-@@ -365,6 +458,9 @@
- }
- # }}}
-
-+main() {
-+init_variables
-+
- orig_argv=("$@")
-
- while getopts 'hcur:I:l:nTD:d:' arg; do
-@@ -430,30 +526,45 @@
- [[ -d $SRCPKGDEST ]] || SRCPKGDEST=$PWD
- [[ -d $LOGDEST ]] || LOGDEST=$PWD
-
--create_chroot
-+# Lock the chroot we want to use. We'll keep this lock until we exit.
-+lock 9 "$copydir.lock" "Locking chroot copy [%s]" "$copy"
-+
-+if [[ ! -d $copydir ]] || $clean_first; then
-+ sync_chroot "$chrootdir" "$copy"
-+fi
-
- $update_first && arch-nspawn "$copydir" \
- "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
- pacman -Syu --noconfirm
-
--[[ -n ${install_pkgs[*]} ]] && install_packages
-+if [[ -n ${install_pkgs[*]:-} ]]; then
-+ install_packages "$copydir" "${install_pkgs[@]}"
-+ ret=$?
-+ # If there is no PKGBUILD we have done
-+ [[ -f PKGBUILD ]] || exit $ret
-+fi
-
--download_sources
-+download_sources "$copydir" "$src_owner"
-
--prepare_chroot
-+prepare_chroot "$copydir" "$USER_HOME" "$repack"
-
- if arch-nspawn "$copydir" \
- --bind-ro="$PWD:/startdir_host" \
- --bind-ro="$SRCDEST:/srcdest_host" \
- "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
-+ /chrootprepare "${makepkg_args[@]}" &&
-+ arch-nspawn "$copydir" \
-+ --bind-ro="$PWD:/startdir_host" \
-+ --bind-ro="$SRCDEST:/srcdest_host" \
-+ "${bindmounts_ro[@]}" "${bindmounts_rw[@]}" \
- /chrootbuild "${makepkg_args[@]}"
- then
-- move_products
-+ move_products "$copydir" "$src_owner"
- else
- (( ret += 1 ))
- fi
-
--$temp_chroot && clean_temporary
-+$temp_chroot && delete_chroot "$copydir"
-
- if (( ret != 0 )); then
- if $temp_chroot; then
-@@ -464,3 +575,4 @@
- else
- true
- fi
-+}
diff --git a/src/chroot-tools/mkarchroot.patch b/src/chroot-tools/mkarchroot.patch
deleted file mode 100644
index 9fc7b39..0000000
--- a/src/chroot-tools/mkarchroot.patch
+++ /dev/null
@@ -1,67 +0,0 @@
---- mkarchroot.in 2016-06-09 16:36:04.297290617 -0400
-+++ mkarchroot.ugly 2016-06-09 16:36:26.290140708 -0400
-@@ -1,4 +1,6 @@
- #!/bin/bash
-+# License: GNU GPLv2
-+#
- # 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.
-@@ -14,23 +16,29 @@
-
- working_dir=''
-
-+files=()
-+
- usage() {
- echo "Usage: ${0##*/} [options] working-dir package-list..."
- echo ' options:'
- echo ' -C <file> Location of a pacman config file'
- echo ' -M <file> Location of a makepkg config file'
- echo ' -c <dir> Set pacman cache'
-+ echo ' -f <file> Copy file from the host to the chroot'
-+ echo ' -s Do not run setarch'
- echo ' -h This message'
- exit 1
- }
-
- orig_argv=("$@")
-
--while getopts 'hC:M:c:' arg; do
-+while getopts 'hC:M:c:f:s' arg; do
- case "$arg" in
- C) pac_conf="$OPTARG" ;;
- M) makepkg_conf="$OPTARG" ;;
- c) cache_dir="$OPTARG" ;;
-+ f) files+=("$OPTARG") ;;
-+ s) nosetarch=1 ;;
- h|?) usage ;;
- *) error "invalid argument '%s'" "$arg"; usage ;;
- esac
-@@ -68,6 +76,16 @@
- chmod 0755 "$working_dir"
- fi
-
-+for file in "${files[@]}"; do
-+ mkdir -p "$(dirname "$working_dir$file")"
-+ cp "$file" "$working_dir$file"
-+done
-+
-+_env=()
-+while read -r varname; do
-+ _env+=("$varname=${!varname}")
-+done < <(declare -x | sed -r 's/^declare -x ([^=]*)=.*/\1/' | grep -i '_proxy$')
-+env -i "${_env[@]}" \
- pacstrap -GMcd ${pac_conf:+-C "$pac_conf"} "$working_dir" \
- "${cache_dirs[@]/#/--cachedir=}" "$@" || die 'Failed to install all packages'
-
-@@ -77,7 +95,8 @@
-
- systemd-machine-id-setup --root="$working_dir"
-
--exec arch-nspawn \
-+exec "$(librelib chroot/arch-nspawn)" \
-+ ${nosetarch:+-s} \
- ${pac_conf:+-C "$pac_conf"} \
- ${makepkg_conf:+-M "$makepkg_conf"} \
- ${cache_dir:+-c "$cache_dir"} \