projects/aports·blob v1.14 · refs

828 lines · 18.4 KiB

1#!/bin/sh
2
3# script to build apk packages (light version og makepkg)
4# Copyright (c) 2008 Natanael Copa <[email protected]>
5#
6# Distributed under GPL-2
7#
8# Depends on: busybox utilities, fakeroot,
9#
10
11abuild_ver=1.14
12
13startdir="$PWD"
14srcdir=${srcdir:-"$startdir/src"}
15pkgdir=${pkgdir:-"$startdir/pkg"}
16pkgrel=0
17repo=${startdir%/*}
18repo=${repo##*/}
19
20# defaults
21SRCDEST=${SRCDEST:-$startdir}
22PKGDEST=${PKGDEST:-$startdir}
23BUILD_BASE="binutils gcc make patch uclibc-dev"
24
25SUDO=${SUDO:-"sudo"}
26
27default_cmds="sanitycheck builddeps clean fetch unpack rootpkg"
28
29# read config
30ABUILD_CONF=${ABUILD_CONF:-"/etc/abuild.conf"}
31[ -f "$ABUILD_CONF" ] && . "$ABUILD_CONF"
32
33# source functions
34datadir=/usr/share/abuild
35
36# if abuild was not run from PATH, then look for func lib at same location
37if [ -z "$FUNCLIB" ]; then
38 FUNCLIB="${0##/*}/functions.sh"
39 [ -f "$FUNCLIB" ] || FUNCLIB=$datadir/functions.sh
40fi
41
42if ! [ -f "$FUNCLIB" ]; then
43 echo "$FUNCLIB: not found" >&2
44 exit 1
45fi
46. "$FUNCLIB"
47
48set_xterm_title() {
49 if [ "$TERM" = xterm ]; then
50 printf "\033]0;$1\007" >&2
51 fi
52}
53
54cleanup() {
55 set_xterm_title ""
56 if [ -z "$install_after" ] && [ -n "$uninstall_after" ]; then
57 $SUDO apk del $uninstall_after
58 fi
59}
60
61die() {
62 error "$@"
63 cleanup
64 exit 1
65}
66
67# check if apkbuild is basicly sane
68sanitycheck() {
69 local i
70 msg "Checking sanity of $APKBUILD..."
71 [ -z "$pkgname" ] && die "Missing pkgname in APKBUILD"
72 [ -z "${pkgname##* *}" ] && die "pkgname contains spaces"
73 [ -z "$pkgver" ] && die "Missing pkgver in APKBUILD"
74 [ "${pkgver##[0-9]}" == "$pkgver" ] && \
75 die "pkgver does not start with a digit"
76 [ -z "$pkgrel" ] && warning "Missing pkgrel in APKBUILD. Using pkgrel=0"
77 [ -z "$pkgdesc" ] && die "Missing pkgdesc in APKBUILD"
78 [ -z "$url" ] && die "Missing url in APKBUILD"
79 [ -z "$license" ] && die "Missing license in APKBULID"
80
81 if [ -n "$source" ]; then
82 for i in $source; do
83 md5sums_has ${i##*/} || die "${i##*/} is missing in md5sums"
84 case "$i" in
85 https://*) makedepends_has wget || die "wget must be in makedepends when source has https://" ;;
86 esac
87 done
88 fi
89
90 if [ -n "$md5sums" ]; then
91 for i in $(echo "$md5sums" | awk '{ print $2 }'); do
92 source_has $i || die "$i is missing in source"
93 done
94 fi
95
96 # common spelling errors
97 [ -n "$depend" ] && die "APKBUILD contains 'depend'. It should be depends"
98 [ -n "$makedepend" ] && die "APKBUILD contains 'makedepend'. It should be makedepends"
99
100 grep '^# Maintainer:' $APKBUILD >/dev/null || warning "No maintainer"
101 return 0
102}
103
104md5check() {
105 local dummy f
106 if [ -z "$source" ]; then
107 return 0
108 fi
109 if [ -z "$md5sums" ]; then
110 die "Use 'abuild checksum' to generate/update the checksum(s)"
111 fi
112 if [ "$(echo $source | wc -l)" -ne "$(echo $md5sums | wc -l)" ]; then
113 die "Number of md5sums does not correspond to number of sources"
114 fi
115 fetch || return 1
116 msg "Checking md5sums..."
117 cd "$srcdir" && echo "$md5sums" | md5sum -c
118}
119
120uri_fetch() {
121 local uri="$1"
122 local d="${s##*/}" # $(basename $s)
123 local opts
124 [ -n "$quiet" ] && opts="-q"
125 [ -f "$SRCDEST/$d" ] && return 0
126
127
128 # we need GNU wget for this
129 case "$uri" in
130 https://*) opts="--no-check-certificate";;
131 esac
132
133 mkdir -p "$SRCDEST"
134 if [ -f "$SRCDEST/$d.part" ]; then
135 msg "Partial download found. Trying to resume"
136 opts="$opts -c"
137 fi
138 msg "Fetching $uri"
139 wget $opts -O "$SRCDEST/$d.part" "$uri" \
140 && mv "$SRCDEST/$d.part" "$SRCDEST/$d"
141}
142
143is_remote() {
144 case "$1" in
145 http://*|ftp://*|https://*)
146 return 0;;
147 esac
148 return 1
149}
150
151fetch() {
152 local s
153 mkdir -p "$srcdir"
154 for s in $source; do
155 if is_remote "$s"; then
156 uri_fetch "$s" || return 1
157 ln -sf "$SRCDEST/${s##*/}" "$srcdir"/
158 else
159 ln -sf "$startdir/$s" "$srcdir/"
160 fi
161 done
162}
163
164# unpack the sources
165unpack() {
166 local u
167 md5check || return 1
168 mkdir -p "$srcdir"
169 for u in $source; do
170 local s="$SRCDEST/${u##*/}" # $(basename $s)
171 case "$s" in
172 *.tar.gz|*.tgz)
173 msg "Unpacking $s..."
174 tar -C "$srcdir" -zxf "$s" || return 1;;
175 *.tar.bz2)
176 msg "Unpacking $s..."
177 tar -C "$srcdir" -jxf "$s" || return 1;;
178 *.tar.lzma)
179 msg "Unpacking $s..."
180 unlzma -c "$s" | tar -C "$srcdir" -x \
181 || return 1;;
182 *.zip)
183 msg "Unpacking $s..."
184 unzip "$s" -d "$srcdir" || return 1;;
185 esac
186 done
187}
188
189# cleanup source and package dir
190clean() {
191 msg "Cleaning temporary build dirs..."
192 rm -rf "$srcdir"
193 rm -rf "$pkgdir"
194 local i
195 for i in $subpackages; do
196 rm -rf "$pkgdir-$(get_split_func $i)"
197 done
198}
199
200# cleanup fetched sources
201cleancache() {
202 local s
203 for s in $source; do
204 if is_remote "$s"; then
205 msg "Cleaning downloaded ${s##*/}..."
206 rm -f "$SRCDEST/${s##*/}"
207 fi
208 done
209}
210
211cleanpkg() {
212 local i
213 msg "Cleaning built packages..."
214 for i in $pkgname $subpackages; do
215 local p="$i-$pkgver-r$pkgrel"
216 rm -f "$PKGDEST/$p.apk" "$PKGDEST/$p.src.tar.gz"
217 done
218}
219
220# clean all packages except current
221cleanoldpkg() {
222 local i j
223 msg "Cleaning all packages except $pkgver-r$pkgrel..."
224 for i in $pkgname $subpackages; do
225 for j in "$PKGDEST"/${i%:*}-[0-9]*.apk; do
226 [ "$j" != "$PKGDEST/${i%:*}-$pkgver-r$pkgrel.apk" ] \
227 && rm -f "$j"
228 done
229 done
230 return 0
231}
232
233runpart() {
234 local part=$1
235 [ -n "$DEBUG" ] && msg "$part"
236 $part || die "$part failed"
237}
238
239# override those in your build script
240build() {
241 die "No build() function found in $APKBUILD"
242}
243
244get_split_func() {
245 # get the 'func' from "sub-pkg:func"
246 local func=${1##*:}
247
248 # get 'func' from "sub-pkg-func" if there was no :func
249 [ "$func" = "$1" ] && func=${func##*-}
250 echo $func
251}
252
253subpkg() {
254 if [ -z "$subpackages" ]; then
255 return 0
256 fi
257 local i
258 cd "$startdir"
259 for i in $subpackages; do
260 local func=$(get_split_func $i)
261 # call abuild recursively, setting subpkg{dir,name}
262 msg "Running split function $func..."
263 subpkgdir="$startdir/pkg-$func" subpkgname="${i%:*}" \
264 $0 $func package || return 1
265 done
266}
267
268package_apk() {
269 local name=${subpkgname:-$pkgname}
270 [ -z "${name##* *}" ] && die "package name contains spaces"
271 local dir=${subpkgdir:-$pkgdir}
272 local pkg="$name-$pkgver-r$pkgrel.apk"
273 local sub
274
275 [ ! -d "$dir" ] && die "Missing $dir"
276 cd "$dir"
277 msg "Creating ${subpkgname:+sub}package $pkg..."
278 local builddate=$(date -u "+%s")
279 local size=$(du -sk | awk '{print $1 * 1024}')
280
281 echo "# Generated by $(basename $0) $abuild_ver" >.PKGINFO
282 if [ -n "$FAKEROOTKEY" ]; then
283 echo "# using $(fakeroot -v)" >> .PKGINFO
284 fi
285 echo "# $(date -u)" >> .PKGINFO
286 cat >> .PKGINFO <<EOF
287pkgname = $name
288pkgver = $pkgver-r$pkgrel
289pkgdesc = $pkgdesc
290url = $url
291builddate = $builddate
292packager = ${PACKAGER:-"Unknown"}
293size = $size
294EOF
295 local i deps
296 deps="$depends"
297 if [ "$pkgname" != "busybox" ] && ! depends_has busbox; then
298 for i in $install; do
299 if head -n 1 "$srcdir/$i" | grep '^#!/bin/sh' >/dev/null ; then
300 msg "Script found. busybox added as a dependency for $pkg"
301 deps="$deps busybox"
302 break
303 fi
304 done
305 fi
306
307 for i in $license; do
308 echo "license = $i" >>.PKGINFO
309 done
310 for i in $replaces; do
311 echo "replaces = $i" >>.PKGINFO
312 done
313 for i in $deps; do
314 echo "depend = $i" >>.PKGINFO
315 done
316 for i in $conflicts; do
317 echo "conflict = $i" >>.PKGINFO
318 done
319 for i in $provides; do
320 echo "provides = $i" >>.PKGINFO
321 done
322 for i in $backup; do
323 echo "backup = $i" >>.PKGINFO
324 done
325
326 local metafiles=".PKGINFO"
327 for i in $install; do
328 script=${i#$name}
329 case "$script" in
330 .install)
331 warning "Deprecated .install script found."
332 script=.INSTALL
333 ;;
334 .pre-install|.post-install|.pre-upgrade|.post-upgrade|.pre-deinstall|.post-deinstall)
335 msg "Adding $script"
336 ;;
337 *) error "$script: Invalid install script"
338 return 1
339 ;;
340 esac
341 cp "$srcdir/$i" "$dir/$script" || return 1
342 chmod +x "$dir/$script"
343 metafiles="$metafiles $script"
344 done
345
346 set *
347 [ "$1" = '*' ] && set --
348 ( cd "$dir" && tar -zcf "$PKGDEST/$pkg" $metafiles $@ )
349}
350
351package() {
352 options_has "!strip" || stripbin
353 package_apk
354}
355
356# predefined splitfunc doc
357default_doc() {
358 depends="$depends_doc"
359 install="$install_doc"
360 local i
361 for i in doc man info html sgml licenses gtk-doc; do
362 if [ -d "$pkgdir/usr/share/$i" ]; then
363 mkdir -p "$subpkgdir/usr/share"
364 mv "$pkgdir/usr/share/$i" "$subpkgdir/usr/share/"
365 fi
366 done
367
368 rm -f "$subpkgdir/usr/share/info/dir"
369
370# # compress info and man pages
371# find "$subpkgdir/usr/share" \( -name '*.info' -o -name '*.info-[1-9]' \
372# -o -name '*.[1-9]' \) -exec gzip {} \;
373
374 # remove if empty, ignore error (not empty)
375 rmdir "$pkgdir/usr/share" "$pkgdir/usr" 2>/dev/null
376
377# [ -d "$subpkgdir/usr/share/man" ] && depends="man"
378 return 0
379}
380
381doc() {
382 default_doc
383}
384
385# predefined splitfunc mod
386default_mod() {
387 depends="$kernel $depends_mod"
388 install="$install_mod"
389 for i in firmware modules; do
390 if [ -d "$pkgdir/lib/$i" ]; then
391 rm -rf "$subpkgdir/lib"
392 mkdir -p "$subpkgdir/lib"
393 mv "$pkgdir/lib/$i" "$subpkgdir/lib"
394 fi
395 done
396}
397
398mod() {
399 default_mod
400}
401
402# predefined splitfunc dev
403default_dev() {
404 depends="$pkgname $depends_dev"
405 install="$install_dev"
406 cd "$pkgdir" || return 0
407 for i in usr/include usr/lib/pkgconfig usr/share/aclocal\
408 usr/share/gettext usr/bin/*-config \
409 $(find -name include -type d) \
410 $(find usr/ -name '*.[acho]' -o -name '*.la' \
411 2>/dev/null); do
412 if [ -e "$pkgdir/$i" ] || [ -L "$pkgdir/$i" ]; then
413 d="$subpkgdir/${i%/*}" # dirname $i
414 mkdir -p "$d"
415 mv "$pkgdir/$i" "$d"
416 rmdir "$pkgdir/${i%/*}" 2>/dev/null
417 fi
418 done
419 return 0
420}
421
422dev() {
423 default_dev
424}
425
426# build and package in fakeroot
427rootpkg() {
428 cd "$startdir"
429 msg "Entering fakeroot..."
430 fakeroot $0 build subpkg package
431}
432
433srcpkg() {
434 local p="$pkgname-$pkgver-$pkgrel"
435 local prefix="${startdir##*/}"
436 local i files="$prefix/APKBUILD"
437 for i in $source; do
438 files="$files $prefix/${i##*/}"
439 done
440 mkdir -p "$PKGDEST"
441 msg "Creating source package $p.src.tar.gz..."
442 (cd .. && tar -zcf "$PKGDEST/$p.src.tar.gz" $files)
443}
444
445# check if package is up to date
446up2date() {
447 local pkg="$PKGDEST/$pkgname-$pkgver-r$pkgrel.apk"
448 local i s
449 cd "$startdir"
450 for i in $pkgname $subpackages; do
451 [ -f "$PKGDEST/$pkgname-$pkgver-r$pkgrel.apk" ] || return 1
452 done
453 [ -n "$keep" ] && return 0
454
455 for i in $source APKBUILD; do
456 local s
457 if is_remote "$i"; then
458 s="$SRCDEST/${i##*/}" # $(basename $i)
459 else
460 s="$startdir/${i##*/}"
461 fi
462 if [ "$s" -nt "$pkg" ]; then
463 return 1
464 fi
465 done
466 return 0
467}
468
469# source all APKBUILDs and output:
470# 1) origin of package
471# 2) all dependencies
472# the output is i in a format easy parseable for awk
473depparse_aports() {
474 # lets run this in a subshell since we source all APKBUILD here
475 (
476 aportsdir=$(realpath ${APKBUILD%/APKBUILD}/../..)
477 for i in $aportsdir/*/*/APKBUILD; do
478 pkgname=
479 subpackages=
480 depends=
481 makedepends=
482 . $i
483 dir=${i%/APKBUILD}
484 deps=
485 # filter out conflicts from deps
486 for j in $depends $makedepends; do
487 case "$j" in
488 !*) continue;;
489 esac
490 deps="$deps $j"
491 done
492 for j in $pkgname $subpackages; do
493 echo "o ${j%%:*} $dir"
494 set -- $deps
495 echo -n "d ${j%%:*} $1"
496 shift
497 while [ $# -gt 0 ]; do
498 echo -n ",$1"
499 shift
500 done
501 echo
502 done
503 done
504 )
505}
506
507deptrace() {
508 local deps="$@"
509 [ -z "$deps" ] && deps="$BUILD_BASE $depends $makedepends"
510 ( depparse_aports
511 if [ -z "$upgrade" ]; then
512 # list installed pkgs and prefix with 'i '
513 apk info -q | sort | sed 's/^/i /'
514 fi
515 ) | awk -v pkgs="$deps" '
516
517 function depgraph(pkg, a, i) {
518 if (visited[pkg])
519 return 0;
520 visited[pkg] = 1;
521 split(deps[pkg], a, ",");
522 for (i in a)
523 depgraph(a[i]);
524 print pkg ":" origin[pkg];
525
526 }
527
528 $1 == "i" { visited[$2] = 1 }
529 $1 == "o" { origin[$2] = $3 }
530 $1 == "d" { deps[$2] = $3 }
531 END {
532 split(pkgs, pkgarray);
533 for (i in pkgarray)
534 depgraph(pkgarray[i]);
535 }
536 '
537}
538
539# build and install dependencies
540builddeps() {
541 local deps alldeps pkg i dir ver missing
542 msg "Building dependencies..."
543 deps="$BUILD_BASE $makedepends"
544
545 # add depends unless it is a subpackage
546 for i in $depends; do
547 subpackages_has $i || deps="$deps $i"
548 done
549
550 # find which deps are missing
551 for i in $deps; do
552 if [ "${i#\!}" != "$i" ]; then
553 apk info -e ${i#\!} \
554 && die "Conflicting package ${i#\!} is installed."
555 elif ! apk info -e $i; then
556 if [ -z "$install_deps" ] && [ -z "$recursive" ]; then
557 die "Missing dependency $i. Use -r to autoinstall or -R to build"
558 fi
559 missing="$missing $i"
560 fi
561 done
562
563 [ -z "$missing" ] && return 0
564
565 if [ -n "$install_deps" ] && $SUDO apk add $missing; then
566 uninstall_after="$missing $uninstall_after"
567 return 0
568 fi
569
570 [ -z "$recursive" ] && return 1
571
572 for i in $(deptrace $missing); do
573 # i = pkg:dir
574 local dir=${i#*:}
575 local pkg=${i%:*}
576 msg "Entering $dir"
577 cd "$dir" || return 1
578 $0 -k -i $pkg || return 1
579 uninstall_after="$pkg $uninstall_after"
580 done
581}
582
583# replace the md5sums in the APKBUILD
584checksum() {
585 local s files
586 [ -z "$source" ] && return 0
587 fetch
588 msg "Updating the md5sums in APKBUILD..."
589 for s in $source; do
590 files="$files ${s##*/}"
591 done
592 md5sums="$(cd "$srcdir" && md5sum $files)" || die "md5sum failed"
593 sed -i -e '/^md5sums="/,/"\$/d; /^md5sums=''/,/''\$/d' "$APKBUILD"
594 echo "md5sums=\"$md5sums\"" >>"$APKBUILD"
595}
596
597stripbin() {
598 local bin
599 cd "${subpkgdir:-$pkgdir}" || return 1
600 msg "Stripping binaries"
601 find . -type f 2>/dev/null | while read bin; do
602 local opt=
603 case "$(file -biz "$bin")" in
604 */x-sharedlib*|*/x-archive*)
605 strip --strip-debug "$bin";;
606 */x-executable*)
607 strip "$bin";;
608 esac
609 done
610 return 0
611}
612
613# simply list target apks
614listpkg() {
615 local i
616 for i in $pkgname $subpackages; do
617 echo "${i%:*}-$pkgver-r$pkgrel.apk"
618 done
619}
620
621source_has() {
622 local i
623 for i in $source; do
624 [ "$1" = "${i##*/}" ] && return 0
625 done
626 return 1
627}
628
629subpackages_has() {
630 local i
631 for i in $subpackages; do
632 [ "$1" = "${i%:*}" ] && return 0
633 done
634 return 1
635}
636
637list_has() {
638 local needle="$1"
639 local i
640 shift
641 for i in $@; do
642 [ "$needle" = "$i" ] && return 0
643 [ "$needle" = "!$i" ] && return 1
644 done
645 return 1
646}
647
648options_has() {
649 list_has "$1" $options
650}
651
652depends_has() {
653 list_has "$1" $depends
654}
655
656makedepends_has() {
657 list_has "$1" $makedepends
658}
659
660md5sums_has() {
661 list_has "$1" $md5sums
662}
663
664# install package after build
665post_add() {
666 local pkgf="$PKGDEST/$1-$pkgver-r$pkgrel.apk"
667 local deps i
668 if ! subpackages_has $1 && [ "$1" != "$pkgname" ]; then
669 die "$1 is not built by this APKBUILD"
670 fi
671 # recursively install dependencies that are provided by this APKBUILD
672 deps=$(apk index "$pkgf" 2>/dev/null | awk -F: '$1=="D" { print $2 }')
673 for i in $deps; do
674 if subpackages_has $i || [ "$i" = "$pkgname" ]; then
675 post_add $i || return 1
676 fi
677 done
678 $SUDO apk add -u "$pkgf" || die "Failed to install $1"
679}
680
681# create new aport from templates
682newaport() {
683 local pn=${newname%-[0-9]*}
684 local pv
685 if [ "$pn" != "$newname" ]; then
686 pv=${newname#$pn-}
687 fi
688 if [ -e "$pn"/APKBUILD ]; then
689 error "$pn/APKBUILD already exist"
690 return 1
691 fi
692 mkdir -p "$pn"
693 cd "$pn"
694 sed -e '1,/^\#*$/d' \
695 -e "s/^\(# Contributor: \).*/\1$PACKAGER/" \
696 -e "s/^\(# Maintainer: \).*/\1$PACKAGER/" \
697 -e "s/^pkgname=.*/pkgname=$pn/" \
698 -e "s/^pkgver=.*/pkgver=$pv/" \
699 "$datadir"/sample.APKBUILD > APKBUILD || return 1
700 #-e '1,/^\#$/d' \
701 if [ -n "$cpinitd" ]; then
702 cp "$datadir"/sample.initd $pn.initd
703 cp "$datadir"/sample.confd $pn.confd
704 cp "$datadir"/sample.pre-install $pn.pre-install
705 cp "$datadir"/sample.post-install $pn.post-install
706 sed -i -e "s/^install=.*/install=\"\$pkgname.pre-install \$pkgname.post-install\"/" \
707 -e "s/^source=\"\(.*\)\"/source=\"\1\n\t$pn.initd\n\t$pn.confd\n\t\$install\n\t\"/" \
708 APKBUILD
709
710 fi
711}
712
713installdeps() {
714 sudo apk add $depends $makedepends
715}
716
717uninstalldeps (){
718 sudo apk del $depends $makedepends
719}
720
721usage() {
722 echo "$(basename $0) $abuild_ver"
723 echo "usage: ${0##*/} [options] [-i PKG] [-P REPODEST] [-p PKGDEST]"
724 echo " [-s SRCDEST] [cmd] ..."
725 echo " ${0##*/} [-c] -n PKGNAME[-PKGVER]"
726 echo "Options:"
727 echo " -f Force specified cmd, even if they are already done"
728 echo " -h Show this help"
729 echo " -i Install PKG after successul build"
730 echo " -k Keep built packages, even if APKBUILD or sources are newer"
731 echo " -p Set package destination directory"
732 echo " -P Set PKGDEST to REPODEST/<repo>, where repo is the parents dir name"
733 echo " -q Quiet"
734 echo " -r Install missing dependencies from system repository (using sudo)"
735 echo " -R Recursively build and install missing dependencies (using sudo)"
736 echo " -s Set source package destination directory"
737 echo " -u Recursively build and upgrade all dependencies (using sudo)"
738 echo ""
739 echo " -n Create a new APKBUILD in a directory named PKGNAME"
740 echo " -c Copy a sample init.d, conf.d and install script to new directory"
741 echo ""
742 echo "Commands:"
743 echo " checksum Generate checksum to be included in APKBUILD"
744 echo " fetch Fetch sources to \$SRCDEST and verify checksums"
745 echo " sanitycheck Basic sanity check of APKBUILD"
746 echo " md5check Check md5sums"
747 echo " unpack Unpack sources to \$srcdir"
748 echo " build Compile and install package into \$pkgdir"
749 echo " listpkg List target packages"
750 echo " package Create package in \$PKGDEST"
751 echo " rootpkg Run '$0 build package' as fakeroot"
752 echo " clean Remove temp build and install dirs"
753 echo " cleanoldpkg Remove binary packages except current version"
754 echo " cleanpkg Remove already built binary and source package"
755 echo " cleancache Remove downloaded files from \$SRCDEST"
756 echo " srcpkg Make a source package"
757 echo " up2date Compare target and sources dates"
758 echo " installdeps Install packages listed in makedepends and depends"
759 echo " uninstalldeps Uninstall packages listed in makedepends and depends"
760 echo ""
761 exit 0
762}
763
764APKBUILD="${APKBUILD:-./APKBUILD}"
765unset force
766unset recursive
767while getopts "cfhi:kin:p:P:qrRs:u" opt; do
768 case $opt in
769 'c') cpinitd=1;;
770 'f') force=1;;
771 'h') usage;;
772 'i') install_after="$install_after $OPTARG";;
773 'k') keep=1;;
774 'n') newname=$OPTARG;;
775 'p') PKGDEST=$OPTARG;;
776 'P') REPODEST=$OPTARG;;
777 'q') quiet=1;;
778 'r') install_deps=1;;
779 'R') recursive=1;;
780 's') SRCDEST=$OPTARG;;
781 'u') upgrade=1
782 recursive=1;;
783 esac
784done
785shift $(( $OPTIND - 1 ))
786
787# If REPODEST is set then it will override the PKGDEST
788if [ -n "$REPODEST" ]; then
789 PKGDEST="$REPODEST/$repo"
790fi
791
792# source the buildfile
793if [ -z "$newname" ]; then
794 [ -f "$APKBUILD" ] || die "Could not find $APKBUILD (PWD=$PWD)"
795 . "$APKBUILD"
796fi
797
798# If we are handling a sub package then reset subpackages
799if [ -n "$subpkgname" ]; then
800 subpackages=
801fi
802
803trap 'die "Aborted by user"' INT
804set_xterm_title "abuild: $pkgname"
805
806if [ -z "$1" ] && [ -n "$newname" ]; then
807 set "newaport"
808fi
809
810if [ -z "$1" ]; then
811 if up2date && [ -z "$force" ]; then
812 msg "Package is up to date"
813 else
814 set $default_cmds
815 fi
816fi
817
818while [ $# -gt 0 ]; do
819 runpart $1
820 shift
821done
822
823for i in $install_after; do
824 post_add $i
825done
826
827cleanup
828