display current version and if outdated in ui display correct time in output log
		
			
				
	
	
		
			1484 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1484 lines
		
	
	
		
			41 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/usr/bin/bash
 | 
						|
#
 | 
						|
#   makepkg - make packages compatible for use with pacman
 | 
						|
#
 | 
						|
#   Copyright (c) 2006-2021 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='6.0.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 [[ -w $BUILDFILE ]]; then
 | 
						|
			mapfile -t buildfile < "$BUILDFILE"
 | 
						|
			buildfile=("${buildfile[@]/#pkgver=*([^ ])/pkgver=$newpkgver}")
 | 
						|
			buildfile=("${buildfile[@]/#pkgrel=*([^ ])/pkgrel=1}")
 | 
						|
			if ! printf '%s\n' "${buildfile[@]}" > "$BUILDFILE"; then
 | 
						|
				error "$(gettext "Failed to update %s from %s to %s")" \
 | 
						|
						"pkgver" "$pkgver" "$newpkgver"
 | 
						|
				exit $E_PKGBUILD_ERROR
 | 
						|
			fi
 | 
						|
			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 cmdescape
 | 
						|
	if [[ $1 = -@(T|Q)*([[:alpha:]]) ]]; then
 | 
						|
		cmd=("$PACMAN_PATH" "$@")
 | 
						|
	else
 | 
						|
		cmd=("$PACMAN_PATH" "${PACMAN_OPTS[@]}" "$@")
 | 
						|
		cmdescape="$(printf '%q ' "${cmd[@]}")"
 | 
						|
		if (( ${#PACMAN_AUTH[@]} )); then
 | 
						|
			if in_array '%c' "${PACMAN_AUTH[@]}"; then
 | 
						|
				cmd=("${PACMAN_AUTH[@]/\%c/$cmdescape}")
 | 
						|
			else
 | 
						|
				cmd=("${PACMAN_AUTH[@]}" "${cmd[@]}")
 | 
						|
			fi
 | 
						|
		elif type -p sudo >/dev/null; then
 | 
						|
			cmd=(sudo "${cmd[@]}")
 | 
						|
		else
 | 
						|
			cmd=(su root -c "$cmdescape")
 | 
						|
		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 versioned_provides libprovides missing
 | 
						|
	for p in "${provides[@]}"; do
 | 
						|
		missing=0
 | 
						|
		versioned_provides=()
 | 
						|
		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"
 | 
						|
								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\.}"
 | 
						|
 | 
						|
							versioned_provides+=("${p}=${soversion}-${soarch}")
 | 
						|
						else
 | 
						|
							warning "$(gettext "Library listed in %s is not a shared object: %s")" "'provides'" "$p"
 | 
						|
						fi
 | 
						|
					done
 | 
						|
				else
 | 
						|
					missing=1
 | 
						|
				fi
 | 
						|
				;;
 | 
						|
		esac
 | 
						|
 | 
						|
		if (( missing )); then
 | 
						|
			warning "$(gettext "Cannot find library listed in %s: %s")" "'provides'" "$p"
 | 
						|
		fi
 | 
						|
		if (( ${#versioned_provides[@]} > 0 )); then
 | 
						|
			libprovides+=("${versioned_provides[@]}")
 | 
						|
		else
 | 
						|
			libprovides+=("$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" "2"
 | 
						|
 | 
						|
	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 "startdir"  "${startdir}"
 | 
						|
	write_kv_pair "buildtool" "${BUILDTOOL:-makepkg}"
 | 
						|
	write_kv_pair "buildtoolver" "${BUILDTOOLVER:-$makepkg_version}"
 | 
						|
	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 --no-read-sparse -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 $pkgbase"
 | 
						|
	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 --no-read-sparse -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() {
 | 
						|
	local fullver pkgarch allpkgbuilt somepkgbuilt
 | 
						|
	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
 | 
						|
	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-2021 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")"
 | 
						|
}
 | 
						|
 | 
						|
# 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 "${!cksums_@}" "${!md5sums_@}" "${!sha1sums_@}" "${!sha224sums_@}"
 | 
						|
unset "${!sha256sums_@}" "${!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
 | 
						|
 | 
						|
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
 | 
						|
	generate_checksums
 | 
						|
	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
 | 
						|
 | 
						|
	# 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
 | 
						|
	check_source_integrity all
 | 
						|
	cd_safe "$startdir"
 | 
						|
 | 
						|
	enter_fakeroot
 | 
						|
 | 
						|
	if [[ $SIGNPKG = 'y' ]]; then
 | 
						|
		msg "$(gettext "Signing package...")"
 | 
						|
		create_signature "$SRCPKGDEST/${pkgbase}-$(get_full_version)${SRCEXT}"
 | 
						|
	fi
 | 
						|
 | 
						|
	msg "$(gettext "Source package created: %s")" "$pkgbase ($(date +%c))"
 | 
						|
	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
 | 
						|
 | 
						|
	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
 | 
						|
		download_sources
 | 
						|
		check_source_integrity
 | 
						|
		(( 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
 |