summaryrefslogtreecommitdiff
path: root/src/chroot-tools/libremakepkg
diff options
context:
space:
mode:
Diffstat (limited to 'src/chroot-tools/libremakepkg')
-rwxr-xr-xsrc/chroot-tools/libremakepkg311
1 files changed, 311 insertions, 0 deletions
diff --git a/src/chroot-tools/libremakepkg b/src/chroot-tools/libremakepkg
new file mode 100755
index 0000000..b8cdca1
--- /dev/null
+++ b/src/chroot-tools/libremakepkg
@@ -0,0 +1,311 @@
+#!/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 <http://www.gnu.org/licenses/>.
+
+. /usr/share/libretools/conf.sh
+load_conf_libretools_chroot
+
+. libremessages
+
+shopt -s nullglob
+umask 0022
+
+# Boring/mundane functions #####################################################
+
+# End inmediately but print a useful message
+trap_exit() {
+ error "$*"
+ set +euE
+ . /usr/share/devtools/makechrootpkg.sh
+ chroot_copy_out_logs "$@"
+ 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="$*"
+
+ cat >"$copydir/chrootexec" <<EOF
+#!/bin/bash
+. /etc/profile
+${INCHROOT} || export HOME=/build
+${INCHROOT} || cd /build
+
+${cmd}
+EOF
+ chmod 755 "$copydir/chrootexec"
+
+ local flags=''
+ if $INCHROOT; then
+ $HASNET || flags='-n'
+ unshare $flags -- /chrootexec
+ else
+ $HASNET || flags='-N'
+ librechroot $flags -l "$copydir" run /chrootexec
+ fi
+}
+
+# Usage: add_to_local_repo $copydir
+add_to_local_repo() (
+ set +euE
+ . /usr/share/devtools/makechrootpkg.sh
+ 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
+ . /usr/share/devtools/makechrootpkg.sh
+ chroot_copy_in "$@"
+)
+
+# Usage: chroot_copy_out $copydir $owner
+# Environment:
+# - $SRCDEST is set
+# - $PKGDEST is set
+chroot_copy_out() (
+ set +euE
+ . /usr/share/devtools/makechrootpkg.sh
+ 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
+ . /usr/share/devtools/makechrootpkg.sh
+ 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
+
+ if grep -q '^\[repo\]' "$copydir/etc/pacman.conf"; then
+ cat >> "$copydir/etc/makepkg.conf" <<EOF
+[repo]
+SigLevel = Optional TrustAll
+Server = file:///repo
+EOF
+ fi
+
+ chroot_let_nobody_use_pacman "$copydir"
+}
+
+# Core functions ###############################################################
+
+# Usage: extract
+# Extracts the sources (`makepkg -o`)
+# Environment:
+# - $INCHROOT is set
+# - $copydir is set
+# - $LIBREUSER is set
+extract() {
+ local user=$LIBREUSER
+ $INCHROOT || user=nobody
+
+ local clean
+ if $INCHROOT; then
+ clean=chcleanup
+ else
+ cp -a "$(which chcleanup)" "${copydir}/clean"
+ clean=/clean
+ fi
+
+ run "$copydir" "${clean} && sudo -u ${user} makepkg ${makepkg_args} -o"
+ rm -f "$copydir"/clean
+}
+
+# Usage: build
+# Builds the package (`makepkg -e`)
+# Environment:
+# - $INCHROOT is set
+# - $copydir is set
+# - $LIBREUSER is set
+build() {
+ local user=$LIBREUSER
+ $INCHROOT || user=nobody
+
+ run -N "$copydir" "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 "The \`-n' and \`-l' options behave identically to librechroot,"
+ echo 'see the documentation there.'
+ echo ''
+ echo 'Options:'
+ echo ' -n <CHROOT> Name of the chroot to use'
+ echo ' -l <COPY> Name of, or absolute path to, the copy to use'
+ 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
+
+ while getopts 'n:l:Rh' arg ; do
+ case "${arg}" in
+ n) CHROOT=$OPTARG;;
+ l) COPY=$OPTARG;;
+ 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='/'
+ elif [[ ${COPY:0:1} = / ]]; then
+ copydir=$COPY
+ else
+ copydir="${CHROOTDIR}/${CHROOT}/${COPY}"
+ 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"
+ $INCHROOT || chroot_copy_out "$copydir" "$LIBREUSER"
+}
+
+main "$@"