abuild 16.2 KB
Newer Older
Natanael Copa's avatar
Natanael Copa committed
1 2 3 4 5 6 7 8 9 10
#!/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, 
#

Natanael Copa's avatar
Natanael Copa committed
11
abuild_ver=1.8
Natanael Copa's avatar
Natanael Copa committed
12 13 14 15 16

startdir="$PWD"
srcdir=${srcdir:-"$startdir/src"}
pkgdir=${pkgdir:-"$startdir/pkg"}
pkgrel=0
Natanael Copa's avatar
Natanael Copa committed
17 18
repo=${startdir%/*}
repo=${repo##*/}
Natanael Copa's avatar
Natanael Copa committed
19 20 21 22

# defaults
SRCDEST=${SRCDEST:-$startdir}
PKGDEST=${PKGDEST:-$startdir}
23
BUILD_BASE="binutils gcc make patch uclibc-dev"
Natanael Copa's avatar
Natanael Copa committed
24

25 26
SUDO=${SUDO:-"sudo"}

27
default_cmds="sanitycheck builddeps clean fetch unpack rootpkg"
Natanael Copa's avatar
Natanael Copa committed
28

Natanael Copa's avatar
Natanael Copa committed
29 30 31 32 33 34 35 36 37
# read config
ABUILD_CONF=${ABUILD_CONF:-"/etc/abuild.conf"}
[ -f "$ABUILD_CONF" ] && . "$ABUILD_CONF"

# If REPODEST is set then it will override the PKGDEST
if [ -n "$REPODEST" ]; then
	PKGDEST="$REPODEST/$repo"
fi

Natanael Copa's avatar
Natanael Copa committed
38
# source functions
39 40
datadir=/usr/share/abuild

Natanael Copa's avatar
Natanael Copa committed
41 42 43
# if abuild was not run from PATH, then look for func lib at same location
if [ -z "$FUNCLIB" ]; then
	FUNCLIB="${0##/*}/functions.sh"
44
	[ -f "$FUNCLIB"	] || FUNCLIB=$datadir/functions.sh
Natanael Copa's avatar
Natanael Copa committed
45 46 47 48 49 50 51 52
fi

if ! [ -f "$FUNCLIB" ]; then
	echo "$FUNCLIB: not found" >&2
	exit 1
fi
. "$FUNCLIB"
	
Linux User's avatar
Linux User committed
53 54
set_xterm_title() {
	if [ "$TERM" = xterm ]; then
55
		 printf "\033]0;$1\007" >&2
Linux User's avatar
Linux User committed
56 57 58 59 60
	fi
} 

cleanup() {
	set_xterm_title ""
61
	if [ -z "$install_after" ] && [ -n "$uninstall_after" ]; then
62
		$SUDO apk del $uninstall_after
63
	fi
Linux User's avatar
Linux User committed
64 65
}

Natanael Copa's avatar
Natanael Copa committed
66
die() {
Linux User's avatar
Linux User committed
67
	error "$@"
Linux User's avatar
Linux User committed
68
	cleanup
Natanael Copa's avatar
Natanael Copa committed
69 70 71
	exit 1
}

72 73
# check if apkbuild is basicly sane
sanitycheck() {
74
	msg "Checking sanity of $APKBUILD..."
75 76 77
	[ -z "$pkgname" ] && die "Missing pkgname in APKBUILD"
	[ -z "${pkgname##* *}" ] && die "pkgname contains spaces"
	[ -z "$pkgver" ] && die "Missing pkgver in APKBUILD"
Natanael Copa's avatar
Natanael Copa committed
78
	[  "${pkgver##[0-9]}" == "$pkgver" ] && \
79 80 81 82 83 84
		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"

85 86 87 88
	if [ "$(echo $source | wc -l)" -ne "$(echo $md5sums | wc -l)" ]; then
		die "Number of md5sums does not correspond to number of sources"
	fi

89 90 91 92 93 94 95
	# 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() {
96 97 98
	if [ -z "$source" ]; then
		return 0
	fi
99
	if [ -z "$md5sums" ]; then
100
		die "Use 'abuild checksum' to generate/update the checksum(s)"
101
	fi
102 103 104 105

	if [ "$(echo $source | wc -l)" -ne "$(echo $md5sums | wc -l)" ]; then
		die "Number of md5sums does not correspond to number of sources"
	fi
106
	fetch || return 1
107
	msg "Checking md5sums..."
108
	cd "$srcdir" && echo "$md5sums" | md5sum -c 
Natanael Copa's avatar
Natanael Copa committed
109 110 111 112 113
}

