diff options
author | Luke Shumaker <LukeShu@sbcglobal.net> | 2012-11-28 19:34:19 -0500 |
---|---|---|
committer | Luke Shumaker <LukeShu@sbcglobal.net> | 2012-11-28 19:34:19 -0500 |
commit | 259c05c47fc43875415d5ecab9666a46fb4b6d76 (patch) | |
tree | 093976c000f7d4e8a48319dcfb4e933489e78ad4 | |
parent | 2a86ab6a3575724412f32fdbd794b0fd2738eb91 (diff) |
Rewrite libremakepkg to not use makechrootpkg
-rwxr-xr-x | src/chroot-tools/libremakepkg | 175 | ||||
-rwxr-xr-x | src/chroot-tools/libremakepkg.gpl2 | 102 |
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 +} |