[pacman-dev] [PATCHv2] PKGBUILD: add support for arch-specific sources

Dave Reisner dreisner at archlinux.org
Fri Aug 15 21:47:45 EDT 2014


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.
---
foutrelis pointed out that 'makepkg -g' wouldn't attempt to download
sources for all architectures. So, I've added some additional polish
to download_sources to make it take several tokens, instead of just
one. And, give the token "fast" a better name...

We really need some of these codepaths to converge sooner...

 doc/PKGBUILD.5.txt    |   4 ++
 scripts/makepkg.sh.in | 161 +++++++++++++++++++++++++++++++++++++++-----------
 2 files changed, 131 insertions(+), 34 deletions(-)

diff --git a/doc/PKGBUILD.5.txt b/doc/PKGBUILD.5.txt
index e2389cb..7a8531b 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 a8ae1de..0678105 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -768,16 +768,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")
@@ -786,16 +829,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"
@@ -977,8 +1020,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
@@ -1121,16 +1166,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")"
 
@@ -1183,6 +1239,9 @@ generate_checksums() {
 		fi
 
 		generate_one_checksum "$integ"
+		for a in "${arch[@]}"; do
+			generate_one_checksum "$integ" "$a"
+		done
 	done
 }
 
@@ -1215,15 +1274,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
@@ -1242,9 +1311,20 @@ check_checksums() {
 	(( SKIPCHECKSUMS )) && 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 +1401,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 +1515,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 +2221,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"
@@ -3254,7 +3347,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
@@ -3358,12 +3451,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
-- 
2.0.4


More information about the pacman-dev mailing list