#!/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_exec
# - chroot_copy_in
# - chroot_copy_out
# - add_to_local_repo
# 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
}
extract() {
local user=$LIBREUSER
$INCHROOT || user=nobody
local clean
if $INCHROOT; then
clean=chcleanup
else
cp -a "$(which chcleanup)" "${copydir}/clean"
clean=/clean
fi
chroot_exec "${clean} && sudo -u ${user} ${MAKEPKG} ${makepkg_args} -o"
}
build() {
local user=$LIBREUSER
$INCHROOT || user=nobody
chroot_exec -N "sudo -u ${user} ${MAKEPKG} ${makepkg_args} -e"
}
# Functions that check for issues with the build ###############################
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
}
check_src() {
msg "Checking src directory for issues"
# TODO
}
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 'If run from outside of a chroot, this will set PKGDEST and'
echo "SRCDEST in the chroot's \`/etc/makepkg.conf', as well as making"
echo "whataver alterations to the chroot \`librechroot' makes."
echo ''
echo 'Options:'
echo " -n Use this chroot instead of \`$CHROOT'"
echo " -l Use this chroot copy instead \`$CHROOTCOPY'"
echo " -m Use the command MAKEPKG instead of \'makepkg'"
echo ' -h Show this message'
}
main() {
# Parse command line ###################################################
CHROOTCOPY=$LIBREUSER
[[ $CHROOTCOPY != root ]] || CHROOTCOPY=copy
makepkg_args='-s --noconfirm -L '
MAKEPKG=makepkg
INCHROOT=false
if [[ -f /.arch-chroot ]]; then
INCHROOT=true
fi
while getopts 'n:l:m:Rh' arg ; do
case "${arg}" in
n) CHROOT=$OPTARG;;
l) CHROOTCOPY=$OPTARG;;
m) MAKEPKG=$OPTARG;;
h) usage; exit 0;;
*) usage; exit 1;;
esac
done
shift $(($OPTIND - 1))
# Pass all arguments after -- right to makepkg
makepkg_args+=" $*"
if $INCHROOT; then
copydir=''
else
copydir="${CHROOTDIR}/${CHROOT}/${CHROOTCOPY}"
fi
# 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" \
"Waiting for existing lock on \`$copydir' to be released"
# 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
$INCHROOT || chroot_init
check_pkgbuild
$INCHROOT || chroot_copy_in
extract
check_src
build
check_pkg
add_to_local_repo
$INCHROOT || chroot_copy_out
}
main "$@"