#!/bin/sh

# $NetBSD: mkbinarykit,v 1.23 2007/05/27 19:55:58 schmonz Exp $
#
# Make a binary bootstrap kit and place it in targetdir (or current
# working directory if not specified). The mk.conf.example file is
# copied to ${PREFIX}/etc/mk.conf or to the location specified
# by using --mkconf. Run this program from the pkgsrc/bootstrap
# directory.

mkbinarykit_macpkg()
{
	local macdestdir
	macdestdir=${wrkdir}/macpkg-destdir
	rm -rf ${macdestdir} || die "cleanup destdir"

	mkdir -p ${macdestdir}${prefix} || die "mkdir destprefix"
	rmdir ${macdestdir}${prefix} || die "rmdir destprefix"
	cp -Rp ${prefix} ${macdestdir}${prefix} || die "copy prefix"

	if [ ! -d ${macdestdir}${pkgdbdir} ]; then
		mkdir -p ${macdestdir}${pkgdbdir} || die "mkdir destdbdir"
		rmdir ${macdestdir}${pkgdbdir} || die "rmdir destdbdir"
		cp -Rp ${pkgdbdir} ${macdestdir}${pkgdbdir} || die "copy dbdir"
	fi

	${sedprog} -e "s|%WRKDIR%|${wrkdir}|g" \
		-e "s|%TARGETDIR%|${targetdir}|g" -e "s|%DATE%|${date}|g" \
		< macpkg.pmproj.in > ${wrkdir}/macpkg.pmproj
	/Developer/Tools/packagemaker -build -proj ${wrkdir}/macpkg.pmproj -p "$targetdir/bootstrap-pkgsrc-$opsys-$osrev-$ospro-$date.pkg"
	ls -dl "$targetdir/bootstrap-pkgsrc-$opsys-$osrev-$ospro-$date.pkg"
}

mkbinarykit_tar()
{
	# in case tar was built by bootstrap
	PATH="$prefix/bin:$PATH"; export PATH
	[ ! -d $sysconfdir ] && mkdir -p $sysconfdir 
	cp ${wrkdir}/mk.conf.example $mkfile &&						\
	cd / && \
	tar -hcf "$targetdir/bootstrap-pkgsrc-$opsys-$osrev-$ospro-$date.tar" \
		.$prefix .$pkgdbdir .$mkfile && \
	ls -l "$targetdir/bootstrap-pkgsrc-$opsys-$osrev-$ospro-$date.tar"
}

die()
{
	echo "error: can't $@" >&2
	exit 1
}

usage="Usage: $0 "'
	[ --force ] [ --targetdir=<tar target dir> ] [ --mkconf=<target> ]
	[ --no-build ] [ --workdir=<work dir> ] [ bootstrap script arguments ]
	[ --fetch-cmd=<ftp command> ]'

opsys=`uname -s | tr -d /-`
osrev=`uname -r`
ospro=`uname -p`
date=`date +%Y%m%d`

prefix=/usr/pkg
sysconfdir=$prefix/etc
pkgdbdir=/var/db/pkg
mkfile=
ignorecasecheck=no
ignoreusercheck=no
force=no
build=yes
fetch_cmd=""
targetdir=`pwd`
wrkdir=`pwd`/work		# default: relative to pkgsrc/bootstrap

sedprog="sed" 

case "$opsys" in
AIX)
	pkgdbdir=$prefix/pkgdb
	;;
Darwin)
	macosx_version=`echo $osrev | awk -F . '{ print "10."$1-4; }'`
	universal_sdk="/Developer/SDKs/MacOSX${macosx_version}u.sdk"
	if [ -d "${universal_sdk}" ]; then
		echo "===> Building Universal binaries."
		ospro=universal
		export CFLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64 -isysroot ${universal_sdk}"
		export LDFLAGS="-arch i386 -arch ppc -arch ppc64 -arch x86_64 -Wl,-syslibroot,${universal_sdk}"
	else
		echo "===> Building non-Universal binaries."
	fi
	unset macosx_version universal_sdk
	;;