uri_fetch() {
	local uri="$1"
	local d="${s##*/}"	# $(basename $s)
114 115 116 117
	local opts
	[ -n "$quiet" ] && opts="-q"
	[ -f "$SRCDEST/$d" ] && return 0

Natanael Copa's avatar
Natanael Copa committed
118
	mkdir -p "$SRCDEST"
119 120 121
	if [ -f "$SRCDEST/$d.part" ]; then
		msg "Partial download found. Trying to resume"
		opts="$opts -c"
Natanael Copa's avatar
Natanael Copa committed
122
	fi
Linux User's avatar
Linux User committed
123
	msg "Fetching $uri"
124 125
	wget $opts -O "$SRCDEST/$d.part" "$uri" \
		&& mv "$SRCDEST/$d.part" "$SRCDEST/$d"
Natanael Copa's avatar
Natanael Copa committed
126 127
}

128 129 130 131 132 133 134 135
is_remote() {
	case "$1" in
		http://*|ftp://*)
			return 0;;
	esac
	return 1
}

Natanael Copa's avatar
Natanael Copa committed
136 137 138
fetch() {
	local s
	mkdir -p "$srcdir"
139 140 141 142 143 144 145
	for s in $source; do
		if is_remote "$s"; then
			uri_fetch "$s" || return 1
			ln -sf "$SRCDEST/${s##*/}" "$srcdir"/
		else		
			ln -sf "$startdir/$s" "$srcdir/"
		fi
Natanael Copa's avatar
Natanael Copa committed
146 147 148 149 150 151
	done
}

# unpack the sources
unpack() {
	local u
152
	md5check || return 1
Natanael Copa's avatar
Natanael Copa committed
153 154 155 156
	mkdir -p "$srcdir"
	for u in $source; do
		local s="$SRCDEST/${u##*/}"	# $(basename $s)
		case "$s" in
Natanael Copa's avatar
Natanael Copa committed
157
			*.tar.gz|*.tgz)
158
				msg "Unpacking $s..."
Natanael Copa's avatar
Natanael Copa committed
159 160
				tar -C "$srcdir" -zxf "$s" || return 1;;
			*.tar.bz2)
161
				msg "Unpacking $s..."
Natanael Copa's avatar
Natanael Copa committed
162
				tar -C "$srcdir" -jxf "$s" || return 1;;
163 164 165 166
			*.tar.lzma)
				msg "Unpacking $s..."
				unlzma -c "$s" | tar -C "$srcdir" -x  \
					|| return 1;;
Natanael Copa's avatar
Natanael Copa committed
167 168 169
			*.zip)
				msg "Unpacking $s..."
				unzip "$s" -d "$srcdir" || return 1;;
Natanael Copa's avatar
Natanael Copa committed
170 171 172 173 174 175
		esac
	done
}

# cleanup source and package dir
clean() {
176
	msg "Cleaning temporary build dirs..."
Natanael Copa's avatar
Natanael Copa committed
177 178 179
	rm -rf "$srcdir"
	rm -rf "$pkgdir"
	local i
Natanael Copa's avatar
Natanael Copa committed
180 181
	for i in $subpackages; do
		rm -rf "$pkgdir-$(get_split_func $i)"
Natanael Copa's avatar
Natanael Copa committed
182 183 184 185 186 187 188
	done
}

# cleanup fetched sources
cleancache() {
	local s
	for s in $source; do
189 190 191 192
		if is_remote "$s"; then
			msg "Cleaning downloaded ${s##*/}..."
			rm -f "$SRCDEST/${s##*/}"
		fi
Natanael Copa's avatar
Natanael Copa committed
193 194 195 196 197
	done
}

