mirror of
https://gitlab.alpinelinux.org/alpine/abuild.git
synced 2024-12-23 15:33:28 +00:00
c7d94591a5
This option will make buildrepo continue build even if some package fails. It is an 'build what you can' option.
207 lines
4.4 KiB
Bash
Executable File
207 lines
4.4 KiB
Bash
Executable File
#!/bin/sh
|
|
|
|
program=${0##*/}
|
|
|
|
aportsdir=${APORTSDIR:-$HOME/aports}
|
|
repodir=${REPODIR:-$HOME/packages}
|
|
|
|
if [ -f /etc/abuild.conf ]; then
|
|
. /etc/abuild.conf
|
|
fi
|
|
|
|
if [ -z "$CARCH" ]; then
|
|
machine=$(uname -m)
|
|
case $machine in
|
|
i[3-9]86) CARCH=x86;;
|
|
*) CARCH=$machine;;
|
|
esac
|
|
fi
|
|
|
|
usage() {
|
|
echo "usage: $program [-a APORTSDIR] [-d REPODIR] [-hp] [-l LOGPREFIX ]"
|
|
echo " [-r DEPREPO] REPOSITORY..."
|
|
|
|
echo "options:"
|
|
echo " -a Set the aports base dir to APORTSDIR instead of $aportsdir"
|
|
echo " -d Set destination repository base dir to REPODIR instead of $repodir"
|
|
echo " -h Show this help and exit"
|
|
echo " -l Send build to logfile, prefixed by LOGPREFIX"
|
|
echo " -k Keep going, even if packages fails"
|
|
echo " -p Purge obsolete packages from REPODIR after build"
|
|
echo " -r Dependencies are found in DEPREPO"
|
|
exit 1
|
|
}
|
|
|
|
is_in() {
|
|
local needle="$1" arg=
|
|
shift
|
|
for arg; do
|
|
[ "$needle" = "$arg" ] && return 0
|
|
done
|
|
return 1
|
|
}
|
|
|
|
check_arch() {
|
|
[ "$1" = "all" ] || [ "$1" = "noarch" ] || is_in "$CARCH" $@
|
|
}
|
|
|
|
listpackages() {
|
|
local repo="$1" i= pkgname= pkgver= pkgrel= subpackage= arch= subpkg= linguas=
|
|
local lang= suffix=
|
|
cd "$aportsdir/$repo"
|
|
for i in */APKBUILD; do
|
|
cd "$aportsdir/$repo"/${i%/*} || return 1
|
|
pkgname=
|
|
pkgver=
|
|
pkgrel=
|
|
subpackages=
|
|
arch=
|
|
linguas=
|
|
. ./APKBUILD
|
|
suffix="$pkgver-r$pkgrel.apk"
|
|
|
|
if ! check_arch $arch; then
|
|
continue
|
|
fi
|
|
for subpkg in $pkgname $subpackages; do
|
|
echo ${subpkg%:*}-$suffix
|
|
done
|
|
for lang in $linguas; do
|
|
echo $pkgname-lang-$lang-$suffix
|
|
done
|
|
done
|
|
}
|
|
|
|
all_exist() {
|
|
while [ $# -gt 0 ]; do
|
|
[ -e "$1" ] || return 1
|
|
shift 1
|
|
done
|
|
return 0
|
|
}
|
|
|
|
list_needbuild() {
|
|
local repo="$1" i=
|
|
|
|
cd "$aportsdir/$repo" || return 0
|
|
|
|
# first we try copy everything possible and find out which we need
|
|
# to rebuild. By doing this we might save us for rebuilding
|
|
# needed when running 'abuild -R'
|
|
for apkbuild in */APKBUILD; do
|
|
[ -f "$aportsdir/$repo/$apkbuild" ] || continue
|
|
export REPODEST="$repodir"
|
|
cd "$aportsdir/$repo"/${apkbuild%/*} || return 1
|
|
pkgname=
|
|
pkgver=
|
|
pkgrel=
|
|
subpackages=
|
|
arch=
|
|
. ./APKBUILD
|
|
|
|
if ! check_arch $arch; then
|
|
continue
|
|
fi
|
|
|
|
pkgs=
|
|
for subpkg in $pkgname $subpackages; do
|
|
pkgfile=${subpkg%:*}-$pkgver-r$pkgrel.apk
|
|
if ! [ -f "$REPODEST/$repo/$CARCH/$pkgfile" ]; then
|
|
pkgs="$pkgs $pkgfile"
|
|
fi
|
|
done
|
|
if [ -z "$pkgs" ]; then
|
|
continue
|
|
fi
|
|
|
|
# try link or copy the files if they are in the ports dir
|
|
if all_exist $pkgs; then
|
|
echo ">>> Copying " $pkgs >&2
|
|
cp -p -l $pkgs "$repodir/$repo/$CARCH"/ 2>/dev/null \
|
|
|| cp -p $pkgs "$repodir/$repo/$CARCH"/ \
|
|
|| echo "$apkbuild"
|
|
else
|
|
echo "$apkbuild"
|
|
fi
|
|
done
|
|
}
|
|
|
|
do_build() {
|
|
local repo="$1" i=
|
|
cd "$aportsdir/$repo" || return 0
|
|
local needbuild="$(list_needbuild $repo)"
|
|
|
|
export REPODEST="$repodir"
|
|
export ABUILD_BLACKLIST
|
|
# build the postponed packages if any
|
|
if [ -n "$needbuild" ]; then
|
|
for i in $needbuild; do
|
|
cd "$aportsdir/$repo"/${i%/*} || return 1
|
|
if ! abuild -k -R; then
|
|
[ -n "$keep_going" ] || return 1
|
|
ABUILD_BLACKLIST="$ABUILD_BLACKLIST $i"
|
|
fi
|
|
done
|
|
fi
|
|
|
|
# kill old packages in repo
|
|
if [ -n "$dopurge" ]; then
|
|
echo ">>> Removing old packages from $repo..."
|
|
local tmp=$(mktemp /tmp/$program-XXXXXX)
|
|
local purgefiles
|
|
cd "$repodir/$repo/$CARCH" || return 1
|
|
trap 'rm -f "$tmp"; exit 1' INT
|
|
( listpackages "$1") >$tmp || return 1
|
|
purge=$(ls *.apk 2>/dev/null | grep -v -w -f $tmp)
|
|
if [ -n "$purge" ]; then
|
|
rm -f $purge
|
|
fi
|
|
rm -f "$tmp"
|
|
fi
|
|
|
|
# generate the repository index
|
|
echo ">>> Generating Index for $repo..."
|
|
cd "$repodir/$repo/$CARCH"
|
|
local deps
|
|
for i in $deprepo; do
|
|
deps="--repo $repodir/$i"
|
|
done
|
|
oldindex=
|
|
if [ -f APKINDEX.tar.gz ]; then
|
|
oldindex="--index APKINDEX.tar.gz"
|
|
fi
|
|
tmpindex=$(mktemp).tar.gz
|
|
apk index --rewrite-arch $CARCH $oldindex -o $tmpindex \
|
|
--description "$repo $(cd $aportsdir && git describe)" \
|
|
-- *.apk
|
|
abuild-sign $tmpindex && mv $tmpindex APKINDEX.tar.gz
|
|
chmod 644 APKINDEX.tar.gz
|
|
rm -f tmp.*
|
|
}
|
|
|
|
while getopts "a:d:hkl:pr:" opt; do
|
|
case "$opt" in
|
|
a) aportsdir=$OPTARG;;
|
|
d) repodir=$OPTARG;;
|
|
h) usage >&2;;
|
|
k) keep_going=1;;
|
|
l) logprefix=$OPTARG;;
|
|
p) dopurge=1;;
|
|
r) deprepo="$deprepo $OPTARG";;
|
|
esac
|
|
done
|
|
shift $(($OPTIND - 1))
|
|
|
|
[ $# -eq 0 ] && usage >&2
|
|
|
|
while [ $# -gt 0 ]; do
|
|
if [ -n "$logprefix" ]; then
|
|
do_build $1 >$logprefix.$1.log 2>&1 || exit 1
|
|
else
|
|
do_build $1 || exit 1
|
|
fi
|
|
deprepo="$deprepo $1"
|
|
shift
|
|
done
|
|
|