#!/bin/bash -euE
# libremakepkg
# Copyright 2010 - 2011 Nicolás Reynolds
# Copyright 2011 Joshua Ismael Haase Hernández
# Copyright 2012-2013 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 .
. $(librelib conf.sh)
load_files chroot
. libremessages
makechrootpkg=$(librelib makechrootpkg)
shopt -s nullglob
umask 0022
# Boring/mundane functions #####################################################
# End inmediately but print a useful message
trap_exit() {
error "$*"
$INCHROOT || chroot_copy_out "$copydir" "$LIBREUSER"
exit 1
}
# Usage run [-N] $copydir "$cmd"
# Runs cmd properly, whether in a chroot already or not.
#
# Note that $cmd is a quoted string, not a list of arguments.
# $copydir=/ if INCHROOT=true
#
# Environment
# - $INCHROOT is set
run() (
local HASNET=true
[[ $1 == -N ]] && { HASNET=false; shift; }
local copydir=$1; shift
local cmd="$*"
if $HASNET; then
trap "rm -f -- '$copydir/chrootexec'" EXIT
else
distcc_start "$copydir"
trap "rm -f -- '$copydir/chrootexec'; distcc_stop '$copydir'" EXIT
fi
cat >"$copydir/chrootexec" < "$home/.makepkg.conf"
printf '%s\n' \
'Host *' \
' ProxyCommand /distcc-tool client %h %p' \
> "$home/.ssh/config"
distcc-tool odaemon "$copydir" &
echo $! > "$copydir/distcc-tool.pid"
fi
}
distcc_stop() {
local copydir=$1
local home=$LIBREHOME
$INCHROOT || home="$copydir/build"
if [[ -f "$copydir/distcc-tool.pid" ]]; then
odaemon=$(cat "$copydir/distcc-tool.pid")
kill -- $odaemon
rm -f -- \
"$copydir/distcc-tool" \
"$home/.makepkg.conf" \
"$home/.ssh/config" \
"$copydir/distcc-tool.pid"
fi
}
# Usage: add_to_local_repo $copydir $pkgfiles...
add_to_local_repo() (
set +euE
. $makechrootpkg
chroot_add_to_local_repo "$@"
)
# Usage: chroot_copy_in $copydir
# Environment:
# - In the dirctory of a PKGBUILD
# - $SRCDEST is set
chroot_copy_in() (
set +euE
. $makechrootpkg
chroot_copy_in "$@"
)
# Usage: chroot_copy_out $copydir $owner
# Environment:
# - $SRCDEST is set
# - $PKGDEST is set
chroot_copy_out() (
set +euE
. $makechrootpkg
chroot_copy_out_pkgs "$@"
chroot_copy_out_logs "$@"
chroot_copy_out_srcs "$@"
)
# Usage: chroot_let_nobody_use_pacman $copydir
chroot_let_nobody_use_pacman() (
set +euE
. $makechrootpkg
chroot_let_nobody_use_pacman "$@"
)
# Usage: chroot_init $copydir $repack
# Environment
# - $LIBREHOME is set
chroot_init() {
local copydir=$1
local repack=$2
librechroot -l "$copydir" make # make sure the chroot exists
mkdir -p "$copydir"/{build,pkgdest,srcdest}
# Remove anything in there UNLESS -R (repack) was passed
$repack || rm -rf "$copydir"/build/*
if [[ -r "$LIBREHOME/.gnupg/pubring.gpg" ]]; then
install -D "$LIBREHOME/.gnupg/pubring.gpg" "$copydir/build/.gnupg/pubring.gpg"
fi
rm -f "$copydir/build/.makepkg.conf"
MAKEPKG_CONF="$copydir/etc/makepkg.conf" set_conf_makepkg PKGDEST /pkgdest
MAKEPKG_CONF="$copydir/etc/makepkg.conf" set_conf_makepkg SRCDEST /srcdest
local PACKAGER="$(get_conf_makepkg PACKAGER .)"
MAKEPKG_CONF="$copydir/etc/makepkg.conf" set_conf_makepkg PACKAGER "$PACKAGER"
unset PACKAGER
if ! grep -q '^\[repo\]' "$copydir/etc/pacman.conf"; then
cat >> "$copydir/etc/pacman.conf" < Name of the chroot to use'
echo ' -l Name of, or absolute path to, the copy to use'
echo " -N Don't disable networking during build() or package()"
echo ' Only use this as a temporary hack to use distcc,'
echo ' until actual distcc support is added.'
echo ' -R Repackage contents of the package without rebuilding'
echo ' -h Show this message'
}
# Globals: $CHROOTDIR, $CHROOT, $COPY and $copydir
# Globals: $makepkg_args, $INCHROOT
main() {
# Parse command line ###################################################
COPY=$LIBREUSER
[[ $COPY != root ]] || COPY=copy
makepkg_args='-s --noconfirm -L '
local repack=false
INCHROOT=false
if [[ -f /.arch-chroot ]]; then
INCHROOT=true
fi
NONET=true
while getopts 'n:l:NRh' arg ; do
case "${arg}" in
n) CHROOT=$OPTARG;;
l) COPY=$OPTARG;;
N) NONET=false;;
R) repack=true; makepkg_args+=" -R";;
h) usage; return 0;;
*) usage; return 1;;
esac
done
shift $(($OPTIND - 1))
# Pass all arguments after -- right to makepkg
makepkg_args+=" $*"
if $INCHROOT; then
copydir='/'
else
check_vars chroot CHROOTDIR CHROOT
if [[ ${COPY:0:1} = / ]]; then
copydir=$COPY
else
copydir="${CHROOTDIR}/${CHROOT}/${COPY}"
fi
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 error has occurred. Exiting..."' ERR
SRCDEST="$(get_conf_makepkg SRCDEST .)"
PKGDEST="$(get_conf_makepkg PKGDEST .)"
# OK, we're starting now ###############################################
$INCHROOT || lock_open_write 9 "$copydir" \
"Waiting for existing lock on chroot copy to be released: [$COPY]"
# 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 "$copydir" "$repack"
check_pkgbuild
$INCHROOT || chroot_copy_in "$copydir"
$repack || extract
check_src
build
check_pkg
add_to_local_repo "$copydir" "$copydir"/pkgdest/*.pkg.tar*
$INCHROOT || chroot_copy_out "$copydir" "$LIBREUSER"
}
main "$@"