cleanpkg() {
	local i
198
	msg "Cleaning built packages..."
199
	for i in $pkgname $subpackages; do
200
		local p="$i-$pkgver-r$pkgrel"
201
		rm -f "$PKGDEST/$p.apk" "$PKGDEST/$p.src.tar.gz"
Natanael Copa's avatar
Natanael Copa committed
202 203 204
	done
}

205 206 207 208 209 210 211 212 213 214 215 216 217
# clean all packages except current
cleanoldpkg() {
	local i j
	msg "Cleaning all packages except $pkgver-r$pkgrel..."
	for i in $pkgname $subpackages; do
		for j in "$PKGDEST"/${i%:*}-[0-9]*.apk; do
			[ "$j" != "$PKGDEST/${i%:*}-$pkgver-r$pkgrel.apk" ] \
				&& rm -f "$j"
		done
	done
	return 0
}
	
Natanael Copa's avatar
Natanael Copa committed
218 219
runpart() {
	local part=$1
220
	[ -n "$DEBUG" ] && msg "$part"
Natanael Copa's avatar
Natanael Copa committed
221 222 223 224 225 226 227 228
	$part || die "$part failed"
}

# override those in your build script
build() {
	die "No build() function found in $APKBUILD"
}

Natanael Copa's avatar
Natanael Copa committed
229 230 231 232 233 234 235 236 237
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
}

Natanael Copa's avatar
Natanael Copa committed
238
subpkg() {
Natanael Copa's avatar
Natanael Copa committed
239
	if [ -z "$subpackages" ]; then
240 241
		return 0
	fi
Natanael Copa's avatar
Natanael Copa committed
242 243
	local i
	cd "$startdir"
244
	for i in $subpackages; do
Natanael Copa's avatar
Natanael Copa committed
245 246
		local func=$(get_split_func $i)
		# call abuild recursively, setting subpkg{dir,name}
247
		msg "Running split function $func..."
248
		subpkgdir="$startdir/pkg-$func" subpkgname="${i%:*}" \
Natanael Copa's avatar
Natanael Copa committed
249
			$0 $func package || return 1
Natanael Copa's avatar
Natanael Copa committed
250 251 252 253
	done
}

package_apk() {
254 255
	local name=${subpkgname:-$pkgname}
	[ -z "${name##* *}" ] && die "package name contains spaces"
256
	local dir=${subpkgdir:-$pkgdir}
257
	local pkg="$name-$pkgver-r$pkgrel.apk"
258
	local sub
Natanael Copa's avatar
Natanael Copa committed
259 260 261
	
	[ ! -d "$dir" ] && die "Missing $dir"
	cd "$dir"
262
	msg "Creating ${subpkgname:+sub}package $pkg..."
Natanael Copa's avatar
Natanael Copa committed
263 264 265
	local builddate=$(date -u "+%s")
	local size=$(du -sk | awk '{print $1 * 1024}')

266
	echo "# Generated by $(basename $0) $abuild_ver" >.PKGINFO
Natanael Copa's avatar
Natanael Copa committed
267 268 269 270 271
	if [ -n "$FAKEROOTKEY" ]; then
		echo "# using $(fakeroot -v)" >> .PKGINFO
	fi
	echo "# $(date -u)" >> .PKGINFO
	cat >> .PKGINFO <<EOF
272
pkgname = $name
273
pkgver = $pkgver-r$pkgrel
Natanael Copa's avatar
Natanael Copa committed
274 275 276 277 278 279
pkgdesc = $pkgdesc
url = $url
builddate = $builddate
packager = ${PACKAGER:-"Unknown"}
size = $size
EOF
Natanael Copa's avatar
Natanael Copa committed
280
	local i
Natanael Copa's avatar
Natanael Copa committed
281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301

	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"
Natanael Copa's avatar
Natanael Copa committed
302 303 304
	if [ -n "$install" ]; then
		cp "$srcdir/$install" "$dir/.INSTALL" || return 1
		chmod +x "$dir/.INSTALL"
Natanael Copa's avatar
Natanael Copa committed
305
		metafiles="$metafiles .INSTALL"
Natanael Copa's avatar
Natanael Copa committed
306
	fi
Natanael Copa's avatar
Natanael Copa committed
307 308 309 310 311 312 313 314

#	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 $@ )
Natanael Copa's avatar
Natanael Copa committed
315 316 317
}