DragonFly)
	case "$osrev" in
	1.1[0-9]*)
		;;
	1.0* | 1.1 | 1.2.* | 1.3.*)
		# Don't use the ports /var/db/pkg
		pkgdbdir=$prefix/pkgdb
		;;
	esac
	;;
FreeBSD)
	# Don't use the ports /var/db/pkg
	pkgdbdir=$prefix/pkgdb
	;;
Interix)
	# Don't use the interopsystems.com package dir
	pkgdbdir=$prefix/pkgdb
	ospro=i386
	;;
HPUX)
	ospro=`uname -m | sed 's/^9000.*$/hppa/'`
	;;
NetBSD)
	;;
OpenBSD)
	# Don't use the ports /var/db/pkg
	pkgdbdir=$prefix/pkgdb
	# Use "arch -s" instead of uname -p
	ospro=`arch -s`
	;;
SunOS)
	sedprog=/usr/xpg4/bin/sed
	;;
esac

while [ $# -gt 0 ]; do
	case $1 in
	--force)	force=yes ;;
	--no-build)	build=no ;;
	--targetdir=*)	targetdir=`echo $1 | $sedprog -e 's|--targetdir=||'` ;;
	--prefix=*)	prefix=`echo $1 | $sedprog -e 's|--prefix=||'` ;;
	--fetch-cmd=*)	fetch_cmd="$1" ;;
	--mkconf=*)	mkfile=`echo $1 | $sedprog -e 's|--mkconf=||'` ;;
	--pkgdbdir=*)	pkgdbdir=`echo $1 | $sedprog -e 's|--pkgdbdir=||'` ;;
	--ignore-case-check) ignorecasecheck=yes ;;
	--ignore-user-check) ignoreusercheck=yes ;;
	--workdir=*)	wrkdir=`echo $1 | $sedprog -e 's|--workdir=||'` ;;
	--*)		echo "$usage"; exit 1 ;;
	esac
	shift
done

[ -z "${mkfile}" ] && mkfile="$prefix/etc/mk.conf"

if [ "$build" = "yes" ] && [ "$force" != "yes" ]; then
	if [ -d "$prefix" ] || [ -d "$pkgdbdir" ]; then
		echo "Some pkgsrc infrastructure exists on this system already."
		echo "Use --force to move it out of the way."
		exit 1
	fi
elif [ "$build" = "yes" ]; then
	mv -f "$prefix" "$prefix.$$"
	mv -f "$pkgdbdir" "$pkgdbdir.$$"
	mv -f "$mkfile" "$mkfile.$$"
fi

if [ "$build" != "no" ]; then

	# Bootstrap
	bootstrap_flags="--prefix=$prefix --pkgdbdir=$pkgdbdir --workdir=$wrkdir $fetch_cmd"
	if [ "$ignorecasecheck" = "yes" ]; then
	bootstrap_flags="$bootstrap_flags --ignore-case-check"
	fi

	if [ "$ignoreusercheck" = "yes" ]; then
	bootstrap_flags="$bootstrap_flags --ignore-user-check"
	fi

	echo "Making bootstrap kit with"
	echo "prefix = $prefix"
	echo "pkgdbdir = $pkgdbdir"
	echo "mk.conf.example will be copied to $mkfile"
	echo ""

	./cleanup $wrkdir
	./bootstrap $bootstrap_flags
	if [ $? != "0" ]; then
	echo "Bootstrap error."
	exit 1;
	fi
fi

# Make a tar ball

strip=strip
if [ -x /usr/ccs/bin/strip ]; then
	strip=/usr/ccs/bin/strip
fi

echo "Stripping binaries..."
$strip "$prefix/"bin/*
$strip "$prefix/"sbin/*

echo "Making binary kit."
case "$opsys" in
Darwin)
	mkbinarykit_macpkg
	;;
*)
	mkbinarykit_tar
	;;
esac
