mirror of
https://github.com/moparisthebest/pacman
synced 2024-11-15 13:55:09 -05:00
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:
parent
51353edc61
commit
963f7fe02f
@ -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')`.
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
if [[ $arch ]]; then
|
||||||
|
printf "%ssums_%s=(%n" "$integ" "$arch" indentsz
|
||||||
|
else
|
||||||
printf "%ssums=(%n" "$integ" indentsz
|
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=()
|
||||||
|
|
||||||
|
if [[ $arch ]]; then
|
||||||
|
array_build integrity_sums "${integ}sums_$arch"
|
||||||
|
array_build sources "source_$arch"
|
||||||
|
else
|
||||||
array_build integrity_sums "${integ}sums"
|
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
|
||||||
|
Loading…
Reference in New Issue
Block a user