package() {
318
	options_has "!strip" ||	stripbin
Natanael Copa's avatar
Natanael Copa committed
319 320 321
	package_apk
}

322
# predefined splitfunc doc
Natanael Copa's avatar
Natanael Copa committed
323
doc() {
324
	depends="$depends_doc"
Natanael Copa's avatar
Natanael Copa committed
325
	local i
326
	for i in doc man info html sgml licenses; do
327 328 329
		if [ -d "$pkgdir/usr/share/$i" ]; then
			mkdir -p "$subpkgdir/usr/share"
			mv "$pkgdir/usr/share/$i" "$subpkgdir/usr/share/"
Natanael Copa's avatar
Natanael Copa committed
330 331
		fi
	done
332 333 334
	
	rm -f "$subpkgdir/usr/share/info/dir"

335 336 337
#	# compress info and man pages
#	find "$subpkgdir/usr/share" \( -name '*.info' -o -name '*.info-[1-9]' \
#		-o -name '*.[1-9]' \) -exec gzip {} \;
338 339 340 341

	# remove if empty, ignore error (not empty)
	rmdir "$pkgdir/usr/share" "$pkgdir/usr" 2>/dev/null

Natanael Copa's avatar
Natanael Copa committed
342
#	[ -d "$subpkgdir/usr/share/man" ] && depends="man"
Natanael Copa's avatar
Natanael Copa committed
343 344 345
	return 0
}

346
# predefined splitfunc mod
Natanael Copa's avatar
Natanael Copa committed
347
mod() {
348
	depends="$kernel $depends_mod"
Natanael Copa's avatar
Natanael Copa committed
349
	for i in firmware modules; do
350 351 352
		if [ -d "$pkgdir/lib/$i" ]; then
			rm -rf "$subpkgdir/lib"
			mkdir -p "$subpkgdir/lib"
353
			mv "$pkgdir/lib/$i" "$subpkgdir/lib"
Natanael Copa's avatar
Natanael Copa committed
354 355 356 357
		fi
	done
}

358
# predefined splitfunc dev
Natanael Copa's avatar
Natanael Copa committed
359
dev() {
360
	depends="$pkgname $depends_dev"
361
	cd "$pkgdir" || return 0
362 363 364 365 366
	for i in usr/include usr/lib/pkgconfig usr/share/aclocal\
			usr/share/gettext usr/bin/*-config	\
			$(find -name include -type d) 		\
			$(find usr/ -name '*.[acho]' -o -name '*.la' \
			2>/dev/null); do
367 368
		if [ -e "$pkgdir/$i" ] || [ -L "$pkgdir/$i" ]; then
			d="$subpkgdir/${i%/*}"	# dirname $i
Natanael Copa's avatar
Natanael Copa committed
369
			mkdir -p "$d"
370
			mv "$pkgdir/$i" "$d"
371
			rmdir "$pkgdir/${i%/*}" 2>/dev/null
Natanael Copa's avatar
Natanael Copa committed
372 373
		fi
	done
Natanael Copa's avatar
Natanael Copa committed
374
	return 0
Natanael Copa's avatar
Natanael Copa committed
375 376 377 378
}

# build and package in fakeroot
rootpkg() {
Natanael Copa's avatar
Natanael Copa committed
379
	cd "$startdir"
380
	msg "Entering fakeroot..."
Natanael Copa's avatar
Natanael Copa committed
381 382 383 384
	fakeroot $0 build subpkg package
}

srcpkg() {
385
	local p="$pkgname-$pkgver-$pkgrel"
Natanael Copa's avatar
Natanael Copa committed
386
	local prefix="${startdir##*/}"
