summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbill-auger <mr.j.spam.me@gmail.com>2021-01-22 22:25:56 -0500
committerbill-auger <mr.j.spam.me@gmail.com>2021-01-23 00:54:54 -0500
commit6d81e6c24a3056b6d8c581f740dca3c2ab7c79de (patch)
treeaef7eb136059958c29faae74cec1bd7d87739eac
parent0bcc40ef9af0bd4f06baa8436458ca6fe9844587 (diff)
mergeme - scripts/makepkg.installed-wip -> scripts/makepkg.sh.in
-rwxr-xr-xscripts/makepkg.installed-wip1567
1 files changed, 1567 insertions, 0 deletions
diff --git a/scripts/makepkg.installed-wip b/scripts/makepkg.installed-wip
new file mode 100755
index 00000000..f6724d2d
--- /dev/null
+++ b/scripts/makepkg.installed-wip
@@ -0,0 +1,1567 @@
+#!/usr/bin/bash
+#
+# makepkg - make packages compatible for use with pacman
+# Generated from makepkg.sh.in; do not edit by hand.
+#
+# Copyright (c) 2006-2020 Pacman Development Team <pacman-dev@archlinux.org>
+# Copyright (c) 2002-2006 by Judd Vinet <jvinet@zeroflux.org>
+# Copyright (c) 2005 by Aurelien Foret <orelien@chez.com>
+# Copyright (c) 2006 by Miklos Vajna <vmiklos@frugalware.org>
+# Copyright (c) 2005 by Christian Hamar <krics@linuxforum.hu>
+# Copyright (c) 2006 by Alex Smith <alex@alex-smith.me.uk>
+# Copyright (c) 2006 by Andras Voroskoi <voroskoi@frugalware.org>
+#
+# This program 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+# makepkg uses quite a few external programs during its execution. You
+# need to have at least the following installed for makepkg to function:
+# awk, bsdtar (libarchive), bzip2, coreutils, fakeroot, file, find (findutils),
+# gettext, gpg, grep, gzip, sed, tput (ncurses), xz
+
+# gettext initialization
+export TEXTDOMAIN='pacman-scripts'
+export TEXTDOMAINDIR='/usr/share/locale'
+
+# file -i does not work on Mac OSX unless legacy mode is set
+export COMMAND_MODE='legacy'
+# Ensure CDPATH doesn't screw with our cd calls
+unset CDPATH
+# Ensure GREP_OPTIONS doesn't screw with our grep calls
+unset GREP_OPTIONS
+
+declare -r makepkg_version='5.2.2'
+declare -r confdir='/etc'
+declare -r BUILDSCRIPT='PKGBUILD'
+declare -r startdir="$(pwd -P)"
+
+LIBRARY=${LIBRARY:-'/usr/share/makepkg'}
+
+# Options
+ASDEPS=0
+BUILDFUNC=0
+BUILDPKG=1
+CHECKFUNC=0
+CLEANBUILD=0
+CLEANUP=0
+DEP_BIN=0
+FORCE=0
+GENINTEG=0
+HOLDVER=0
+IGNOREARCH=0
+INFAKEROOT=0
+INSTALL=0
+LOGGING=0
+NEEDED=0
+NOARCHIVE=0
+NOBUILD=0
+NODEPS=0
+NOEXTRACT=0
+PKGFUNC=0
+PKGVERFUNC=0
+PREPAREFUNC=0
+REPKG=0
+REPRODUCIBLE=0
+RMDEPS=0
+SKIPCHECKSUMS=0
+SKIPPGPCHECK=0
+SIGNPKG=''
+SPLITPKG=0
+SOURCEONLY=0
+VERIFYSOURCE=0
+
+if [[ -n $SOURCE_DATE_EPOCH ]]; then
+ REPRODUCIBLE=1
+else
+ SOURCE_DATE_EPOCH=$(date +%s)
+fi
+export SOURCE_DATE_EPOCH
+
+PACMAN_OPTS=()
+
+shopt -s extglob
+
+### SUBROUTINES ###
+
+# Import libmakepkg
+for lib in "$LIBRARY"/*.sh; do
+ source "$lib"
+done
+
+##
+# Special exit call for traps, Don't print any error messages when inside,
+# the fakeroot call, the error message will be printed by the main call.
+##
+trap_exit() {
+ local signal=$1; shift
+
+ if (( ! INFAKEROOT )); then
+ echo
+ error "$@"
+ fi
+ [[ -n $srclinks ]] && rm -rf "$srclinks"
+
+ # unset the trap for this signal, and then call the default handler
+ trap -- "$signal"
+ kill "-$signal" "$$"
+}
+
+
+##
+# Clean up function. Called automatically when the script exits.
+##
+clean_up() {
+ local EXIT_CODE=$?
+
+ if (( INFAKEROOT )); then
+ # Don't clean up when leaving fakeroot, we're not done yet.
+ return 0
+ fi
+
+ if [[ -p $logpipe ]]; then
+ rm "$logpipe"
+ fi
+
+ if (( (EXIT_CODE == E_OK || EXIT_CODE == E_INSTALL_FAILED) && BUILDPKG && CLEANUP )); then
+ local pkg file
+
+ # If it's a clean exit and -c/--clean has been passed...
+ msg "$(gettext "Cleaning up...")"
+ rm -rf "$pkgdirbase" "$srcdir"
+ if [[ -n $pkgbase ]]; then
+ local fullver=$(get_full_version)
+ # Can't do this unless the BUILDSCRIPT has been sourced.
+ if (( PKGVERFUNC )); then
+ rm -f "${pkgbase}-${fullver}-${CARCH}-pkgver.log"*
+ fi
+ if (( PREPAREFUNC )); then
+ rm -f "${pkgbase}-${fullver}-${CARCH}-prepare.log"*
+ fi
+ if (( BUILDFUNC )); then
+ rm -f "${pkgbase}-${fullver}-${CARCH}-build.log"*
+ fi
+ if (( CHECKFUNC )); then
+ rm -f "${pkgbase}-${fullver}-${CARCH}-check.log"*
+ fi
+ if (( PKGFUNC )); then
+ rm -f "${pkgbase}-${fullver}-${CARCH}-package.log"*
+ elif (( SPLITPKG )); then
+ for pkg in ${pkgname[@]}; do
+ rm -f "${pkgbase}-${fullver}-${CARCH}-package_${pkg}.log"*
+ done
+ fi
+
+ # clean up dangling symlinks to packages
+ for pkg in ${pkgname[@]}; do
+ for file in ${pkg}-*-*-*{${PKGEXT},${SRCEXT}}; do
+ if [[ -h $file && ! -e $file ]]; then
+ rm -f "$file"
+ fi
+ done
+ done
+ fi
+ fi
+
+ if ! remove_deps && (( EXIT_CODE == E_OK )); then
+ exit $E_REMOVE_DEPS_FAILED
+ else
+ exit $EXIT_CODE
+ fi
+}
+
+enter_fakeroot() {
+ msg "$(gettext "Entering %s environment...")" "fakeroot"
+ fakeroot -- bash -$- "${BASH_SOURCE[0]}" -F "${ARGLIST[@]}" || exit $?
+}
+
+# Automatically update pkgver variable if a pkgver() function is provided
+# Re-sources the PKGBUILD afterwards to allow for other variables that use $pkgver
+update_pkgver() {
+ msg "$(gettext "Starting %s()...")" "pkgver"
+ newpkgver=$(run_function_safe pkgver)
+ if (( $? != 0 )); then
+ error_function pkgver
+ fi
+ if ! check_pkgver "$newpkgver"; then
+ error "$(gettext "pkgver() generated an invalid version: %s")" "$newpkgver"
+ exit $E_PKGBUILD_ERROR
+ fi
+
+ if [[ -n $newpkgver && $newpkgver != "$pkgver" ]]; then
+ if [[ -f $BUILDFILE && -w $BUILDFILE ]]; then
+ if ! /usr/bin/sed --follow-symlinks -i "s:^pkgver=[^ ]*:pkgver=$newpkgver:" "$BUILDFILE"; then
+ error "$(gettext "Failed to update %s from %s to %s")" \
+ "pkgver" "$pkgver" "$newpkgver"
+ exit $E_PKGBUILD_ERROR
+ fi
+ /usr/bin/sed --follow-symlinks -i "s:^pkgrel=[^ ]*:pkgrel=1:" "$BUILDFILE"
+ source_safe "$BUILDFILE"
+ local fullver=$(get_full_version)
+ msg "$(gettext "Updated version: %s")" "$pkgbase $fullver"
+ else
+ warning "$(gettext "%s is not writeable -- pkgver will not be updated")" \
+ "$BUILDFILE"
+ fi
+ fi
+}
+
+# Print 'source not found' error message and exit makepkg
+missing_source_file() {
+ error "$(gettext "Unable to find source file %s.")" "$(get_filename "$1")"
+ plainerr "$(gettext "Aborting...")"
+ exit $E_MISSING_FILE
+}
+
+run_pacman() {
+ local cmd
+ if [[ $1 = -@(T|Q)*([[:alpha:]]) ]]; then
+ cmd=("$PACMAN_PATH" "$@")
+ else
+ cmd=("$PACMAN_PATH" "${PACMAN_OPTS[@]}" "$@")
+ if type -p sudo >/dev/null; then
+ cmd=(sudo "${cmd[@]}")
+ else
+ cmd=(su root -c "$(printf '%q ' "${cmd[@]}")")
+ fi
+ local lockfile="$(pacman-conf DBPath)/db.lck"
+ while [[ -f $lockfile ]]; do
+ local timer=0
+ msg "$(gettext "Pacman is currently in use, please wait...")"
+ while [[ -f $lockfile ]] && (( timer < 10 )); do
+ (( ++timer ))
+ sleep 3
+ done
+ done
+ fi
+ "${cmd[@]}"
+}
+
+check_deps() {
+ (( $# > 0 )) || return 0
+
+ local ret=0
+ local pmout
+ pmout=$(run_pacman -T "$@")
+ ret=$?
+
+ if (( ret == 127 )); then #unresolved deps
+ printf "%s\n" "$pmout"
+ elif (( ret )); then
+ error "$(gettext "'%s' returned a fatal error (%i): %s")" "$PACMAN" "$ret" "$pmout"
+ return "$ret"
+ fi
+}
+
+handle_deps() {
+ local R_DEPS_SATISFIED=0
+ local R_DEPS_MISSING=1
+
+ (( $# == 0 )) && return $R_DEPS_SATISFIED
+
+ local deplist=("$@")
+
+ if (( ! DEP_BIN )); then
+ return $R_DEPS_MISSING
+ fi
+
+ if (( DEP_BIN )); then
+ # install missing deps from binary packages (using pacman -S)
+ msg "$(gettext "Installing missing dependencies...")"
+
+ if ! run_pacman -S --asdeps "${deplist[@]}"; then
+ error "$(gettext "'%s' failed to install missing dependencies.")" "$PACMAN"
+ return $R_DEPS_MISSING
+ fi
+ fi
+
+ # we might need the new system environment
+ # save our shell options and turn off extglob
+ local shellopts=$(shopt -p extglob)
+ shopt -u extglob
+ source /etc/profile &>/dev/null
+ eval "$shellopts"
+
+ # umask might have been changed in /etc/profile
+ # ensure that sane default is set again
+ umask 0022
+
+ return $R_DEPS_SATISFIED
+}
+
+resolve_deps() {
+ local R_DEPS_SATISFIED=0
+ local R_DEPS_MISSING=1
+
+ # deplist cannot be declared like this: local deplist=$(foo)
+ # Otherwise, the return value will depend on the assignment.
+ local deplist
+ deplist=($(check_deps "$@")) || exit $E_INSTALL_DEPS_FAILED
+ [[ -z $deplist ]] && return $R_DEPS_SATISFIED
+
+ if handle_deps "${deplist[@]}"; then
+ # check deps again to make sure they were resolved
+ deplist=$(check_deps "$@")
+ [[ -z $deplist ]] && return $R_DEPS_SATISFIED
+ fi
+
+ msg "$(gettext "Missing dependencies:")"
+ local dep
+ for dep in ${deplist[@]}; do
+ msg2 "$dep"
+ done
+
+ return $R_DEPS_MISSING
+}
+
+remove_deps() {
+ (( ! RMDEPS )) && return 0
+
+ # check for packages removed during dependency install (e.g. due to conflicts)
+ # removing all installed packages is risky in this case
+ if [[ -n $(grep -xvFf <(printf '%s\n' "${current_pkglist[@]}") \
+ <(printf '%s\n' "${original_pkglist[@]}")) ]]; then
+ warning "$(gettext "Failed to remove installed dependencies.")"
+ return $E_REMOVE_DEPS_FAILED
+ fi
+
+ local deplist
+ deplist=($(grep -xvFf <(printf "%s\n" "${original_pkglist[@]}") \
+ <(printf "%s\n" "${current_pkglist[@]}")))
+ if [[ -z $deplist ]]; then
+ return 0
+ fi
+
+ msg "Removing installed dependencies..."
+ # exit cleanly on failure to remove deps as package has been built successfully
+ if ! run_pacman -Rnu ${deplist[@]}; then
+ warning "$(gettext "Failed to remove installed dependencies.")"
+ return $E_REMOVE_DEPS_FAILED
+ fi
+}
+
+error_function() {
+ # first exit all subshells, then print the error
+ if (( ! BASH_SUBSHELL )); then
+ error "$(gettext "A failure occurred in %s().")" "$1"
+ plainerr "$(gettext "Aborting...")"
+ fi
+ exit $E_USER_FUNCTION_FAILED
+}
+
+merge_arch_attrs() {
+ local attr supported_attrs=(
+ provides conflicts depends replaces optdepends
+ makedepends checkdepends)
+
+ for attr in "${supported_attrs[@]}"; do
+ eval "$attr+=(\"\${${attr}_$CARCH[@]}\")"
+ done
+
+ # ensure that calling this function is idempotent.
+ unset -v "${supported_attrs[@]/%/_$CARCH}"
+}
+
+source_buildfile() {
+ source_safe "$@"
+}
+
+run_function_safe() {
+ local restoretrap restoreshopt
+
+ # we don't set any special shopts of our own, but we don't want the user to
+ # muck with our environment.
+ restoreshopt=$(shopt -p)
+
+ # localize 'set' shell options to this function - this does not work for shopt
+ local -
+ shopt -o -s errexit errtrace
+
+ restoretrap=$(trap -p ERR)
+ trap "error_function '$1'" ERR
+
+ run_function "$1"
+
+ trap - ERR
+ eval "$restoretrap"
+ eval "$restoreshopt"
+}
+
+run_function() {
+ if [[ -z $1 ]]; then
+ return 1
+ fi
+ local pkgfunc="$1"
+
+ if (( ! BASH_SUBSHELL )); then
+ msg "$(gettext "Starting %s()...")" "$pkgfunc"
+ fi
+ cd_safe "$srcdir"
+
+ local ret=0
+ if (( LOGGING )); then
+ local fullver=$(get_full_version)
+ local BUILDLOG="$LOGDEST/${pkgbase}-${fullver}-${CARCH}-$pkgfunc.log"
+ if [[ -f $BUILDLOG ]]; then
+ local i=1
+ while true; do
+ if [[ -f $BUILDLOG.$i ]]; then
+ i=$(($i +1))
+ else
+ break
+ fi
+ done
+ mv "$BUILDLOG" "$BUILDLOG.$i"
+ fi
+
+ # ensure overridden package variables survive tee with split packages
+ logpipe=$(mktemp -u "$LOGDEST/logpipe.XXXXXXXX")
+ mkfifo "$logpipe"
+ tee "$BUILDLOG" < "$logpipe" &
+ local teepid=$!
+
+ $pkgfunc &>"$logpipe"
+
+ wait -f $teepid
+ rm "$logpipe"
+ else
+ "$pkgfunc"
+ fi
+}
+
+run_prepare() {
+ run_function_safe "prepare"
+}
+
+run_build() {
+ run_function_safe "build"
+}
+
+run_check() {
+ run_function_safe "check"
+}
+
+run_package() {
+ run_function_safe "package${1:+_$1}"
+}
+
+find_libdepends() {
+ local d sodepends
+
+ sodepends=0
+ for d in "${depends[@]}"; do
+ if [[ $d = *.so ]]; then
+ sodepends=1
+ break
+ fi
+ done
+
+ if (( sodepends == 0 )); then
+ (( ${#depends[@]} )) && printf '%s\n' "${depends[@]}"
+ return 0
+ fi
+
+ local libdeps filename soarch sofile soname soversion
+ declare -A libdeps
+
+ while IFS= read -rd '' filename; do
+ # get architecture of the file; if soarch is empty it's not an ELF binary
+ soarch=$(LC_ALL=C readelf -h "$filename" 2>/dev/null | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p')
+ [[ -n "$soarch" ]] || continue
+
+ # process all libraries needed by the binary
+ for sofile in $(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -nr 's/.*Shared library: \[(.*)\].*/\1/p')
+ do
+ # extract the library name: libfoo.so
+ soname="${sofile%.so?(+(.+([0-9])))}".so
+ # extract the major version: 1
+ soversion="${sofile##*\.so\.}"
+
+ if [[ ${libdeps[$soname]} ]]; then
+ if [[ ${libdeps[$soname]} != *${soversion}-${soarch}* ]]; then
+ libdeps[$soname]+=" ${soversion}-${soarch}"
+ fi
+ else
+ libdeps[$soname]="${soversion}-${soarch}"
+ fi
+ done
+ done < <(find "$pkgdir" -type f -perm -u+x -print0)
+
+ local libdepends v
+ for d in "${depends[@]}"; do
+ case "$d" in
+ *.so)
+ if [[ ${libdeps[$d]} ]]; then
+ for v in ${libdeps[$d]}; do
+ libdepends+=("$d=$v")
+ done
+ else
+ warning "$(gettext "Library listed in %s is not required by any files: %s")" "'depends'" "$d"
+ libdepends+=("$d")
+ fi
+ ;;
+ *)
+ libdepends+=("$d")
+ ;;
+ esac
+ done
+
+ (( ${#libdepends[@]} )) && printf '%s\n' "${libdepends[@]}"
+}
+
+
+find_libprovides() {
+ local p libprovides missing
+ for p in "${provides[@]}"; do
+ missing=0
+ case "$p" in
+ *.so)
+ mapfile -t filename < <(find "$pkgdir" -type f -name $p\* | LC_ALL=C sort)
+ if [[ $filename ]]; then
+ # packages may provide multiple versions of the same library
+ for fn in "${filename[@]}"; do
+ # check if we really have a shared object
+ if LC_ALL=C readelf -h "$fn" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then
+ # get the string binaries link to (e.g. libfoo.so.1.2 -> libfoo.so.1)
+ local sofile=$(LC_ALL=C readelf -d "$fn" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p')
+ if [[ -z "$sofile" ]]; then
+ warning "$(gettext "Library listed in %s is not versioned: %s")" "'provides'" "$p"
+ libprovides+=("$p")
+ continue
+ fi
+
+ # get the library architecture (32 or 64 bit)
+ local soarch=$(LC_ALL=C readelf -h "$fn" | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p')
+
+ # extract the library major version
+ local soversion="${sofile##*\.so\.}"
+
+ libprovides+=("${p}=${soversion}-${soarch}")
+ else
+ warning "$(gettext "Library listed in %s is not a shared object: %s")" "'provides'" "$p"
+ libprovides+=("$p")
+ fi
+ done
+ else
+ libprovides+=("$p")
+ missing=1
+ fi
+ ;;
+ *)
+ libprovides+=("$p")
+ ;;
+ esac
+
+ if (( missing )); then
+ warning "$(gettext "Cannot find library listed in %s: %s")" "'provides'" "$p"
+ fi
+ done
+
+ (( ${#libprovides[@]} )) && printf '%s\n' "${libprovides[@]}"
+}
+
+write_kv_pair() {
+ local key="$1"
+ shift
+
+ for val in "$@"; do
+ if [[ $val = *$'\n'* ]]; then
+ error "$(gettext "Invalid value for %s: %s")" "$key" "$val"
+ exit $E_PKGBUILD_ERROR
+ fi
+ printf "%s = %s\n" "$key" "$val"
+ done
+}
+
+write_pkginfo() {
+ local size=$(dirsize)
+
+ merge_arch_attrs
+
+ printf "# Generated by makepkg %s\n" "$makepkg_version"
+ printf "# using %s\n" "$(fakeroot -v)"
+
+ write_kv_pair "pkgname" "$pkgname"
+ write_kv_pair "pkgbase" "$pkgbase"
+
+ local fullver=$(get_full_version)
+ write_kv_pair "pkgver" "$fullver"
+
+ # TODO: all fields should have this treatment
+ local spd="${pkgdesc//+([[:space:]])/ }"
+ spd=("${spd[@]#[[:space:]]}")
+ spd=("${spd[@]%[[:space:]]}")
+
+ write_kv_pair "pkgdesc" "$spd"
+ write_kv_pair "url" "$url"
+ write_kv_pair "builddate" "$SOURCE_DATE_EPOCH"
+ write_kv_pair "packager" "$PACKAGER"
+ write_kv_pair "size" "$size"
+ write_kv_pair "arch" "$pkgarch"
+
+ mapfile -t provides < <(find_libprovides)
+ mapfile -t depends < <(find_libdepends)
+
+ write_kv_pair "license" "${license[@]}"
+ write_kv_pair "replaces" "${replaces[@]}"
+ write_kv_pair "group" "${groups[@]}"
+ write_kv_pair "conflict" "${conflicts[@]}"
+ write_kv_pair "provides" "${provides[@]}"
+ write_kv_pair "backup" "${backup[@]}"
+ write_kv_pair "depend" "${depends[@]}"
+ write_kv_pair "optdepend" "${optdepends[@]//+([[:space:]])/ }"
+ write_kv_pair "makedepend" "${makedepends[@]}"
+ write_kv_pair "checkdepend" "${checkdepends[@]}"
+}
+
+write_buildinfo() {
+ write_kv_pair "format" "1"
+
+ write_kv_pair "pkgname" "$pkgname"
+ write_kv_pair "pkgbase" "$pkgbase"
+
+ local fullver=$(get_full_version)
+ write_kv_pair "pkgver" "$fullver"
+
+ write_kv_pair "pkgarch" "$pkgarch"
+
+ local sum="$(sha256sum "${BUILDFILE}")"
+ sum=${sum%% *}
+ write_kv_pair "pkgbuild_sha256sum" $sum
+
+ write_kv_pair "packager" "${PACKAGER}"
+ write_kv_pair "builddate" "${SOURCE_DATE_EPOCH}"
+ write_kv_pair "builddir" "${BUILDDIR}"
+ write_kv_pair "buildenv" "${BUILDENV[@]}"
+ write_kv_pair "options" "${OPTIONS[@]}"
+
+ local pkginfos_parsed=($(LC_ALL=C run_pacman -Qi | awk -F': ' '\
+ /^Name .*/ {printf "%s", $2} \
+ /^Version .*/ {printf "-%s", $2} \
+ /^Architecture .*/ {print "-"$2} \
+ '))
+
+ write_kv_pair "installed" "${pkginfos_parsed[@]}"
+}
+
+# build a sorted NUL-separated list of the full contents of the current
+# directory suitable for passing to `bsdtar --files-from`
+# database files are placed at the beginning of the package regardless of
+# sorting
+list_package_files() {
+ (
+ export LC_COLLATE=C
+ shopt -s dotglob globstar
+ # bash 5.0 only works with combo directory + file globs
+ printf '%s\0' **/*
+ )
+}
+
+create_package() {
+ (( NOARCHIVE )) && return 0
+
+ if [[ ! -d $pkgdir ]]; then
+ error "$(gettext "Missing %s directory.")" "\$pkgdir/"
+ plainerr "$(gettext "Aborting...")"
+ exit $E_MISSING_PKGDIR
+ fi
+
+ cd_safe "$pkgdir"
+ msg "$(gettext "Creating package \"%s\"...")" "$pkgname"
+
+ pkgarch=$(get_pkg_arch)
+ msg2 "$(gettext "Generating %s file...")" ".PKGINFO"
+ write_pkginfo > .PKGINFO
+ msg2 "$(gettext "Generating %s file...")" ".BUILDINFO"
+ write_buildinfo > .BUILDINFO
+
+ # check for changelog/install files
+ for i in 'changelog/.CHANGELOG' 'install/.INSTALL'; do
+ IFS='/' read -r orig dest < <(printf '%s\n' "$i")
+
+ if [[ -n ${!orig} ]]; then
+ msg2 "$(gettext "Adding %s file...")" "$orig"
+ if ! cp "$startdir/${!orig}" "$dest"; then
+ error "$(gettext "Failed to add %s file to package.")" "$orig"
+ exit $E_MISSING_FILE
+ fi
+ chmod 644 "$dest"
+ fi
+ done
+
+ # tar it up
+ local fullver=$(get_full_version)
+ local pkg_file="$PKGDEST/${pkgname}-${fullver}-${pkgarch}${PKGEXT}"
+ local ret=0
+
+ [[ -f $pkg_file ]] && rm -f "$pkg_file"
+ [[ -f $pkg_file.sig ]] && rm -f "$pkg_file.sig"
+
+ # ensure all elements of the package have the same mtime
+ find . -exec touch -h -d @$SOURCE_DATE_EPOCH {} +
+
+ msg2 "$(gettext "Generating .MTREE file...")"
+ list_package_files | LANG=C bsdtar -cnf - --format=mtree \
+ --options='!all,use-set,type,uid,gid,mode,time,size,md5,sha256,link' \
+ --null --files-from - --exclude .MTREE | gzip -c -f -n > .MTREE
+ touch -d @$SOURCE_DATE_EPOCH .MTREE
+
+ msg2 "$(gettext "Compressing package...")"
+ # TODO: Maybe this can be set globally for robustness
+ shopt -s -o pipefail
+ list_package_files | LANG=C bsdtar --no-fflags -cnf - --null --files-from - |
+ compress_as "$PKGEXT" > "${pkg_file}" || ret=$?
+
+ shopt -u -o pipefail
+
+ if (( ret )); then
+ error "$(gettext "Failed to create package file.")"
+ exit $E_PACKAGE_FAILED
+ fi
+}
+
+create_debug_package() {
+ # check if a debug package was requested
+ if ! check_option "debug" "y" || ! check_option "strip" "y"; then
+ return 0
+ fi
+
+ local pkgdir="$pkgdirbase/$pkgbase-debug"
+
+ # check if we have any debug symbols to package
+ if dir_is_empty "$pkgdir/usr/lib/debug"; then
+ return 0
+ fi
+
+ unset groups depends optdepends provides conflicts replaces backup install changelog
+
+ local pkg
+ for pkg in ${pkgname[@]}; do
+ if [[ $pkg != $pkgbase ]]; then
+ provides+=("$pkg-debug")
+ fi
+ done
+
+ pkgdesc="Detached debugging symbols for $pkgname"
+ pkgname=$pkgbase-debug
+
+ create_package
+}
+
+create_srcpackage() {
+ local ret=0
+ msg "$(gettext "Creating source package...")"
+ local srclinks="$(mktemp -d "$startdir"/srclinks.XXXXXXXXX)"
+ mkdir "${srclinks}"/${pkgbase}
+
+ msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
+ ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"
+
+ msg2 "$(gettext "Generating %s file...")" .SRCINFO
+ write_srcinfo > "$srclinks/$pkgbase"/.SRCINFO
+
+ local file all_sources
+
+ get_all_sources 'all_sources'
+ for file in "${all_sources[@]}"; do
+ if [[ "$file" = "$(get_filename "$file")" ]] || (( SOURCEONLY == 2 )); then
+ local absfile
+ absfile=$(get_filepath "$file") || missing_source_file "$file"
+ msg2 "$(gettext "Adding %s...")" "${absfile##*/}"
+ ln -s "$absfile" "$srclinks/$pkgbase"
+ fi
+ done
+
+ # set pkgname the same way we do for running package(), this way we get
+ # the right value in extract_function_variable
+ local pkgname_backup=(${pkgname[@]})
+ local i pkgname
+ for i in 'changelog' 'install'; do
+ local file files
+
+ [[ ${!i} ]] && files+=("${!i}")
+ for pkgname in "${pkgname_backup[@]}"; do
+ if extract_function_variable "package_$pkgname" "$i" 0 file; then
+ files+=("$file")
+ fi
+ done
+
+ for file in "${files[@]}"; do
+ if [[ $file && ! -f "${srclinks}/${pkgbase}/$file" ]]; then
+ msg2 "$(gettext "Adding %s file (%s)...")" "$i" "${file}"
+ ln -s "${startdir}/$file" "${srclinks}/${pkgbase}/"
+ fi
+ done
+ done
+ pkgname=(${pkgname_backup[@]})
+
+ local fullver=$(get_full_version)
+ local pkg_file="$SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT}"
+
+ # tar it up
+ msg2 "$(gettext "Compressing source package...")"
+ cd_safe "${srclinks}"
+
+ # TODO: Maybe this can be set globally for robustness
+ shopt -s -o pipefail
+ LANG=C bsdtar --no-fflags -cLf - ${pkgbase} | compress_as "$SRCEXT" > "${pkg_file}" || ret=$?
+
+ shopt -u -o pipefail
+
+ if (( ret )); then
+ error "$(gettext "Failed to create source package file.")"
+ exit $E_PACKAGE_FAILED
+ fi
+
+ cd_safe "${startdir}"
+ rm -rf "${srclinks}"
+}
+
+install_package() {
+ (( ! INSTALL )) && return 0
+
+ remove_deps || return $?
+ RMDEPS=0
+
+ if (( ! SPLITPKG )); then
+ msg "$(gettext "Installing package %s with %s...")" "$pkgname" "$PACMAN -U"
+ else
+ msg "$(gettext "Installing %s package group with %s...")" "$pkgbase" "$PACMAN -U"
+ fi
+
+ local fullver pkgarch pkg pkglist
+ (( ASDEPS )) && pkglist+=('--asdeps')
+ (( NEEDED )) && pkglist+=('--needed')
+
+ for pkg in ${pkgname[@]}; do
+ fullver=$(get_full_version)
+ pkgarch=$(get_pkg_arch $pkg)
+ pkglist+=("$PKGDEST/${pkg}-${fullver}-${pkgarch}${PKGEXT}")
+
+ if [[ -f "$PKGDEST/${pkg}-debug-${fullver}-${pkgarch}${PKGEXT}" ]]; then
+ pkglist+=("$PKGDEST/${pkg}-debug-${fullver}-${pkgarch}${PKGEXT}")
+ fi
+ done
+
+ if ! run_pacman -U "${pkglist[@]}"; then
+ warning "$(gettext "Failed to install built package(s).")"
+ return $E_INSTALL_FAILED
+ fi
+}
+
+check_build_status() {
+ if (( ! SPLITPKG )); then
+ fullver=$(get_full_version)
+ pkgarch=$(get_pkg_arch)
+ if [[ -f $PKGDEST/${pkgname}-${fullver}-${pkgarch}${PKGEXT} ]] \
+ && ! (( FORCE || SOURCEONLY || NOBUILD || NOARCHIVE)); then
+ if (( INSTALL )); then
+ warning "$(gettext "A package has already been built, installing existing package...")"
+ install_package
+ exit $?
+ else
+ error "$(gettext "A package has already been built. (use %s to overwrite)")" "-f"
+ exit $E_ALREADY_BUILT
+ fi
+ fi
+ else
+ allpkgbuilt=1
+ somepkgbuilt=0
+ for pkg in ${pkgname[@]}; do
+ fullver=$(get_full_version)
+ pkgarch=$(get_pkg_arch $pkg)
+ if [[ -f $PKGDEST/${pkg}-${fullver}-${pkgarch}${PKGEXT} ]]; then
+ somepkgbuilt=1
+ else
+ allpkgbuilt=0
+ fi
+ done
+ if ! (( FORCE || SOURCEONLY || NOBUILD || NOARCHIVE)); then
+ if (( allpkgbuilt )); then
+ if (( INSTALL )); then
+ warning "$(gettext "The package group has already been built, installing existing packages...")"
+ install_package
+ exit $?
+ else
+ error "$(gettext "The package group has already been built. (use %s to overwrite)")" "-f"
+ exit $E_ALREADY_BUILT
+ fi
+ fi
+ if (( somepkgbuilt && ! PKGVERFUNC )); then
+ error "$(gettext "Part of the package group has already been built. (use %s to overwrite)")" "-f"
+ exit $E_ALREADY_BUILT
+ fi
+ fi
+ unset allpkgbuilt somepkgbuilt
+ fi
+}
+
+backup_package_variables() {
+ local var
+ for var in ${pkgbuild_schema_package_overrides[@]}; do
+ local indirect="${var}_backup"
+ eval "${indirect}=(\"\${$var[@]}\")"
+ done
+}
+
+restore_package_variables() {
+ local var
+ for var in ${pkgbuild_schema_package_overrides[@]}; do
+ local indirect="${var}_backup"
+ if [[ -n ${!indirect} ]]; then
+ eval "${var}=(\"\${$indirect[@]}\")"
+ else
+ unset ${var}
+ fi
+ done
+}
+
+run_single_packaging() {
+ local pkgdir="$pkgdirbase/$pkgname"
+ mkdir "$pkgdir"
+ if [[ -n $1 ]] || (( PKGFUNC )); then
+ run_package $1
+ fi
+ tidy_install
+ lint_package || exit $E_PACKAGE_FAILED
+ create_package
+}
+
+run_split_packaging() {
+ local pkgname_backup=("${pkgname[@]}")
+ backup_package_variables
+ for pkgname in ${pkgname_backup[@]}; do
+ run_single_packaging $pkgname
+ restore_package_variables
+ done
+ pkgname=("${pkgname_backup[@]}")
+}
+
+usage() {
+ printf "makepkg (pacman) %s\n" "$makepkg_version"
+ echo
+ printf -- "$(gettext "Make packages compatible for use with pacman")\n"
+ echo
+ printf -- "$(gettext "Usage: %s [options]")\n" "$0"
+ echo
+ printf -- "$(gettext "Options:")\n"
+ printf -- "$(gettext " -A, --ignorearch Ignore incomplete %s field in %s")\n" "arch" "$BUILDSCRIPT"
+ printf -- "$(gettext " -c, --clean Clean up work files after build")\n"
+ printf -- "$(gettext " -C, --cleanbuild Remove %s dir before building the package")\n" "\$srcdir/"
+ printf -- "$(gettext " -d, --nodeps Skip all dependency checks")\n"
+ printf -- "$(gettext " -e, --noextract Do not extract source files (use existing %s dir)")\n" "\$srcdir/"
+ printf -- "$(gettext " -f, --force Overwrite existing package")\n"
+ printf -- "$(gettext " -g, --geninteg Generate integrity checks for source files")\n"
+ printf -- "$(gettext " -h, --help Show this help message and exit")\n"
+ printf -- "$(gettext " -i, --install Install package after successful build")\n"
+ printf -- "$(gettext " -L, --log Log package build process")\n"
+ printf -- "$(gettext " -m, --nocolor Disable colorized output messages")\n"
+ printf -- "$(gettext " -o, --nobuild Download and extract files only")\n"
+ printf -- "$(gettext " -p <file> Use an alternate build script (instead of '%s')")\n" "$BUILDSCRIPT"
+ printf -- "$(gettext " -r, --rmdeps Remove installed dependencies after a successful build")\n"
+ printf -- "$(gettext " -R, --repackage Repackage contents of the package without rebuilding")\n"
+ printf -- "$(gettext " -s, --syncdeps Install missing dependencies with %s")\n" "pacman"
+ printf -- "$(gettext " -S, --source Generate a source-only tarball without downloaded sources")\n"
+ printf -- "$(gettext " -V, --version Show version information and exit")\n"
+ printf -- "$(gettext " --allsource Generate a source-only tarball including downloaded sources")\n"
+ printf -- "$(gettext " --check Run the %s function in the %s")\n" "check()" "$BUILDSCRIPT"
+ printf -- "$(gettext " --config <file> Use an alternate config file (instead of '%s')")\n" "$confdir/makepkg.conf"
+ printf -- "$(gettext " --holdver Do not update VCS sources")\n"
+ printf -- "$(gettext " --key <key> Specify a key to use for %s signing instead of the default")\n" "gpg"
+ printf -- "$(gettext " --noarchive Do not create package archive")\n"
+ printf -- "$(gettext " --nocheck Do not run the %s function in the %s")\n" "check()" "$BUILDSCRIPT"
+ printf -- "$(gettext " --noprepare Do not run the %s function in the %s")\n" "prepare()" "$BUILDSCRIPT"
+ printf -- "$(gettext " --nosign Do not create a signature for the package")\n"
+ printf -- "$(gettext " --packagelist Only list package filepaths that would be produced")\n"
+ printf -- "$(gettext " --printsrcinfo Print the generated SRCINFO and exit")\n"
+ printf -- "$(gettext " --sign Sign the resulting package with %s")\n" "gpg"
+ printf -- "$(gettext " --skipchecksums Do not verify checksums of the source files")\n"
+ printf -- "$(gettext " --skipinteg Do not perform any verification checks on source files")\n"
+ printf -- "$(gettext " --skippgpcheck Do not verify source files with PGP signatures")\n"
+ printf -- "$(gettext " --verifysource Download source files (if needed) and perform integrity checks")\n"
+ echo
+ printf -- "$(gettext "These options can be passed to %s:")\n" "pacman"
+ echo
+ printf -- "$(gettext " --asdeps Install packages as non-explicitly installed")\n"
+ printf -- "$(gettext " --needed Do not reinstall the targets that are already up to date")\n"
+ printf -- "$(gettext " --noconfirm Do not ask for confirmation when resolving dependencies")\n"
+ printf -- "$(gettext " --noprogressbar Do not show a progress bar when downloading files")\n"
+ echo
+ printf -- "$(gettext "If %s is not specified, %s will look for '%s'")\n" "-p" "makepkg" "$BUILDSCRIPT"
+ echo
+}
+
+version() {
+ printf "makepkg (pacman) %s\n" "$makepkg_version"
+ printf -- "Copyright (c) 2006-2020 Pacman Development Team <pacman-dev@archlinux.org>.\n"
+ printf -- "Copyright (C) 2002-2006 Judd Vinet <jvinet@zeroflux.org>.\n"
+ printf '\n'
+ printf -- "$(gettext "\
+This is free software; see the source for copying conditions.\n\
+There is NO WARRANTY, to the extent permitted by law.\n")"
+}
+
+# update mksource checksums, if $BUILDFILE is a temporary mksource() PKGBUILD
+# Gobals:
+# - $BUILDFILE
+update_mksums() {
+ declare -r PKGBUILD="$(dirname $BUILDFILE)"/PKGBUILD
+ local padding
+ local mksums
+ local mksums_ind
+
+ if [[ -f "$BUILDFILE" && -w "$BUILDFILE" ]] && # temporary mksource PKGBUILD
+ [[ -f "$PKGBUILD" && -w "$PKGBUILD" ]]; then # the real PKGBUILD
+ updpkgsums "$BUILDFILE"
+ source_safe "$BUILDFILE"
+
+ for algo in ${known_hash_algos[*]}; do
+ for array in mk${algo}sums{,_armv7h,_i686,_x86_64}; do
+ if grep "^[[:blank:]]*$array=(" "$PKGBUILD" > /dev/null; then
+ padding=$(printf "%${#array}s ")
+ mksums_ind="${array}[@]"
+ mksums="'$(sed "s| |'\n$padding'|g" <<<${!mksums_ind})'"
+
+ awk -v array=$array \
+ -v array_rx="^[ ]*${array}=" \
+ -v mksums="$mksums" \
+ '$0 ~ array_rx , /^[^#]*\)/ { m=NR } \
+ NR == m + 1 && !!m { print array"=("mksums")" } \
+ NR != m { print } ' \
+ "$PKGBUILD" > "$PKGBUILD".tmp
+ cat -- "$PKGBUILD".tmp > "$PKGBUILD" ; rm "$PKGBUILD".tmp ;
+ fi
+ done
+ done
+ else
+ error "$(gettext "%s is not writeable -- checksums will not be updated")" "$BUILDFILE"
+ exit $E_PKGBUILD_ERROR
+ fi
+}
+
+# PROGRAM START
+
+# ensure we have a sane umask set
+umask 0022
+
+# determine whether we have gettext; make it a no-op if we do not
+if ! type -p gettext >/dev/null; then
+ gettext() {
+ printf "%s\n" "$@"
+ }
+fi
+
+ARGLIST=("$@")
+
+# Parse Command Line Options.
+OPT_SHORT="AcCdefFghiLmop:rRsSV"
+OPT_LONG=('allsource' 'check' 'clean' 'cleanbuild' 'config:' 'force' 'geninteg'
+ 'help' 'holdver' 'ignorearch' 'install' 'key:' 'log' 'noarchive' 'nobuild'
+ 'nocolor' 'nocheck' 'nodeps' 'noextract' 'noprepare' 'nosign' 'packagelist'
+ 'printsrcinfo' 'repackage' 'rmdeps' 'sign' 'skipchecksums' 'skipinteg'
+ 'skippgpcheck' 'source' 'syncdeps' 'verifysource' 'version')
+
+# Pacman Options
+OPT_LONG+=('asdeps' 'noconfirm' 'needed' 'noprogressbar')
+
+if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
+ exit $E_INVALID_OPTION
+fi
+set -- "${OPTRET[@]}"
+unset OPT_SHORT OPT_LONG OPTRET
+
+while true; do
+ case "$1" in
+ # Pacman Options
+ --asdeps) ASDEPS=1;;
+ --needed) NEEDED=1;;
+ --noconfirm) PACMAN_OPTS+=("--noconfirm") ;;
+ --noprogressbar) PACMAN_OPTS+=("--noprogressbar") ;;
+
+ # Makepkg Options
+ --allsource) BUILDPKG=0 SOURCEONLY=2 ;;
+ -A|--ignorearch) IGNOREARCH=1 ;;
+ -c|--clean) CLEANUP=1 ;;
+ -C|--cleanbuild) CLEANBUILD=1 ;;
+ --check) RUN_CHECK='y' ;;
+ --config) shift; MAKEPKG_CONF=$1 ;;
+ -d|--nodeps) NODEPS=1 ;;
+ -e|--noextract) NOEXTRACT=1 ;;
+ -f|--force) FORCE=1 ;;
+ -F) INFAKEROOT=1 ;;
+ # generating integrity checks does not depend on architecture
+ -g|--geninteg) BUILDPKG=0 GENINTEG=1 IGNOREARCH=1;;
+ --holdver) HOLDVER=1 ;;
+ -i|--install) INSTALL=1 ;;
+ --key) shift; GPGKEY=$1 ;;
+ -L|--log) LOGGING=1 ;;
+ -m|--nocolor) USE_COLOR='n'; PACMAN_OPTS+=("--color" "never") ;;
+ --noarchive) NOARCHIVE=1 ;;
+ --nocheck) RUN_CHECK='n' ;;
+ --noprepare) RUN_PREPARE='n' ;;
+ --nosign) SIGNPKG='n' ;;
+ -o|--nobuild) BUILDPKG=0 NOBUILD=1 ;;
+ -p) shift; BUILDFILE=$1 ;;
+ --packagelist) BUILDPKG=0 PACKAGELIST=1 IGNOREARCH=1;;
+ --printsrcinfo) BUILDPKG=0 PRINTSRCINFO=1 IGNOREARCH=1;;
+ -r|--rmdeps) RMDEPS=1 ;;
+ -R|--repackage) REPKG=1 ;;
+ --sign) SIGNPKG='y' ;;
+ --skipchecksums) SKIPCHECKSUMS=1 ;;
+ --skipinteg) SKIPCHECKSUMS=1; SKIPPGPCHECK=1 ;;
+ --skippgpcheck) SKIPPGPCHECK=1;;
+ -s|--syncdeps) DEP_BIN=1 ;;
+ -S|--source) BUILDPKG=0 SOURCEONLY=1 ;;
+ --verifysource) BUILDPKG=0 VERIFYSOURCE=1 ;;
+
+ -h|--help) usage; exit $E_OK ;;
+ -V|--version) version; exit $E_OK ;;
+
+ --) shift; break ;;
+ esac
+ shift
+done
+
+# attempt to consume any extra argv as environment variables. this supports
+# overriding (e.g. CC=clang) as well as overriding (e.g. CFLAGS+=' -g').
+extra_environment=()
+while [[ $1 ]]; do
+ if [[ $1 = [_[:alpha:]]*([[:alnum:]_])?(+)=* ]]; then
+ extra_environment+=("$1")
+ fi
+ shift
+done
+
+# setup signal traps
+trap 'clean_up' 0
+for signal in TERM HUP QUIT; do
+ trap "trap_exit $signal \"$(gettext "%s signal caught. Exiting...")\" \"$signal\"" "$signal"
+done
+trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT
+trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR
+
+load_makepkg_config
+
+# override settings from extra variables on commandline, if any
+if (( ${#extra_environment[*]} )); then
+ export "${extra_environment[@]}"
+fi
+
+# canonicalize paths and provide defaults if anything is still undefined
+for var in PKGDEST SRCDEST SRCPKGDEST LOGDEST BUILDDIR; do
+ printf -v "$var" '%s' "$(canonicalize_path "${!var:-$startdir}")"
+done
+unset var
+PACKAGER=${PACKAGER:-"Unknown Packager"}
+
+# set pacman command if not already defined
+PACMAN=${PACMAN:-pacman}
+# save full path to command as PATH may change when sourcing /etc/profile
+PACMAN_PATH=$(type -P $PACMAN)
+
+# check if messages are to be printed using color
+if [[ -t 2 && $USE_COLOR != "n" ]] && check_buildenv "color" "y"; then
+ colorize
+else
+ unset ALL_OFF BOLD BLUE GREEN RED YELLOW
+fi
+
+
+# check makepkg.conf for some basic requirements
+lint_config || exit $E_CONFIG_ERROR
+
+
+# check that all settings directories are user-writable
+if ! ensure_writable_dir "BUILDDIR" "$BUILDDIR"; then
+ plainerr "$(gettext "Aborting...")"
+ exit $E_FS_PERMISSIONS
+fi
+
+if (( ! (NOBUILD || GENINTEG) )) && ! ensure_writable_dir "PKGDEST" "$PKGDEST"; then
+ plainerr "$(gettext "Aborting...")"
+ exit $E_FS_PERMISSIONS
+fi
+
+if ! ensure_writable_dir "SRCDEST" "$SRCDEST" ; then
+ plainerr "$(gettext "Aborting...")"
+ exit $E_FS_PERMISSIONS
+fi
+
+if (( SOURCEONLY )); then
+ if ! ensure_writable_dir "SRCPKGDEST" "$SRCPKGDEST"; then
+ plainerr "$(gettext "Aborting...")"
+ exit $E_FS_PERMISSIONS
+ fi
+
+ # If we're only making a source tarball, then we need to ignore architecture-
+ # dependent behavior.
+ IGNOREARCH=1
+fi
+
+if (( LOGGING )) && ! ensure_writable_dir "LOGDEST" "$LOGDEST"; then
+ plainerr "$(gettext "Aborting...")"
+ exit $E_FS_PERMISSIONS
+fi
+
+if (( ! INFAKEROOT )); then
+ if (( EUID == 0 )); then
+ error "$(gettext "Running %s as root is not allowed as it can cause permanent,\n\
+catastrophic damage to your system.")" "makepkg"
+ exit $E_ROOT
+ fi
+else
+ if [[ -z $FAKEROOTKEY ]]; then
+ error "$(gettext "Do not use the %s option. This option is only for internal use by %s.")" "'-F'" "makepkg"
+ exit $E_INVALID_OPTION
+ fi
+fi
+
+unset pkgname "${pkgbuild_schema_strings[@]}" "${pkgbuild_schema_arrays[@]}"
+unset "${known_hash_algos[@]/%/sums}"
+unset -f pkgver prepare build check package "${!package_@}"
+unset "${!makedepends_@}" "${!depends_@}" "${!source_@}" "${!checkdepends_@}"
+unset "${!optdepends_@}" "${!conflicts_@}" "${!provides_@}" "${!replaces_@}"
+unset "${!md5sums_@}" "${!sha1sums_@}" "${!sha224sums_@}" "${!sha256sums_@}"
+unset "${!sha384sums_@}" "${!sha512sums_@}" "${!b2sums_@}"
+
+BUILDFILE=${BUILDFILE:-$BUILDSCRIPT}
+if [[ ! -f $BUILDFILE ]]; then
+ error "$(gettext "%s does not exist.")" "$BUILDFILE"
+ exit $E_PKGBUILD_ERROR
+
+else
+ if [[ $(<"$BUILDFILE") = *$'\r'* ]]; then
+ error "$(gettext "%s contains %s characters and cannot be sourced.")" "$BUILDFILE" "CRLF"
+ exit $E_PKGBUILD_ERROR
+ fi
+
+ if [[ ! $BUILDFILE -ef $PWD/${BUILDFILE##*/} ]]; then
+ error "$(gettext "%s must be in the current working directory.")" "$BUILDFILE"
+ exit $E_PKGBUILD_ERROR
+ fi
+
+ if [[ ${BUILDFILE:0:1} != "/" ]]; then
+ BUILDFILE="$startdir/$BUILDFILE"
+ fi
+ source_buildfile "$BUILDFILE"
+fi
+
+pkgbase=${pkgbase:-${pkgname[0]}}
+
+# check the PKGBUILD for some basic requirements
+lint_pkgbuild || exit $E_PKGBUILD_ERROR
+
+# detect temporary mksource PKGBUILD
+declare -r MKSOURCE_RX='librefetch\.[^\ ]{11}\.PKGBUILD\.to\.SRCBUILD$'
+declare -r IS_MKSOURCE=$( [[ "$BUILDFILE" =~ $MKSOURCE_RX ]] && echo 1 || echo 0 )
+# DBG "BUILDFILE=$BUILDFILE"
+
+if (( !SOURCEONLY && !PRINTSRCINFO )); then
+ merge_arch_attrs
+fi
+
+basever=$(get_full_version)
+
+if [[ $BUILDDIR -ef "$startdir" ]]; then
+ srcdir="$BUILDDIR/src"
+ pkgdirbase="$BUILDDIR/pkg"
+else
+ srcdir="$BUILDDIR/$pkgbase/src"
+ pkgdirbase="$BUILDDIR/$pkgbase/pkg"
+
+fi
+
+# set pkgdir to something "sensible" for (not recommended) use during build()
+pkgdir="$pkgdirbase/$pkgbase"
+
+if (( GENINTEG )); then
+ mkdir -p "$srcdir"
+ chmod a-s "$srcdir"
+ cd_safe "$srcdir"
+ download_sources novcs allarch >&2
+
+ # trick `updpkgsums` into updating mk*sums(), if this is temporary mksource() PKGBUILD
+ if (( IS_MKSOURCE )); then
+ generate_checksums | sed 's|^\(.*\)=(|mk\1=(|g'
+ else # standard behavior
+ generate_checksums
+ fi
+ exit $E_OK
+fi
+
+if have_function pkgver; then
+ PKGVERFUNC=1
+fi
+
+# check we have the software required to process the PKGBUILD
+check_software || exit $E_MISSING_MAKEPKG_DEPS
+
+if (( ${#pkgname[@]} > 1 )) || have_function package_${pkgname}; then
+ SPLITPKG=1
+fi
+
+# test for available PKGBUILD functions
+if have_function prepare; then
+ # "Hide" prepare() function if not going to be run
+ if [[ $RUN_PREPARE != "n" ]]; then
+ PREPAREFUNC=1
+ fi
+fi
+if have_function build; then
+ BUILDFUNC=1
+fi
+if have_function check; then
+ # "Hide" check() function if not going to be run
+ if [[ $RUN_CHECK = 'y' ]] || { ! check_buildenv "check" "n" && [[ $RUN_CHECK != "n" ]]; }; then
+ CHECKFUNC=1
+ fi
+fi
+if have_function package; then
+ PKGFUNC=1
+fi
+
+# check if gpg signature is to be created and if signing key is valid
+if { [[ -z $SIGNPKG ]] && check_buildenv "sign" "y"; } || [[ $SIGNPKG == 'y' ]]; then
+ SIGNPKG='y'
+ if ! gpg --list-secret-key ${GPGKEY:+"$GPGKEY"} &>/dev/null; then
+ if [[ ! -z $GPGKEY ]]; then
+ error "$(gettext "The key %s does not exist in your keyring.")" "${GPGKEY}"
+ else
+ error "$(gettext "There is no key in your keyring.")"
+ fi
+ exit $E_PRETTY_BAD_PRIVACY
+ fi
+fi
+
+if (( PACKAGELIST )); then
+ print_all_package_names
+ exit $E_OK
+fi
+
+if (( PRINTSRCINFO )); then
+ write_srcinfo_content
+ exit $E_OK
+fi
+
+if (( ! PKGVERFUNC )); then
+ check_build_status
+fi
+
+# Run the bare minimum in fakeroot
+if (( INFAKEROOT )); then
+ if (( SOURCEONLY )); then
+ create_srcpackage
+ msg "$(gettext "Leaving %s environment.")" "fakeroot"
+ exit $E_OK
+ fi
+
+ prepare_buildenv
+
+ chmod 755 "$pkgdirbase"
+ if (( ! SPLITPKG )); then
+ run_single_packaging
+ else
+ run_split_packaging
+ fi
+
+ create_debug_package
+
+ msg "$(gettext "Leaving %s environment.")" "fakeroot"
+ exit $E_OK
+fi
+
+msg "$(gettext "Making package: %s")" "$pkgbase $basever ($(date +%c))"
+
+# if we are creating a source-only package, go no further
+if (( SOURCEONLY )); then
+ if [[ -f $SRCPKGDEST/${pkgbase}-${basever}${SRCEXT} ]] \
+ && (( ! FORCE )); then
+ error "$(gettext "A source package has already been built. (use %s to overwrite)")" "-f"
+ exit $E_ALREADY_BUILT
+ fi
+
+DBG "makepkg SOURCEONLY calling download_sources"
+
+ # Get back to our src directory so we can begin with sources.
+ mkdir -p "$srcdir"
+ chmod a-s "$srcdir"
+ cd_safe "$srcdir"
+ if (( SOURCEONLY == 2 )); then
+ download_sources allarch
+ elif ( (( ! SKIPCHECKSUMS )) || \
+ ( (( ! SKIPPGPCHECK )) && source_has_signatures ) ); then
+ download_sources allarch novcs
+ fi
+
+# if ! (( IS_MKSOURCE )); then # standard behavior
+DBG "makepkg SOURCEONLY calling check_source_integrity IS_MKSOURCE=$IS_MKSOURCE" # its not
+
+ check_source_integrity all
+ cd_safe "$startdir"
+
+DBG "makepkg SOURCEONLY DONE check_source_integrity"
+
+ enter_fakeroot
+
+ if [[ $SIGNPKG = 'y' ]]; then
+
+DBG "makepkg SOURCEONLY calling create_signature"
+
+ msg "$(gettext "Signing package...")"
+ create_signature "$SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT}"
+ fi
+
+ msg "$(gettext "Source package created: %s")" "$pkgbase ($(date +%c))"
+
+DBG "makepkg SOURCEONLY OUT"
+
+ exit $E_OK
+fi
+
+if (( NODEPS || ( VERIFYSOURCE && !DEP_BIN ) )); then
+ if (( NODEPS )); then
+ warning "$(gettext "Skipping dependency checks.")"
+ fi
+else
+ if (( RMDEPS && ! INSTALL )); then
+ original_pkglist=($(run_pacman -Qq)) # required by remove_dep
+ fi
+ deperr=0
+DBG "makepkg ->resolve_deps IS_MKSOURCE=$IS_MKSOURCE"
+ msg "$(gettext "Checking runtime dependencies...")"
+ resolve_deps ${depends[@]} || deperr=1
+
+ if (( RMDEPS && INSTALL )); then
+ original_pkglist=($(run_pacman -Qq)) # required by remove_dep
+ fi
+
+ msg "$(gettext "Checking buildtime dependencies...")"
+ if (( CHECKFUNC )); then
+ resolve_deps "${makedepends[@]}" "${checkdepends[@]}" || deperr=1
+ else
+ resolve_deps "${makedepends[@]}" || deperr=1
+ fi
+
+ if (( RMDEPS )); then
+ current_pkglist=($(run_pacman -Qq)) # required by remove_deps
+ fi
+
+ if (( deperr )); then
+ error "$(gettext "Could not resolve all dependencies.")"
+ exit $E_INSTALL_DEPS_FAILED
+ fi
+fi
+
+# get back to our src directory so we can begin with sources
+mkdir -p "$srcdir"
+chmod a-s "$srcdir"
+cd_safe "$srcdir"
+
+if (( !REPKG )); then
+ if (( NOEXTRACT && ! VERIFYSOURCE )); then
+ warning "$(gettext "Using existing %s tree")" "\$srcdir/"
+ else
+ # prompt to update mksource checksums, if $BUILDFILE is a temporary mksource PKGBUILD
+ if ! (( IS_MKSOURCE )); then # standard behavior
+ download_sources
+ check_source_integrity
+ else # mksource behavior
+DBG "makepkg IS_MKSOURCE ->download_sources"
+ download_sources
+DBG "makepkg IS_MKSOURCE ->check_pgpsigs"
+ check_pgpsigs
+DBG "makepkg IS_MKSOURCE ->check_checksums"
+ if ! ( check_checksums ); then
+ warning "$(gettext "The PKGBUILD mk*sums do not validate the upstream sources.\n")"
+ ask "$(gettext "Run \`updpkgsums\` to account for the checksums mismatch?")"
+ read -p " [y/N] " -n 1 -r ; echo ; plain ;
+
+ if [[ $REPLY =~ ^[yY]$ ]]; then
+ update_mksums
+ else
+ exit $E_PKGBUILD_ERROR
+ fi
+
+else DBG "makepkg IS_MKSOURCE ->check_checksums DONE"
+
+ fi
+ fi
+
+# PKGVERFUNC=0
+# VERIFYSOURCE=0
+# CLEANBUILD=0
+# PREPAREFUNC=1
+# REPRODUCIBLE=1
+# NOBUILD=0
+# NOARCHIVE=0
+
+ (( VERIFYSOURCE )) && exit $E_OK
+
+ if (( CLEANBUILD )); then
+ msg "$(gettext "Removing existing %s directory...")" "\$srcdir/"
+ rm -rf "$srcdir"/*
+ fi
+
+ extract_sources
+ if (( PREPAREFUNC )); then
+ run_prepare
+ fi
+ if (( REPRODUCIBLE )); then
+ # We have activated reproducible builds, so unify source times before
+ # building
+ find "$srcdir" -exec touch -h -d @$SOURCE_DATE_EPOCH {} +
+ fi
+ fi
+
+ if (( PKGVERFUNC )); then
+ update_pkgver
+ basever=$(get_full_version)
+ check_build_status
+ fi
+fi
+
+if (( NOBUILD )); then
+ msg "$(gettext "Sources are ready.")"
+ exit $E_OK
+else
+ # clean existing pkg directory
+ if [[ -d $pkgdirbase ]]; then
+ msg "$(gettext "Removing existing %s directory...")" "\$pkgdir/"
+ rm -rf "$pkgdirbase"
+ fi
+ mkdir -p "$pkgdirbase"
+ chmod a-srw "$pkgdirbase"
+ cd_safe "$startdir"
+
+ prepare_buildenv
+
+ if (( ! REPKG )); then
+ (( BUILDFUNC )) && run_build
+ (( CHECKFUNC )) && run_check
+ cd_safe "$startdir"
+ fi
+
+ enter_fakeroot
+
+ create_package_signatures || exit $E_PRETTY_BAD_PRIVACY
+fi
+
+# if inhibiting archive creation, go no further
+if (( NOARCHIVE )); then
+ msg "$(gettext "Package directory is ready.")"
+ exit $E_OK
+fi
+
+msg "$(gettext "Finished making: %s")" "$pkgbase $basever ($(date +%c))"
+
+install_package && exit $E_OK || exit $E_INSTALL_FAILED