#!/bin/bash
# Copyright 2010 - 2011 Nicolás Reynolds
# Copyright 2011 Joshua Ismael Haase Hernández
# ---------- 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 .
source /etc/libretools.conf
source /etc/makepkg.conf
# Local vars may differ from chroot's
LOCALPKGDEST=${PKGDEST}
LOCALSRCDEST=${SRCDEST}
LOCALSRCPKGDEST=${SRCPKGDEST}
source ${CHROOTDIR}/${CHROOT}/etc/makepkg.conf
function usage { # Display message and exit
echo 'cd to a dir containing a PKGBUILD and run:'
echo '$0 [options] [makepkg args]'
echo 'This script will build your package on a chroot.'
echo
echo 'OPTIONS:'
echo
echo ' -h show this message.'
echo ' -c cleans the chroot before building.'
echo ' -u updates the chroot before building.'
echo ' -n use this dir instead of "${CHROOT}".'
echo ' -M <--arg> passes long args to makepkg, use it as many times as needed.'
echo
exit 1
}
function buildenv { # Mounts *DEST from makepkg.conf
msg "Building env"
# for mp in SRCDEST PKGDEST SRCPKGDEST; do
# The host system directory
# lmp=LOCAL${mp}
# msg2 "Binding ${!lmp} to ${CHROOTDIR}/${CHROOT}${!mp}"
# mkdir -p "${CHROOTDIR}/${CHROOT}${!mp}"
# mount -o bind ${!lmp} "${CHROOTDIR}/${CHROOT}${!mp}" || exit 1
# done
msg2 "Bind ${CACHEDIR} => ${CHROOTDIR}/${CHROOT}/var/cache/pacman/pkg/"
mount -o bind ${CACHEDIR} ${CHROOTDIR}/${CHROOT}/var/cache/pacman/pkg/
}
function clean_chroot { # Clean packages with pacman
plain "making list of packages in ${CHROOTDIR}/${CHROOTNAME}/root/"
echo "sudo
" > "${CHROOTDIR}/${CHROOTNAME}/root/cleansystem"
pacman -Sgq base base-devel >> "${CHROOTDIR}/${CHROOTNAME}/root/cleansystem"
(cat < "${CHROOTDIR}/${CHROOTNAME}/clean"
chmod +x "${CHROOTDIR}/${CHROOTNAME}/clean"
mkarchroot -r "/clean" "${CHROOTDIR}/${CHROOTNAME}"
}
function copy_log { # copy logs if they exist
if [ "${USE_LOG}" == 'y' ]; then
find ${CHROOTDIR}/${CHROOTNAME}/build/ -name "*\.log" -exec cp {} ./ \;
fi
}
function trap_exit { # End inmediately but print a useful message
# args are treated as part of the message
for mp in ${SRCDEST} ${PKGDEST} ${SRCPKGDEST}; do
umount "${CHROOTDIR}/${CHROOT}${mp}"
done
copy_log
error "$@"
exit 1
}
# 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
CLEAN_FIRST="n"
CLEAN_CACHE=""
UPDATE_FIRST="n"
USE_LOG='n'
CHROOTNAME=${CHROOT}
MAKEPKG_ARGS=""
libremakepkgargs='hcuUn:I:M:' # libremakepkg own args
libremakepkgargs+='ACdefiLmop:rRs' # makepkg args
while getopts ${libremakepkgargs} arg ; do
case "${arg}" in
h) usage ;;
c) CLEAN_FIRST="y" ;;
u) UPDATE_FIRST="y" ;;
n) CHROOTNAME="$OPTARG" ;;
M) MAKEPKG_ARGS+=" $OPTARG" ;;
L) MAKEPKG_ARGS+=" -$arg $OPTARG"
USE_LOG='y';;
*) MAKEPKG_ARGS+=" -$arg $OPTARG" ;;
esac
done
if [ ${UID} -ne 0 ]; then
error "This script must be run as root"
exit 1
fi
if [ ! -r PKGBUILD ]; then # Check if we are actually on a build directory. Do this early.
error "This isn't a build directory"; usage
fi
msg "Checking PKGBUILD for non-free issues"
if ! pkgbuild-check-nonfree; then
if [[ $? -eq 15 ]]; then # other errors mean fail, not nonfree
error "PKGBUILD contains non-free issues"
exit 15
else
true
fi
fi
buildenv
msg "Creating the package"
if [ ! -d "${CHROOTDIR}/${CHROOTNAME}" ]; then # use chroot
mkarchroot -c ${CACHEDIR} -u "${CHROOTDIR}/${CHROOT}" # -c option is for cache
fi
if [ "${CLEAN_FIRST}" = 'y' ]; then
msg "Cleaning"
clean_chroot
fi
if [ "${UPDATE_FIRST}" = 'y' ]; then
msg "Updating the chroot in use..."
mkarchroot -c ${CACHEDIR} -u "${CHROOTDIR}/${CHROOTNAME}" # -c option is for cache
fi
makechrootpkg -r "${CHROOTDIR}" -l "${CHROOTNAME}" -- "${MAKEPKG_ARGS}"
ev=$? # exit value
copy_log
exit $ev