#!/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 '')" if [[ -n $PACKAGER ]]; then MAKEPKG_CONF="$copydir/etc/makepkg.conf" set_conf_makepkg PACKAGER "$PACKAGER" fi 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 " PLEASE don't use this unless you have a special" echo " reason, its use is a violation of Parabola policy." 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 "$@"