summaryrefslogtreecommitdiff
path: root/src/devtools
diff options
context:
space:
mode:
Diffstat (limited to 'src/devtools')
-rw-r--r--src/devtools/.gitignore4
-rw-r--r--src/devtools/Makefile103
-rw-r--r--src/devtools/lib/makechrootpkg.sh.patch254
3 files changed, 361 insertions, 0 deletions
diff --git a/src/devtools/.gitignore b/src/devtools/.gitignore
new file mode 100644
index 0000000..06a1942
--- /dev/null
+++ b/src/devtools/.gitignore
@@ -0,0 +1,4 @@
+*
+!*/
+!Makefile
+!*.patch
diff --git a/src/devtools/Makefile b/src/devtools/Makefile
new file mode 100644
index 0000000..e357675
--- /dev/null
+++ b/src/devtools/Makefile
@@ -0,0 +1,103 @@
+# Configuration
+DESTDIR=
+
+#prefix=/usr/local
+prefix=/usr
+exec_prefix=$(prefix)
+datarootdir=$(prefix)/share
+
+bindir=$(exec_prefix)/bin
+sbindir=$(exec_prefix)/sbin
+datadir=$(datarootdir)
+
+pkgdatadir=$(datadir)/devtools
+
+devtoolsdir=../../../devtools-par
+
+default: all
+all: build
+
+######################################################################
+
+copy: \
+ archroot.in \
+ checkpkg.in \
+ find-libdeps.in \
+ finddeps.in \
+ lddd.in \
+ lib/common.sh.in \
+ lib/makechrootpkg.sh.in
+
+archroot.in: $(devtoolsdir)/mkarchroot.in ; cp $< $@
+checkpkg.in: $(devtoolsdir)/checkpkg.in ; cp $< $@
+find-libdeps.in: $(devtoolsdir)/find-libdeps.in ; cp $< $@
+finddeps.in: $(devtoolsdir)/finddeps.in ; cp $< $@
+lddd.in: $(devtoolsdir)/lddd.in ; cp $< $@
+lib/common.sh.in: $(devtoolsdir)/lib/common.sh ; cp $< $@
+lib/makechrootpkg.sh.in: $(devtoolsdir)/makechrootpkg.in ; cp $< $@
+
+######################################################################
+
+build: \
+ archroot \
+ checkpkg \
+ find-libdeps \
+ finddeps \
+ lddd \
+ lib/common.sh \
+ lib/makechrootpkg.sh
+
+edit = sed -e 's|m4_include(lib/\(.*\))|. @pkgdatadir@/\1|' -e "s|@pkgdatadir[@]|$(pkgdatadir)|g"
+
+indent = emacs --batch $1 \
+ --eval '(setq sh-basic-offset 8)' \
+ --eval '(indent-region (point-min) (point-max) nil)' \
+ -f save-buffer &>/dev/null
+
+%: %.in Makefile
+ @echo "GEN $@"
+ @$(edit) <"$<" >"$@"
+ @chmod 755 "$@"
+
+lib/common.sh: %: %.in Makefile
+ @echo "GEN $@"
+ @{ \
+ echo 'if [[ -z $${_INCLUDE_COMMON_SH:-} ]]; then' && \
+ echo '_INCLUDE_COMMON_SH=true' && \
+ cat "$<" && \
+ echo 'fi'; } > "$@"
+
+lib/makechrootpkg.sh.ugly: %.ugly: %.in %.patch Makefile
+ @echo "GEN $@"
+ @cp $*.in $@
+ @patch $@ $*.patch
+
+lib/makechrootpkg.sh: %: %.ugly Makefile
+ @echo "GEN $@"
+ @$(edit) <"$<" >"$@"
+ $(call indent,$@)
+
+######################################################################
+
+install: \
+ $(DESTDIR)$(sbindir)/archroot \
+ $(DESTDIR)$(bindir)/checkpkg \
+ $(DESTDIR)$(bindir)/find-libdeps \
+ $(DESTDIR)$(bindir)/find-libprovides \
+ $(DESTDIR)$(bindir)/finddeps \
+ $(DESTDIR)$(bindir)/lddd \
+ $(DESTDIR)$(pkgdatadir)/common.sh \
+ $(DESTDIR)$(pkgdatadir)/makechrootpkg.sh
+
+$(DESTDIR)$(sbindir)/%: %
+ install -Dm755 $< $@
+
+$(DESTDIR)$(bindir)/%: %
+ install -Dm755 $< $@
+
+$(DESTDIR)$(pkgdatadir)/%: lib/%
+ install -Dm644 $< $@
+
+$(DESTDIR)$(bindir)/find-libprovides:
+ install -d $(@D)
+ ln -sf find-libdeps $@
diff --git a/src/devtools/lib/makechrootpkg.sh.patch b/src/devtools/lib/makechrootpkg.sh.patch
new file mode 100644
index 0000000..6016ba4
--- /dev/null
+++ b/src/devtools/lib/makechrootpkg.sh.patch
@@ -0,0 +1,254 @@
+--- 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,7 +246,14 @@
+ # 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/"
+ (
+@@ -256,13 +279,23 @@
+ )
+
+ 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 +317,62 @@
+ exit 0
+ EOF
+ chmod +x "$copydir/chrootbuild"
++archroot -r "$copydir" "/chrootbuild"
++}
+
+-if archroot -r "$copydir" "/chrootbuild"; then
+- for pkgfile in "$copydir"/pkgdest/*.pkg.tar.?z; do
+- if $add_to_db; then
++# Usage: chroot_add_to_local_repo $copydir
++chroot_add_to_local_repo() {
++ local copydir=$1
++ for pkgfile in "$copydir"/pkgdest/*.pkg.tar*; do
+ mkdir -p "$copydir/repo"
+ pushd "$copydir/repo" >/dev/null
+ cp "$pkgfile" .
+ 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 [$copy]"
+ if [[ "$chroottype" == btrfs ]]; then
+ btrfs subvolume delete "$copydir" >/dev/null ||
+ die "Unable to delete subvolume $copydir"
+@@ -326,8 +384,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"
++ 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
++}