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