diff options
author | Dave Reisner <dreisner@archlinux.org> | 2014-08-07 12:41:20 -0400 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2014-09-30 12:56:21 +1000 |
commit | 963f7fe02fcb1429224c6c936e3110f0eb10d107 (patch) | |
tree | 4ddbb7366f4708f2f724eee1b6e8377069ec3d0d | |
parent | 51353edc6156ae46cb32e7adc18c415a1732e2dc (diff) | |
download | pacman-963f7fe02fcb1429224c6c936e3110f0eb10d107.tar.xz |
PKGBUILD: add support for arch-specific sources
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.
This commit also refactors download_sources slightly:
1) to use the otherwise preferred convention of lowercase local variable
names, and to make the handling of $1 more clear.
2) rename the "fast" parameter to "novcs", to make it more clear what
this token does.
3) add a new possible token "allarch" to ensure that download_sources
will fetch all sources, for all architectures.
-rw-r--r-- | doc/PKGBUILD.5.txt | 4 | ||||
-rw-r--r-- | scripts/makepkg.sh.in | 182 |
2 files changed, 151 insertions, 35 deletions
diff --git a/doc/PKGBUILD.5.txt b/doc/PKGBUILD.5.txt index c653aacd..74aea322 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 0402475a..af906608 100644 --- a/scripts/makepkg.sh.in +++ b/scripts/makepkg.sh.in @@ -767,16 +767,59 @@ 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 + local get_source_fn=get_all_sources_for_arch get_vcs=1 + msg "$(gettext "Retrieving sources...")" - local GET_VCS=1 - if [[ $1 == "fast" ]]; then - GET_VCS=0 - fi + while true; do + case $1 in + allarch) + get_source_fn=get_all_sources + ;; + novcs) + get_vcs=0 + ;; + *) + break 2 + ;; + esac + shift + done - local netfile - for netfile in "${source[@]}"; do + "$get_source_fn" 'all_sources' + for netfile in "${all_sources[@]}"; do pushd "$SRCDEST" &>/dev/null local proto=$(get_protocol "$netfile") @@ -785,16 +828,16 @@ download_sources() { download_local "$netfile" ;; bzr*) - (( GET_VCS )) && download_bzr "$netfile" + (( get_vcs )) && download_bzr "$netfile" ;; git*) - (( GET_VCS )) && download_git "$netfile" + (( get_vcs )) && download_git "$netfile" ;; hg*) - (( GET_VCS )) && download_hg "$netfile" + (( get_vcs )) && download_hg "$netfile" ;; svn*) - (( GET_VCS )) && download_svn "$netfile" + (( get_vcs )) && download_svn "$netfile" ;; *) download_file "$netfile" @@ -976,8 +1019,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 @@ -1120,16 +1165,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; ++idx )); do - local netfile=${source[idx]} + local netfile=${sources[idx]} local proto sum proto="$(get_protocol "$netfile")" @@ -1182,6 +1238,9 @@ generate_checksums() { fi generate_one_checksum "$integ" + for a in "${arch[@]}"; do + generate_one_checksum "$integ" "$a" + done done } @@ -1214,15 +1273,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[@]} == 0 && ${#sources[@]} == 0 )); then + return 1 + fi - if (( ${#integrity_sums[@]} == ${#source[@]} )); then + 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 @@ -1237,14 +1306,44 @@ verify_integrity_sums() { fi } +have_sources() { + local a + + case $1 in + all) + for a in "${arch[@]}"; do + array_build _ source_"$a" && return 0 + done + ;; + *) + if (( ${#source[*]} )) || array_build _ source_"$CARCH"; then + return 0 + fi + ;; + esac + + return 1 +} + check_checksums() { (( SKIPCHECKSUMS )) && return 0 - (( ! ${#source[@]} )) && return 0 + have_sources "$1" || return 0 local correlation=0 - local integ + local integ a for integ in "${known_hash_algos[@]}"; do verify_integrity_sums "$integ" && correlation=1 + + case $1 in + all) + for a in "${arch[@]}"; do + verify_integrity_sums "$integ" "$a" && correlation=1 + done + ;; + *) + verify_integrity_sums "$integ" "$CARCH" && correlation=1 + ;; + esac done if (( ! correlation )); then @@ -1321,8 +1420,17 @@ check_pgpsigs() { local warning=0 local errors=0 local statusfile=$(mktemp) + local all_sources - for file in "${source[@]}"; do + case $1 in + all) + get_all_sources 'all_sources' + ;; + *) + get_all_sources_for_arch 'all_sources' + ;; + esac + for file in "${all_sources[@]}"; do file="$(get_filename "$file")" if [[ ! $file = *.@(sig?(n)|asc) ]]; then continue @@ -1426,20 +1534,22 @@ check_source_integrity() { warning "$(gettext "Skipping all source file integrity checks.")" elif (( SKIPCHECKSUMS )); then warning "$(gettext "Skipping verification of source file checksums.")" - check_pgpsigs + check_pgpsigs "$@" elif (( SKIPPGPCHECK )); then warning "$(gettext "Skipping verification of source file PGP signatures.")" - check_checksums + check_checksums "$@" else - check_checksums - check_pgpsigs + check_checksums "$@" + check_pgpsigs "$@" fi } 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 @@ -2130,8 +2240,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' + for file in "${all_sources[@]}"; do if [[ "$file" = "$(get_filename "$file")" ]] || (( SOURCEONLY == 2 )); then local absfile absfile=$(get_filepath "$file") || missing_source_file "$file" @@ -3268,7 +3380,7 @@ if (( GENINTEG )); then mkdir -p "$srcdir" chmod a-s "$srcdir" cd_safe "$srcdir" - download_sources fast + download_sources novcs allarch generate_checksums exit 0 # $E_OK fi @@ -3372,12 +3484,12 @@ if (( SOURCEONLY )); then chmod a-s "$srcdir" cd_safe "$srcdir" if (( SOURCEONLY == 2 )); then - download_sources + download_sources allarch elif ( (( ! SKIPCHECKSUMS )) || \ ( (( ! SKIPPGPCHECK )) && source_has_signatures ) ); then - download_sources fast + download_sources novcs fi - check_source_integrity + check_source_integrity all cd_safe "$startdir" enter_fakeroot |