boot-strap revision 321964
10Sduke:
212485Shseigel# NAME:
30Sduke#	boot-strap
40Sduke#
50Sduke# SYNOPSIS:
60Sduke#	boot-strap ["options"]
70Sduke#	boot-strap --prefix=/opt --install
80Sduke#	boot-strap --prefix=$HOME --install-host-target -DWITH_PROG_VERSION
90Sduke#	boot-strap ["options"] op=build
100Sduke#	boot-strap ["options"] op=install
110Sduke#
120Sduke# DESCRIPTION:
130Sduke#	This script is used to configure/build bmake it builds for
140Sduke#	each host-target in a different subdir to keep the src clean.
150Sduke#	There is no requirement for an existing make(1).
160Sduke#
170Sduke#	On successful completion if no '--install' flag is given,
180Sduke#	it echos a command to do installation.
191472Strims#
201472Strims#	The variable "op" defaults to 'all', and is affected by
211472Strims#	'--install' flag as above.
220Sduke#	Other values include:
230Sduke#
240Sduke#	configure
251879Sstefank#		Just run 'configure'
261879Sstefank#
271879Sstefank#	build
281879Sstefank#		If 'configure' has not been done, do it, then
291879Sstefank#		run the build script, and finally 'test'.
302062Scoleenp#
311879Sstefank#	install
321879Sstefank#		If 'build' has not been done, do it, 'test' then
330Sduke#		install. 
340Sduke#
353557Skamg#	clean
363557Skamg#		attempt to clean up
373557Skamg#
380Sduke#	test
390Sduke#		run the unit-tests.  Done automatically after 'build'
400Sduke#		and before 'install'.
410Sduke#
420Sduke#	The above are leveraged by a trivial makefile for the benefit
430Sduke#	of those that have './configure; make; make install' baked
440Sduke#	into them.
450Sduke#	
460Sduke#	Options:
470Sduke#
480Sduke#	-c "rc"
490Sduke#		Pick up settings from "rc".  
500Sduke#		We look for '.bmake-boot-strap.rc' before processing
510Sduke#		options (unless SKIP_RC is set in environment).
520Sduke#
530Sduke#	--share "share_dir"
540Sduke#		Where to put man pages and mk files.
550Sduke#		If $prefix ends in $HOST_TARGET, and $prefix/../share
560Sduke#		exits, the default will be that rather than $prefix/share.
570Sduke#
580Sduke#	--mksrc "mksrc"
590Sduke#		Indicate where the mk files can be found.
600Sduke#		Default is $Mydir/mk
610Sduke#
620Sduke#	--install
630Sduke#		If build and test work, run bmake install.
640Sduke#		BINDIR=$prefix/bin
650Sduke#		SHAREDIR=$prefix/share
660Sduke#
670Sduke#	--install-host-target
680Sduke#		As for '--install' but BINDIR=$prefix/$HOST_TARGET/bin
690Sduke#		This is useful when $prefix/ is shared by multiple
700Sduke#		machines.
710Sduke#
720Sduke#	Flags relevant when installing:
730Sduke#
740Sduke#	-DWITHOUT_INSTALL_MK
750Sduke#		Skip installing mk files.
760Sduke#		By default they will be installed to $prefix/share/mk
779860Scoleenp#
782062Scoleenp#	-DWITH_PROG_VERSION
790Sduke#		Install 'bmake' as 'bmake-$MAKE_VERSION'
800Sduke#		A symlink will be made as 'bmake' unless
810Sduke#		-DWITHOUT_PROG_LINK is set.
820Sduke#
830Sduke#	Possibly useful configure_args:
840Sduke#
850Sduke#	--without-meta
860Sduke#		disable use of meta mode.
870Sduke#
880Sduke#	--without-filemon
890Sduke#		disable use of filemon(9) which is currently only
900Sduke#		available for NetBSD and FreeBSD.
910Sduke#
920Sduke#	--with-filemon="path/to/filemon.h"
930Sduke#		enables use of filemon(9) by meta mode.
940Sduke#		
950Sduke#	--with-machine="machine"
960Sduke#		set "machine" to override that determined by
970Sduke#		machine.sh
980Sduke#	
990Sduke#	--with-force-machine="machine"
1000Sduke#		force "machine" even if uname(3) provides a value.
1010Sduke#
1020Sduke#	--with-machine_arch="machine_arch"
1030Sduke#		set "machine_arch" to override that determined by
1040Sduke#		machine.sh
1052062Scoleenp#
1062062Scoleenp#	--with-default-sys-path="syspath"
1072062Scoleenp#		set an explicit default "syspath" which is where bmake
1082062Scoleenp#		will look for sys.mk and friends.
1092062Scoleenp#
1102062Scoleenp# AUTHOR:
1112062Scoleenp#	Simon J. Gerraty <sjg@crufty.net>
1122062Scoleenp
1130Sduke# RCSid:
1140Sduke#	$Id: boot-strap,v 1.49 2016/05/29 00:09:14 sjg Exp $
1150Sduke#
1160Sduke#	@(#) Copyright (c) 2001 Simon J. Gerraty
1170Sduke#
1180Sduke#	This file is provided in the hope that it will
1190Sduke#	be of use.  There is absolutely NO WARRANTY.
1200Sduke#	Permission to copy, redistribute or otherwise
1210Sduke#	use this file is hereby granted provided that 
1220Sduke#	the above copyright notice and this notice are
1230Sduke#	left intact. 
1240Sduke#      
1250Sduke#	Please send copies of changes and bug-fixes to:
1260Sduke#	sjg@crufty.net
1270Sduke#
1280Sduke
1290SdukeMydir=`dirname $0`
1300Sduke. "$Mydir/os.sh"
1310Sdukecase "$Mydir" in
1320Sduke/*) ;;
1330Sduke*) Mydir=`cd "$Mydir" && 'pwd'`;;
1340Sdukeesac
1350Sduke
1360SdukeUsage() {
1370Sduke	[ "$1" ] && echo "ERROR: $@" >&2
1380Sduke	echo "Usage:" >&2
1390Sduke	echo "$0 [--<configure_arg> ...][<prefix>][--install]" >&2
1400Sduke	exit 1
1410Sduke}
1420Sduke
1430SdukeError() {
1440Sduke	echo "ERROR: $@" >&2
1453557Skamg	exit 1
1463557Skamg}
1473557Skamg
1480Sdukesource_rc() {
1493557Skamg	rc="$1"; shift
1503557Skamg	for d in ${*:-""}
1517207Shseigel	do
1523557Skamg		r="${d:+$d/}$rc"
1530Sduke		[ -f "$r" -a -s "$r" ] || continue
1540Sduke		echo "NOTE: reading $r"
1553557Skamg		. "$r"
1560Sduke		break
1570Sduke	done
1582319Skamg}
15912485Shseigel
1603557Skamgcmd_args="$@"
1613557Skamg
1623557Skamg# clear some things from the environment that we care about
1633557Skamgunset MAKEOBJDIR MAKEOBJDIRPREFIX
1643557Skamg
1653557Skamg# --install[-host-target] will set this
1663557SkamgINSTALL_PREFIX=
1673557Skamg# other things we pass to install step
1680SdukeINSTALL_ARGS=
1690SdukeCONFIGURE_ARGS=
1700SdukeMAKESYSPATH=
1710Sduke# pick a useful default prefix (for me at least ;-)
1720Sdukefor prefix in /opt/$HOST_TARGET "$HOME/$HOST_TARGET" /usr/pkg /usr/local ""
1733557Skamgdo
1743557Skamg	[ -d "${prefix:-.}" ] || continue
1753557Skamg	case "$prefix" in
1763557Skamg	*/$HOST_TARGET)
1773557Skamg		p=`dirname $prefix`
1783557Skamg		if [ -d $p/share ]; then
1793557Skamg			INSTALL_BIN=$HOST_TARGET/bin
1803557Skamg			prefix=$p
1813557Skamg		fi
1823557Skamg		;;
1833557Skamg	esac
1843557Skamg        echo "NOTE: default prefix=$prefix ${INSTALL_BIN:+INSTALL_BIN=$INSTALL_BIN}"
1853557Skamg	break
1863557Skamgdone
1873557Skamgsrcdir=$Mydir
1883557Skamgmksrc=$Mydir/mk
1893557Skamgobjdir=
19012485Shseigelquiet=:
1913557Skamg
1923557Skamg${SKIP_RC:+:} source_rc .bmake-boot-strap.rc . "$Mydir/.." "$HOME"
1933557Skamg
1943557Skamgget_optarg() {
1953557Skamg	expr "x$1" : "x[^=]*=\\(.*\\)"
1963557Skamg}
1970Sduke
1980Sdukehere=`'pwd'`
1990Sdukeif [ $here = $Mydir ]; then
2000Sduke   # avoid pollution
2013557Skamg   OBJROOT=../
2023557Skamgfi
2033557Skamg
2040Sdukeop=all
2050SdukeBMAKE=
2060Sduke
2070Sdukewhile :
2087207Shseigeldo
2090Sduke	case "$1" in
2103557Skamg	--) shift; break;;
2113557Skamg        --help) sed -n -e "1d;/RCSid/,\$d" -e '/^#\.[a-z]/d' -e '/^#/s,^# *,,p' $0; exit 0;;
2123557Skamg	--prefix) prefix="$2"; shift;;
2133557Skamg	--prefix=*) prefix=`get_optarg "$1"`;;
2140Sduke	--src=*) srcdir=`get_optarg "$1"`;;
2150Sduke	--with-mksrc=*|--mksrc=*) mksrc=`get_optarg "$1"`;;
2160Sduke	--share=*) share_dir=`get_optarg "$1"`;;
2170Sduke	--share) share_dir="$2"; shift;;
2180Sduke	--with-default-sys-path=*)
2190Sduke	    CONFIGURE_ARGS="$1";;
2200Sduke	--with-default-sys-path)
2210Sduke	    CONFIGURE_ARGS="$1 $2";;
2223557Skamg	--install) INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix};;
2233557Skamg	--install-host-target)
2243557Skamg                INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix}
2250Sduke                INSTALL_BIN=$HOST_TARGET/bin;;
2260Sduke	--install-destdir=*) INSTALL_DESTDIR=`get_optarg "$1"`;;
2270Sduke	--install-prefix=*) INSTALL_PREFIX=`get_optarg "$1"`;;
2287207Shseigel	-DWITH*) INSTALL_ARGS="$INSTALL_ARGS $1";;
2290Sduke	-s|--src) srcdir="$2"; shift;;
2303557Skamg	-m|--mksrc) mksrc="$2"; shift;;
2313557Skamg	-o|--objdir) objdir="$2"; shift;;
2323557Skamg	-q) quiet=;;
2333557Skamg	-c) source_rc "$2"; shift;;
2343557Skamg	--*) CONFIGURE_ARGS="$CONFIGURE_ARGS $1";;
2350Sduke	*=*) eval "$1"; export `expr "x$1" : "x\\(.[^=]*\\)=.*"`;;
2360Sduke	*) break;;
2370Sduke	esac
2380Sduke        shift
2390Sdukedone
2400Sduke
2410SdukeAddConfigure() {
2420Sduke	case " $CONFIGURE_ARGS " in
2430Sduke	*" $1"*) ;;
2440Sduke	*) CONFIGURE_ARGS="$CONFIGURE_ARGS $1$2";;
2450Sduke	esac
2463557Skamg}
2473557Skamg
2483557SkamgGetDir() {
2490Sduke	match="$1"
2500Sduke	shift
2517207Shseigel	fmatch="$1"
2523557Skamg	shift
2533557Skamg	for dir in $*
2543557Skamg	do
2553557Skamg		[ -d "$dir" ] || continue
2563557Skamg		case "/$dir/" in
2573557Skamg		*$match*) ;;
2587207Shseigel		*) continue;;
2593557Skamg		esac
2603557Skamg		case "$fmatch" in
2613557Skamg		.) ;;
2623557Skamg		*) [ -s $dir/$fmatch ] || continue;;
2633557Skamg		esac
2643557Skamg		case "$dir/" in
2653557Skamg		*./*) cd "$dir" && 'pwd';;
2663557Skamg		/*) echo $dir;;
2673557Skamg		*) cd "$dir" && 'pwd';;
2680Sduke		esac
2690Sduke		break
2700Sduke	done
2710Sduke}
2720Sduke
2730SdukeFindHereOrAbove() {
2743557Skamg    (
2753557Skamg	_t=-s
2763557Skamg	while :
2770Sduke	do
2780Sduke		case "$1" in
2790Sduke		-C) cd "$2"; shift; shift;;
2800Sduke		-?) _t=$1; shift;;
2810Sduke		*) break;;
2820Sduke		esac
2830Sduke	done
2840Sduke	case "$1" in	
2850Sduke	/*)	# we shouldn't be here
2860Sduke		[ $_t "$1" ] && echo "$1"
2870Sduke		return
2880Sduke		;;
2890Sduke	.../*) want=`echo "$1" | sed 's,^.../*,,'`;;
2900Sduke	*) want="$1";;
2910Sduke	esac
2920Sduke	here=`'pwd'`
2930Sduke	while :
2940Sduke	do
2950Sduke		if [ $_t "./$want" ]; then
2960Sduke			echo "$here/$want"
2970Sduke			return
2980Sduke		fi
2990Sduke		cd ..
3000Sduke		here=`'pwd'`
3010Sduke		case "$here" in
3020Sduke		/) return;;
3030Sduke		esac
3040Sduke	done
3050Sduke    )
3063557Skamg}
3073557Skamg
3083557Skamg# is $1 missing from $2 (or PATH) ?
3090Sdukeno_path() {
3100Sduke	eval "__p=\$${2:-PATH}"
3110Sduke	case ":$__p:" in *:"$1":*) return 1;; *) return 0;; esac
3120Sduke}
3130Sduke
3140Sduke# if $1 exists and is not in path, append it
3150Sdukeadd_path () {
3160Sduke	case "$1" in
3170Sduke	-?) t=$1; shift;;
3180Sduke	*) t=-d;;
3190Sduke	esac
3200Sduke	case "$2,$1" in
3210Sduke	MAKESYSPATH,.../*) ;;
3220Sduke	*) [ $t ${1:-.} ] || return;;
3230Sduke	esac
3240Sduke	no_path $* && eval ${2:-PATH}="$__p${__p:+:}$1"
3250Sduke}
3260Sduke
3270Sduke
3280Sdukesrcdir=`GetDir /bmake make-bootstrap.sh.in "$srcdir" "$2" "$Mydir" ./bmake* "$Mydir"/../bmake*`
3290Sduke[ -d "${srcdir:-/dev/null}" ] || Usage
3300Sdukecase "$mksrc" in
3310Sdukenone|-) # we ignore this now
3320Sduke	mksrc=$Mydir/mk
3330Sduke	;;
3343557Skamg.../*)	# find here or above
3353557Skamg	mksrc=`FindHereOrAbove -C "$Mydir" -s "$mksrc/sys.mk"`
3360Sduke	# that found a file
3370Sduke	mksrc=`dirname $mksrc`
3383557Skamg	;;
3393557Skamg*)	# guess we want mksrc...
3403557Skamg	mksrc=`GetDir /mk sys.mk "$mksrc" "$3" ./mk* "$srcdir"/mk* "$srcdir"/../mk*`
3413557Skamg	[ -d "${mksrc:-/dev/null}" ] || Usage "Use '-m none' to build without mksrc"
3423557Skamg	;;
3433557Skamgesac
3443557Skamg
3453557Skamg# Ok, get to work...
3463557Skamgobjdir="${objdir:-$OBJROOT$HOST_TARGET}"
3473557Skamg[ -d "$objdir" ] || mkdir -p "$objdir"
3483557Skamg[ -d "$objdir" ] || mkdir "$objdir"
3493557Skamgcd "$objdir" || exit 1
3503557Skamg# make it absolute
3513557Skamgobjdir=`'pwd'`
3523557Skamg
3533557SkamgShareDir() {
3543557Skamg	case "/$1" in
3553557Skamg	/) [ -d /share ] || return;;
3563557Skamg	*/$HOST_TARGET)
3573557Skamg		if [ -d "$1/../share" ]; then
3583557Skamg			echo `dirname "$1"`/share
3593557Skamg			return
3603557Skamg		fi
361		;;
362	esac
363	echo $1/share
364}
365
366# make it easy to force prefix to use $HOST_TARGET
367: looking at "$prefix"
368case "$prefix" in
369*/host?target) prefix=`echo "$prefix" | sed "s,host.target,${HOST_TARGET},"`;;
370esac
371
372share_dir="${share_dir:-`ShareDir $prefix`}"
373
374AddConfigure --prefix= "$prefix"
375case "$CONFIGURE_ARGS" in
376*--with-*-sys-path*) ;; # skip
377*) [ "$share_dir" ] && AddConfigure --with-default-sys-path= "$share_dir/mk";;
378esac
379if [ "$mksrc" ]; then
380        AddConfigure --with-mksrc= "$mksrc"
381        # not all cc's support this
382        CFLAGS_MF= CFLAGS_MD=
383        export CFLAGS_MF CFLAGS_MD
384fi
385
386# this makes it easy to run the bmake we just built
387# the :tA dance is needed because 'pwd' and even /bin/pwd
388# may not give the same result as realpath().
389Bmake() {
390    (
391	    cd $Mydir &&
392	    MAKESYSPATH=$mksrc SRCTOP=$Mydir OBJTOP=$objdir \
393	    MAKEOBJDIR='${.CURDIR:S,${SRCTOP:tA},${OBJTOP:tA},}' \
394	    ${BMAKE:-$objdir/bmake} -f $Mydir/Makefile "$@"
395    )
396}
397
398# there is actually a shell where type is not a builtin
399# if type is missing, which(1) had better exists!
400if (type cat) > /dev/null 2>&1; then
401which() {
402        type "$@" | sed 's,[()],,g;s,^[^/][^/]*,,;q'
403}
404fi
405# make sure test below uses the same diff that configure did
406TOOL_DIFF=`which diff`
407export TOOL_DIFF
408
409op_configure() {
410	$srcdir/configure $CONFIGURE_ARGS || exit 1
411}
412
413op_build() {
414	[ -s make-bootstrap.sh ] || op_configure
415	chmod 755 make-bootstrap.sh || exit 1
416	./make-bootstrap.sh || exit 1
417	case "$op" in
418	build) op_test;;
419	esac
420}
421
422op_test() {
423	[ -x bmake ] || op_build
424	Bmake test || exit 1
425}
426
427op_clean() {
428	if [ -x bmake ]; then
429		ln bmake bmake$$
430		BMAKE=$objdir/bmake$$ Bmake clean
431		rm -f bmake$$
432	elif [ $objdir != $srcdir ]; then
433		rm -rf *
434	fi
435}
436
437op_install() {
438	op_test
439	case "$INSTALL_PREFIX,$INSTALL_BIN,$prefix" in
440	,$HOST_TARGET/bin,*/$HOST_TARGET)
441		INSTALL_PREFIX=`dirname $prefix`
442		;;
443	esac
444	INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix}
445	Bmake install prefix=$INSTALL_PREFIX BINDIR=$INSTALL_PREFIX/${INSTALL_BIN:-bin} ${INSTALL_DESTDIR:+DESTDIR=$INSTALL_DESTDIR} $INSTALL_ARGS || exit 1
446}
447
448op_all() {
449	rm -f make-bootstrap.sh bmake *.o
450	if [ -n "$INSTALL_PREFIX" ]; then
451		op_install
452	else
453		op_test
454		MAKE_VERSION=`sed -n '/^_MAKE_VERSION/ { s,.*=  *,,;p; }' $srcdir/Makefile`
455		echo You can install by running:
456		echo
457		echo $0 $cmd_args op=install
458		echo
459		echo "Use --install-prefix=/something to install somewhere other than $prefix"
460		echo "Use --install-destdir=/somewhere to set DESTDIR during install"
461		echo "Use --install-host-target to use INSTALL_BIN=$HOST_TARGET/bin"
462		echo "Use -DWITH_PROG_VERSION to install as bmake-$MAKE_VERSION"
463		echo "Use -DWITHOUT_PROG_LINK to suppress bmake -> bmake-$MAKE_VERSION symlink"
464		echo "Use -DWITHOUT_INSTALL_MK to skip installing files to $prefix/share/mk"
465	fi
466}
467
468op_$op
469exit 0
470