From 46c4def0733a78ce08702d188e3e1a141fb07316 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Mon, 29 Aug 2011 10:53:50 +0200 Subject: [PATCH 01/18] Support non-standard install locations This build system overhaul allows for adding (define-style) macros to our scripts. All source files are now suffixed with ".in" to clarify that they might contain unprocessed defines. The Makefile provides a new rule to preprocess source files and generate proper output scripts. Also, add a "@pkgdatadir@" define (as used in GNU Autotools) and use it instead of hardcoded paths to "/usr/share/devtools" everywhere. We missed this when adding PREFIX support to the build system in commit 35fc83ce7d8dc26cd424321f2e8638d05da0a6d4. Signed-off-by: Lukas Fleischer --- .gitignore | 13 +++++++++++++ Makefile | 8 +++++++- archbuild => archbuild.in | 4 ++-- archco => archco.in | 0 archrelease => archrelease.in | 0 archrm => archrm.in | 0 bash_completion => bash_completion.in | 0 checkpkg => checkpkg.in | 0 commitpkg => commitpkg.in | 0 finddeps => finddeps.in | 0 lddd => lddd.in | 0 makechrootpkg => makechrootpkg.in | 0 mkarchroot => mkarchroot.in | 0 rebuildpkgs => rebuildpkgs.in | 0 zsh_completion => zsh_completion.in | 0 15 files changed, 22 insertions(+), 3 deletions(-) rename archbuild => archbuild.in (93%) mode change 100755 => 100644 rename archco => archco.in (100%) mode change 100755 => 100644 rename archrelease => archrelease.in (100%) mode change 100755 => 100644 rename archrm => archrm.in (100%) mode change 100755 => 100644 rename bash_completion => bash_completion.in (100%) rename checkpkg => checkpkg.in (100%) mode change 100755 => 100644 rename commitpkg => commitpkg.in (100%) mode change 100755 => 100644 rename finddeps => finddeps.in (100%) mode change 100755 => 100644 rename lddd => lddd.in (100%) mode change 100755 => 100644 rename makechrootpkg => makechrootpkg.in (100%) mode change 100755 => 100644 rename mkarchroot => mkarchroot.in (100%) mode change 100755 => 100644 rename rebuildpkgs => rebuildpkgs.in (100%) mode change 100755 => 100644 rename zsh_completion => zsh_completion.in (100%) diff --git a/.gitignore b/.gitignore index d823845..cd39b63 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,15 @@ *~ devtools-*.tar.gz +archbuild +archco +archrelease +archrm +bash_completion +checkpkg +commitpkg +finddeps +lddd +makechrootpkg +mkarchroot +rebuildpkgs +zsh_completion diff --git a/Makefile b/Makefile index 6f7a238..47378ff 100644 --- a/Makefile +++ b/Makefile @@ -47,7 +47,13 @@ ARCHBUILD_LINKS = \ multilib-build \ multilib-testing-build -all: +all: $(BINPROGS) $(SBINPROGS) bash_completion zsh_completion + +%: %.in + @echo "GEN $@" + @sed -e "s|@pkgdatadir[@]|$(DESTDIR)$(PREFIX)/share/devtools|g" "$<" >"$@" + @chmod a-w "$@" + @chmod +x "$@" install: install -dm0755 $(DESTDIR)$(PREFIX)/bin diff --git a/archbuild b/archbuild.in old mode 100755 new mode 100644 similarity index 93% rename from archbuild rename to archbuild.in index 5518996..92d2554 --- a/archbuild +++ b/archbuild.in @@ -54,8 +54,8 @@ if ${clean_first} || [[ ! -d "${chroots}/${repo}-${arch}" ]]; then rm -rf "${chroots}/${repo}-${arch}" mkdir -p "${chroots}/${repo}-${arch}" setarch "${arch}" mkarchroot \ - -C "/usr/share/devtools/pacman-${repo}.conf" \ - -M "/usr/share/devtools/makepkg-${arch}.conf" \ + -C "@pkgdatadir@/pacman-${repo}.conf" \ + -M "@pkgdatadir@/makepkg-${arch}.conf" \ "${chroots}/${repo}-${arch}/root" \ "${base_packages[@]}" else diff --git a/archco b/archco.in old mode 100755 new mode 100644 similarity index 100% rename from archco rename to archco.in diff --git a/archrelease b/archrelease.in old mode 100755 new mode 100644 similarity index 100% rename from archrelease rename to archrelease.in diff --git a/archrm b/archrm.in old mode 100755 new mode 100644 similarity index 100% rename from archrm rename to archrm.in diff --git a/bash_completion b/bash_completion.in similarity index 100% rename from bash_completion rename to bash_completion.in diff --git a/checkpkg b/checkpkg.in old mode 100755 new mode 100644 similarity index 100% rename from checkpkg rename to checkpkg.in diff --git a/commitpkg b/commitpkg.in old mode 100755 new mode 100644 similarity index 100% rename from commitpkg rename to commitpkg.in diff --git a/finddeps b/finddeps.in old mode 100755 new mode 100644 similarity index 100% rename from finddeps rename to finddeps.in diff --git a/lddd b/lddd.in old mode 100755 new mode 100644 similarity index 100% rename from lddd rename to lddd.in diff --git a/makechrootpkg b/makechrootpkg.in old mode 100755 new mode 100644 similarity index 100% rename from makechrootpkg rename to makechrootpkg.in diff --git a/mkarchroot b/mkarchroot.in old mode 100755 new mode 100644 similarity index 100% rename from mkarchroot rename to mkarchroot.in diff --git a/rebuildpkgs b/rebuildpkgs.in old mode 100755 new mode 100644 similarity index 100% rename from rebuildpkgs rename to rebuildpkgs.in diff --git a/zsh_completion b/zsh_completion.in similarity index 100% rename from zsh_completion rename to zsh_completion.in From 21daec135add61bf0af74c1277b4f3eeff9cca64 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Mon, 29 Aug 2011 10:53:51 +0200 Subject: [PATCH 02/18] Makefile: Add a cleanup target Allows for using `make clean` to remove any output files generated by make(1). Signed-off-by: Lukas Fleischer --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 47378ff..9249da6 100644 --- a/Makefile +++ b/Makefile @@ -55,6 +55,9 @@ all: $(BINPROGS) $(SBINPROGS) bash_completion zsh_completion @chmod a-w "$@" @chmod +x "$@" +clean: + rm -f $(BINPROGS) $(SBINPROGS) bash_completion zsh_completion + install: install -dm0755 $(DESTDIR)$(PREFIX)/bin install -dm0755 $(DESTDIR)$(PREFIX)/sbin @@ -84,4 +87,4 @@ dist: upload: scp devtools-$(V).tar.gz gerolde.archlinux.org:/srv/ftp/other/devtools/ -.PHONY: all install uninstall dist upload +.PHONY: all clean install uninstall dist upload From 733668f4ccb42aba30b17811f3c9a1091de64cc2 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 14:46:10 +0200 Subject: [PATCH 03/18] makechrootpkg: Bashify syntax No functional change. Eliminates unused variables RUN and FORCE. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 224 +++++++++++++++++++++++------------------------ 1 file changed, 111 insertions(+), 113 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index a60c9fe..6e1e37e 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -8,27 +8,22 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -FORCE='n' -RUN='' -MAKEPKG_ARGS='-s --noconfirm' -REPACK='' -WORKDIR=$PWD - -update_first='0' -clean_first='0' -install_pkg='' -add_to_db=0 - -chrootdir='' - -APPNAME=$(basename "${0}") +workdir="$PWD" +makepkg_args='-s --noconfirm' +repack=false +update_first=false +clean_first=false +install_pkg= +add_to_db=false +chrootdir= +appname=${0##*/} default_copy=$USER [[ -n $SUDO_USER ]] && default_copy=$SUDO_USER [[ -z $default_copy || $default_copy = root ]] && default_copy=copy usage() { - echo "usage ${APPNAME} [options] -r [--] [makepkg args]" + echo "usage $appname [options] -r [--] [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.' @@ -41,7 +36,7 @@ usage() { echo 'command:' echo ' mkarchroot /root base base-devel sudo' echo '' - echo "Default makepkg args: $MAKEPKG_ARGS" + echo "Default makepkg args: $makepkg_args" echo '' echo 'Flags:' echo '-h This help' @@ -59,22 +54,22 @@ usage() { } while getopts 'hcudr:I:l:' arg; do - case "${arg}" in + case "$arg" in h) usage ;; - c) clean_first=1 ;; - u) update_first=1 ;; - d) add_to_db=1 ;; + c) clean_first=true ;; + u) update_first=true ;; + d) add_to_db=true ;; r) chrootdir="$OPTARG" ;; I) install_pkg="$OPTARG" ;; l) copy="$OPTARG" ;; - *) MAKEPKG_ARGS="$MAKEPKG_ARGS -$arg $OPTARG" ;; + *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; esac done # Canonicalize chrootdir, getting rid of trailing / chrootdir=$(readlink -e "$chrootdir") -if [[ ${copy:0:1} = "/" ]]; then +if [[ ${copy:0:1} = / ]]; then copydir=$copy else [[ -z $copy ]] && copy=$default_copy @@ -82,32 +77,32 @@ else fi # Pass all arguments after -- right to makepkg -MAKEPKG_ARGS="$MAKEPKG_ARGS ${*:$OPTIND}" +makepkg_args="$makepkg_args ${*:$OPTIND}" # See if -R was passed to makepkg for arg in ${*:$OPTIND}; do - if [ "$arg" = '-R' ]; then - REPACK=1 - break; + if [[ $arg = -R ]]; then + repack=1 + break fi done -if [ "$EUID" != '0' ]; then +if (( EUID )); then echo 'This script must be run as root.' exit 1 fi -if [ ! -f PKGBUILD -a -z "$install_pkg" ]; then +if [[ ! -f PKGBUILD && -z $install_pkg ]]; then echo 'This must be run in a directory containing a PKGBUILD.' exit 1 fi -if [ ! -d "$chrootdir" ]; then +if [[ ! -d $chrootdir ]]; then echo "No chroot dir defined, or invalid path '$chrootdir'" exit 1 fi -if [ ! -d "$chrootdir/root" ]; then +if [[ ! -d $chrootdir/root ]]; then echo 'Missing chroot dir root directory.' echo "Try using: mkarchroot $chrootdir/root base base-devel sudo" usage @@ -124,7 +119,7 @@ if ! flock -n 9; then echo "done" fi -if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then +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 exec 8>"$chrootdir/root.lock" @@ -138,8 +133,9 @@ if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then echo -n 'creating clean working copy...' use_rsync=false if type -P btrfs >/dev/null; then - [ -d $copydir ] && btrfs subvolume delete "$copydir" &>/dev/null - btrfs subvolume snapshot "$chrootdir/root" "$copydir" &>/dev/null || use_rsync=true + [[ -d $copydir ]] && btrfs subvolume delete "$copydir" &>/dev/null + btrfs subvolume snapshot "$chrootdir/root" "$copydir" &>/dev/null || + use_rsync=true else use_rsync=true fi @@ -154,152 +150,154 @@ if [ ! -d "$copydir" -o "$clean_first" -eq "1" ]; then exec 8>&- fi -if [ -n "$install_pkg" ]; then - pkgname="$(basename "$install_pkg")" +if [[ -n $install_pkg ]]; then + pkgname="${install_pkg##*/}" cp "$install_pkg" "$copydir/$pkgname" + mkarchroot -r "pacman -U /$pkgname --noconfirm" "$copydir" ret=$? + rm "$copydir/$pkgname" + # Exit early, we've done all we need to exit $ret fi -if [ $update_first -eq 1 ]; then - mkarchroot -u "$copydir" -fi +$update_first && mkarchroot -u "$copydir" -[ -d "$copydir/build" ] || mkdir "$copydir/build" +mkdir -p "$copydir/build" -if [ "$REPACK" != "1" ]; then - # Remove anything in there UNLESS -R (repack) was passed to makepkg - rm -rf "$copydir/build/"* -fi +# Remove anything in there UNLESS -R (repack) was passed to makepkg +$repack || rm -rf "$copydir"/build/* # Read .makepkg.conf even if called via sudo -if [ -n "${SUDO_USER}" ]; then - makepkg_conf="/$(eval echo ~${SUDO_USER})/.makepkg.conf" +if [[ -n $SUDO_USER ]]; then + makepkg_conf="$(eval echo ~$SUDO_USER)/.makepkg.conf" else - makepkg_conf="~/.makepkg.conf" + makepkg_conf="$HOME/.makepkg.conf" fi # Get SRC/PKGDEST from makepkg.conf -if [ -f "${makepkg_conf}" ]; then - eval $(grep '^SRCDEST=' "${makepkg_conf}") - eval $(grep '^PKGDEST=' "${makepkg_conf}") - - eval $(grep '^MAKEFLAGS=' "${makepkg_conf}") - eval $(grep '^PACKAGER=' "${makepkg_conf}") +if [[ -f $makepkg_conf ]]; then + eval $(grep '^SRCDEST=' "$makepkg_conf") + eval $(grep '^PKGDEST=' "$makepkg_conf") + eval $(grep '^MAKEFLAGS=' "$makepkg_conf") + eval $(grep '^PACKAGER=' "$makepkg_conf") fi -[ -z "${SRCDEST}" ] && eval $(grep '^SRCDEST=' /etc/makepkg.conf) -[ -z "${PKGDEST}" ] && eval $(grep '^PKGDEST=' /etc/makepkg.conf) -[ -d "$copydir/pkgdest" ] || mkdir "$copydir/pkgdest" -if ! grep 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then +[[ -z $SRCDEST ]] && eval $(grep '^SRCDEST=' /etc/makepkg.conf) +[[ -z $PKGDEST ]] && eval $(grep '^PKGDEST=' /etc/makepkg.conf) +[[ -z $MAKEFLAGS ]] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf) +[[ -z $PACKAGER ]] && eval $(grep '^PACKAGER=' /etc/makepkg.conf) + +mkdir -p "$copydir/pkgdest" +if ! grep -q 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf"; then echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf" fi -[ -d "$copydir/srcdest" ] || mkdir "$copydir/srcdest" -if ! grep 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf" >/dev/null 2>&1; then +mkdir -p "$copydir/srcdest" +if ! grep -q 'SRCDEST="/srcdest"' "$copydir/etc/makepkg.conf"; then echo 'SRCDEST="/srcdest"' >> "$copydir/etc/makepkg.conf" fi -[ -z "${MAKEFLAGS}" ] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf) -if [ -n "${MAKEFLAGS}" ]; then - sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf" - echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf" + +if [[ -n $MAKEFLAGS ]]; then + sed -i '/^MAKEFLAGS=/d' "$copydir/etc/makepkg.conf" + echo "MAKEFLAGS='${MAKEFLAGS}'" >> "$copydir/etc/makepkg.conf" fi -[ -z "${PACKAGER}" ] && eval $(grep '^PACKAGER=' /etc/makepkg.conf) -if [ -n "${PACKAGER}" ]; then - sed -i '/^PACKAGER=/d' "$copydir/etc/makepkg.conf" - echo "PACKAGER='${PACKAGER}'" >> "$copydir/etc/makepkg.conf" + +if [[ -n $PACKAGER ]]; then + sed -i '/^PACKAGER=/d' "$copydir/etc/makepkg.conf" + echo "PACKAGER='${PACKAGER}'" >> "$copydir/etc/makepkg.conf" fi # Set target CARCH as it might be used within the PKGBUILD to select correct sources eval $(grep '^CARCH=' "$copydir/etc/makepkg.conf") export CARCH + # Copy PKGBUILD and sources -source=($(. PKGBUILD; echo ${source[@]})) +source=( $(source PKGBUILD; echo ${source[@]}) ) cp PKGBUILD "$copydir/build/" -for f in ${source[@]}; do - basef=$(echo $f | sed 's|::.*||' | sed 's|^.*://.*/||g') - if [ -f "$basef" ]; then - cp "$basef" "$copydir/srcdest/" - elif [ -f "$SRCDEST/$basef" ]; then - cp "$SRCDEST/$basef" "$copydir/srcdest/" +for file in "${source[@]}"; do + file="${file%%::*}" + file="${file##*://*/}" + if [[ -f $file ]]; then + cp "$file" "$copydir/srcdest/" + elif [[ -f $SRCDEST/$file ]]; then + cp "$SRCDEST/$file" "$copydir/srcdest/" fi done -( . PKGBUILD -for i in 'changelog' 'install'; do - filelist=$(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD) - for file in $filelist; do - # evaluate any bash variables used - eval file=${file} - if [[ -f "$file" ]]; then - cp "$file" "$copydir/build/" - fi +( + source PKGBUILD + for i in changelog install; do + sed -n "s/^[[:space:]]*$i=//p" PKGBUILD | while IFS= read -r file; do + # evaluate any bash variables used + eval file="$file" + [[ -f $file ]] && cp "$file" "$copydir/build/" + done done -done ) -chown -R nobody "$copydir/build" -chown -R nobody "$copydir/srcdest" -chown -R nobody "$copydir/pkgdest" +chown -R nobody "$copydir"/{build,pkgdest,srcdest} echo 'nobody ALL = NOPASSWD: /usr/bin/pacman' > "$copydir/etc/sudoers.d/nobody-pacman" chmod 440 "$copydir/etc/sudoers.d/nobody-pacman" -#This is a little gross, but this way the script is recreated every time in the -#working copy -(cat <"$copydir/chrootbuild" </dev/null && namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log + exit 0 EOF -) > "$copydir/chrootbuild" chmod +x "$copydir/chrootbuild" if mkarchroot -r "/chrootbuild" "$copydir"; then - for pkgfile in "${copydir}"/pkgdest/*.pkg.tar.*; do - [ -e "$pkgfile" ] || continue - if [ "$add_to_db" -eq "1" ]; then - mkdir -p "${copydir}/repo" - pushd "${copydir}/repo" >/dev/null + for pkgfile in "$copydir"/pkgdest/*.pkg.tar.*; do + [[ -e $pkgfile ]] || continue + if $add_to_db; then + mkdir -p "$copydir/repo" + pushd "$copydir/repo" >/dev/null cp "$pkgfile" . - repo-add repo.db.tar.gz "$(basename "$pkgfile")" + repo-add repo.db.tar.gz "${pkgfile##*/}" popd >/dev/null fi - if [ -d "$PKGDEST" ]; then - mv "$pkgfile" "${PKGDEST}" + if [[ -d $PKGDEST ]]; then + mv "$pkgfile" "$PKGDEST" else - mv "$pkgfile" "${WORKDIR}" + mv "$pkgfile" "$workdir" fi done - for l in "${copydir}"/build/{namcap,*-{build,check,package,package_*}}.log; do - [ -f "$l" ] && mv "$l" "${WORKDIR}" + for l in "$copydir"/build/{namcap,*-{build,check,package,package_*}}.log; do + [[ -f $l ]] && mv "$l" "$workdir" done else - #just in case. We returned 1, make sure we fail - touch "${copydir}/build/BUILD_FAILED" + # Just in case. We returned 1, make sure we fail + touch "$copydir/build/BUILD_FAILED" fi -for f in "${copydir}"/srcdest/*; do - [ -e "$f" ] || continue - if [ -d "$SRCDEST" ]; then - mv "$f" "${SRCDEST}" +for f in "$copydir"/srcdest/*; do + [[ -e $f ]] || continue + if [[ -d $SRCDEST ]]; then + mv "$f" "$SRCDEST" else - mv "$f" "${WORKDIR}" + mv "$f" "$workdir" fi done -if [ -e "${copydir}/build/BUILD_FAILED" ]; then +if [[ -e $copydir/build/BUILD_FAILED ]]; then echo "Build failed, check $copydir/build" - rm "${copydir}/build/BUILD_FAILED" + rm "$copydir/build/BUILD_FAILED" exit 1 fi From 004ced2a33c06985d88b424d88facb0d8b1bdd27 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 14:51:58 +0200 Subject: [PATCH 04/18] makechrootpkg: Eliminate appname, only used once Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 6e1e37e..5538e95 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -16,14 +16,13 @@ clean_first=false install_pkg= add_to_db=false chrootdir= -appname=${0##*/} default_copy=$USER [[ -n $SUDO_USER ]] && default_copy=$SUDO_USER [[ -z $default_copy || $default_copy = root ]] && default_copy=copy usage() { - echo "usage $appname [options] -r [--] [makepkg args]" + echo "usage ${0##*/} [options] -r [--] [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.' From e41deee5e5d471e90b951b1f68db5dc50c343b0c Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 14:56:49 +0200 Subject: [PATCH 05/18] makechrootpkg: Replace $workdir with . ($PWD) $workdir is never used when we change directory, so it's superfluous. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 5538e95..eb23c61 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -8,7 +8,6 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -workdir="$PWD" makepkg_args='-s --noconfirm' repack=false update_first=false @@ -274,12 +273,12 @@ if mkarchroot -r "/chrootbuild" "$copydir"; then if [[ -d $PKGDEST ]]; then mv "$pkgfile" "$PKGDEST" else - mv "$pkgfile" "$workdir" + mv "$pkgfile" . fi done for l in "$copydir"/build/{namcap,*-{build,check,package,package_*}}.log; do - [[ -f $l ]] && mv "$l" "$workdir" + [[ -f $l ]] && mv "$l" . done else # Just in case. We returned 1, make sure we fail @@ -291,7 +290,7 @@ for f in "$copydir"/srcdest/*; do if [[ -d $SRCDEST ]]; then mv "$f" "$SRCDEST" else - mv "$f" "$workdir" + mv "$f" . fi done From 1df679974786fe4282fd675574d92a464c28f7cb Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 15:05:35 +0200 Subject: [PATCH 06/18] makechrootpkg: Always set PKGDEST and SRCDEST Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index eb23c61..1bed6b8 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -188,6 +188,10 @@ fi [[ -z $MAKEFLAGS ]] && eval $(grep '^MAKEFLAGS=' /etc/makepkg.conf) [[ -z $PACKAGER ]] && eval $(grep '^PACKAGER=' /etc/makepkg.conf) +# Use PKGBUILD directory if PKGDEST or SRCDEST don't exist +[[ -d $PKGDEST ]] || PKGDEST=. +[[ -d $SRCDEST ]] || SRCDEST=. + mkdir -p "$copydir/pkgdest" if ! grep -q 'PKGDEST="/pkgdest"' "$copydir/etc/makepkg.conf"; then echo 'PKGDEST="/pkgdest"' >> "$copydir/etc/makepkg.conf" @@ -270,11 +274,7 @@ if mkarchroot -r "/chrootbuild" "$copydir"; then popd >/dev/null fi - if [[ -d $PKGDEST ]]; then - mv "$pkgfile" "$PKGDEST" - else - mv "$pkgfile" . - fi + mv "$pkgfile" "$PKGDEST" done for l in "$copydir"/build/{namcap,*-{build,check,package,package_*}}.log; do @@ -287,11 +287,7 @@ fi for f in "$copydir"/srcdest/*; do [[ -e $f ]] || continue - if [[ -d $SRCDEST ]]; then - mv "$f" "$SRCDEST" - else - mv "$f" . - fi + mv "$f" "$SRCDEST" done if [[ -e $copydir/build/BUILD_FAILED ]]; then From b9070bf0b8b6e8f154c718074058dba9c03b01e0 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 15:14:08 +0200 Subject: [PATCH 07/18] makechrootpkg: Use nullglob Use nullglob instead of checking for existence. If the glob doesn't match any files, it will be removed instead of staying unexpanded. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 1bed6b8..11fa401 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -8,6 +8,8 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. +shopt -s nullglob + makepkg_args='-s --noconfirm' repack=false update_first=false @@ -265,7 +267,6 @@ chmod +x "$copydir/chrootbuild" if mkarchroot -r "/chrootbuild" "$copydir"; then for pkgfile in "$copydir"/pkgdest/*.pkg.tar.*; do - [[ -e $pkgfile ]] || continue if $add_to_db; then mkdir -p "$copydir/repo" pushd "$copydir/repo" >/dev/null @@ -286,7 +287,6 @@ else fi for f in "$copydir"/srcdest/*; do - [[ -e $f ]] || continue mv "$f" "$SRCDEST" done From 7a9f808a0fd80c14b32223fa73d5368294994e49 Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 15:50:30 +0200 Subject: [PATCH 08/18] makechrootpkg: Source PKGBUILD only once Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 11fa401..04893b8 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -219,20 +219,20 @@ eval $(grep '^CARCH=' "$copydir/etc/makepkg.conf") export CARCH # Copy PKGBUILD and sources -source=( $(source PKGBUILD; echo ${source[@]}) ) cp PKGBUILD "$copydir/build/" -for file in "${source[@]}"; do - file="${file%%::*}" - file="${file##*://*/}" - if [[ -f $file ]]; then - cp "$file" "$copydir/srcdest/" - elif [[ -f $SRCDEST/$file ]]; then - cp "$SRCDEST/$file" "$copydir/srcdest/" - fi -done - ( source PKGBUILD + for file in "${source[@]}"; do + file="${file%%::*}" + file="${file##*://*/}" + if [[ -f $file ]]; then + cp "$file" "$copydir/srcdest/" + elif [[ -f $SRCDEST/$file ]]; then + cp "$SRCDEST/$file" "$copydir/srcdest/" + fi + done + + # Find all changelog and install files, even inside functions for i in changelog install; do sed -n "s/^[[:space:]]*$i=//p" PKGBUILD | while IFS= read -r file; do # evaluate any bash variables used From e66a1f3cd85b22cd5113684acdad50e5c077662e Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 15:59:57 +0200 Subject: [PATCH 09/18] makechrootpkg: Add option to explicitly run namcap Installs namcap if needed, *after* building the package, contrary to the former way of having to have namcap installed, e.g. via makedepends. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 04893b8..6bedf03 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -16,6 +16,7 @@ update_first=false clean_first=false install_pkg= add_to_db=false +run_namcap=false chrootdir= default_copy=$USER @@ -49,11 +50,12 @@ usage() { echo '-I Install a package into the working copy of the chroot' echo '-l The directory to use as the working copy of the chroot' echo ' Useful for maintaining multiple copies.' + echo '-n Run namcap on the package' echo " Default: $default_copy" exit 1 } -while getopts 'hcudr:I:l:' arg; do +while getopts 'hcudr:I:l:n' arg; do case "$arg" in h) usage ;; c) clean_first=true ;; @@ -62,6 +64,7 @@ while getopts 'hcudr:I:l:' arg; do r) chrootdir="$OPTARG" ;; I) install_pkg="$OPTARG" ;; l) copy="$OPTARG" ;; + n) run_namcap=true ;; *) makepkg_args="$makepkg_args -$arg $OPTARG" ;; esac done @@ -259,7 +262,10 @@ sudo -u nobody makepkg $makepkg_args || touch BUILD_FAILED [[ -f BUILD_FAILED ]] && exit 1 -which namcap &>/dev/null && namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log +if $run_namcap; then + pacman -S --needed --noconfirm namcap + namcap /build/PKGBUILD /pkgdest/*.pkg.tar.* > /build/namcap.log +fi exit 0 EOF From a790c39c7dc3074e26b780054b0fc5a33eaa4a2b Mon Sep 17 00:00:00 2001 From: "Jan Alexander Steffens (heftig)" Date: Sat, 17 Sep 2011 16:47:39 +0200 Subject: [PATCH 10/18] makechrootpkg: If chroot is missing, exit instead of usage I'm not sure why this was handled differently than the other error conditions. Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 6bedf03..092f195 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -108,7 +108,7 @@ fi if [[ ! -d $chrootdir/root ]]; then echo 'Missing chroot dir root directory.' echo "Try using: mkarchroot $chrootdir/root base base-devel sudo" - usage + exit 1 fi umask 0022 From 022cd3d523a416ec2eba99220b82bfff40875c9d Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 8 Sep 2011 16:38:28 -0500 Subject: [PATCH 11/18] archrelease: call 'svn copy' once for all files We don't need to invoke svn copy on each file; it accepts multiple arguments. This cut Allan's time releasing one patch-friendly package from 5 minutes to 2 minutes. Signed-off-by: Dan McGee Signed-off-by: Lukas Fleischer --- archrelease.in | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/archrelease.in b/archrelease.in index 2f6a563..7bb4c8a 100644 --- a/archrelease.in +++ b/archrelease.in @@ -52,9 +52,8 @@ for tag in "$@"; do svn add --parents -q "repos/$tag" fi - for file in "${known_files[@]}"; do - svn copy -q -r HEAD "$trunk/$file" "repos/$tag/" - done + # copy all files at once from trunk to the subdirectory in repos/ + svn copy -q -r HEAD ${known_files[@]/#/$trunk/} "repos/$tag/" echo 'done' done From a991c9a71f92aa24fd445e6189a6ac07c4ddb77c Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Tue, 27 Sep 2011 14:42:14 +1000 Subject: [PATCH 12/18] Always log builds in makechrootpkg It is very helpful to always log the build output in makechrootpkg so pass "-L" as a standard option to makepkg. Signed-off-by: Allan McRae Signed-off-by: Lukas Fleischer --- makechrootpkg.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makechrootpkg.in b/makechrootpkg.in index 092f195..43acc3f 100644 --- a/makechrootpkg.in +++ b/makechrootpkg.in @@ -10,7 +10,7 @@ shopt -s nullglob -makepkg_args='-s --noconfirm' +makepkg_args='-s --noconfirm -L' repack=false update_first=false clean_first=false From fe2040cd145344bfbe006e89c79348cce2ad2e13 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Wed, 12 Oct 2011 16:26:29 +0200 Subject: [PATCH 13/18] archrelease: Fix SVN error when repository is empty MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit If trash is empty, `svn rm -q "${trash[@]}"` fails with: svn: Try 'svn help' for more info and then svn: Not enough arguments provided This doesn't result in any further malfunction but is kind of confusing and unexpected. Skipping `svn rm` on an empty trash fixes this. Reported-by: Alexander Rødseth Signed-off-by: Lukas Fleischer --- archrelease.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/archrelease.in b/archrelease.in index 7bb4c8a..2f7725e 100644 --- a/archrelease.in +++ b/archrelease.in @@ -46,7 +46,7 @@ for tag in "$@"; do while read -r file; do trash+=("repos/$tag/$file") done < <(svn ls "repos/$tag") - svn rm -q "${trash[@]}" + [[ $trash ]] && svn rm -q "${trash[@]}" else mkdir -p "repos/$tag" svn add --parents -q "repos/$tag" From 4800be25c2089927b340f01d974ae2707bca8a86 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 27 Sep 2011 09:40:31 +0200 Subject: [PATCH 14/18] finddeps: Proper quoting, use double brackets Signed-off-by: Lukas Fleischer --- finddeps.in | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/finddeps.in b/finddeps.in index ded7a93..0d59634 100644 --- a/finddeps.in +++ b/finddeps.in @@ -3,7 +3,10 @@ # finddeps - find packages that depend on a given depname # -if [ "$1" = '' ]; then +match=$1 +tld=$(pwd) + +if [[ -z $match ]]; then echo 'usage: finddeps ' echo '' echo 'Find packages that depend on a given depname.' @@ -12,35 +15,26 @@ if [ "$1" = '' ]; then exit 0 fi -match=$1 -tld=$(pwd) - -for d in $(find . -type d); do - cd $d - if [ -f PKGBUILD ]; then +for d in "$(find . -type d)"; do + cd "$d" + if [[ -f PKGBUILD ]]; then unset pkgname depends makedepends . PKGBUILD for dep in "${depends[@]}"; do # lose the version comparator, if any depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (depends)" - fi + [[ $depname = $match ]] && echo "$d (depends)" done for dep in "${makedepends[@]}"; do # lose the version comparator, if any depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (makedepends)" - fi + [[ $depname = $match ]] && echo "$d (makedepends)" done for dep in "${optdepends[@]/:*}"; do # lose the version comaparator, if any depname=${dep%%[<>=]*} - if [ "$depname" = "$match" ]; then - echo "$d (optdepends)" - fi + [[ $depname = $match ]] && echo "$d (optdepends)" done fi - cd $tld + cd "$tld" done From 8edb443c125cb668e6609b5ff696e565b15a6069 Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 27 Sep 2011 09:43:26 +0200 Subject: [PATCH 15/18] finddeps: Remove redundant cd(1) Source the PKGBUILD using the correct path (relative to our base directory) instead of using cd(1) to switch to the ABS base directory first and to the package directory afterwards. This is very useful when trying to track errors, also: $ ~/src/devtools/finddeps libdaq ./community/snort (depends) PKGBUILD: line 17: ruby: command not found PKGBUILD: line 19: [: =: unary operator expected Versus: $ ~/src/devtools/finddeps libdaq ./community/snort (depends) ./community/ruby-pkgconfig/PKGBUILD: line 17: ruby: command not found ./community/lmms/PKGBUILD: line 19: [: =: unary operator expected Signed-off-by: Lukas Fleischer --- finddeps.in | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/finddeps.in b/finddeps.in index 0d59634..ec8cde4 100644 --- a/finddeps.in +++ b/finddeps.in @@ -4,7 +4,6 @@ # match=$1 -tld=$(pwd) if [[ -z $match ]]; then echo 'usage: finddeps ' @@ -16,10 +15,9 @@ if [[ -z $match ]]; then fi for d in "$(find . -type d)"; do - cd "$d" - if [[ -f PKGBUILD ]]; then + if [[ -f "$d/PKGBUILD" ]]; then unset pkgname depends makedepends - . PKGBUILD + . "$d/PKGBUILD" for dep in "${depends[@]}"; do # lose the version comparator, if any depname=${dep%%[<>=]*} @@ -36,5 +34,4 @@ for d in "$(find . -type d)"; do [[ $depname = $match ]] && echo "$d (optdepends)" done fi - cd "$tld" done From 84b789f760e91bcbcf035cca5d40c40032ad87dd Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 27 Sep 2011 09:48:13 +0200 Subject: [PATCH 16/18] finddeps: Use read builtin to iterate over packages Using parameter substitution might result in unpredictable behaviour when directories contain whitespaces here. The read shell builtin is the proper way to read single lines. Signed-off-by: Lukas Fleischer --- finddeps.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/finddeps.in b/finddeps.in index ec8cde4..3f4515b 100644 --- a/finddeps.in +++ b/finddeps.in @@ -14,7 +14,7 @@ if [[ -z $match ]]; then exit 0 fi -for d in "$(find . -type d)"; do +find . -type d | while read d; do if [[ -f "$d/PKGBUILD" ]]; then unset pkgname depends makedepends . "$d/PKGBUILD" From dcb80e7b5c57b14bbab2858c6c863d8f224ba43b Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Tue, 27 Sep 2011 09:52:09 +0200 Subject: [PATCH 17/18] finddeps: Unset optdepends The optdepends array should be unset before sourcing the PKGBUILD to avoid dangling optional depends. Signed-off-by: Lukas Fleischer --- finddeps.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/finddeps.in b/finddeps.in index 3f4515b..4651fd9 100644 --- a/finddeps.in +++ b/finddeps.in @@ -16,7 +16,7 @@ fi find . -type d | while read d; do if [[ -f "$d/PKGBUILD" ]]; then - unset pkgname depends makedepends + unset pkgname depends makedepends optdepends . "$d/PKGBUILD" for dep in "${depends[@]}"; do # lose the version comparator, if any From a0c6bf4556e211037b9d9d6de3fd17f798a3c1fb Mon Sep 17 00:00:00 2001 From: Lukas Fleischer Date: Thu, 13 Oct 2011 11:03:35 +0200 Subject: [PATCH 18/18] Honor TMPDIR environment variable Replace all mktemp(1) invocations that hardcode "/tmp" with `mktemp --tmpdir` and change templates accordingly. Note that "--tmpdir" is GNU-ish which is okay given that we currently support Arch Linux only anyway. Signed-off-by: Lukas Fleischer --- checkpkg.in | 2 +- lddd.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/checkpkg.in b/checkpkg.in index 94a7529..cde3dc2 100644 --- a/checkpkg.in +++ b/checkpkg.in @@ -24,7 +24,7 @@ if [[ $arch == 'any' ]]; then fi STARTDIR=$(pwd) -TEMPDIR=$(mktemp -d /tmp/checkpkg-script.XXXX) +TEMPDIR=$(mktemp -d --tmpdir checkpkg-script.XXXX) cd "$TEMPDIR" for _pkgname in "${pkgname[@]}"; do diff --git a/lddd.in b/lddd.in index 9695c9b..c011674 100644 --- a/lddd.in +++ b/lddd.in @@ -9,7 +9,7 @@ IFS="${IFS}:" libdirs="/lib /usr/lib /usr/local/lib $(cat /etc/ld.so.conf.d/*)" extras= -TEMPDIR=$(mktemp -d /tmp/lddd-script.XXXX) +TEMPDIR=$(mktemp -d --tmpdir lddd-script.XXXX) echo 'Go out and drink some tea, this will take a while :) ...' # Check ELF binaries in the PATH and specified dir trees.