Natanael Copa's avatar
Natanael Copa committed
387 388 389 390 391
	local i files="$prefix/APKBUILD"
	for i in $source; do
		files="$files $prefix/${i##*/}"
	done
	mkdir -p "$PKGDEST"
392
	msg "Creating source package $p.src.tar.gz..."
393
	(cd .. && tar -zcf "$PKGDEST/$p.src.tar.gz" $files) 
Natanael Copa's avatar
Natanael Copa committed
394 395
}

396 397
# check if package is up to date
up2date() {
398
	local pkg="$PKGDEST/$pkgname-$pkgver-r$pkgrel.apk"
399
	local i s
Natanael Copa's avatar
Natanael Copa committed
400
	cd "$startdir"
401 402 403 404 405
	for i in $pkgname $subpackages; do
		[ -f "$PKGDEST/$pkgname-$pkgver-r$pkgrel.apk" ] || return 1
	done
	[ -n "$keep" ] && return 0

406
	for i in $source APKBUILD; do
407 408 409 410 411 412
		local s
		if is_remote "$i"; then
			s="$SRCDEST/${i##*/}"	# $(basename $i)
		else
			s="$startdir/${i##*/}"
		fi
413 414 415 416 417 418 419
		if [ "$s" -nt "$pkg" ]; then
			return 1
		fi
	done
	return 0
}

420 421 422 423 424 425 426 427 428 429 430 431 432
# 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=
433
		. $i
434
		dir=${i%/APKBUILD}
435
		for j in $pkgname $subpackages; do
436 437 438 439 440 441 442 443 444
			echo "o ${j%%:*} $dir"
			set -- $depends $makedepends
			echo -n "d ${j%%:*} $1"
			shift
			while [ $# -gt 0 ]; do
				echo -n ",$1"
				shift
			done
			echo
445 446
		done
	done
447
	)
448 449
}

450
deptrace() {
451 452
	local deps="$@"
	[ -z "$deps" ] && deps="$BUILD_BASE $depends $makedepends"
453 454 455
	( 	depparse_aports 
		if [ -z "$upgrade" ]; then
			# list installed pkgs and prefix with 'i '
Natanael Copa's avatar
abuild:  
Natanael Copa committed
456
			apk info -q | sort |  sed 's/^/i /'
457
		fi
458
	) | awk -v pkgs="$deps" '
459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483

	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() {
484
	local deps alldeps pkg i dir ver missing
485 486
	msg "Building dependencies..."
	deps="$BUILD_BASE $depends $makedepends"
487 488 489 490 491 492 493 494 495 496 497 498 499
	for i in $deps; do
		if ! apk info -e $i; then
			if [ -z "$install_deps" ] && [ -z "$recursive" ]; then
				die "Missing dependency $i. Use -r to autoinstall or -R to build"
			fi
			missing="$missing $i"
		fi
	done

	[ -z "$missing" ] && return 0

	if [ -n "$install_deps" ] &&  $SUDO apk add $missing; then
		uninstall_after="$missing $uninstall_after"
500 501
		return 0
	fi
502 503 504 505
	
	[ -z "$recursive" ] && return 1
	
	for i in $(deptrace $missing); do
506 507 508 509 510 511 512
		# 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"
513 514 515
	done
}

516
# replace the md5sums in the APKBUILD
Natanael Copa's avatar
Natanael Copa committed
517 518 519
checksum() {
	local s files
	fetch
520
	msg "Updating the md5sums in APKBUILD..."
Natanael Copa's avatar
Natanael Copa committed
521 522 523 524
	for s in $source; do
		files="$files ${s##*/}"
	done
	md5sums="$(cd "$srcdir" && md5sum $files)" || die "md5sum failed"
525 526
	sed -i -e '/^md5sums="/,/"\$/d; /^md5sums=''/,/''\$/d' "$APKBUILD"
	echo "md5sums=\"$md5sums\"" >>"$APKBUILD"
Natanael Copa's avatar
Natanael Copa committed
527 528
}

529
stripbin() {
530
	local bin
531 532
	cd "${subpkgdir:-$pkgdir}" || return 1
	msg "Stripping binaries"
533
	find . -type f 2>/dev/null | while read bin; do
534 535 536 537 538 539 540 541 542 543 544
		local opt=
		case "$(file -biz "$bin")" in
			*/x-sharedlib*|*/x-archive*)
				strip --strip-debug "$bin";;
			*/x-executable*)
				strip "$bin";;
		esac
	done
	return 0
}

