summaryrefslogtreecommitdiffstats
path: root/abuild
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2009-01-04 13:38:45 +0000
committerNatanael Copa <ncopa@alpinelinux.org>2009-01-04 13:38:45 +0000
commit014754b3c2efa6f829d8d97716b7bfa9adaa86b3 (patch)
tree3116d395f4e5d54d62cdb5c6cb59eb690da905e4 /abuild
parente48c520d54ce487c69105009be0408c9bcf0d6b4 (diff)
downloadabuild-014754b3c2efa6f829d8d97716b7bfa9adaa86b3.tar.bz2
abuild-014754b3c2efa6f829d8d97716b7bfa9adaa86b3.tar.xz
abuild: reworked dependency handling
- Added option -i, to install a given build target after successful build. - Parse all APKBUILDs and use awk to calculate a dependency graph. Then build the package and use -i to install the needed dependency. - Uninstall all build dependencies after package is built (unless -i given) - Automatically add binutils gcc make patch uclibc-dev as deps
Diffstat (limited to 'abuild')
-rwxr-xr-xabuild124
1 files changed, 91 insertions, 33 deletions
diff --git a/abuild b/abuild
index d8c475d..5c7dfc0 100755
--- a/abuild
+++ b/abuild
@@ -36,6 +36,7 @@ pkgrel=0
# defaults
SRCDEST=${SRCDEST:-$startdir}
PKGDEST=${PKGDEST:-$startdir}
+BUILD_BASE="binutils gcc make patch uclibc-dev"
default_cmds="sanitycheck builddeps clean fetch md5check unpack rootpkg"
@@ -47,6 +48,9 @@ set_xterm_title() {
cleanup() {
set_xterm_title ""
+ if [ -z "$install_after" ] && [ -n "$uninstall_after" ]; then
+ sudo apk_delete $uninstall_after
+ fi
}
die() {
@@ -394,42 +398,86 @@ up2date() {
return 0
}
-# note: this must run in a subshell
-find_aport() {
- local i
- msg "Searching for $1 in aports tree..."
- cd ../..
- for i in */*/APKBUILD; do
- pkgrel=
+# source all APKBUILDs and output:
+# 1) origin of package
+# 2) all dependencies
+# the output is i in a format easy parseable for awk
+depparse_aports() {
+ # lets run this in a subshell since we source all APKBUILD here
+ (
+ aportsdir=$(realpath ${APKBUILD%/APKBUILD}/../..)
+ for i in $aportsdir/*/*/APKBUILD; do
+ pkgname=
+ subpackages=
+ depends=
+ makedepends=
. $i
- local j
+ dir=${i%/APKBUILD}
for j in $pkgname $subpackages; do
- if [ "${j%%:*}" = "$1" ]; then
- echo "$PWD/${i%/APKBUILD}/$1-$pkgver-r$pkgrel.apk"
- return 0
- fi
+ echo "o ${j%%:*} $dir"
+ set -- $depends $makedepends
+ echo -n "d ${j%%:*} $1"
+ shift
+ while [ $# -gt 0 ]; do
+ echo -n ",$1"
+ shift
+ done
+ echo
done
done
- return 1
+ )
}
-# recursively build and install dependencies
-builddeps() {
- local dep pkg
- for dep in $depends $makedepends; do
- [ -z "$upgrade" ] && apk_info -e $dep && continue
- [ -z "$recursive" ] && die "Missing dependency $dep. Use -r or -u to build recursively"
- pkg=$(find_aport $dep)
- if [ -z "$pkg" ]; then
- # try install from system repo as fallback
- apk_add ${upgrade:+-u} $dep && continue
- die "Failed to find dependency $dep"
+deptrace() {
+ ( depparse_aports
+ if [ -z "$upgrade" ]; then
+ # list installed pkgs and prefix with 'i '
+ apk_info | sed 's/-[0-9].*//; s/^/i /'
fi
- # recursively build deps
- msg "Entering ${pkg%/*}"
- cd ${pkg%/*}
- $0 -r ${upgrade:+-u} || return 1
- sudo apk_add ${upgrade:+-u} $pkg
+ ) | awk -v pkgs="$BUILD_BASE $depends $makedepends" '
+
+ function depgraph(pkg, a, i) {
+ if (visited[pkg])
+ return 0;
+ visited[pkg] = 1;
+ split(deps[pkg], a, ",");
+ for (i in a)
+ depgraph(a[i]);
+ print pkg ":" origin[pkg];
+
+ }
+
+ $1 == "i" { visited[$2] = 1 }
+ $1 == "o" { origin[$2] = $3 }
+ $1 == "d" { deps[$2] = $3 }
+ END {
+ split(pkgs, pkgarray);
+ for (i in pkgarray)
+ depgraph(pkgarray[i]);
+ }
+ '
+}
+
+# build and install dependencies
+builddeps() {
+ local deps alldeps pkg i dir ver
+ msg "Building dependencies..."
+ deps="$BUILD_BASE $depends $makedepends"
+ if [ -z "$recursive" ]; then
+ for i in $deps; do
+ apk_info -e $i || die "Missing dependency $i. Use -r to build recursively"
+ done
+ return 0
+ fi
+
+ for i in $(deptrace); do
+ # i = pkg:dir
+ local dir=${i#*:}
+ local pkg=${i%:*}
+ msg "Entering $dir"
+ cd "$dir" || return 1
+ $0 -i $pkg || return 1
+ uninstall_after="$pkg $uninstall_after"
done
}
@@ -469,10 +517,11 @@ listpkg() {
usage() {
echo "$(basename $0) $abuild_ver"
- echo "usage: $0 [options] [cmd] ..."
+ echo "usage: $0 [options] [-i PKG] [cmd] ..."
echo "Options:"
- echo " -h Show this help"
echo " -f Force specified cmd, even if they are already done"
+ echo " -h Show this help"
+ echo " -i Install PKG after successul build"
echo " -q Quiet"
echo " -r Recursively build and install missing dependencies (using sudo)"
echo " -u Recursively build and upgrade dependencies (using sudo)"
@@ -499,10 +548,13 @@ usage() {
APKBUILD="${APKBUILD:-./APKBUILD}"
-while getopts "hfqru" opt; do
+unset force
+unset recursive
+while getopts "fhi:qru" opt; do
case $opt in
- 'h') usage;;
'f') force=1;;
+ 'h') usage;;
+ 'i') install_after="$install_after $OPTARG";;
'q') quiet=1;;
'r') recursive=1;;
'u') upgrade=1
@@ -536,5 +588,11 @@ while [ $# -gt 0 ]; do
runpart $1
shift
done
+
+for i in $install_after; do
+ sudo apk_add -s -u $PKGDEST/$i-$pkgver-r$pkgrel.apk \
+ || die "Failed to install $i"
+done
+
cleanup