This implements support for declarations such as:

  arch=('i686' 'x86_64')
  ...

  source=("somescript.sh")
  source_i686=("http://evilmonster.com/i686/ponies-9001-1.i686.bin";)
  source_x86_64=("http://evilmonster.com/i686/ponies-9001-1.x86_64.bin";)

  md5sums=('d41d8cd98f00b204e9800998ecf8427e')
  md5sums_i686=('e4ca381035a34b7a852184cc0dd89baa')
  md5sums_x86_64=('4019740e6998f30a3c534bac6a83f582')

Just the same as the "untagged" sources, multiple integrity algorithms
are supported. The manpage is updated to reflect support for these
suffices.
---
 doc/PKGBUILD.5.txt    |   4 ++
 scripts/makepkg.sh.in | 104 +++++++++++++++++++++++++++++++++++++++++---------
 2 files changed, 90 insertions(+), 18 deletions(-)

diff --git a/doc/PKGBUILD.5.txt b/doc/PKGBUILD.5.txt
index c957180..a8c1fbb 100644
--- a/doc/PKGBUILD.5.txt
+++ b/doc/PKGBUILD.5.txt
@@ -116,6 +116,10 @@ below).
        Compressed files will be extracted automatically unless found in the
        noextract array described below.
 +
+Additional architecture-specific sources can be added by appending an
+underscore and the architecture name e.g., 'source_x86_64=()'. There must be a
+corresponding integrity array with checksums, e.g. 'md5sums_x86_64=()'.
++
 It is also possible to change the name of the downloaded file, which is helpful
 with weird URLs and for handling multiple source files with the same
 name. The syntax is: `source=('filename::url')`.
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 3962005..639f860 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -702,7 +702,39 @@ extract_svn() {
        popd &>/dev/null
 }
 
+get_all_sources() {
+       local aggregate l a
+
+       if array_build l 'source'; then
+               aggregate+=("${l[@]}")
+       fi
+
+       for a in "${arch[@]}"; do
+               if array_build l "source_$a"; then
+                       aggregate+=("${l[@]}")
+               fi
+       done
+
+       array_build "$1" "aggregate"
+}
+
+get_all_sources_for_arch() {
+       local aggregate l
+
+       if array_build l 'source'; then
+               aggregate+=("${l[@]}")
+       fi
+
+       if array_build l "source_$CARCH"; then
+               aggregate+=("${l[@]}")
+       fi
+
+       array_build "$1" "aggregate"
+}
+
 download_sources() {
+       local netfile all_sources
+
        msg "$(gettext "Retrieving sources...")"
 
        local GET_VCS=1
@@ -710,8 +742,8 @@ download_sources() {
                GET_VCS=0
        fi
 
-       local netfile
-       for netfile in "${source[@]}"; do
+       get_all_sources_for_arch 'all_sources'
+       for netfile in "${all_sources[@]}"; do
                pushd "$SRCDEST" &>/dev/null
 
                local proto=$(get_protocol "$netfile")
@@ -911,8 +943,10 @@ in_array() {
 }
 
 source_has_signatures() {
-       local file
-       for file in "${source[@]}"; do
+       local file all_sources
+
+       get_all_sources_for_arch 'all_sources'
+       for file in "${all_sources[@]}"; do
                if [[ ${file%%::*} = *.@(sig?(n)|asc) ]]; then
                        return 0
                fi
@@ -1055,16 +1089,27 @@ get_integlist() {
 }
 
 generate_one_checksum() {
-       local integ=$1 numsrc=${#source[*]} indentsz idx
+       local integ=$1 arch=$2 sources numsrc indentsz idx
 
+       if [[ $arch ]]; then
+               array_build sources "source_$arch"
+       else
+               array_build sources 'source'
+       fi
+
+       numsrc=${#sources[*]}
        if (( numsrc == 0 )); then
                return
        fi
 
-       printf "%ssums=(%n" "$integ" indentsz
+       if [[ $arch ]]; then
+               printf "%ssums_%s=(%n" "$integ" "$arch" indentsz
+       else
+               printf "%ssums=(%n" "$integ" indentsz
+       fi
 
        for (( idx = 0; idx < numsrc; i++ )); do
-               local netfile=${source[idx]}
+               local netfile=${sources[idx]}
                local proto sum
                proto="$(get_protocol "$netfile")"
 
@@ -1117,6 +1162,9 @@ generate_checksums() {
                fi
 
                generate_one_checksum "$integ"
+               for a in "${arch[@]}"; do
+                       generate_one_checksum "$integ" "$a"
+               done
        done
 }
 
@@ -1149,15 +1197,25 @@ verify_integrity_one() {
 }
 
 verify_integrity_sums() {
-       local integ=$1 integrity_sums
+       local integ=$1 arch=$2 integrity_sums=() sources=()
 
-       array_build integrity_sums "${integ}sums"
+       if [[ $arch ]]; then
+               array_build integrity_sums "${integ}sums_$arch"
+               array_build sources "source_$arch"
+       else
+               array_build integrity_sums "${integ}sums"
+               array_build sources source
+       fi
 
-       if (( ${#integrity_sums[@]} == ${#source[@]} )); then
+       if (( ${#integrity_sums[@]} == 0 && ${#sources[@]} == 0 )); then
+               return 1
+       fi
+
+       if (( ${#integrity_sums[@]} == ${#sources[@]} )); then
                msg "$(gettext "Validating source files with %s...")" 
"${integ}sums"
                local idx errors=0
-               for (( idx = 0; idx < ${#source[*]}; idx++ )); do
-                       verify_integrity_one "${source[idx]}" "$integ" 
"${integrity_sums[idx]}" || errors=1
+               for (( idx = 0; idx < ${#sources[*]}; idx++ )); do
+                       verify_integrity_one "${sources[idx]}" "$integ" 
"${integrity_sums[idx]}" || errors=1
                done
 
                if (( errors )); then
@@ -1177,9 +1235,13 @@ check_checksums() {
        (( ! ${#source[@]} )) && return 0
 
        local correlation=0
-       local integ
+       local integ a
        for integ in "${known_hash_algos[@]}"; do
                verify_integrity_sums "$integ" && correlation=1
+
+               for a in "${arch[@]}"; do
+                       verify_integrity_sums "$integ" "$a" && correlation=1
+               done
        done
 
        if (( ! correlation )); then
@@ -1256,8 +1318,10 @@ check_pgpsigs() {
        local warning=0
        local errors=0
        local statusfile=$(mktemp)
+       local all_sources
 
-       for file in "${source[@]}"; do
+       get_all_sources_for_arch 'all_sources'
+       for file in "${all_sources[@]}"; do
                file="$(get_filename "$file")"
                if [[ ! $file = *.@(sig?(n)|asc) ]]; then
                        continue
@@ -1373,8 +1437,10 @@ check_source_integrity() {
 
 extract_sources() {
        msg "$(gettext "Extracting sources...")"
-       local netfile
-       for netfile in "${source[@]}"; do
+       local netfile all_sources
+
+       get_all_sources_for_arch 'all_sources'
+       for netfile in "${all_sources[@]}"; do
                local file=$(get_filename "$netfile")
                if in_array "$file" "${noextract[@]}"; then
                        # skip source files in the noextract=() array
@@ -2065,8 +2131,10 @@ create_srcpackage() {
        msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
        ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"
 
-       local file
-       for file in "${source[@]}"; do
+       local file all_sources
+
+       get_all_sources 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"
-- 
2.0.4

Reply via email to