Newer
Older
#!/bin/sh
# script to build apk packages (light version og makepkg)
# Copyright (c) 2008 Natanael Copa <natanael.copa@gmail.com>
#
# Distributed under GPL-2
#
# Depends on: busybox utilities, fakeroot,
#
# read config
MAKEAPK_CONF=${MAKEAPK_CONF:-/etc/abuild.conf}
[ -f "$MAKEAPK_CONF" ] && . "$MAKEAPK_CONF"
startdir="$PWD"
srcdir=${srcdir:-"$startdir/src"}
pkgdir=${pkgdir:-"$startdir/pkg"}
pkgrel=0
# defaults
SRCDEST=${SRCDEST:-$startdir}
PKGDEST=${PKGDEST:-$startdir}
default_cmds="sanitycheck builddeps clean fetch md5check unpack rootpkg"
[ -n "$subpkgname" ] && sub="(sub)"
[ -z "$quiet" ] && echo ">>> ${subpkgname:-$pkgname} $sub:" "$@" >&2
}
warning() {
echo ">>> Warning:" "$@" >&2
}
die() {
quiet=
# check if apkbuild is basicly sane
sanitycheck() {
[ -z "$pkgname" ] && die "Missing pkgname in APKBUILD"
[ -z "${pkgname##* *}" ] && die "pkgname contains spaces"
[ -z "$pkgver" ] && die "Missing pkgver in APKBUILD"
die "pkgver does not start with a digit"
[ -z "$pkgrel" ] && warning "Missing pkgrel in APKBUILD. Using pkgrel=0"
[ -z "$pkgdesc" ] && die "Missing pkgdesc in APKBUILD"
[ -z "$url" ] && die "Missing url in APKBUILD"
[ -z "$license" ] && die "Missing license in APKBULID"
if [ "$(echo $source | wc -l)" -ne "$(echo $md5sums | wc -l)" ]; then
die "Number of md5sums does not correspond to number of sources"
fi
# common spelling errors
[ -n "$depend" ] && die "APKBUILD contains 'depend'. It should be depends"
[ -n "$makedepend" ] && die "APKBUILD contains 'makedepend'. It should be makedepends"
return 0
}
md5check() {
if [ -z "$source" ]; then
return 0
fi
if [ -z "$md5sums" ]; then
die "Use 'abuild checksum >>$APKBUILD' to generate a checksum"
fi
if [ "$(echo $source | wc -l)" -ne "$(echo $md5sums | wc -l)" ]; then
die "Number of md5sums does not correspond to number of sources"
fi
cd "$srcdir" && echo "$md5sums" | md5sum -c
}
uri_fetch() {
local uri="$1"
local d="${s##*/}" # $(basename $s)
local opts
[ -n "$quiet" ] && opts="-q"
[ -f "$SRCDEST/$d" ] && return 0
if [ -f "$SRCDEST/$d.part" ]; then
msg "Partial download found. Trying to resume"
opts="$opts -c"
wget $opts -O "$SRCDEST/$d.part" "$uri" \
&& mv "$SRCDEST/$d.part" "$SRCDEST/$d"
}
fetch() {
local s
mkdir -p "$srcdir"
for s in $source; do
case "$s" in
http://*|ftp://*)
uri_fetch "$s" || return 1
;;
esac
ln -sf "$SRCDEST/${s##*/}" "$srcdir"/
done
}
# unpack the sources
unpack() {
local u
mkdir -p "$srcdir"
for u in $source; do
local s="$SRCDEST/${u##*/}" # $(basename $s)
case "$s" in
tar -C "$srcdir" -zxf "$s" || return 1;;
*.tar.bz2)
tar -C "$srcdir" -jxf "$s" || return 1;;
esac
done
}
# cleanup source and package dir
clean() {
rm -rf "$srcdir"
rm -rf "$pkgdir"
local i
for i in $subpackages; do
rm -rf "$pkgdir-$(get_split_func $i)"
done
}
# cleanup fetched sources
cleancache() {
local s
for s in $source; do
case "$s" in
http:/*|ftp:/*)
for i in $pkgname $subpackages; do
local p="$i-$pkgver-$pkgrel"
rm -f "$PKGDEST/$p.apk" "$PKGDEST/$p.src.tar.gz"
$part || die "$part failed"
}
# override those in your build script
build() {
die "No build() function found in $APKBUILD"
}
get_split_func() {
# get the 'func' from "sub-pkg:func"
local func=${1##*:}
# get 'func' from "sub-pkg-func" if there was no :func
[ "$func" = "$1" ] && func=${func##*-}
echo $func
}
local func=$(get_split_func $i)
# call abuild recursively, setting subpkg{dir,name}
subpkgdir="$startdir/pkg-$func" subpkgname="$i" \
$0 $func package || return 1
local name=${subpkgname:-$pkgname}
[ -z "${name##* *}" ] && die "package name contains spaces"
local pkg="$name-$pkgver-r$pkgrel.apk"
[ ! -d "$dir" ] && die "Missing $dir"
cd "$dir"
msg "Creating $pkg"
local builddate=$(date -u "+%s")
local size=$(du -sk | awk '{print $1 * 1024}')
echo "# Generated by $(basename $0) $myver" >.PKGINFO
if [ -n "$FAKEROOTKEY" ]; then
echo "# using $(fakeroot -v)" >> .PKGINFO
fi
echo "# $(date -u)" >> .PKGINFO
cat >> .PKGINFO <<EOF
pkgdesc = $pkgdesc
url = $url
builddate = $builddate
packager = ${PACKAGER:-"Unknown"}
size = $size
EOF
for i in $license; do
echo "license = $i" >>.PKGINFO
done
for i in $replaces; do
echo "replaces = $i" >>.PKGINFO
done
for i in $depends; do
echo "depend = $i" >>.PKGINFO
done
for i in $conflicts; do
echo "conflict = $i" >>.PKGINFO
done
for i in $provides; do
echo "provides = $i" >>.PKGINFO
done
for i in $backup; do
echo "backup = $i" >>.PKGINFO
done
local metafiles=".PKGINFO"
if [ -n "$install" ]; then
cp "$srcdir/$install" "$dir/.INSTALL" || return 1
chmod +x "$dir/.INSTALL"
# for i in pre-install post-install pre-deinstall post-deinstall; do
# [ -f ../$i ] && cp ../$i "$db"/
# done
set *
[ "$1" = '*' ] && set --
( cd "$dir" && tar -zcf "$PKGDEST/$pkg" $metafiles $@ )
doc() {
depends=""
local i
for i in doc man info html sgml; do
if [ -d "$pkgdir/usr/share/$i" ]; then
mkdir -p "$subpkgdir/usr/share"
mv "$pkgdir/usr/share/$i" "$subpkgdir/usr/share/"
# remove if empty, ignore error (not empty)
rmdir "$pkgdir/usr/share" "$pkgdir/usr" 2>/dev/null
[ -d "$subpkgdir/usr/share/man" ] && depends="man"
mod() {
depends="$kernel"
for i in firmware modules; do
if [ -d "$pkgdir/lib/$i" ]; then
rm -rf "$subpkgdir/lib"
mkdir -p "$subpkgdir/lib"
mv "$pkgdir/lib/$i" "$subpkgdir/lib"
depends="$pkgname"
for i in $(cd "$pkgdir" && find usr/lib -name '*.a' -o \
-name '*.la' -o -name '*.o' 2>/dev/null) \
usr/include usr/lib/pkgconfig usr/share/aclocal; do
if [ -e "$pkgdir/$i" ] || [ -L "$pkgdir/$i" ]; then
d="$subpkgdir/${i%/*}" # dirname $i
fi
done
}
# build and package in fakeroot
rootpkg() {
fakeroot $0 build subpkg package
}
srcpkg() {
local p="$pkgname-$pkgver-$pkgrel"
local i files="$prefix/APKBUILD"
for i in $source; do
files="$files $prefix/${i##*/}"
done
mkdir -p "$PKGDEST"
(cd .. && tar -zcf "$PKGDEST/$p.src.tar.gz" $files)
# check if package is up to date
up2date() {
local pkg="$PKGDEST/$pkgname-$pkgver-$pkgrel.apk"
[ -f "$pkg" ] || return 1
for i in $source APKBUILD; do
local s="$SRCDEST/${i##*/}" # $(basename $i)
if [ "$s" -nt "$pkg" ]; then
return 1
fi
done
return 0
}
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
# note: this must run in a subshell
find_aport() {
local i
cd ../..
for i in */*/APKBUILD; do
. $i
local j
for j in $pkgname $subpackages; do
if [ "${j%%:*}" = "$1" ]; then
echo "$PWD/${i%/APKBUILD}/$1-$pkgver-r$pkgrel.apk"
return 0
fi
done
done
return 1
}
# recursively build and install dependencies
builddeps() {
local dep pkg
for dep in $depends $makedepends; do
apk_info -e $dep && continue
[ -z "$recursive" ] && die "Missing dependency $dep. Use -r to build recursively"
# sudo apk_add $dep && continue
pkg=$(find_aport $dep) || die "failed to find dependency $dep"
# recursively build deps
msg "entering ${pkg%/*}"
cd ${pkg%/*}
$0 -r || return 1
sudo apk_add $pkg
done
}
usage() {
echo "$(basename $0) $myver"
echo "usage: $0 [options] [cmd] ..."
echo "Options:"
echo " -h Show this help"
echo " -f Force specified cmd, even if they are already done"
echo " -r Recursively build and install dependencies (using sudo)"
echo " checksum Generate checksum to be included in $APKBUILD"
echo " fetch Fetch sources to \$SRCDEST and verify checksums"
echo " sanitycheck Basic sanity check of APKBUILD"
echo " md5check Check md5sums"
echo " unpack Unpack sources to \$srcdir"
echo " build Compile and install package into \$pkgdir"
echo " package Create package in \$PKGDEST"
echo " rootpkg Run '$0 build package' as fakeroot"
echo " clean Remove temp build and install dirs"
echo " cleanpkg Remove already built binary and source package"
echo " cleancache Remove downloaded files from \$SRCDEST"
echo " srcpkg Make a source package"
echo " up2date Compare target and sources dates"
echo ""
exit 0
}
checksum() {
local s files
for s in $source; do
files="$files ${s##*/}"
done
md5sums="$(cd "$SRCDEST" && md5sum $files)" || die "md5sum failed"
echo "md5sums=\"$md5sums\""
case $opt in
'h') usage;;
'f') force=1;;
'q') quiet=1;;
esac
done
shift $(( $OPTIND - 1 ))
# source the buildfile
[ -f "$APKBUILD" ] || die "Could not find $APKBUILD (PWD=$PWD)"
. "$APKBUILD"
# If we are handling a sub package then reset subpackages
if [ -n "$subpkgname" ]; then
subpackages=
fi
trap 'die "Aborted by user"' INT
[ -n "$forceunpack" ] && rm -f "$srcdir"/.unpack
if [ -z "$1" ]; then
else
set $default_cmds
fi
fi
while [ $# -gt 0 ]; do
runpart $1
shift
done