545 546 547 548 549 550 551 552
# simply list target apks
listpkg() {
	local i 
	for i in $pkgname $subpackages; do
		echo "${i%:*}-$pkgver-r$pkgrel.apk"
	done
}

Natanael Copa's avatar
abuild:  
Natanael Copa committed
553 554 555 556 557 558 559 560
subpackages_has() {
	local i
	for i in $subpackages; do
		[ "$1" = "${i%:*}" ] && return 0
	done
	return 1
}

561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
list_has() {
	local needle="$1"
	local i
	shift
	for i in $@; do
		[ "$needle" = "$i" ] && return 0
		[ "$needle" = "!$i" ] && return 1
	done
	return 1
}

options_has() {
	list_has "$1" $options
}

Natanael Copa's avatar
abuild:  
Natanael Copa committed
576 577 578 579 580 581 582 583 584 585 586 587 588 589
# install package after build
post_add() {
	local pkgf="$PKGDEST/$1-$pkgver-r$pkgrel.apk"
	local deps i
	if ! subpackages_has $1 && [ "$1" != "$pkgname" ]; then
		die "$1 is not built by this APKBUILD"
	fi
	# recursively install dependencies that are provided by this APKBUILD
	deps=$(apk index "$pkgf" 2>/dev/null | awk -F: '$1=="D" { print $2 }')
	for i in $deps; do
		if subpackages_has $i || [ "$i" = "$pkgname" ]; then
			post_add $i || return 1
		fi
	done
590
	$SUDO apk add -u "$pkgf" || die "Failed to install $1"
Natanael Copa's avatar
abuild:  
Natanael Copa committed
591 592
}

593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623
# create new aport from templates
newaport() {
	local pn=${newname%-[0-9]*}
	local pv
	if [ "$pn" != "$newname" ]; then
		pv=${newname#$pn-}
	fi
	if [ -e "$pn"/APKBUILD ]; then
		error "$pn/APKBUILD already exist"
		return 1
	fi
	mkdir -p "$pn"
	cd "$pn"
	sed 	-e '1,/^\#*$/d' \
		-e "s/^\(# Contributor: \).*/\1$PACKAGER/" \
		-e "s/^\(# Maintainer: \).*/\1$PACKAGER/" \
		-e "s/^pkgname=.*/pkgname=$pn/" \
		-e "s/^pkgver=.*/pkgver=$pv/" \
		"$datadir"/sample.APKBUILD > APKBUILD || return 1
	#-e '1,/^\#$/d' \
	if [ -n "$cpinitd" ]; then
		cp "$datadir"/sample.initd $pn.initd
		cp "$datadir"/sample.confd $pn.confd
		cp "$datadir"/sample.install $pn.install
		sed -i -e "s/^install=.*/install=\"$pn.install\"/" \
			-e "s/^source=\"\(.*\)\"/source=\"\1\n\t$pn.initd\n\t$pn.confd\n\t\$install\n\t\"/" \
			APKBUILD
		
	fi
}
	
Natanael Copa's avatar
Natanael Copa committed
624
usage() {
625
	echo "$(basename $0) $abuild_ver"
626 627
	echo "usage: ${0##*/} [options] [-i PKG] [-p PKGDEST] [-s SRCDEST] [cmd] ..."
	echo "       ${0##*/} [-c] -n PKGNAME[-PKGVER]"
Natanael Copa's avatar
Natanael Copa committed
628 629
	echo "Options:"
	echo " -f  Force specified cmd, even if they are already done"
630 631
	echo " -h  Show this help"
	echo " -i  Install PKG after successul build"
632
	echo " -k  Keep built packages, even if APKBUILD or sources are newer"
633
	echo " -p  Set package destination directory"
Natanael Copa's avatar
Natanael Copa committed
634
	echo " -q  Quiet"
635 636
	echo " -r  Install missing dependencies from system repository (using sudo)"
	echo " -R  Recursively build and install missing dependencies (using sudo)"
637
	echo " -s  Set source package destination directory"
638
	echo " -u  Recursively build and upgrade all dependencies (using sudo)"
Natanael Copa's avatar
Natanael Copa committed
639
	echo ""
640 641 642
	echo " -n  Create a new APKBUILD in a directory named PKGNAME"
	echo " -c  Copy a sample init.d, conf.d and install script to new directory"
	echo ""
Natanael Copa's avatar
Natanael Copa committed
643
	echo "Commands:"
644
	echo "  checksum    Generate checksum to be included in APKBUILD"
645 646 647 648 649
	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"
650
	echo "  listpkg     List target packages"
651 652 653
	echo "  package     Create package in \$PKGDEST"
	echo "  rootpkg     Run '$0 build package' as fakeroot"
	echo "  clean       Remove temp build and install dirs"
654
	echo "  cleanoldpkg Remove binary packages except current version"
655 656 657 658
	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"
Natanael Copa's avatar
Natanael Copa committed
659 660 661 662 663
	echo ""
	exit 0
}

APKBUILD="${APKBUILD:-./APKBUILD}"
664 665
unset force
unset recursive
666
while getopts "cfhi:kin:p:qrRs:u" opt; do
Natanael Copa's avatar
Natanael Copa committed
667
	case $opt in
668
		'c') cpinitd=1;;
