#!/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 .
. /usr/share/libretools/conf.sh
load_conf_libretools_chroot
. "$(which libremessages)"
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
}
# 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
SRCDEST="$(get_conf_makepkg SRCDEST .)"
PKGDEST="$(get_conf_makepkg 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
MAKEPKG_CONF=$copydir/etc/makepkg.conf
export CARCH="$(get_conf_makepkg CARCH)"
unset MAKEPKG_CONF
$NOCHROOT || chroot_init
libre_check_pkgbuild
chroot_extract
libre_check_src
chroot_build
libre_check_pkg
$NOCHROOT || copy_pkgs
$NOCHROOT || copy_logs
}
main "$@"