#!/bin/bash -euE # libremakepkg # Copyright 2010 - 2011 Nicolás Reynolds # Copyright 2011 Joshua Ismael Haase Hernández # Copyright 2012 Luke Shumaker # # 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 . . /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_logs() { for l in "$copydir"/build/*.log; do chown "$LIBREUSER" "$l" mv "$l" . done } ## # End inmediately but print a useful message ## trap_exit() { 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 ############################################################# cmd=${0##*/} usage() { echo "Usage: $cmd [options] [-- makepkg args]" echo 'This program will build your package.' echo '' echo 'OPTIONS:' echo " -n Use this chroot instead of \`$CHROOT'" echo ' -l Use this chroot copy instead of basing it' echo ' on the username' echo ' -C Do not use a chroot' echo '' echo " -m Use the command MAKEPKG instead of 'makepkg'" echo '' echo ' -h Show this message' } main() { # Parse command line ################################################### CHROOTCOPY=$LIBREUSER [[ $CHROOTCOPY != root ]] || CHROOTCOPY=copy makepkg_args='-s --noconfirm -L ' MAKEPKG=makepkg NOCHROOT=false while getopts 'n:l:m:Rh' arg ; do case "${arg}" in n) CHROOT=$OPTARG;; l) CHROOTCOPY=$OPTARG;; C) NOCHROOT=true m) MAKEPKG=$OPTARG;; h) usage; exit 0;; *) usage; exit 1;; esac done shift $(($OPTIND - 1)) # Pass all arguments after -- right to makepkg makepkg_args+=" $*" rootdir="${CHROOTDIR}/${CHROOT}/root" copydir="${CHROOTDIR}/${CHROOT}/${CHROOTCOPY}" # Init ################################################################# if (( EUID )); then error "This script must be run as root" exit 1 fi if [[ ! -f PKGBUILD ]]; then # This is the message used by makepkg error "PKGBUILD does not exist" exit 1 fi # Trap signals from makepkg 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 makepkg_conf_get SRCDEST . makepkg_conf_get PKGDEST . # OK, we're starting now ############################################### lock_open_write 9 "$copydir" "Locking chroot '$CHROOTCOPY'" # Set target CARCH as it might be used within the PKGBUILD to select correct sources chroot_makepkg_conf_get CARCH export CARCH $NOCHROOT || chroot_init libre_check_pkgbuild chroot_extract libre_check_src chroot_build libre_check_pkg $NOCHROOT || copy_pkgs $NOCHROOT || copy_logs } main "$@"