summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <LukeShu@sbcglobal.net>2012-11-28 19:34:19 -0500
committerLuke Shumaker <LukeShu@sbcglobal.net>2012-11-28 19:34:19 -0500
commit259c05c47fc43875415d5ecab9666a46fb4b6d76 (patch)
tree093976c000f7d4e8a48319dcfb4e933489e78ad4
parent2a86ab6a3575724412f32fdbd794b0fd2738eb91 (diff)
Rewrite libremakepkg to not use makechrootpkg
-rwxr-xr-xsrc/chroot-tools/libremakepkg175
-rwxr-xr-xsrc/chroot-tools/libremakepkg.gpl2102
2 files changed, 214 insertions, 63 deletions
diff --git a/src/chroot-tools/libremakepkg b/src/chroot-tools/libremakepkg
index faa50be..d661714 100755
--- a/src/chroot-tools/libremakepkg
+++ b/src/chroot-tools/libremakepkg
@@ -1,141 +1,190 @@
-#!/bin/bash
+#!/bin/bash -euE
# libremakepkg
-# analogous to devtools' archbuild
# Copyright 2010 - 2011 Nicolás Reynolds
# Copyright 2011 Joshua Ismael Haase Hernández
# Copyright 2012 Luke Shumaker
-
-# ---------- GNU General Public License 3 ----------
-
+#
# This file is part of Parabola.
-
+#
# Parabola 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, either version 3 of the License, or
# (at your option) any later version.
-
+#
# Parabola is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
-
+#
# You should have received a copy of the GNU General Public License
# along with Parabola. If not, see <http://www.gnu.org/licenses/>.
. /etc/libretools.conf
+shopt -s nullglob
+
+# This file (libremakepkg) is GPLv3+, but I would like to use some code
+# modified from devtools' "makechrootpkg", which is GPLv2.
+. "$(dirname "$0")/libremakepkg.gpl2"
+# This gives us the functions:
+# - chroot_init
+# - chroot_extract
+# - chroot_build
+# - copy_pkgs
+
+# Boring functions #############################################################
+
##
# copy logs if they exist
##
-copy_log() {
- find "${copydir}/build/" -maxdepth 1 -name "*\.log" -exec cp {} ./ \;
+copy_logs() {
+ for l in "$copydir"/build/*.log; do
+ chown "$LIBREUSER" "$l"
+ mv "$l" .
+ done
}
##
# End inmediately but print a useful message
##
trap_exit() {
- copy_log
- error "$@"
+ copy_logs
+ error "$*"
exit 1
}
+##
+# Usage: makepkg_conf_get SETTING [DEFAULT]
+##
+makepkg_conf_get() {
+ local setting=$1
+ if [[ -f $LIBREHOME/.makepkg.conf ]]; then
+ eval $(grep "^$setting=" "$LIBREHOME/.makepkg.conf")
+ fi
+ if [[ -z ${!setting} ]]; then
+ eval $(grep "^$setting=" "/etc/makepkg.conf")
+ fi
+ if [[ -z ${!setting} && -n ${2} ]]; then
+ eval "$setting='$2'"
+ fi
+}
+
+chroot_makepkg_conf_get() {
+ local setting=$1
+ eval $(grep "^$setting=" "$copydir/etc/makepkg.conf")
+}
+
+chroot_makepkg_conf_set() {
+ local key=$1
+ local val=$2
+ sed -i "/^$KEY=/d" "$copydir/etc/makepkg.conf"
+ echo "$key='$val'" >> "$copydir/etc/makepkg.conf"
+}
+
+# Functions that check for issues with the build ###############################
+
+libre_check_pkgbuild() {
+ msg "Checking PKGBUILD for issues"
+ # TODO
+ if ! pkgbuild-check-nonfree -f; then
+ if [[ $? -eq 15 ]]; then
+ # other errors mean fail, not nonfree
+ error "PKGBUILD contains non-free issues"
+ exit 15
+ else
+ warning "PKGBUILD couldn't be check aganist non-free issues"
+ fi
+ fi
+}
+
+libre_check_src() {
+ msg "Checking src directory for issues"
+ # TODO
+}
+
+libre_check_pkg() {
+ msg "Checking final package for issues"
+ # TODO
+}
+
+
+# The main program #############################################################
+
usage() {
echo 'cd to a dir containing a PKGBUILD and run:'
- echo '$0 [options] [-- makechrootpkg args [-- makepkg args]]'
+ echo '$0 [options] [-- makepkg args]'
echo 'This script will build your package in a chroot.'
echo ''
echo 'OPTIONS:'
echo ' -h Show this message'
echo ''
- echo ' -c Clean the chroot before building'
- echo ' -u Update the chroot before building'
- echo ' -N Do not check freedom issues (for fullpkg)'
- echo ''
+ echo " -R Repackage"
echo " -n <chroot> Use this chroot instead of \`$CHROOT'"
echo ' -l <copy> Use this chroot copy instead of basing it'
echo ' on the username'
}
main() {
- # The logic for setting CHROOTCOPY is mirred from makechrootpkg
- CHROOTCOPY=$USER
- [[ -n $SUDO_USER ]] && CHROOTCOPY=$SUDO_USER
- [[ -z $CHROOTCOPY || $CHROOTCOPY = root ]] && CHROOTCOPY=copy
-
- CLEANFIRST=false
- UPDATEFIRST=false
- CHECKNONFREE=true
+ # Parse command line ###################################################
- makechrootpkg_args=()
+ CHROOTCOPY=$LIBREUSER
+ [[ $CHROOTCOPY != root ]] || CHROOTCOPY=copy
+ makepkg_args=(-s --noconfirm -L)
+ REPACKAGE=false
- while getopts 'hcuNd:n:l:' arg ; do
+ while getopts 'hRn:l:' arg ; do
case "${arg}" in
- c) CLEANFIRST=true;;
- u) UPDATEFIRST=true;;
- N) CHECKNONFREE=false;;
-
n) CHROOT=$OPTARG;;
l) CHROOTCOPY=$OPTARG;;
-
+ R) REPACKAGE=true; makepkg_args+=(-R) ;;
h) usage; exit 0;;
*) usage; exit 1;;
esac
done
shift $(($OPTIND - 1))
- # Pass all arguments after -- right to makechrootpkg
- makechrootpkg_args+=("$@")
+ # Pass all arguments after -- right to makepkg
+ makepkg_args+=("$@")
- # not local
rootdir="${CHROOTDIR}/${CHROOT}/root"
copydir="${CHROOTDIR}/${CHROOT}/${CHROOTCOPY}"
+ # Init #################################################################
+
if (( EUID )); then
error "This script must be run as root"
exit 1
fi
- if [[ ! -e PKGBUILD ]]; then
- error "This isn't a build directory"
+ if [[ ! -f PKGBUILD ]]; then
+ error "This must be run in a directory containing a PKGBUILD"
exit 1
fi
- # OK, we're starting now ###############################################
-
# Trap signals from makepkg
- set -E
trap 'trap_exit "(libremakepkg): TERM signal caught. Exiting..."' TERM HUP QUIT
trap 'trap_exit "(libremakepkg): Aborted by user! Exiting..."' INT
trap 'trap_exit "(libremakepkg): An unknown error has occurred. Exiting..."' ERR
- if $CHECKNONFREE; then
- msg "Checking PKGBUILD for non-free issues"
- if ! pkgbuild-check-nonfree -f; then
- if [[ $? -eq 15 ]]; then
- # other errors mean fail, not nonfree
- error "PKGBUILD contains non-free issues"
- exit 15
- else
- warning "PKGBUILD couldn't be check aganist non-free issues"
- fi
- fi
- fi
+ makepkg_conf_get SRCDEST .
+ makepkg_conf_get PKGDEST .
- if $CLEANFIRST; then
- librechroot -c -d "$CHROOTDIR" -l "$CHROOTCOPY" "$CHROOT"
- fi
+ # OK, we're starting now ###############################################
- if $UPDATEFIRST; then
- librechroot -u -d "$CHROOTDIR" -l "$CHROOTCOPY" "$CHROOT"
- fi
+ lock_open_write 9 "$copydir.lock" "Locking chroot '$copy'"
- unset CLEANFIRST UPDATEFIRST librechroot_args
+ # Set target CARCH as it might be used within the PKGBUILD to select correct sources
+ chroot_makepkg_conf_get CARCH
+ export CARCH
- makechrootpkg "${makechrootpkg_args[@]}" -d -r "$CHROOTDIR/$CHROOT" -l "$CHROOTCOPY"
- ev=$? # exit value
- copy_log
- exit $ev
+ chroot_init
+ libre_check_pkgbuild
+ $REPACKAGE || chroot_extract
+ libre_check_src
+ chroot_build
+ libre_check_pkg
+ copy_pkgs
+ copy_logs
}
main "$@"
diff --git a/src/chroot-tools/libremakepkg.gpl2 b/src/chroot-tools/libremakepkg.gpl2
new file mode 100755
index 0000000..8ca60e0
--- /dev/null
+++ b/src/chroot-tools/libremakepkg.gpl2
@@ -0,0 +1,102 @@
+#!/bin/bash
+# Contains code derived from devtools' "makechrootpkg"
+
+# Copyright 2011-2012 The Arch Linux Development Team
+# Copyright 2012 Luke Shumaker
+#
+# 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.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+chroot_init() {
+ # no-op; make sure the chroot exists
+ librechroot -n -l "$CHROOTCOPY" "$CHROOT"
+
+ if [[ -r "$LIBREHOME/.gnupg/pubring.gpg" ]]; then
+ install -D "$HOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg"
+ fi
+
+ mkdir -p "$copydir/pkgdest"
+ mkdir -p "$copydir/srcdest"
+ chroot_makepkg_conf_set PKGDEST /pkgdest
+ chroot_makepkg_conf_set SRCDEST /srcdest
+
+ 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"
+}
+
+chroot_extract() {
+ rm -rf "$copydir"/build/*
+ cp PKGBUILD "$copydir/build/"
+ (
+ source PKGBUILD
+
+ # Copy source files
+ 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
+ while read -r file; do
+ # evaluate any bash variables used
+ eval file=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "$file")\"
+ if [[ -f $file ]]; then
+ cp "$file" "$copydir/build/"
+ fi
+ done < <(sed -n "s/^[[:space:]]*$i=//p" PKGBUILD)
+ done
+ )
+
+ chown -R nobody "$copydir"/{build,pkgdest,srcdest}
+
+ local file="$copydir/chrootextract"
+ echo '#!/bin/bash' > "$file"
+ echo '. /etc/profile' >> "$file"
+ echo 'export HOME=/build' >> "$file"
+ echo 'cd /build' >> "$file"
+ echo "sudo -u nobody ${MAKEPKG:-makepkg} $makepkg_args -o" >> "$file"
+ chmod 755 "$file"
+ archroot "$copydir" -r /chrootextract
+}
+
+chroot_build() {
+ local file="$copydir/chrootbuild"
+ echo '#!/bin/bash' > "$file"
+ echo '. /etc/profile' >> "$file"
+ echo 'export HOME=/build' >> "$file"
+ echo 'cd /build' >> "$file"
+ echo "sudo -u nobody ${MAKEPKG:-makepkg} $makepkg_args -e" >> "$file"
+ chmod 755 "$file"
+ archroot -N "$copydir" -r /chrootbuild
+}
+
+copy_pkgs() {
+ 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
+
+ chown "$LIBREUSER" "$pkgfile"
+ mv "$pkgfile" "$PKGDEST"
+ if [[ $PKGDEST != . ]]; then
+ ln -s "$PKGDEST/${pkgfile##*/}" .
+ fi
+ done
+}