abuild: support subpackages="pkg:split:arch" syntax

For proper cross-build support, the subpackage arch needs to
be known before invoking the split function. This implements
a way to do that. This also changes to write the actual subpkg
arch to .PKGINFO - apk index --rewrite-arch still overwrites
index to have machine arch for noarch packages.
This commit is contained in:
Timo Teräs 2016-07-23 06:18:27 +00:00
parent 26ec31c6c2
commit b217bbb2ea
1 changed files with 47 additions and 39 deletions

View File

@ -441,6 +441,28 @@ cleancache() {
done done
} }
subpkg_unset() {
unset subpkgname subpkgsplit subpkgarch
}
subpkg_set() {
subpkgname=${1%%:*}
local _splitarch=${1#*:}
[ "$_splitarch" = "$1" ] && _splitarch=""
subpkgsplit=${_splitarch%%:*}
[ -z "$subpkgsplit" ] && subpkgsplit="${subpkgname##*-}"
subpkgarch=${_splitarch#*:}
if [ "$subpkgarch" = "$_splitarch" -o -z "$subpkgarch" ]; then
case "$subpkgname" in
*-doc | *-lang | *-lang-*) subpkgarch="noarch" ;;
*) subpkgarch="$pkgarch" ;;
esac
fi
}
listpkgnames() { listpkgnames() {
local i local i
for i in $pkgname $subpackages; do for i in $pkgname $subpackages; do
@ -575,18 +597,6 @@ targz() {
tar -czf "$PKGDEST"/$pkgname-$pkgver-r$pkgrel.tar.gz * tar -czf "$PKGDEST"/$pkgname-$pkgver-r$pkgrel.tar.gz *
} }
get_split_func() {
# get the 'func' from "sub-pkg:func:arch"
local _splitarch=${1#*:}
[ "$_splitarch" = "$1" ] && _splitarch=""
local _split=${_splitarch%:*}
if [ -z "$_split" ]; then
local _name=${1%%:*}
_split="${_name##*-}"
fi
echo $_split
}
postcheck() { postcheck() {
local dir="$1" name="$2" i= local dir="$1" name="$2" i=
msg "Running postcheck for $name" msg "Running postcheck for $name"
@ -678,20 +688,17 @@ pre_split() {
# the subpackages should not inherit those form main package # the subpackages should not inherit those form main package
provides="" provides=""
install_if="" install_if=""
apkbuild_arch="$arch"
} }
prepare_subpackages() { prepare_subpackages() {
local i local i
cd "$startdir" cd "$startdir"
for i in $subpackages; do for i in $subpackages; do
local func=$(get_split_func $i)
# call abuild recursively, setting subpkg{dir,name} # call abuild recursively, setting subpkg{dir,name}
msg "Running split function $func..." ( subpkg_set "$i"; msg "Running split function $subpkgsplit..."; \
local dir="$pkgbasedir/${i%%:*}" name="${i%%:*}" subpkgdir="$pkgbasedir/$subpkgname" subpkgname="$subpkgname" subpkgarch="$subpkgarch" \
( subpkgdir="$dir" subpkgname="$name" \ $0 pre_split $subpkgsplit prepare_package \
$0 pre_split $func prepare_package \ && postcheck "$pkgbasedir/$subpkgname" "$subpkgname" ) || return 1
&& postcheck "$dir" "$name" ) || return 1
done done
postcheck "$pkgdir" "$pkgname" || return 1 postcheck "$pkgdir" "$pkgname" || return 1
# post check for /usr/share/locale # post check for /usr/share/locale
@ -704,7 +711,7 @@ prepare_subpackages() {
default_lang() { default_lang() {
pkgdesc="Languages for package $pkgname" pkgdesc="Languages for package $pkgname"
install_if="$pkgname=$pkgver-r$pkgrel lang" install_if="$pkgname=$pkgver-r$pkgrel lang"
arch="noarch"
local dir local dir
for dir in ${langdir:-/usr/share/locale}; do for dir in ${langdir:-/usr/share/locale}; do
mkdir -p "$subpkgdir"/${dir%/*} mkdir -p "$subpkgdir"/${dir%/*}
@ -722,8 +729,8 @@ default_lang_subpkg() {
return 1 return 1
fi fi
pkgdesc="$pkgname language pack for $lang" pkgdesc="$pkgname language pack for $lang"
arch="noarch"
install_if="$pkgname=$pkgver-r$pkgrel lang-$lang" install_if="$pkgname=$pkgver-r$pkgrel lang-$lang"
local dir local dir
for dir in ${langdir:-/usr/share/locale}; do for dir in ${langdir:-/usr/share/locale}; do
mkdir -p "$subpkgdir"/$dir mkdir -p "$subpkgdir"/$dir
@ -787,7 +794,7 @@ check_depends_dev() {
fi fi
local i local i
for i in $pkgname $subpackages; do for i in $pkgname $subpackages; do
case "$i" in case "${i%%:*}" in
*-dev) return 0 ;; *-dev) return 0 ;;
esac esac
done done
@ -808,16 +815,12 @@ prepare_metafiles() {
mkdir -p "$controldir" mkdir -p "$controldir"
local builddate=$(date -u "+%s") local builddate=$(date -u "+%s")
local size=$(du -sk | awk '{print $1 * 1024}') local size=$(du -sk | awk '{print $1 * 1024}')
local parch="$CARCH"
# we need to wait with setting noarch til our build infra can handle it if [ "$arch" != "$apkbuild_arch" ]; then
# if [ "$arch" = "noarch" ]; then local msg="Split function set arch=\"$arch\" for $name, use subpackages=pkg:split:arch format instead"
# parch="noarch" [ "$arch" != "noarch" ] && die "$msg"
# fi warning "$msg"
subpkgarch="$arch"
# save arch incase subpackages set it different than main pkg
if [ "${apkbuild_arch:-$arch}" != "$arch" ]; then
echo "$arch" > "$controldir"/.arch
fi fi
echo "# Generated by $(basename $0) $program_version" >"$pkginfo" echo "# Generated by $(basename $0) $program_version" >"$pkginfo"
@ -833,7 +836,7 @@ url = $url
builddate = $builddate builddate = $builddate
packager = ${PACKAGER:-"Unknown"} packager = ${PACKAGER:-"Unknown"}
size = $size size = $size
arch = $parch arch = ${subpkgarch:-$pkgarch}
origin = $pkgname origin = $pkgname
EOF EOF
local i deps local i deps
@ -904,7 +907,7 @@ EOF
prepare_trace_rpaths() { prepare_trace_rpaths() {
local dir=${subpkgdir:-$pkgdir} local dir=${subpkgdir:-$pkgdir}
local etype= soname= file= sover= local etype= soname= file= sover=
[ "$arch" = "noarch" ] && return 0 [ "${subpkgarch:-$pkgarch}" = "noarch" ] && return 0
options_has "!tracedeps" && return 0 options_has "!tracedeps" && return 0
# lets tell all the places we should look for .so files - all rpaths # lets tell all the places we should look for .so files - all rpaths
scanelf --quiet --recursive --rpath "$dir" \ scanelf --quiet --recursive --rpath "$dir" \
@ -974,10 +977,10 @@ is_doc_pkg() {
archcheck() { archcheck() {
options_has "!archcheck" && return 0 options_has "!archcheck" && return 0
if dir_has_arch_binaries "${subpkgdir:-$pkgdir}"; then if dir_has_arch_binaries "${subpkgdir:-$pkgdir}"; then
[ "$arch" != "noarch" ] && return 0 [ "${subpkgarch:-$pkgarch}" != "noarch" ] && return 0
error "Arch specific binaries found so arch must not be set to \"noarch\"" error "Arch specific binaries found so arch must not be set to \"noarch\""
return 1 return 1
elif [ "$arch" != "noarch" ] && ! is_dev_pkg; then elif [ "${subpkgarch:-$pkgarch}" != "noarch" ] && ! is_dev_pkg; then
# we dont want -dev package go to noarch # we dont want -dev package go to noarch
warning "No arch specific binaries found so arch should probably be set to \"noarch\"" warning "No arch specific binaries found so arch should probably be set to \"noarch\""
fi fi
@ -1042,6 +1045,7 @@ trace_apk_deps() {
local name="$1" local name="$1"
local dir="$2" local dir="$2"
local i= found= autodeps= deppkgs= missing= local i= found= autodeps= deppkgs= missing=
msg "Tracing dependencies..." msg "Tracing dependencies..."
# add pkgconfig if usr/lib/pkgconfig is found # add pkgconfig if usr/lib/pkgconfig is found
if [ -d "$pkgbasedir"/$name/usr/lib/pkgconfig ] \ if [ -d "$pkgbasedir"/$name/usr/lib/pkgconfig ] \
@ -1153,7 +1157,7 @@ scan_shared_objects() {
local name="$1" controldir="$2" datadir="$3" local name="$1" controldir="$2" datadir="$3"
local opt= i= local opt= i=
if [ "$arch" = "noarch" ] && ! [ -e "$controldir"/.arch ]; then if [ "${subpkgarch:-$pkgarch}" = "noarch" ]; then
return 0 return 0
fi fi
@ -1430,7 +1434,6 @@ update_abuildrepo_index() {
default_doc() { default_doc() {
depends="$depends_doc" depends="$depends_doc"
pkgdesc="$pkgdesc (documentation)" pkgdesc="$pkgdesc (documentation)"
arch=${arch_doc:-"noarch"}
install_if="docs $pkgname=$pkgver-r$pkgrel" install_if="docs $pkgname=$pkgver-r$pkgrel"
local i local i
@ -1927,7 +1930,7 @@ checksum() {
stripbin() { stripbin() {
local bin local bin
if options_has "!strip" || [ "$arch" = "noarch" ]; then if options_has "!strip" || [ "${subpkgarch:-$pkgarch}" = "noarch" ]; then
return 0 return 0
fi fi
cd "${subpkgdir:-$pkgdir}" || return 1 cd "${subpkgdir:-$pkgdir}" || return 1
@ -2271,7 +2274,12 @@ if [ -n "$subpkgname" ]; then
origsubpackages="$subpackages" origsubpackages="$subpackages"
subpackages= subpackages=
fi fi
apkbuild_arch="$arch"
pkgdir="$pkgbasedir/$pkgname" pkgdir="$pkgbasedir/$pkgname"
if [ -z "$pkgarch" ]; then
pkgarch=$CARCH
list_has noarch $arch && pkgarch=noarch
fi
controldir="$pkgbasedir"/.control.${subpkgname:-$pkgname} controldir="$pkgbasedir"/.control.${subpkgname:-$pkgname}
trap 'die "Aborted by user"' INT trap 'die "Aborted by user"' INT