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.
This commit is contained in:
Dave Reisner 2014-08-07 12:41:20 -04:00 committed by Allan McRae
parent 51353edc61
commit 963f7fe02f
2 changed files with 152 additions and 36 deletions

View File

@ -116,6 +116,10 @@ below).
Compressed files will be extracted automatically unless found in the Compressed files will be extracted automatically unless found in the
noextract array described below. 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 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 with weird URLs and for handling multiple source files with the same
name. The syntax is: `source=('filename::url')`. name. The syntax is: `source=('filename::url')`.

View File

@ -767,16 +767,59 @@ extract_svn() {
popd &>/dev/null popd &>/dev/null
} }
download_sources() { get_all_sources() {
msg "$(gettext "Retrieving sources...")" local aggregate l a
local GET_VCS=1 if array_build l 'source'; then
if [[ $1 == "fast" ]]; then aggregate+=("${l[@]}")
GET_VCS=0
fi fi
local netfile for a in "${arch[@]}"; do
for netfile in "${source[@]}"; 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...")"
while true; do
case $1 in
allarch)
get_source_fn=get_all_sources
;;
novcs)
get_vcs=0
;;
*)
break 2
;;
esac
shift
done
"$get_source_fn" 'all_sources'
for netfile in "${all_sources[@]}"; do
pushd "$SRCDEST" &>/dev/null pushd "$SRCDEST" &>/dev/null
local proto=$(get_protocol "$netfile") local proto=$(get_protocol "$netfile")
@ -785,16 +828,16 @@ download_sources() {
download_local "$netfile" download_local "$netfile"
;; ;;
bzr*) bzr*)
(( GET_VCS )) && download_bzr "$netfile" (( get_vcs )) && download_bzr "$netfile"
;; ;;
git*) git*)
(( GET_VCS )) && download_git "$netfile" (( get_vcs )) && download_git "$netfile"
;; ;;
hg*) hg*)
(( GET_VCS )) && download_hg "$netfile" (( get_vcs )) && download_hg "$netfile"
;; ;;
svn*) svn*)
(( GET_VCS )) && download_svn "$netfile" (( get_vcs )) && download_svn "$netfile"
;; ;;
*) *)
download_file "$netfile" download_file "$netfile"
@ -976,8 +1019,10 @@ in_array() {
} }
source_has_signatures() { source_has_signatures() {
local file local file all_sources
for file in "${source[@]}"; do
get_all_sources_for_arch 'all_sources'
for file in "${all_sources[@]}"; do
if [[ ${file%%::*} = *.@(sig?(n)|asc) ]]; then if [[ ${file%%::*} = *.@(sig?(n)|asc) ]]; then
return 0 return 0
fi fi
@ -1120,16 +1165,27 @@ get_integlist() {
} }
generate_one_checksum() { 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 if (( numsrc == 0 )); then
return return
fi 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 for (( idx = 0; idx < numsrc; ++idx )); do
local netfile=${source[idx]} local netfile=${sources[idx]}
local proto sum local proto sum
proto="$(get_protocol "$netfile")" proto="$(get_protocol "$netfile")"
@ -1182,6 +1238,9 @@ generate_checksums() {
fi fi
generate_one_checksum "$integ" generate_one_checksum "$integ"
for a in "${arch[@]}"; do
generate_one_checksum "$integ" "$a"
done
done done
} }
@ -1214,15 +1273,25 @@ verify_integrity_one() {
} }
verify_integrity_sums() { 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" msg "$(gettext "Validating source files with %s...")" "${integ}sums"
local idx errors=0 local idx errors=0
for (( idx = 0; idx < ${#source[*]}; idx++ )); do for (( idx = 0; idx < ${#sources[*]}; idx++ )); do
verify_integrity_one "${source[idx]}" "$integ" "${integrity_sums[idx]}" || errors=1 verify_integrity_one "${sources[idx]}" "$integ" "${integrity_sums[idx]}" || errors=1
done done
if (( errors )); then if (( errors )); then
@ -1237,14 +1306,44 @@ verify_integrity_sums() {
fi 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() { check_checksums() {
(( SKIPCHECKSUMS )) && return 0 (( SKIPCHECKSUMS )) && return 0
(( ! ${#source[@]} )) && return 0 have_sources "$1" || return 0
local correlation=0 local correlation=0
local integ local integ a
for integ in "${known_hash_algos[@]}"; do for integ in "${known_hash_algos[@]}"; do
verify_integrity_sums "$integ" && correlation=1 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 done
if (( ! correlation )); then if (( ! correlation )); then
@ -1321,8 +1420,17 @@ check_pgpsigs() {
local warning=0 local warning=0
local errors=0 local errors=0
local statusfile=$(mktemp) 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")" file="$(get_filename "$file")"
if [[ ! $file = *.@(sig?(n)|asc) ]]; then if [[ ! $file = *.@(sig?(n)|asc) ]]; then
continue continue
@ -1426,20 +1534,22 @@ check_source_integrity() {
warning "$(gettext "Skipping all source file integrity checks.")" warning "$(gettext "Skipping all source file integrity checks.")"
elif (( SKIPCHECKSUMS )); then elif (( SKIPCHECKSUMS )); then
warning "$(gettext "Skipping verification of source file checksums.")" warning "$(gettext "Skipping verification of source file checksums.")"
check_pgpsigs check_pgpsigs "$@"
elif (( SKIPPGPCHECK )); then elif (( SKIPPGPCHECK )); then
warning "$(gettext "Skipping verification of source file PGP signatures.")" warning "$(gettext "Skipping verification of source file PGP signatures.")"
check_checksums check_checksums "$@"
else else
check_checksums check_checksums "$@"
check_pgpsigs check_pgpsigs "$@"
fi fi
} }
extract_sources() { extract_sources() {
msg "$(gettext "Extracting sources...")" msg "$(gettext "Extracting sources...")"
local netfile local netfile all_sources
for netfile in "${source[@]}"; do
get_all_sources_for_arch 'all_sources'
for netfile in "${all_sources[@]}"; do
local file=$(get_filename "$netfile") local file=$(get_filename "$netfile")
if in_array "$file" "${noextract[@]}"; then if in_array "$file" "${noextract[@]}"; then
# skip source files in the noextract=() array # skip source files in the noextract=() array
@ -2130,8 +2240,10 @@ create_srcpackage() {
msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT" msg2 "$(gettext "Adding %s...")" "$BUILDSCRIPT"
ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}" ln -s "${BUILDFILE}" "${srclinks}/${pkgbase}/${BUILDSCRIPT}"
local file local file all_sources
for file in "${source[@]}"; do
get_all_sources 'all_sources'
for file in "${all_sources[@]}"; do
if [[ "$file" = "$(get_filename "$file")" ]] || (( SOURCEONLY == 2 )); then if [[ "$file" = "$(get_filename "$file")" ]] || (( SOURCEONLY == 2 )); then
local absfile local absfile
absfile=$(get_filepath "$file") || missing_source_file "$file" absfile=$(get_filepath "$file") || missing_source_file "$file"
@ -3268,7 +3380,7 @@ if (( GENINTEG )); then
mkdir -p "$srcdir" mkdir -p "$srcdir"
chmod a-s "$srcdir" chmod a-s "$srcdir"
cd_safe "$srcdir" cd_safe "$srcdir"
download_sources fast download_sources novcs allarch
generate_checksums generate_checksums
exit 0 # $E_OK exit 0 # $E_OK
fi fi
@ -3372,12 +3484,12 @@ if (( SOURCEONLY )); then
chmod a-s "$srcdir" chmod a-s "$srcdir"
cd_safe "$srcdir" cd_safe "$srcdir"
if (( SOURCEONLY == 2 )); then if (( SOURCEONLY == 2 )); then
download_sources download_sources allarch
elif ( (( ! SKIPCHECKSUMS )) || \ elif ( (( ! SKIPCHECKSUMS )) || \
( (( ! SKIPPGPCHECK )) && source_has_signatures ) ); then ( (( ! SKIPPGPCHECK )) && source_has_signatures ) ); then
download_sources fast download_sources novcs
fi fi
check_source_integrity check_source_integrity all
cd_safe "$startdir" cd_safe "$startdir"
enter_fakeroot enter_fakeroot