Natanael Copa's avatar
Natanael Copa committed
669
		'f') force=1;;
670 671
		'h') usage;;
		'i') install_after="$install_after $OPTARG";;
672
		'k') keep=1;;
673
		'n') newname=$OPTARG;;
674
		'p') PKGDEST=$OPTARG;;
Natanael Copa's avatar
Natanael Copa committed
675
		'q') quiet=1;;
676 677
		'r') install_deps=1;;
		'R') recursive=1;;
678
		's') SRCDEST=$OPTARG;;
679 680
		'u') upgrade=1
		     recursive=1;;
Natanael Copa's avatar
Natanael Copa committed
681 682 683 684
	esac
done
shift $(( $OPTIND - 1 ))

685
# source the buildfile
686 687 688 689
if [ -z "$newname" ]; then
	[ -f "$APKBUILD" ] || die "Could not find $APKBUILD (PWD=$PWD)"
	. "$APKBUILD"
fi
690

Natanael Copa's avatar
Natanael Copa committed
691
# If we are handling a sub package then reset subpackages
692 693 694
if [ -n "$subpkgname" ]; then
	subpackages=
fi
Natanael Copa's avatar
Natanael Copa committed
695 696

trap 'die "Aborted by user"' INT
Linux User's avatar
Linux User committed
697
set_xterm_title "abuild: $pkgname"
Natanael Copa's avatar
Natanael Copa committed
698

699 700 701
if [ -z "$1" ] && [ -n "$newname" ]; then
	set "newaport"
fi
Natanael Copa's avatar
Natanael Copa committed
702 703

if [ -z "$1" ]; then
Natanael Copa's avatar
Natanael Copa committed
704
	if up2date && [ -z "$force" ]; then
Natanael Copa's avatar
Natanael Copa committed
705
		msg "Package is up to date"
706 707 708
	else
		set $default_cmds
	fi
Natanael Copa's avatar
Natanael Copa committed
709 710 711 712 713 714
fi

while [ $# -gt 0 ]; do
	runpart $1
	shift
done
715 716

for i in $install_after; do
Natanael Copa's avatar
abuild:  
Natanael Copa committed
717
	post_add $i
718 719
done

Linux User's avatar
Linux User committed
720
cleanup
Natanael Copa's avatar
Natanael Copa committed
721