#!/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 #############################################################
usage() {
echo 'cd to a dir containing a PKGBUILD and run:'
echo '$0 [options] [-- makepkg args]'
echo 'This script will build your package in a chroot.'
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 ''
echo " -m Use the command MAKEPKG instead of 'makepkg'"
echo " -R Repackage"
echo ''
echo ' -h Show this message'
}
main() {
# Parse command line ###################################################
CHROOTCOPY=$LIBREUSER
[[ $CHROOTCOPY != root ]] || CHROOTCOPY=copy
makepkg_args=(-s --noconfirm -L)
REPACKAGE=false
MAKEPKG=makepkg
while getopts 'n:l:m:Rh' arg ; do
case "${arg}" in
n) CHROOT=$OPTARG;;
l) CHROOTCOPY=$OPTARG;;
m) MAKEPKG=$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 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
error "This must be run in a directory containing a PKGBUILD"
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.lock" "Locking chroot '$copy'"
# Set target CARCH as it might be used within the PKGBUILD to select correct sources
chroot_makepkg_conf_get CARCH
export CARCH
chroot_init
libre_check_pkgbuild
$REPACKAGE || chroot_extract
libre_check_src
chroot_build
libre_check_pkg
copy_pkgs
copy_logs
}
main "$@"