:
# NAME:
#	boot-strap
#
# SYNOPSIS:
#	boot-strap [--"configure_arg" ... ][-s "srcdir"][-m "mksrc"]\\
#		["prefix" ["bmakesrc" ["mksrc"]]]
#
# DESCRIPTION:
#	This script is used to configure/build bmake it builds for
#	each OS in a subdir to keep the src clean. 
#	On successful completion it echos commands to put the new
#	bmake binary into the /configs tree (if it exists)
#	(http://www.crufty.net/FreeWare/configs.html), $prefix/bin
#	and a suitable ~/*bin directory.
#
#	Options:
#
#	-c "rc"
#		Pick up settings from "rc".  
#		We look for '.bmake-boot-strap.rc' before processing
#		options.
#
#	--share "share_dir"
#		Where to put man pages and mk files.
#		If $prefix ends in $HOST_TARGET, and $prefix/../share
#		exits, the default will be that rather than $prefix/share.
#
#	--mksrc "mksrc"
#		Indicate where the mk files can be found.
#		Default is ./mk or ../mk, set to 'none' to force
#		building without "mksrc" but in that case a sys.mk
#		needs to exist in the default syspath ($share_dir/mk)
#
#	Possibly useful configure_args:
#
#	--with-machine="machine"
#		set "machine" to override that determined by
#		machine.sh
#	
#	--with-force-machine="machine"
#		force "machine" even if uname(3) provides a value.
#
#	--with-machine_arch="machine_arch"
#		set "machine_arch" to override that determined by
#		machine.sh
#
#	--with-default-sys-path="syspath"
#		set an explicit default "syspath" which is where bmake
#		will look for sys.mk and friends.
#	
#	--with-prefix-sys-path="syspath"
#		prefix the built in default syspath with "syspath"
#
# AUTHOR:
#	Simon J. Gerraty <sjg@crufty.net>

# RCSid:
#	$Id: boot-strap,v 1.28 2010/03/18 05:08:57 sjg Exp $
#
#	@(#) Copyright (c) 2001 Simon J. Gerraty
#
#	This file is provided in the hope that it will
#	be of use.  There is absolutely NO WARRANTY.
#	Permission to copy, redistribute or otherwise
#	use this file is hereby granted provided that 
#	the above copyright notice and this notice are
#	left intact. 
#      
#	Please send copies of changes and bug-fixes to:
#	sjg@crufty.net
#

Mydir=`dirname $0`
. "$Mydir/os.sh"
case "$Mydir" in
/*) ;;
*) Mydir=`cd "$Mydir" && 'pwd'`;;
esac


Usage() {
	[ "$1" ] && echo "ERROR: $@" >&2
	echo "Usage:" >&2
	echo "$0 [--<configure_arg> ...][-s <srcdir>][-m <mksrc>][<prefix> [[<srcdir>] [<mksrc>]]]" >&2
	exit 1
}

Error() {
	echo "ERROR: $@" >&2
	exit 1
}

source_rc() {
	rc="$1"; shift
	for d in ${*:-""}
	do
		r="${d:+$d/}$rc"
		[ -f "$r" -a -s "$r" ] || continue
		echo "NOTE: reading $r"
		. "$r"
		break
	done
}

CONFIGURE_ARGS=
# pick a useful default prefix (for me at least ;-)
for prefix in /opt/$HOST_TARGET "$HOME/$HOST_TARGET" /usr/pkg /usr/local ""
do
	[ -d "${prefix:-.}" ] && break
done
srcdir=
mksrc=
objdir=
quiet=:

source_rc .bmake-boot-strap.rc . "$Mydir/.." "$HOME"

while :
do
	case "$1" in
	--) shift; break;;
	--prefix) prefix="$2"; shift;;
	--prefix=*) prefix=`IFS="="; set -- "$1"; echo "$2"`;;
	--src=*) srcdir=`IFS="="; set -- "$1"; echo "$2"`;;
	--with-mksrc=*|--mksrc=*) mksrc=`IFS="="; set -- "$1"; echo "$2"`;;
	--share=*) share_dir=`IFS="="; set -- "$1"; echo "$2"`;;
	--share) share_dir="$2"; shift;;
	-s|--src) srcdir="$2"; shift;;
	-m|--mksrc) mksrc="$2"; shift;;
	-o|--objdir) objdir="$2"; shift;;
	-q) quiet=;;
	-c) source_rc "$2"; shift;;
	--*) CONFIGURE_ARGS="$CONFIGURE_ARGS $1";;
	*=*) eval "$1"; export `IFS="="; set -- "$1"; echo "$1"`;;
	*) break;;
	esac
        shift
done

AddConfigure() {
	case " $CONFIGURE_ARGS " in
	*" $1"*) ;;
	*) CONFIGURE_ARGS="$CONFIGURE_ARGS $1$2";;
	esac
}

GetDir() {
	match="$1"
	shift
	for dir in $*
	do
		[ -d "$dir" ] || continue
		case "/$dir/" in
		*$match*) ;;
		*) continue;;
		esac
		case "$dir/" in
		*./*) cd "$dir" && 'pwd';;
		/*) echo $dir;;
		*) cd "$dir" && 'pwd';;
		esac
		break
	done
}

srcdir=`GetDir /bmake "$srcdir" "$2" "$Mydir" ./bmake* "$Mydir"/../bmake*`
[ -d "${srcdir:-/dev/null}" ] || Usage
case "$mksrc" in
none|-) # we don't want it
	mksrc=
	;;
*)	# guess we want mksrc...
	mksrc=`GetDir /mk "$mksrc" "$3" ./mk* "$srcdir"/mk* "$srcdir"/../mk*`
	[ -d "${mksrc:-/dev/null}" ] || Usage "Use '-m none' to build without mksrc"
	;;
esac

# Ok, get to work...
objdir="${objdir:-$OS}"
[ -d "$objdir" ] || mkdir -p "$objdir"
[ -d "$objdir" ] || mkdir "$objdir"
cd "$objdir" || exit 1
# make it absolute
objdir=`'pwd'`

ShareDir() {
	case "/$1" in
	*/$HOST_TARGET)
		if [ -d "$1/../share" ]; then
			echo `dirname "$1"`/share
			return
		fi
		;;
	esac
	echo $1/share
}

