Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
path: root/scripts/makepkg.sh.in
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/makepkg.sh.in')
-rw-r--r--scripts/makepkg.sh.in542
1 files changed, 296 insertions, 246 deletions
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 6990572b..125f68c7 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -1,4 +1,4 @@
-#!/bin/bash -e
+#!/bin/bash
#
# makepkg - make packages compatible for use with pacman
# @configure_input@
@@ -39,10 +39,10 @@ export COMMAND_MODE='legacy'
# Ensure CDPATH doesn't screw with our cd calls
unset CDPATH
-myver='@PACKAGE_VERSION@'
-confdir='@sysconfdir@'
-BUILDSCRIPT='@BUILDSCRIPT@'
-startdir="$PWD"
+declare -r myver='@PACKAGE_VERSION@'
+declare -r confdir='@sysconfdir@'
+declare -r BUILDSCRIPT='@BUILDSCRIPT@'
+declare -r startdir="$PWD"
packaging_options=('strip' 'docs' 'libtool' 'emptydirs' 'zipman' 'purge' 'upx')
other_options=('ccache' 'distcc' 'buildflags' 'makeflags')
@@ -211,7 +211,7 @@ get_filepath() {
return 1
fi
- echo "$file"
+ printf "%s\n" "$file"
}
# Print 'source not found' error message and exit makepkg
@@ -226,13 +226,13 @@ get_filename() {
# if a filename is specified, use it
local filename="${1%%::*}"
# if it is just an URL, we only keep the last component
- echo "${filename##*/}"
+ printf "%s\n" "${filename##*/}"
}
# extract the URL from a source entry
get_url() {
# strip an eventual filename
- echo "${1#*::}"
+ printf "%s\n" "${1#*::}"
}
##
@@ -242,9 +242,9 @@ get_url() {
get_full_version() {
if [[ -z $1 ]]; then
if [[ $epoch ]] && (( ! $epoch )); then
- echo $pkgver-$pkgrel
+ printf "%s\n" "$pkgver-$pkgrel"
else
- echo $epoch:$pkgver-$pkgrel
+ printf "%s\n" "$epoch:$pkgver-$pkgrel"
fi
else
for i in pkgver pkgrel epoch; do
@@ -253,9 +253,9 @@ get_full_version() {
[[ -z ${!indirect} ]] && eval ${indirect}=\"${!i}\"
done
if (( ! $epoch_override )); then
- echo $pkgver_override-$pkgrel_override
+ printf "%s\n" "$pkgver_override-$pkgrel_override"
else
- echo $epoch_override:$pkgver_override-$pkgrel_override
+ printf "%s\n" "$epoch_override:$pkgver_override-$pkgrel_override"
fi
fi
}
@@ -272,14 +272,14 @@ get_full_version() {
check_option() {
local ret=$(in_opt_array "$1" ${options[@]})
if [[ $ret != '?' ]]; then
- echo $ret
+ printf "%s\n" "$ret"
return
fi
# fall back to makepkg.conf options
ret=$(in_opt_array "$1" ${OPTIONS[@]})
if [[ $ret != '?' ]]; then
- echo $ret
+ printf "%s\n" "$ret"
return
fi
@@ -311,7 +311,7 @@ in_opt_array() {
local opt
for opt in "$@"; do
- if [[ $opt = $needle ]]; then
+ if [[ $opt = "$needle" ]]; then
echo 'y' # Enabled
return
elif [[ $opt = "!$needle" ]]; then
@@ -333,15 +333,15 @@ in_array() {
local needle=$1; shift
local item
for item in "$@"; do
- [[ $item = $needle ]] && return 0 # Found
+ [[ $item = "$needle" ]] && return 0 # Found
done
return 1 # Not Found
}
-source_has_signatures(){
+source_has_signatures() {
local file
for file in "${source[@]}"; do
- if [[ $file = *.@(sig?(n)|asc) ]]; then
+ if [[ ${file%%::*} = *.@(sig?(n)|asc) ]]; then
return 0
fi
done
@@ -357,7 +357,7 @@ get_downloadclient() {
local i
for i in "${DLAGENTS[@]}"; do
local handler="${i%%::*}"
- if [[ $proto = $handler ]]; then
+ if [[ $proto = "$handler" ]]; then
local agent="${i##*::}"
break
fi
@@ -379,7 +379,7 @@ get_downloadclient() {
exit 1 # $E_MISSING_PROGRAM
fi
- echo "$agent"
+ printf "%s\n" "$agent"
}
download_file() {
@@ -420,33 +420,30 @@ download_file() {
run_pacman() {
local cmd
if [[ ! $1 = -@(T|Qq) ]]; then
- printf -v cmd "%q " "$PACMAN" $PACMAN_OPTS "$@"
+ cmd=("$PACMAN" $PACMAN_OPTS "$@")
else
- printf -v cmd "%q " "$PACMAN" "$@"
+ cmd=("$PACMAN" "$@")
fi
if (( ! ASROOT )) && [[ ! $1 = -@(T|Qq) ]]; then
if type -p sudo >/dev/null; then
- cmd="sudo $cmd"
+ cmd=(sudo "${cmd[@]}")
else
- cmd="su root -c '$cmd'"
+ cmd=(su root -c "$(printf '%q ' "${cmd[@]}")")
fi
fi
- eval "$cmd"
+ "${cmd[@]}"
}
check_deps() {
(( $# > 0 )) || return 0
- # Disable error trap in pacman subshell call as this breaks bash-3.2 compatibility
- # Also, a non-zero return value is not unexpected and we are manually dealing them
- set +E
local ret=0
local pmout
- pmout=$(run_pacman -T "$@") || ret=$?
- set -E
+ pmout=$(run_pacman -T "$@")
+ ret=$?
if (( ret == 127 )); then #unresolved deps
- echo "$pmout"
+ printf "%s\n" "$pmout"
elif (( ret )); then
error "$(gettext "'%s' returned a fatal error (%i): %s")" "$PACMAN" "$ret" "$pmout"
return "$ret"
@@ -476,13 +473,11 @@ handle_deps() {
fi
# we might need the new system environment
- # avoid triggering the ERR trap and exiting
- set +e
- local restoretrap=$(trap -p ERR)
- trap - ERR
+ # save our shell options and turn off extglob
+ local shellopts=$(shopt -p)
+ shopt -u extglob
source /etc/profile &>/dev/null
- eval $restoretrap
- set -e
+ eval "$shellopts"
return $R_DEPS_SATISFIED
}
@@ -557,7 +552,7 @@ download_sources() {
local url=$(get_url "$netfile")
# if we get here, check to make sure it was a URL, else fail
- if [[ $file = $url ]]; then
+ if [[ $file = "$url" ]]; then
error "$(gettext "%s was not found in the build directory and is not a URL.")" "$file"
exit 1 # $E_MISSING_FILE
fi
@@ -594,9 +589,9 @@ get_integlist() {
done
if (( ${#integlist[@]} > 0 )); then
- echo ${integlist[@]}
+ printf "%s\n" "${integlist[@]}"
else
- echo ${INTEGRITY_CHECK[@]}
+ printf "%s\n" "${INTEGRITY_CHECK[@]}"
fi
}
@@ -627,7 +622,7 @@ generate_checksums() {
local ct=0
local numsrc=${#source[@]}
- echo -n "${integ}sums=("
+ printf "%s" "${integ}sums=("
local i
local indent=''
@@ -641,8 +636,8 @@ generate_checksums() {
file="$(get_filepath "$netfile")" || missing_source_file "$netfile"
local sum="$(openssl dgst -${integ} "$file")"
sum=${sum##* }
- (( ct )) && echo -n "$indent"
- echo -n "'$sum'"
+ (( ct )) && printf "%s" "$indent"
+ printf "%s" "'$sum'"
ct=$(($ct+1))
(( $ct < $numsrc )) && echo
done
@@ -668,7 +663,7 @@ check_checksums() {
for file in "${source[@]}"; do
local found=1
file="$(get_filename "$file")"
- echo -n " $file ... " >&2
+ printf "%s" " $file ... " >&2
if ! file="$(get_filepath "$file")"; then
printf -- "$(gettext "NOT FOUND")\n" >&2
@@ -677,14 +672,18 @@ check_checksums() {
fi
if (( $found )) ; then
- local expectedsum=$(tr '[:upper:]' '[:lower:]' <<< "${integrity_sums[$idx]}")
- local realsum="$(openssl dgst -${integ} "$file")"
- realsum="${realsum##* }"
- if [[ $expectedsum = $realsum ]]; then
- printf -- "$(gettext "Passed")\n" >&2
+ if [[ ${integrity_sums[$idx]} = 'SKIP' ]]; then
+ echo "$(gettext "Skipped")" >&2
else
- printf -- "$(gettext "FAILED")\n" >&2
- errors=1
+ local expectedsum=$(tr '[:upper:]' '[:lower:]' <<< "${integrity_sums[$idx]}")
+ local realsum="$(openssl dgst -${integ} "$file")"
+ realsum="${realsum##* }"
+ if [[ $expectedsum = "$realsum" ]]; then
+ printf -- "$(gettext "Passed")\n" >&2
+ else
+ printf -- "$(gettext "FAILED")\n" >&2
+ errors=1
+ fi
fi
fi
@@ -838,10 +837,10 @@ extract_sources() {
local ret=0
msg2 "$(gettext "Extracting %s with %s")" "$file" "$cmd"
- if [[ $cmd = bsdtar ]]; then
+ if [[ $cmd = "bsdtar" ]]; then
$cmd -xf "$file" || ret=$?
else
- rm -f "${file%.*}"
+ rm -f -- "${file%.*}"
$cmd -dcf "$file" > "${file%.*}" || ret=$?
fi
if (( ret )); then
@@ -870,6 +869,40 @@ error_function() {
exit 2 # $E_BUILD_FAILED
}
+cd_safe() {
+ if ! cd "$1"; then
+ error "$(gettext "Failed to change to directory %s")" "$1"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
+}
+
+source_safe() {
+ shopt -u extglob
+ if ! source "$@"; then
+ error "$(gettext "Failed to source %s")" "$1"
+ exit 1
+ fi
+ shopt -s extglob
+}
+
+run_function_safe() {
+ local restoretrap
+
+ set -e
+ set -E
+
+ restoretrap=$(trap -p ERR)
+ trap 'error_function $pkgfunc' ERR
+
+ run_function "$1"
+
+ eval $restoretrap
+
+ set +E
+ set +e
+}
+
run_function() {
if [[ -z $1 ]]; then
return 1
@@ -887,7 +920,7 @@ run_function() {
fi
msg "$(gettext "Starting %s()...")" "$pkgfunc"
- cd "$srcdir"
+ cd_safe "$srcdir"
# ensure all necessary build variables are exported
export CFLAGS CXXFLAGS LDFLAGS MAKEFLAGS CHOST
@@ -895,7 +928,6 @@ run_function() {
local shellopts=$(shopt -p)
local ret=0
- local restoretrap
if (( LOGGING )); then
local fullver=$(get_full_version)
local BUILDLOG="${startdir}/${pkgbase}-${fullver}-${CARCH}-$pkgfunc.log"
@@ -917,18 +949,12 @@ run_function() {
tee "$BUILDLOG" < "$logpipe" &
local teepid=$!
- restoretrap=$(trap -p ERR)
- trap 'error_function $pkgfunc' ERR
$pkgfunc &>"$logpipe"
- eval $restoretrap
wait $teepid
rm "$logpipe"
else
- restoretrap=$(trap -p ERR)
- trap 'error_function $pkgfunc' ERR
$pkgfunc 2>&1
- eval $restoretrap
fi
# reset our shell options
eval "$shellopts"
@@ -946,11 +972,11 @@ run_build() {
[[ -d /usr/lib/ccache/bin ]] && export PATH="/usr/lib/ccache/bin:$PATH"
fi
- run_function "build"
+ run_function_safe "build"
}
run_check() {
- run_function "check"
+ run_function_safe "check"
}
run_package() {
@@ -961,23 +987,23 @@ run_package() {
pkgfunc="package_$1"
fi
- run_function "$pkgfunc"
+ run_function_safe "$pkgfunc"
}
tidy_install() {
- cd "$pkgdir"
+ cd_safe "$pkgdir"
msg "$(gettext "Tidying install...")"
if [[ $(check_option docs) = "n" && -n ${DOC_DIRS[*]} ]]; then
msg2 "$(gettext "Removing doc files...")"
- rm -rf ${DOC_DIRS[@]}
+ rm -rf -- ${DOC_DIRS[@]}
fi
if [[ $(check_option purge) = "y" && -n ${PURGE_TARGETS[*]} ]]; then
msg2 "$(gettext "Purging unwanted files...")"
local pt
for pt in "${PURGE_TARGETS[@]}"; do
- if [[ ${pt} = ${pt//\/} ]]; then
+ if [[ ${pt} = "${pt//\/}" ]]; then
find . -type f -name "${pt}" -exec rm -f -- '{}' \;
else
rm -f ${pt}
@@ -997,7 +1023,7 @@ tidy_install() {
find ${MAN_DIRS[@]} -lname "$file" 2>/dev/null |
while read link ; do
rm -f "$link" "${link}.gz"
- ln -s "${file}.gz" "${link}.gz"
+ ln -s -- "${file}.gz" "${link}.gz"
done
# check file still exists (potentially already compressed due to hardlink)
@@ -1021,7 +1047,7 @@ tidy_install() {
done
fi
- if [[ $(check_option strip) = y ]]; then
+ if [[ $(check_option strip) = "y" ]]; then
msg2 "$(gettext "Stripping unneeded symbols from binaries and libraries...")"
# make sure library stripping variables are defined to prevent excess stripping
[[ -z ${STRIP_SHARED+x} ]] && STRIP_SHARED="-S"
@@ -1078,8 +1104,8 @@ find_libdepends() {
if in_array "${soname}" ${depends[@]}; then
if ! in_array "${soname}=${soversion}-${soarch}" ${libdepends[@]}; then
# libfoo.so=1-64
- echo "${soname}=${soversion}-${soarch}"
- libdepends=(${libdepends[@]} "${soname}=${soversion}-${soarch}")
+ printf "%s" "${soname}=${soversion}-${soarch}"
+ libdepends+=("${soname}=${soversion}-${soarch}")
fi
fi
done
@@ -1087,30 +1113,62 @@ find_libdepends() {
}
find_libprovides() {
- local libprovides
- find "$pkgdir" -type f -name \*.so\* | while read filename
- do
- # check if we really have a shared object
- if LC_ALL=C readelf -h "$filename" 2>/dev/null | grep -q '.*Type:.*DYN (Shared object file).*'; then
- # 64
- soarch=$(LC_ALL=C readelf -h "$filename" | sed -n 's/.*Class.*ELF\(32\|64\)/\1/p')
- # get the string binaries link to: libfoo.so.1.2 -> libfoo.so.1
- sofile=$(LC_ALL=C readelf -d "$filename" 2>/dev/null | sed -n 's/.*Library soname: \[\(.*\)\].*/\1/p')
- [ -z "$sofile" ] && sofile="${filename##*/}"
-
- # extract the library name: libfoo.so
- soname="${sofile%%\.so\.*}.so"
- # extract the major version: 1
- soversion="${sofile##*\.so\.}"
- if in_array "${soname}" ${provides[@]}; then
- if ! in_array "${soname}=${soversion}-${soarch}" ${libprovides[@]}; then
- # libfoo.so=1-64
- echo "${soname}=${soversion}-${soarch}"
- libprovides=(${libprovides[@]} "${soname}=${soversion}-${soarch}")
+ local libprovides missing
+ for p in "${provides[@]}"; do
+ missing=0
+ case "$p" in
+ *.so)
+ IFS=$'\n' read -rd '' -a filename < <(find "$pkgdir" -type f -name $p\*)
+ 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
- fi
- fi
+ ;;
+ *)
+ libprovides+=("$p")
+ ;;
+ esac
+
+ if (( missing )); then
+ warning "$(gettext "Can not find library listed in %s: %s")" "'provides'" "$p"
+ fi
done
+
+ printf '%s\n' "${libprovides[@]}"
+}
+
+check_license() {
+ # TODO maybe remove this at some point
+ # warn if license array is not present or empty
+ if [[ -z $license ]]; then
+ warning "$(gettext "Please add a license line to your %s!")" "$BUILDSCRIPT"
+ plain "$(gettext "Example for GPL\'ed software: %s.")" "license=('GPL')"
+ fi
}
write_pkginfo() {
@@ -1135,29 +1193,31 @@ write_pkginfo() {
echo "# using $(fakeroot -v)"
fi
echo "# $(LC_ALL=C date -u)"
- echo "pkgname = $1"
+ printf "pkgname = %s\n" "$1"
(( SPLITPKG )) && echo pkgbase = $pkgbase
echo "pkgver = $(get_full_version)"
- echo "pkgdesc = $pkgdesc"
- echo "url = $url"
- echo "builddate = $builddate"
- echo "packager = $packager"
- echo "size = $size"
- echo "arch = $PKGARCH"
+ printf "pkgdesc = %s\n" "$pkgdesc"
+ printf "url = %s\n" "$url"
+ printf "builddate = %s\n" "$builddate"
+ printf "packager = %s\n" "$packager"
+ printf "size = %s\n" "$size"
+ printf "arch = %s\n" "$PKGARCH"
[[ $license ]] && printf "license = %s\n" "${license[@]}"
[[ $replaces ]] && printf "replaces = %s\n" "${replaces[@]}"
[[ $groups ]] && printf "group = %s\n" "${groups[@]}"
[[ $optdepends ]] && printf "optdepend = %s\n" "${optdepends[@]//+([[:space:]])/ }"
[[ $conflicts ]] && printf "conflict = %s\n" "${conflicts[@]}"
+
+ IFS=$'\n' read -rd '' -a provides < <(find_libprovides)
+ [[ $provides ]] && printf "provides = %s\n" "${provides[@]}"
+
[[ $backup ]] && printf "backup = %s\n" "${backup[@]}"
- local it
- libprovides=$(find_libprovides)
- libdepends=$(find_libdepends)
- provides=("${provides[@]}" ${libprovides})
- depends=("${depends[@]}" ${libdepends})
+ local it
+ IFS=$'\n' read -rd '' -a libdepends < <(find_libdepends)
+ depends+=("${libdepends[@]}")
for it in "${depends[@]}"; do
if [[ $it = *.so ]]; then
@@ -1169,45 +1229,26 @@ write_pkginfo() {
return 1
fi
else
- echo "depend = $it"
- fi
- done
-
- for it in "${provides[@]}"; do
- # ignore versionless entires (those come from the PKGBUILD)
- if [[ $it = *.so ]]; then
- # check if the entry has been found by find_libprovides
- # if not, it's unneeded; tell the user so he can remove it
- if [[ ! $libprovides =~ (^|\s)${it}=.* ]]; then
- error "$(gettext "Cannot find library listed in %s: %s")" "'provides'" "$it"
- return 1
- fi
- else
- echo "provides = $it"
+ printf "depend = %s\n" "$it"
fi
done
for it in "${packaging_options[@]}"; do
local ret="$(check_option $it)"
if [[ $ret != "?" ]]; then
- if [[ $ret = y ]]; then
- echo "makepkgopt = $it"
+ if [[ $ret = "y" ]]; then
+ printf "makepkgopt = %s\n" "$it"
else
- echo "makepkgopt = !$it"
+ printf "makepkgopt = %s\n" "!$it"
fi
fi
done
- # TODO maybe remove this at some point
- # warn if license array is not present or empty
- if [[ -z $license ]]; then
- warning "$(gettext "Please add a license line to your %s!")" "$BUILDSCRIPT"
- plain "$(gettext "Example for GPL\'ed software: %s.")" "license=('GPL')"
- fi
+ check_license
}
check_package() {
- cd "$pkgdir"
+ cd_safe "$pkgdir"
# check existence of backup files
local file
@@ -1236,7 +1277,7 @@ create_package() {
check_package
- cd "$pkgdir"
+ cd_safe "$pkgdir"
msg "$(gettext "Creating package...")"
local nameofpkg
@@ -1254,7 +1295,7 @@ create_package() {
write_pkginfo $nameofpkg > .PKGINFO
- local comp_files=".PKGINFO"
+ local comp_files=('.PKGINFO')
# check for changelog/install files
for i in 'changelog/.CHANGELOG' 'install/.INSTALL'; do
@@ -1264,7 +1305,7 @@ create_package() {
msg2 "$(gettext "Adding %s file...")" "$orig"
cp "$startdir/${!orig}" "$dest"
chmod 644 "$dest"
- comp_files+=" $dest"
+ comp_files+=("$dest")
fi
done
@@ -1286,12 +1327,12 @@ create_package() {
# bsdtar's gzip compression always saves the time stamp, making one
# archive created using the same command line distinct from another.
# Disable bsdtar compression and use gzip -n for now.
- bsdtar -cf - $comp_files * |
+ bsdtar -cf - "${comp_files[@]}" * |
case "$PKGEXT" in
- *tar.gz) gzip -c -f -n ;;
- *tar.bz2) bzip2 -c -f ;;
- *tar.xz) xz -c -z - ;;
- *tar.Z) compress -c -f ;;
+ *tar.gz) ${COMPRESSGZ[@]:-gzip -c -f -n} ;;
+ *tar.bz2) ${COMPRESSBZ2[@]:-bzip2 -c -f} ;;
+ *tar.xz) ${COMPRESSXZ[@]:-xz -c -z -} ;;
+ *tar.Z) ${COMPRESSZ[@]:-compress -c -f} ;;
*tar) cat ;;
*) warning "$(gettext "'%s' is not a valid archive extension.")" \
"$PKGEXT"; cat ;;
@@ -1351,12 +1392,14 @@ create_srcpackage() {
local srclinks="$(mktemp -d "$startdir"/srclinks.XXXXXXXXX)"
mkdir "${srclinks}"/${pkgbase}
+ check_license
+
msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"
local file
for file in "${source[@]}"; do
- if [[ "$file" == $(get_filename "$file") ]] || (( SOURCEONLY == 2 )); then
+ if [[ "$file" = "$(get_filename "$file")" ]] || (( SOURCEONLY == 2 )); then
local absfile
absfile=$(get_filepath "$file") || missing_source_file "$file"
msg2 "$(gettext "Adding %s...")" "${absfile##*/}"
@@ -1393,7 +1436,7 @@ create_srcpackage() {
# tar it up
msg2 "$(gettext "Compressing source package...")"
- cd "${srclinks}"
+ cd_safe "${srclinks}"
if ! bsdtar -c${TAR_OPT}Lf "$pkg_file" ${pkgbase}; then
error "$(gettext "Failed to create source package file.")"
exit 1 # TODO: error code
@@ -1409,7 +1452,7 @@ create_srcpackage() {
warning "$(gettext "Failed to create symlink to source package file.")"
fi
- cd "${startdir}"
+ cd_safe "${startdir}"
rm -rf "${srclinks}"
}
@@ -1478,8 +1521,8 @@ check_sanity() {
awk -F'=' '$1 ~ /^[[:space:]]*pkgrel$/' "$BUILDFILE" | sed "s/[[:space:]]*#.*//" |
while IFS='=' read -r _ i; do
eval i=\"$(sed 's/^\(['\''"]\)\(.*\)\1$/\2/' <<< "${i%%+([[:space:]])}")\"
- if [[ $i = *[[:space:]-]* ]]; then
- error "$(gettext "%s is not allowed to contain hyphens or whitespace.")" "pkgrel"
+ if [[ $i != +([0-9])?(.+([0-9])) ]]; then
+ error "$(gettext "%s must be a decimal.")" "pkgrel"
return 1
fi
done || ret=1
@@ -1571,7 +1614,7 @@ check_sanity() {
known=0
# check if option matches a known option or its inverse
for kopt in ${packaging_options[@]} ${other_options[@]}; do
- if [[ ${i} = ${kopt} || ${i} = "!${kopt}" ]]; then
+ if [[ ${i} = "${kopt}" || ${i} = "!${kopt}" ]]; then
known=1
fi
done
@@ -1695,7 +1738,7 @@ devel_check() {
# Do not update pkgver if --holdver is set, when building a source package, repackaging,
# reading PKGBUILD from pipe (-f), or if we cannot write to the file (-w)
if (( HOLDVER || SOURCEONLY || REPKG )) ||
- [[ ! -f $BUILDFILE || ! -w $BUILDFILE || $BUILDFILE = /dev/stdin ]]; then
+ [[ ! -f $BUILDFILE || ! -w $BUILDFILE || $BUILDFILE = "/dev/stdin" ]]; then
return
fi
@@ -1705,66 +1748,67 @@ devel_check() {
# calls to makepkg via fakeroot will explicitly pass the version
# number to avoid having to determine the version number twice.
# Also do a check to make sure we have the VCS tool available.
- oldpkgver=$pkgver
- if [[ -n ${_darcstrunk} && -n ${_darcsmod} ]] ; then
- if ! type -p darcs >/dev/null; then
- warning "$(gettext "Cannot find the %s binary required to determine latest %s revision.")" "darcs" "darcs"
- return 0
- fi
- msg "$(gettext "Determining latest %s revision...")" 'darcs'
- newpkgver=$(date +%Y%m%d)
- elif [[ -n ${_cvsroot} && -n ${_cvsmod} ]] ; then
- if ! type -p cvs >/dev/null; then
- warning "$(gettext "Cannot find the %s binary required to determine latest %s revision.")" "cvs" "cvs"
- return 0
- fi
- msg "$(gettext "Determining latest %s revision...")" 'cvs'
- newpkgver=$(date +%Y%m%d)
- elif [[ -n ${_gitroot} && -n ${_gitname} ]] ; then
- if ! type -p git >/dev/null; then
- warning "$(gettext "Cannot find the %s binary required to determine latest %s revision.")" "git" "git"
- return 0
- fi
- msg "$(gettext "Determining latest %s revision...")" 'git'
- newpkgver=$(date +%Y%m%d)
- elif [[ -n ${_svntrunk} && -n ${_svnmod} ]] ; then
- if ! type -p svn >/dev/null; then
- warning "$(gettext "Cannot find the %s binary required to determine latest %s revision.")" "svn" "svn"
- return 0
- fi
- msg "$(gettext "Determining latest %s revision...")" 'svn'
- newpkgver=$(LC_ALL=C svn info $_svntrunk | sed -n 's/^Last Changed Rev: \([0-9]*\)$/\1/p')
- elif [[ -n ${_bzrtrunk} && -n ${_bzrmod} ]] ; then
- if ! type -p bzr >/dev/null; then
- warning "$(gettext "Cannot find the %s binary required to determine latest %s revision.")" "bzr" "bzr"
- return 0
- fi
- msg "$(gettext "Determining latest %s revision...")" 'bzr'
- newpkgver=$(bzr revno ${_bzrtrunk})
- elif [[ -n ${_hgroot} && -n ${_hgrepo} ]] ; then
- if ! type -p hg >/dev/null; then
- warning "$(gettext "Cannot find the %s binary required to determine latest %s revision.")" "hg" "hg"
- return 0
- fi
- msg "$(gettext "Determining latest %s revision...")" 'hg'
- if [[ -d ./src/$_hgrepo ]] ; then
- cd ./src/$_hgrepo
- local ret=0
- hg pull || ret=$?
- if (( ! ret )); then
- hg update
- elif (( ret != 1 )); then
- return 1
- fi
- else
- [[ ! -d ./src/ ]] && mkdir ./src/
- hg clone $_hgroot/$_hgrepo ./src/$_hgrepo
- cd ./src/$_hgrepo
- fi
- newpkgver=$(hg tip --template "{rev}")
- cd ../../
+ local vcs=()
+
+ [[ -n ${_darcstrunk} && -n ${_darcsmod} ]] && vcs+=("darcs")
+ [[ -n ${_cvsroot} && -n ${_cvsmod} ]] && vcs+=("cvs")
+ [[ -n ${_gitroot} && -n ${_gitname} ]] && vcs+=("git")
+ [[ -n ${_svntrunk} && -n ${_svnmod} ]] && vcs+=("svn")
+ [[ -n ${_bzrtrunk} && -n ${_bzrmod} ]] && vcs+=("bzr")
+ [[ -n ${_hgroot} && -n ${_hgrepo} ]] && vcs+=("hg")
+
+ if (( ${#vcs[@]} == 0 )); then
+ return
+ elif (( ${#vcs[@]} > 1 )); then
+ warning "$(gettext "Ambiguous VCS package. Cannot pick from: %s.")" "${vcs[*]}"
+ return 0
+ fi
+
+ if ! type -p "$vcs" >/dev/null; then
+ warning "$(gettext "Cannot find the %s binary required to determine latest %s revision.")" "$vcs" "$vcs"
+ return 0
fi
+ msg "$(gettext "Determining latest %s revision...")" "$vcs"
+
+ case "$vcs" in
+ darcs)
+ newpkgver=$(date +%Y%m%d)
+ ;;
+ cvs)
+ newpkgver=$(date +%Y%m%d)
+ ;;
+ git)
+ newpkgver=$(date +%Y%m%d)
+ ;;
+ svn)
+ newpkgver=$(LC_ALL=C svn info $_svntrunk | sed -n 's/^Last Changed Rev: \([0-9]*\)$/\1/p')
+ ;;
+ bzr)
+ newpkgver=$(bzr revno ${_bzrtrunk})
+ ;;
+ hg)
+ if pushd "./src/$_hgrepo" > /dev/null; then
+ local ret=0
+ hg pull || ret=$?
+ if (( ! ret )); then
+ hg update
+ elif (( ret != 1 )); then
+ return 1
+ fi
+ else
+ [[ ! -d ./src/ ]] && mkdir ./src/
+ hg clone "$_hgroot/$_hgrepo" "./src/$_hgrepo"
+ if ! pushd "./src/$_hgrepo" > /dev/null; then
+ warning "$(gettext "An error occured while determining the hg version number.")"
+ return 0
+ fi
+ fi
+ newpkgver=$(hg tip --template "{rev}")
+ popd > /dev/null
+ ;;
+ esac
+
if [[ -n $newpkgver ]]; then
msg2 "$(gettext "Version found: %s")" "$newpkgver"
fi
@@ -1785,13 +1829,13 @@ devel_update() {
# ...
# _foo=pkgver
#
- if [[ -n $newpkgver ]]; then
- if [[ $newpkgver != "$pkgver" ]]; then
- if [[ -f $BUILDFILE && -w $BUILDFILE ]]; then
- @SEDINPLACE@ "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "$BUILDFILE"
- @SEDINPLACE@ "s/^pkgrel=[^ ]*/pkgrel=1/" "$BUILDFILE"
- source "$BUILDFILE"
- fi
+ if [[ -n $newpkgver && $newpkgver != "$pkgver" ]]; then
+ if [[ -f $BUILDFILE && -w $BUILDFILE ]]; then
+ @SEDINPLACE@ "s/^pkgver=[^ ]*/pkgver=$newpkgver/" "$BUILDFILE"
+ @SEDINPLACE@ "s/^pkgrel=[^ ]*/pkgrel=1/" "$BUILDFILE"
+ source "$BUILDFILE"
+ else
+ warning "$(gettext "%s is not writeable -- pkgver will not be updated")" "$BUILDFILE"
fi
fi
}
@@ -1838,15 +1882,15 @@ canonicalize_path() {
if [[ -d $path ]]; then
(
- cd "$path"
+ cd_safe "$path"
pwd -P
)
else
- echo "$path"
+ printf "%s\n" "$path"
fi
}
-m4_include(library/parse_options.sh)
+m4_include(library/parseopts.sh)
usage() {
printf "makepkg (pacman) %s\n" "$myver"
@@ -1907,7 +1951,7 @@ There is NO WARRANTY, to the extent permitted by law.\n")"
# determine whether we have gettext; make it a no-op if we do not
if ! type -p gettext >/dev/null; then
gettext() {
- echo "$@"
+ printf "%s\n" "$@"
}
fi
@@ -1915,19 +1959,20 @@ ARGLIST=("$@")
# Parse Command Line Options.
OPT_SHORT="AcdefFghiLmop:rRsSV"
-OPT_LONG="allsource,asroot,ignorearch,check,clean,nodeps"
-OPT_LONG+=",noextract,force,forcever:,geninteg,help,holdver,skippgpcheck"
-OPT_LONG+=",install,key:,log,nocolor,nobuild,nocheck,nosign,pkg:,rmdeps"
-OPT_LONG+=",repackage,skipchecksums,skipinteg,skippgpcheck,sign,source,syncdeps"
-OPT_LONG+=",version,config:"
+OPT_LONG=('allsource' 'asroot' 'ignorearch' 'check' 'clean' 'nodeps'
+ 'noextract' 'force' 'forcever:' 'geninteg' 'help' 'holdver' 'skippgpcheck'
+ 'install' 'key:' 'log' 'nocolor' 'nobuild' 'nocheck' 'nosign' 'pkg:' 'rmdeps'
+ 'repackage' 'skipchecksums' 'skipinteg' 'skippgpcheck' 'sign' 'source' 'syncdeps'
+ 'version' 'config:')
# Pacman Options
-OPT_LONG+=",noconfirm,noprogressbar"
-if ! OPT_TEMP="$(parse_options $OPT_SHORT $OPT_LONG "$@")"; then
- echo; usage; exit 1 # E_INVALID_OPTION;
+OPT_LONG+=('noconfirm' 'noprogressbar')
+
+if ! parseopts "$OPT_SHORT" "${OPT_LONG[@]}" -- "$@"; then
+ exit 1 # E_INVALID_OPTION;
fi
-eval set -- "$OPT_TEMP"
-unset OPT_SHORT OPT_LONG OPT_TEMP
+set -- "${OPTRET[@]}"
+unset OPT_SHORT OPT_LONG OPTRET
while true; do
case "$1" in
@@ -1958,7 +2003,7 @@ while true; do
--nosign) SIGNPKG='n' ;;
-o|--nobuild) NOBUILD=1 ;;
-p) shift; BUILDFILE=$1 ;;
- --pkg) shift; PKGLIST=($1) ;;
+ --pkg) shift; IFS=, read -ra p <<<"$1"; PKGLIST+=("${p[@]}"); unset p ;;
-r|--rmdeps) RMDEPS=1 ;;
-R|--repackage) REPKG=1 ;;
--skipchecksums) SKIPCHECKSUMS=1 ;;
@@ -1971,8 +2016,7 @@ while true; do
-h|--help) usage; exit 0 ;; # E_OK
-V|--version) version; exit 0 ;; # E_OK
- --) OPT_IND=0; shift; break;;
- *) usage; exit 1 ;; # E_INVALID_OPTION
+ --) OPT_IND=0; shift; break 2;;
esac
shift
done
@@ -1984,7 +2028,6 @@ for signal in TERM HUP QUIT; do
done
trap 'trap_exit INT "$(gettext "Aborted by user! Exiting...")"' INT
trap 'trap_exit USR1 "$(gettext "An unknown error has occurred. Exiting...")"' ERR
-set -E
# preserve environment variables and canonicalize path
[[ -n ${PKGDEST} ]] && _PKGDEST=$(canonicalize_path ${PKGDEST})
@@ -1994,13 +2037,14 @@ set -E
[[ -n ${PKGEXT} ]] && _PKGEXT=${PKGEXT}
[[ -n ${SRCEXT} ]] && _SRCEXT=${SRCEXT}
[[ -n ${GPGKEY} ]] && _GPGKEY=${GPGKEY}
+[[ -n ${PACKAGER} ]] && _PACKAGER=${PACKAGER}
# default config is makepkg.conf
MAKEPKG_CONF=${MAKEPKG_CONF:-$confdir/makepkg.conf}
# Source the config file; fail if it is not found
if [[ -r $MAKEPKG_CONF ]]; then
- source "$MAKEPKG_CONF"
+ source_safe "$MAKEPKG_CONF"
else
error "$(gettext "%s not found.")" "$MAKEPKG_CONF"
plain "$(gettext "Aborting...")"
@@ -2010,7 +2054,7 @@ fi
# Source user-specific makepkg.conf overrides, but only if no override config
# file was specified
if [[ $MAKEPKG_CONF = "$confdir/makepkg.conf" && -r ~/.makepkg.conf ]]; then
- source ~/.makepkg.conf
+ source_safe ~/.makepkg.conf
fi
# set pacman command if not already defined
@@ -2042,8 +2086,11 @@ readonly ALL_OFF BOLD BLUE GREEN RED YELLOW
BUILDDIR=${_BUILDDIR:-$BUILDDIR}
BUILDDIR=${BUILDDIR:-$startdir} #default to $startdir if undefined
if [[ ! -d $BUILDDIR ]]; then
- mkdir -p "$BUILDDIR" ||
- error "$(gettext "You do not have write permission to create packages in %s.")" "$BUILDDIR"
+ if ! mkdir -p "$BUILDDIR"; then
+ error "$(gettext "You do not have write permission to create packages in %s.")" "$BUILDDIR"
+ plain "$(gettext "Aborting...")"
+ exit 1
+ fi
chmod a-s "$BUILDDIR"
fi
if [[ ! -w $BUILDDIR ]]; then
@@ -2051,8 +2098,6 @@ if [[ ! -w $BUILDDIR ]]; then
plain "$(gettext "Aborting...")"
exit 1
fi
-srcdir="$BUILDDIR/src"
-pkgdir="$BUILDDIR/pkg"
PKGDEST=${_PKGDEST:-$PKGDEST}
PKGDEST=${PKGDEST:-$startdir} #default to $startdir if undefined
@@ -2081,6 +2126,7 @@ fi
PKGEXT=${_PKGEXT:-$PKGEXT}
SRCEXT=${_SRCEXT:-$SRCEXT}
GPGKEY=${_GPGKEY:-$GPGKEY}
+PACKAGER=${_PACKAGER:-$PACKAGER}
if (( HOLDVER )) && [[ -n $FORCE_VER ]]; then
# The '\\0' is here to prevent gettext from thinking --holdver is an option
@@ -2125,9 +2171,7 @@ if [[ ! -f $BUILDFILE ]]; then
else
# PKGBUILD passed through a pipe
BUILDFILE=/dev/stdin
- shopt -u extglob
- source "$BUILDFILE"
- shopt -s extglob
+ source_safe "$BUILDFILE"
fi
else
crlftest=$(file "$BUILDFILE" | grep -F 'CRLF' || true)
@@ -2139,19 +2183,25 @@ else
if [[ ${BUILDFILE:0:1} != "/" ]]; then
BUILDFILE="$startdir/$BUILDFILE"
fi
- shopt -u extglob
- source "$BUILDFILE"
- shopt -s extglob
+ source_safe "$BUILDFILE"
fi
# set defaults if they weren't specified in buildfile
pkgbase=${pkgbase:-${pkgname[0]}}
epoch=${epoch:-0}
+if [[ $BUILDDIR = "$startdir" ]]; then
+ srcdir="$BUILDDIR/src"
+ pkgdir="$BUILDDIR/pkg"
+else
+ srcdir="$BUILDDIR/$pkgbase/src"
+ pkgdir="$BUILDDIR/$pkgbase/pkg"
+fi
+
if (( GENINTEG )); then
mkdir -p "$srcdir"
chmod a-s "$srcdir"
- cd "$srcdir"
+ cd_safe "$srcdir"
download_sources
generate_checksums
exit 0 # $E_OK
@@ -2301,14 +2351,14 @@ if (( SOURCEONLY )); then
# Get back to our src directory so we can begin with sources.
mkdir -p "$srcdir"
chmod a-s "$srcdir"
- cd "$srcdir"
+ cd_safe "$srcdir"
if ( (( ! SKIPCHECKSUMS )) || \
( (( ! SKIPPGPCHECK )) && source_has_signatures ) ) || \
(( SOURCEONLY == 2 )); then
download_sources
fi
check_source_integrity
- cd "$startdir"
+ cd_safe "$startdir"
# if we are root or if fakeroot is not enabled, then we don't use it
if [[ $(check_buildenv fakeroot) != "y" ]] || (( EUID == 0 )); then
@@ -2364,7 +2414,7 @@ umask 0022
# get back to our src directory so we can begin with sources
mkdir -p "$srcdir"
chmod a-s "$srcdir"
-cd "$srcdir"
+cd_safe "$srcdir"
if (( NOEXTRACT )); then
warning "$(gettext "Skipping source retrieval -- using existing %s tree")" "src/"
@@ -2400,7 +2450,7 @@ else
fi
mkdir -p "$pkgdir"
chmod a-s "$pkgdir"
- cd "$startdir"
+ cd_safe "$startdir"
# if we are root or if fakeroot is not enabled, then we don't use it
if [[ $(check_buildenv fakeroot) != "y" ]] || (( EUID == 0 )); then
@@ -2430,7 +2480,7 @@ else
devel_update
(( BUILDFUNC )) && run_build
(( CHECKFUNC )) && run_check
- cd "$startdir"
+ cd_safe "$startdir"
fi
enter_fakeroot