share_dir="${share_dir:-`ShareDir $prefix`}"

AddConfigure --prefix= "$prefix"
case "$CONFIGURE_ARGS" in
*--with-prefix-sys-path*) ;;	# skip
*) AddConfigure --with-default-sys-path= "$share_dir/mk";;
esac
if [ "$mksrc" ]; then
        AddConfigure --with-mksrc= "$mksrc"
        # not all cc's support this
        export CFLAGS_MF=
fi

$srcdir/configure $CONFIGURE_ARGS || exit 1
chmod 755 make-bootstrap.sh || exit 1
./make-bootstrap.sh || exit 1
MAKESYSPATH="$share_dir/mk:/usr/share/mk"
if [ -s "${mksrc:-/dev/null}/install-mk" ]; then
        sh "${mksrc}/install-mk" "$objdir/mk"
        MAKESYSPATH=".../mk:${MAKESYSPATH}"
fi
export MAKESYSPATH
./bmake test || exit 1

# If -q given, we don't want all the install instructions
$quiet exit 0

make_version=`./bmake -f ./Makefile -V MAKE_VERSION | ( read one two; echo $one )`
bmake_version=bmake-$make_version

if [ -s /usr/share/tmac/andoc.tmac ]; then
	# this should be ok
	man_subdir=man1
	man_src=$srcdir/bmake.1
else
	# guess not
	man_subdir=cat1
	man_src=$srcdir/bmake.cat1
fi

install_prefix() {
    (
	bin_dir=
	share_dir=
	man_dir=
	mk_dir=
	while :
	do
		case "$1" in
		*=*) eval "$1"; shift;;
		*) break;;
		esac
	done
	bin_dir=${bin_dir:-$1/bin}
	share_dir=${share_dir:-`ShareDir "$1"`}
	man_dir=${man_dir:-$share_dir/man}
	mk_dir=${mk_dir:-$share_dir/mk}
	echo
	echo Commands to install into $1/
	echo
	echo mkdir -p $bin_dir
	echo cp $objdir/bmake $bin_dir/$bmake_version
	echo rm -f $bin_dir/bmake
	echo ln -s $bmake_version $bin_dir/bmake
	echo mkdir -p $man_dir/$man_subdir
	echo cp $man_src $man_dir/$man_subdir/bmake.1
	if [ "$mksrc" ]; then
		ev=`env | grep '_MK='`
		echo $ev sh $mksrc/install-mk $mk_dir
	fi
    )
}

case "$prefix/" in
"$HOME"/*) ;;
*)	CONFIGS=${CONFIGS:-/configs}
	[ -d $CONFIGS ] &&
	install_prefix mksrc= "$CONFIGS/$OS/$OSMAJOR.X/$MACHINE_ARCH$prefix"
	# I like to keep a copy here...
	install_prefix share_dir="$HOME/share" "$HOME/$HOST_TARGET"
	;;
esac

install_prefix "$prefix"
