Home | History | Annotate | Line # | Download | only in src
build.sh revision 1.98
      1  1.67   thorpej #! /usr/bin/env sh
      2  1.98     lukem #	$NetBSD: build.sh,v 1.98 2003/05/08 14:19:39 lukem Exp $
      3  1.84     lukem #
      4  1.84     lukem # Copyright (c) 2001-2003 The NetBSD Foundation, Inc.
      5  1.84     lukem # All rights reserved.
      6  1.84     lukem #
      7  1.84     lukem # This code is derived from software contributed to The NetBSD Foundation
      8  1.84     lukem # by Todd Vierling and Luke Mewburn.
      9  1.84     lukem #
     10  1.84     lukem # Redistribution and use in source and binary forms, with or without
     11  1.84     lukem # modification, are permitted provided that the following conditions
     12  1.84     lukem # are met:
     13  1.84     lukem # 1. Redistributions of source code must retain the above copyright
     14  1.84     lukem #    notice, this list of conditions and the following disclaimer.
     15  1.84     lukem # 2. Redistributions in binary form must reproduce the above copyright
     16  1.84     lukem #    notice, this list of conditions and the following disclaimer in the
     17  1.84     lukem #    documentation and/or other materials provided with the distribution.
     18  1.84     lukem # 3. All advertising materials mentioning features or use of this software
     19  1.84     lukem #    must display the following acknowledgement:
     20  1.84     lukem #        This product includes software developed by the NetBSD
     21  1.84     lukem #        Foundation, Inc. and its contributors.
     22  1.84     lukem # 4. Neither the name of The NetBSD Foundation nor the names of its
     23  1.84     lukem #    contributors may be used to endorse or promote products derived
     24  1.84     lukem #    from this software without specific prior written permission.
     25  1.84     lukem #
     26  1.84     lukem # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     27  1.84     lukem # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     28  1.84     lukem # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     29  1.84     lukem # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     30  1.84     lukem # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  1.84     lukem # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  1.84     lukem # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  1.84     lukem # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  1.84     lukem # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  1.84     lukem # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  1.84     lukem # POSSIBILITY OF SUCH DAMAGE.
     37  1.84     lukem #
     38   1.1        tv #
     39   1.1        tv # Top level build wrapper, for a system containing no tools.
     40   1.1        tv #
     41   1.1        tv # This script should run on any POSIX-compliant shell.  For systems
     42  1.33        tv # with a strange /bin/sh, "ksh" or "bash" may be an ample alternative.
     43   1.1        tv #
     44  1.67   thorpej # Note, however, that due to the way the interpreter is invoked above,
     45  1.67   thorpej # if a POSIX-compliant shell is the first in the PATH, you won't have
     46  1.67   thorpej # to take any further action.
     47  1.67   thorpej #
     48   1.1        tv 
     49  1.84     lukem progname=${0##*/}
     50  1.84     lukem toppid=$$
     51  1.98     lukem results=/dev/null
     52  1.82     lukem trap "exit 1" 1 2 3 15
     53  1.84     lukem 
     54  1.79     lukem bomb()
     55  1.79     lukem {
     56  1.82     lukem 	cat >&2 <<ERRORMESSAGE
     57  1.82     lukem 
     58  1.82     lukem ERROR: $@
     59  1.82     lukem *** BUILD ABORTED ***
     60  1.82     lukem ERRORMESSAGE
     61  1.98     lukem 	kill ${toppid}		# in case we were invoked from a subshell
     62   1.1        tv 	exit 1
     63   1.1        tv }
     64  1.78     lukem 
     65  1.84     lukem 
     66  1.98     lukem statusmsg()
     67  1.98     lukem {
     68  1.98     lukem 	${runcmd} echo "===> $@" | tee -a "${results}"
     69  1.98     lukem }
     70  1.98     lukem 
     71  1.84     lukem initdefaults()
     72  1.84     lukem {
     73  1.84     lukem 	cd "$(dirname $0)"
     74  1.84     lukem 	[ -d usr.bin/make ] ||
     75  1.84     lukem 	    bomb "build.sh must be run from the top source level"
     76  1.84     lukem 	[ -f share/mk/bsd.own.mk ] ||
     77  1.84     lukem 	    bomb "src/share/mk is missing; please re-fetch the source tree"
     78  1.84     lukem 
     79  1.84     lukem 	uname_s=$(uname -s 2>/dev/null)
     80  1.84     lukem 	uname_m=$(uname -m 2>/dev/null)
     81  1.84     lukem 
     82  1.84     lukem 	# If $PWD is a valid name of the current directory, POSIX mandates
     83  1.84     lukem 	# that pwd return it by default which causes problems in the
     84  1.84     lukem 	# presence of symlinks.  Unsetting PWD is simpler than changing
     85  1.84     lukem 	# every occurrence of pwd to use -P.
     86  1.84     lukem 	#
     87  1.84     lukem 	# XXX Except that doesn't work on Solaris.
     88  1.98     lukem 	#
     89  1.84     lukem 	unset PWD
     90  1.84     lukem 	if [ "${uname_s}" = "SunOS" ]; then
     91  1.84     lukem 		TOP=$(pwd -P)
     92  1.84     lukem 	else
     93  1.84     lukem 		TOP=$(pwd)
     94  1.84     lukem 	fi
     95  1.84     lukem 
     96  1.84     lukem 	# Set defaults.
     97  1.98     lukem 	#
     98  1.84     lukem 	toolprefix=nb
     99  1.98     lukem 
    100  1.95   thorpej 	# Some systems have a small ARG_MAX.  -X prevents make(1) from
    101  1.95   thorpej 	# exporting variables in the environment redundantly.
    102  1.98     lukem 	#
    103  1.95   thorpej 	case "${uname_s}" in
    104  1.97  christos 	Darwin | FreeBSD | CYGWIN*)
    105  1.95   thorpej 		MAKEFLAGS=-X
    106  1.95   thorpej 		;;
    107  1.95   thorpej 	*)
    108  1.95   thorpej 		MAKEFLAGS=
    109  1.95   thorpej 		;;
    110  1.95   thorpej 	esac
    111  1.98     lukem 
    112  1.84     lukem 	makeenv=
    113  1.84     lukem 	makewrapper=
    114  1.84     lukem 	runcmd=
    115  1.84     lukem 	operations=
    116  1.84     lukem 	removedirs=
    117  1.84     lukem 	do_expertmode=false
    118  1.84     lukem 	do_rebuildmake=false
    119  1.84     lukem 	do_removedirs=false
    120  1.84     lukem 
    121  1.84     lukem 	# do_{operation}=true if given operation is requested.
    122  1.84     lukem 	#
    123  1.84     lukem 	do_tools=false
    124  1.84     lukem 	do_obj=false
    125  1.84     lukem 	do_build=false
    126  1.84     lukem 	do_distribution=false
    127  1.84     lukem 	do_release=false
    128  1.84     lukem 	do_kernel=false
    129  1.84     lukem 	do_install=false
    130  1.87     lukem 	do_sets=false
    131  1.98     lukem 
    132  1.98     lukem 	# Create scratch directory
    133  1.98     lukem 	#
    134  1.98     lukem 	tmpdir="${TMPDIR-/tmp}/nbbuild$$"
    135  1.98     lukem 	mkdir "${tmpdir}" || bomb "Cannot mkdir: ${tmpdir}"
    136  1.98     lukem 	trap "cd /; rm -r -f \"${tmpdir}\"" 0
    137  1.98     lukem 	results="${tmpdir}/build.sh.results"
    138  1.84     lukem }
    139  1.29       jmc 
    140  1.79     lukem getarch()
    141  1.79     lukem {
    142   1.1        tv 	# Translate a MACHINE into a default MACHINE_ARCH.
    143  1.84     lukem 	#
    144  1.98     lukem 	case "${MACHINE}" in
    145   1.1        tv 
    146  1.98     lukem 	acorn26|acorn32|cats|evbarm|hpcarm|netwinder|shark)
    147  1.84     lukem 		MACHINE_ARCH=arm
    148  1.84     lukem 		;;
    149  1.84     lukem 
    150  1.98     lukem 	hp700)
    151  1.98     lukem 		MACHINE_ARCH=hppa
    152  1.98     lukem 		;;
    153  1.98     lukem 
    154  1.84     lukem 	sun2)
    155  1.84     lukem 		MACHINE_ARCH=m68000
    156  1.84     lukem 		;;
    157  1.84     lukem 
    158  1.98     lukem 	amiga|atari|cesfic|hp300|luna68k|mac68k|mvme68k|news68k|next68k|sun3|x68k)
    159  1.84     lukem 		MACHINE_ARCH=m68k
    160  1.84     lukem 		;;
    161   1.1        tv 
    162  1.84     lukem 	mipsco|newsmips|sbmips|sgimips)
    163  1.84     lukem 		MACHINE_ARCH=mipseb
    164  1.84     lukem 		;;
    165   1.1        tv 
    166  1.84     lukem 	algor|arc|cobalt|evbmips|hpcmips|playstation2|pmax)
    167  1.84     lukem 		MACHINE_ARCH=mipsel
    168  1.84     lukem 		;;
    169   1.1        tv 
    170  1.98     lukem 
    171  1.84     lukem 	pc532)
    172  1.84     lukem 		MACHINE_ARCH=ns32k
    173  1.84     lukem 		;;
    174   1.1        tv 
    175  1.98     lukem 	amigappc|bebox|evbppc|macppc|mvmeppc|ofppc|pmppc|prep|sandpoint)
    176  1.84     lukem 		MACHINE_ARCH=powerpc
    177  1.84     lukem 		;;
    178   1.1        tv 
    179  1.84     lukem 	evbsh3|mmeye)
    180  1.84     lukem 		MACHINE_ARCH=sh3eb
    181  1.84     lukem 		;;
    182   1.1        tv 
    183  1.84     lukem 	dreamcast|hpcsh)
    184  1.84     lukem 		MACHINE_ARCH=sh3el
    185  1.84     lukem 		;;
    186   1.1        tv 
    187  1.84     lukem 	evbsh5)
    188  1.84     lukem 		MACHINE_ARCH=sh5el
    189  1.84     lukem 		;;
    190  1.96      fvdl 	amd64)
    191  1.96      fvdl 		MACHINE_ARCH=x86_64
    192  1.96      fvdl 		;;
    193  1.62  fredette 
    194  1.96      fvdl 	alpha|i386|sparc|sparc64|vax)
    195  1.98     lukem 		MACHINE_ARCH=${MACHINE}
    196  1.84     lukem 		;;
    197  1.69   thorpej 
    198  1.84     lukem 	*)
    199  1.98     lukem 		bomb "Unknown target MACHINE: ${MACHINE}"
    200  1.84     lukem 		;;
    201   1.4        tv 
    202   1.1        tv 	esac
    203   1.1        tv }
    204   1.1        tv 
    205  1.79     lukem validatearch()
    206  1.79     lukem {
    207  1.47        tv 	# Ensure that the MACHINE_ARCH exists (and is supported by build.sh).
    208  1.84     lukem 	#
    209  1.98     lukem 	case "${MACHINE_ARCH}" in
    210  1.47        tv 
    211  1.84     lukem 	alpha|arm|armeb|hppa|i386|m68000|m68k|mipse[bl]|ns32k|powerpc|sh[35]e[bl]|sparc|sparc64|vax|x86_64)
    212  1.84     lukem 		;;
    213  1.84     lukem 
    214  1.84     lukem 	*)
    215  1.98     lukem 		bomb "Unknown target MACHINE_ARCH: ${MACHINE_ARCH}"
    216  1.98     lukem 		;;
    217  1.98     lukem 
    218  1.98     lukem 	esac
    219  1.98     lukem 
    220  1.98     lukem 	# Determine valid MACHINE_ARCHs for MACHINE
    221  1.98     lukem 	#
    222  1.98     lukem 	case "${MACHINE}" in
    223  1.98     lukem 
    224  1.98     lukem 	evbarm)
    225  1.98     lukem 		arches="arm armeb"
    226  1.98     lukem 		;;
    227  1.98     lukem 
    228  1.98     lukem 	evbmips|sbmips)
    229  1.98     lukem 		arches="mipseb mipsel"
    230  1.98     lukem 		;;
    231  1.98     lukem 
    232  1.98     lukem 	evbsh3)
    233  1.98     lukem 		arches="sh3eb sh3el"
    234  1.98     lukem 		;;
    235  1.98     lukem 
    236  1.98     lukem 	evbsh5)
    237  1.98     lukem 		arches="sh5eb sh5el"
    238  1.98     lukem 		;;
    239  1.98     lukem 
    240  1.98     lukem 	*)
    241  1.98     lukem 		oma="${MACHINE_ARCH}"
    242  1.98     lukem 		getarch
    243  1.98     lukem 		arches="${MACHINE_ARCH}"
    244  1.98     lukem 		MACHINE_ARCH="${oma}"
    245  1.84     lukem 		;;
    246  1.84     lukem 
    247  1.47        tv 	esac
    248  1.98     lukem 
    249  1.98     lukem 	# Ensure that MACHINE_ARCH supports MACHINE
    250  1.98     lukem 	#
    251  1.98     lukem 	archok=false
    252  1.98     lukem 	for a in ${arches}; do
    253  1.98     lukem 		if [ "${a}" = "${MACHINE_ARCH}" ]; then
    254  1.98     lukem 			archok=true
    255  1.98     lukem 			break
    256  1.98     lukem 		fi
    257  1.98     lukem 	done
    258  1.98     lukem 	${archok} ||
    259  1.98     lukem 	    bomb "MACHINE_ARCH '${MACHINE_ARCH}' does not support MACHINE '${MACHINE}'"
    260  1.47        tv }
    261  1.47        tv 
    262  1.98     lukem raw_getmakevar()
    263  1.79     lukem {
    264  1.98     lukem 	[ -x "${make}" ] || bomb "raw_getmakevar $1: ${make} is not executable"
    265  1.98     lukem 	"${make}" -m ${TOP}/share/mk -s -f- _x_ <<EOF
    266  1.15        tv _x_:
    267  1.15        tv 	echo \${$1}
    268  1.15        tv .include <bsd.prog.mk>
    269  1.70     lukem .include <bsd.kernobj.mk>
    270  1.15        tv EOF
    271  1.15        tv }
    272  1.15        tv 
    273  1.98     lukem getmakevar()
    274  1.82     lukem {
    275  1.98     lukem 	# raw_getmakevar() doesn't work properly if $make hasn't yet been
    276  1.98     lukem 	# built, which can happen when running with the "-n" option.
    277  1.98     lukem 	# getmakevar() deals with this by emitting a literal '$'
    278  1.84     lukem 	# followed by the variable name, instead of trying to find the
    279  1.84     lukem 	# variable's value.
    280  1.84     lukem 	#
    281  1.98     lukem 	if [ -x "${make}" ]; then
    282  1.98     lukem 		raw_getmakevar "$1"
    283  1.82     lukem 	else
    284  1.82     lukem 		echo "\$$1"
    285  1.82     lukem 	fi
    286  1.82     lukem }
    287  1.82     lukem 
    288  1.79     lukem resolvepath()
    289  1.79     lukem {
    290  1.98     lukem 	case "${OPTARG}" in
    291  1.84     lukem 	/*)
    292  1.84     lukem 		;;
    293  1.84     lukem 	*)
    294  1.98     lukem 		OPTARG="${TOP}/${OPTARG}"
    295  1.84     lukem 		;;
    296  1.10        tv 	esac
    297  1.10        tv }
    298  1.10        tv 
    299  1.79     lukem usage()
    300  1.79     lukem {
    301  1.84     lukem 	if [ -n "$*" ]; then
    302  1.84     lukem 		echo ""
    303  1.84     lukem 		echo "${progname}: $*"
    304  1.84     lukem 	fi
    305  1.70     lukem 	cat <<_usage_
    306  1.83     lukem 
    307  1.84     lukem Usage: ${progname} [-EnorUu] [-a arch] [-B buildid] [-D dest] [-j njob] [-M obj]
    308  1.98     lukem                 [-m mach] [-O obj] [-R release] [-T tools] [-V var=[value]]
    309  1.98     lukem                 [-w wrapper]   operation [...]
    310  1.84     lukem 
    311  1.86     lukem  Build operations (all imply "obj" and "tools"):
    312  1.98     lukem     build               Run "make build"
    313  1.98     lukem     distribution        Run "make distribution" (includes DESTDIR/etc/ files)
    314  1.98     lukem     release             Run "make release" (includes kernels & distrib media)
    315  1.84     lukem 
    316  1.84     lukem  Other operations:
    317  1.98     lukem     help                Show this message (and exit)
    318  1.98     lukem     makewrapper         Create ${toolprefix}make-\${MACHINE} wrapper and ${toolprefix}make.
    319  1.98     lukem                         (Always done)
    320  1.98     lukem     obj                 Run "make obj" (default unless -o is used)
    321  1.98     lukem     tools               Build and install tools
    322  1.98     lukem     kernel=conf         Build kernel with config file \`conf'
    323  1.98     lukem     install=idir        Run "make installworld" to \`idir'
    324  1.98     lukem                         (useful after 'distribution' or 'release')
    325  1.98     lukem     sets                Create distribution sets in RELEASEDIR
    326  1.84     lukem 
    327  1.84     lukem  Options:
    328  1.98     lukem     -a arch     Set MACHINE_ARCH to arch (otherwise deduced from MACHINE)
    329  1.98     lukem     -B buildId  Set BUILDID to buildId
    330  1.98     lukem     -D dest     Set DESTDIR to dest
    331  1.98     lukem     -E          Set "expert" mode; disables various safety checks.
    332  1.98     lukem                 Should not be used without expert knowledge of the build system
    333  1.98     lukem     -j njob     Run up to njob jobs in parallel; see make(1)
    334  1.98     lukem     -M obj      Set obj root directory to obj (sets MAKEOBJDIRPREFIX)
    335  1.98     lukem     -m mach     Set MACHINE to mach (not required if NetBSD native)
    336  1.98     lukem     -n          Show commands that would be executed, but do not execute them
    337  1.98     lukem     -O obj      Set obj root directory to obj (sets a MAKEOBJDIR pattern)
    338  1.98     lukem     -o          Set MKOBJDIRS=no (do not create objdirs at start of build)
    339  1.98     lukem     -R release  Set RELEASEDIR to release
    340  1.98     lukem     -r          Remove contents of TOOLDIR and DESTDIR before building
    341  1.98     lukem     -T tools    Set TOOLDIR to tools.  If unset, and TOOLDIR is not set in
    342  1.98     lukem                 the environment, ${toolprefix}make will be (re)built unconditionally
    343  1.98     lukem     -U          Set UNPRIVED (build without requiring root privileges)
    344  1.98     lukem     -u          Set UPDATE (do not run "make clean" first).
    345  1.98     lukem 		Without this, everything is rebuilt, including the tools.
    346  1.98     lukem     -V v=[val]  Set variable \`v' to \`val'
    347  1.98     lukem     -w wrapper  Create ${toolprefix}make script as wrapper
    348  1.98     lukem                 (Default: \${TOOLDIR}/bin/${toolprefix}make-\${MACHINE})
    349  1.83     lukem 
    350  1.70     lukem _usage_
    351   1.1        tv 	exit 1
    352   1.1        tv }
    353   1.1        tv 
    354  1.84     lukem parseoptions()
    355  1.84     lukem {
    356  1.84     lukem 	opts='a:B:bD:dEhi:j:k:M:m:nO:oR:rT:tUuV:w:'
    357  1.84     lukem 	opt_a=no
    358  1.84     lukem 
    359  1.84     lukem 	if type getopts >/dev/null 2>&1; then
    360  1.84     lukem 		# Use POSIX getopts.
    361  1.98     lukem 		#
    362  1.98     lukem 		getoptcmd='getopts ${opts} opt && opt=-${opt}'
    363  1.84     lukem 		optargcmd=':'
    364  1.98     lukem 		optremcmd='shift $((${OPTIND} -1))'
    365  1.84     lukem 	else
    366  1.84     lukem 		type getopt >/dev/null 2>&1 ||
    367  1.84     lukem 		    bomb "/bin/sh shell is too old; try ksh or bash"
    368  1.84     lukem 
    369  1.84     lukem 		# Use old-style getopt(1) (doesn't handle whitespace in args).
    370  1.98     lukem 		#
    371  1.98     lukem 		args="$(getopt ${opts} $*)"
    372  1.84     lukem 		[ $? = 0 ] || usage
    373  1.98     lukem 		set -- ${args}
    374  1.84     lukem 
    375  1.84     lukem 		getoptcmd='[ $# -gt 0 ] && opt="$1" && shift'
    376  1.84     lukem 		optargcmd='OPTARG="$1"; shift'
    377  1.84     lukem 		optremcmd=':'
    378  1.84     lukem 	fi
    379  1.84     lukem 
    380  1.84     lukem 	# Parse command line options.
    381  1.84     lukem 	#
    382  1.98     lukem 	while eval ${getoptcmd}; do
    383  1.98     lukem 		case ${opt} in
    384  1.84     lukem 
    385  1.84     lukem 		-a)
    386  1.98     lukem 			eval ${optargcmd}
    387  1.98     lukem 			MACHINE_ARCH=${OPTARG}
    388  1.84     lukem 			opt_a=yes
    389  1.84     lukem 			;;
    390  1.84     lukem 
    391  1.84     lukem 		-B)
    392  1.98     lukem 			eval ${optargcmd}
    393  1.98     lukem 			BUILDID=${OPTARG}
    394  1.84     lukem 			;;
    395  1.84     lukem 
    396  1.84     lukem 		-b)
    397  1.86     lukem 			usage "'-b' has been replaced by 'makewrapper'"
    398  1.84     lukem 			;;
    399  1.84     lukem 
    400  1.84     lukem 		-D)
    401  1.98     lukem 			eval ${optargcmd}; resolvepath
    402  1.98     lukem 			DESTDIR="${OPTARG}"
    403  1.84     lukem 			export DESTDIR
    404  1.98     lukem 			makeenv="${makeenv} DESTDIR"
    405  1.84     lukem 			;;
    406  1.84     lukem 
    407  1.84     lukem 		-d)
    408  1.84     lukem 			usage "'-d' has been replaced by 'distribution'"
    409  1.84     lukem 			;;
    410  1.84     lukem 
    411  1.84     lukem 		-E)
    412  1.84     lukem 			do_expertmode=true
    413  1.84     lukem 			;;
    414  1.84     lukem 
    415  1.84     lukem 		-i)
    416  1.84     lukem 			usage "'-i idir' has been replaced by 'install=idir'"
    417  1.84     lukem 			;;
    418  1.84     lukem 
    419  1.84     lukem 		-j)
    420  1.98     lukem 			eval ${optargcmd}
    421  1.98     lukem 			parallel="-j ${OPTARG}"
    422  1.84     lukem 			;;
    423  1.84     lukem 
    424  1.84     lukem 		-k)
    425  1.84     lukem 			usage "'-k conf' has been replaced by 'kernel=conf'"
    426  1.84     lukem 			;;
    427  1.84     lukem 
    428  1.84     lukem 		-M)
    429  1.98     lukem 			eval ${optargcmd}; resolvepath
    430  1.98     lukem 			MAKEOBJDIRPREFIX="${OPTARG}"
    431  1.84     lukem 			export MAKEOBJDIRPREFIX
    432  1.98     lukem 			makeobjdir="${OPTARG}"
    433  1.98     lukem 			makeenv="${makeenv} MAKEOBJDIRPREFIX"
    434  1.84     lukem 			;;
    435  1.84     lukem 
    436  1.84     lukem 			# -m overrides MACHINE_ARCH unless "-a" is specified
    437  1.84     lukem 		-m)
    438  1.98     lukem 			eval ${optargcmd}
    439  1.98     lukem 			MACHINE="${OPTARG}"
    440  1.98     lukem 			[ "${opt_a}" != "yes" ] && getarch
    441  1.84     lukem 			;;
    442  1.84     lukem 
    443  1.84     lukem 		-n)
    444  1.84     lukem 			runcmd=echo
    445  1.84     lukem 			;;
    446  1.84     lukem 
    447  1.84     lukem 		-O)
    448  1.98     lukem 			eval ${optargcmd}; resolvepath
    449  1.84     lukem 			MAKEOBJDIR="\${.CURDIR:C,^$TOP,$OPTARG,}"
    450  1.84     lukem 			export MAKEOBJDIR
    451  1.98     lukem 			makeobjdir="${OPTARG}"
    452  1.98     lukem 			makeenv="${makeenv} MAKEOBJDIR"
    453  1.84     lukem 			;;
    454  1.84     lukem 
    455  1.84     lukem 		-o)
    456  1.84     lukem 			MKOBJDIRS=no
    457  1.84     lukem 			;;
    458  1.84     lukem 
    459  1.84     lukem 		-R)
    460  1.98     lukem 			eval ${optargcmd}; resolvepath
    461  1.98     lukem 			RELEASEDIR="${OPTARG}"
    462  1.84     lukem 			export RELEASEDIR
    463  1.98     lukem 			makeenv="${makeenv} RELEASEDIR"
    464  1.84     lukem 			;;
    465  1.84     lukem 
    466  1.84     lukem 		-r)
    467  1.84     lukem 			do_removedirs=true
    468  1.84     lukem 			do_rebuildmake=true
    469  1.84     lukem 			;;
    470  1.84     lukem 
    471  1.84     lukem 		-T)
    472  1.98     lukem 			eval ${optargcmd}; resolvepath
    473  1.98     lukem 			TOOLDIR="${OPTARG}"
    474  1.84     lukem 			export TOOLDIR
    475  1.84     lukem 			;;
    476  1.84     lukem 
    477  1.84     lukem 		-t)
    478  1.84     lukem 			usage "'-t' has been replaced by 'tools'"
    479  1.84     lukem 			;;
    480  1.16   thorpej 
    481  1.84     lukem 		-U)
    482  1.84     lukem 			UNPRIVED=yes
    483  1.84     lukem 			export UNPRIVED
    484  1.98     lukem 			makeenv="${makeenv} UNPRIVED"
    485  1.84     lukem 			;;
    486  1.44     lukem 
    487  1.84     lukem 		-u)
    488  1.84     lukem 			UPDATE=yes
    489  1.84     lukem 			export UPDATE
    490  1.98     lukem 			makeenv="${makeenv} UPDATE"
    491  1.84     lukem 			;;
    492  1.15        tv 
    493  1.84     lukem 		-V)
    494  1.98     lukem 			eval ${optargcmd}
    495  1.84     lukem 			case "${OPTARG}" in
    496  1.80     lukem 		    # XXX: consider restricting which variables can be changed?
    497  1.84     lukem 			[a-zA-Z_][a-zA-Z_0-9]*=*)
    498  1.84     lukem 				var=${OPTARG%%=*}
    499  1.84     lukem 				value=${OPTARG#*=}
    500  1.84     lukem 				eval "${var}=\"${value}\"; export ${var}"
    501  1.98     lukem 				makeenv="${makeenv} ${var}"
    502  1.84     lukem 				;;
    503  1.84     lukem 			*)
    504  1.84     lukem 				usage "-V argument must be of the form 'var=[value]'"
    505  1.84     lukem 				;;
    506  1.84     lukem 			esac
    507  1.84     lukem 			;;
    508  1.84     lukem 
    509  1.84     lukem 		-w)
    510  1.98     lukem 			eval ${optargcmd}; resolvepath
    511  1.98     lukem 			makewrapper="${OPTARG}"
    512  1.84     lukem 			;;
    513  1.84     lukem 
    514  1.84     lukem 		--)
    515  1.84     lukem 			break
    516  1.84     lukem 			;;
    517  1.84     lukem 
    518  1.84     lukem 		-'?'|-h)
    519  1.84     lukem 			usage
    520  1.84     lukem 			;;
    521  1.84     lukem 
    522  1.84     lukem 		esac
    523  1.84     lukem 	done
    524  1.84     lukem 
    525  1.84     lukem 	# Validate operations.
    526  1.84     lukem 	#
    527  1.98     lukem 	eval ${optremcmd}
    528  1.84     lukem 	while [ $# -gt 0 ]; do
    529  1.84     lukem 		op=$1; shift
    530  1.98     lukem 		operations="${operations} ${op}"
    531  1.84     lukem 
    532  1.98     lukem 		case "${op}" in
    533  1.84     lukem 
    534  1.87     lukem 		help)
    535  1.87     lukem 			usage
    536  1.87     lukem 			;;
    537  1.87     lukem 
    538  1.87     lukem 		makewrapper|obj|tools|build|distribution|release|sets)
    539  1.80     lukem 			;;
    540  1.84     lukem 
    541  1.84     lukem 		kernel=*)
    542  1.84     lukem 			arg=${op#*=}
    543  1.84     lukem 			op=${op%%=*}
    544  1.98     lukem 			[ -n "${arg}" ] ||
    545  1.98     lukem 			    bomb "Must supply a kernel name with \`kernel=...'"
    546  1.84     lukem 			;;
    547  1.84     lukem 
    548  1.84     lukem 		install=*)
    549  1.84     lukem 			arg=${op#*=}
    550  1.84     lukem 			op=${op%%=*}
    551  1.98     lukem 			[ -n "${arg}" ] ||
    552  1.98     lukem 			    bomb "Must supply a directory with \`install=...'"
    553  1.84     lukem 			;;
    554  1.84     lukem 
    555  1.80     lukem 		*)
    556  1.84     lukem 			usage "Unknown operation \`${op}'"
    557  1.84     lukem 			;;
    558  1.84     lukem 
    559  1.80     lukem 		esac
    560  1.98     lukem 		eval do_${op}=true
    561  1.84     lukem 	done
    562  1.98     lukem 	[ -n "${operations}" ] || usage "Missing operation to perform."
    563  1.84     lukem 
    564  1.84     lukem 	# Set up MACHINE*.  On a NetBSD host, these are allowed to be unset.
    565  1.84     lukem 	#
    566  1.98     lukem 	if [ -z "${MACHINE}" ]; then
    567  1.98     lukem 		[ "${uname_s}" = "NetBSD" ] ||
    568  1.98     lukem 		    bomb "MACHINE must be set, or -m must be used, for cross builds."
    569  1.84     lukem 		MACHINE=${uname_m}
    570  1.84     lukem 	fi
    571  1.98     lukem 	[ -n "${MACHINE_ARCH}" ] || getarch
    572  1.84     lukem 	validatearch
    573  1.84     lukem 
    574  1.84     lukem 	# Set up default make(1) environment.
    575  1.84     lukem 	#
    576  1.98     lukem 	makeenv="${makeenv} TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS"
    577  1.98     lukem 	[ -z "${BUILDID}" ] || makeenv="${makeenv} BUILDID"
    578  1.98     lukem 	MAKEFLAGS="-m ${TOP}/share/mk ${MAKEFLAGS} MKOBJDIRS=${MKOBJDIRS-yes}"
    579  1.84     lukem 	export MAKEFLAGS MACHINE MACHINE_ARCH
    580  1.84     lukem }
    581  1.84     lukem 
    582  1.84     lukem rebuildmake()
    583  1.84     lukem {
    584  1.84     lukem 	# Test make source file timestamps against installed ${toolprefix}make
    585  1.84     lukem 	# binary, if TOOLDIR is pre-set.
    586  1.84     lukem 	#
    587  1.84     lukem 	# Note that we do NOT try to grovel "mk.conf" here to find out if
    588  1.84     lukem 	# TOOLDIR is set there, because it can contain make variable
    589  1.84     lukem 	# expansions and other stuff only parseable *after* we have a working
    590  1.84     lukem 	# ${toolprefix}make.  So this logic can only work if the user has
    591  1.84     lukem 	# pre-set TOOLDIR in the environment or used the -T option to build.sh.
    592  1.84     lukem 	#
    593  1.84     lukem 	make="${TOOLDIR-nonexistent}/bin/${toolprefix}make"
    594  1.98     lukem 	if [ -x "${make}" ]; then
    595  1.84     lukem 		for f in usr.bin/make/*.[ch] usr.bin/make/lst.lib/*.[ch]; do
    596  1.98     lukem 			if [ "${f}" -nt "${make}" ]; then
    597  1.84     lukem 				do_rebuildmake=true
    598  1.84     lukem 				break
    599  1.84     lukem 			fi
    600  1.84     lukem 		done
    601  1.84     lukem 	else
    602  1.84     lukem 		do_rebuildmake=true
    603  1.84     lukem 	fi
    604  1.84     lukem 
    605  1.84     lukem 	# Build bootstrap ${toolprefix}make if needed.
    606  1.98     lukem 	if ${do_rebuildmake}; then
    607  1.98     lukem 		statusmsg "Bootstrapping ${toolprefix}make"
    608  1.98     lukem 		${runcmd} cd "${tmpdir}"
    609  1.98     lukem 		${runcmd} env CC="${HOST_CC-cc}" CPPFLAGS="${HOST_CPPFLAGS}" \
    610  1.84     lukem 			CFLAGS="${HOST_CFLAGS--O}" LDFLAGS="${HOST_LDFLAGS}" \
    611  1.98     lukem 			"${TOP}/tools/make/configure" ||
    612  1.98     lukem 		    bomb "Configure of ${toolprefix}make failed"
    613  1.98     lukem 		${runcmd} sh buildmake.sh ||
    614  1.98     lukem 		    bomb "Build of ${toolprefix}make failed"
    615  1.98     lukem 		make="${tmpdir}/${toolprefix}make"
    616  1.98     lukem 		${runcmd} cd "${TOP}"
    617  1.98     lukem 		${runcmd} rm -f usr.bin/make/*.o usr.bin/make/lst.lib/*.o
    618  1.84     lukem 	fi
    619  1.84     lukem }
    620  1.84     lukem 
    621  1.84     lukem validatemakeparams()
    622  1.84     lukem {
    623  1.98     lukem 	if [ "${runcmd}" = "echo" ]; then
    624  1.84     lukem 		TOOLCHAIN_MISSING=no
    625  1.84     lukem 		EXTERNAL_TOOLCHAIN=""
    626  1.84     lukem 	else
    627  1.98     lukem 		TOOLCHAIN_MISSING=$(raw_getmakevar TOOLCHAIN_MISSING)
    628  1.98     lukem 		EXTERNAL_TOOLCHAIN=$(raw_getmakevar EXTERNAL_TOOLCHAIN)
    629  1.84     lukem 	fi
    630  1.84     lukem 	if [ "${TOOLCHAIN_MISSING}" = "yes" ] && \
    631  1.86     lukem 	   [ -z "${EXTERNAL_TOOLCHAIN}" ]; then
    632  1.98     lukem 		${runcmd} echo "ERROR: build.sh (in-tree cross-toolchain) is not yet available for"
    633  1.98     lukem 		${runcmd} echo "	MACHINE:      ${MACHINE}"
    634  1.98     lukem 		${runcmd} echo "	MACHINE_ARCH: ${MACHINE_ARCH}"
    635  1.98     lukem 		${runcmd} echo ""
    636  1.98     lukem 		${runcmd} echo "All builds for this platform should be done via a traditional make"
    637  1.98     lukem 		${runcmd} echo "If you wish to use an external cross-toolchain, set"
    638  1.98     lukem 		${runcmd} echo "	EXTERNAL_TOOLCHAIN=<path to toolchain root>"
    639  1.98     lukem 		${runcmd} echo "in either the environment or mk.conf and rerun"
    640  1.98     lukem 		${runcmd} echo "	${progname} $*"
    641  1.84     lukem 		exit 1
    642  1.84     lukem 	fi
    643  1.84     lukem 
    644  1.84     lukem 	# If TOOLDIR isn't already set, make objdirs in "tools" in case the
    645  1.84     lukem 	# default setting from <bsd.own.mk> is used.
    646  1.84     lukem 	#
    647  1.98     lukem 	if [ -z "${TOOLDIR}" ] && [ "${MKOBJDIRS}" != "no" ]; then
    648  1.98     lukem 		${runcmd} cd tools
    649  1.98     lukem 		${runcmd} "${make}" -m ${TOP}/share/mk obj NOSUBDIR= ||
    650  1.98     lukem 		    bomb "Failed to make obj in tools"
    651  1.98     lukem 		${runcmd} cd "${TOP}"
    652  1.84     lukem 	fi
    653  1.80     lukem 
    654  1.84     lukem 	# If setting -M or -O to root an obj dir make sure the base directory
    655  1.84     lukem 	# is made before continuing as bsd.own.mk will need this to pick up
    656  1.84     lukem 	# _SRC_TOP_OBJ_
    657  1.84     lukem 	#
    658  1.98     lukem 	if [ "${MKOBJDIRS}" != "no" ] && [ ! -z "${makeobjdir}" ]; then
    659  1.98     lukem 		${runcmd} mkdir -p "${makeobjdir}"
    660  1.84     lukem 	fi
    661  1.12        tv 
    662  1.98     lukem 	statusmsg "MACHINE:         ${MACHINE}"
    663  1.98     lukem 	statusmsg "MACHINE_ARCH:    ${MACHINE_ARCH}"
    664  1.98     lukem 
    665  1.98     lukem 	# Find TOOLDIR, DESTDIR, and RELEASEDIR.
    666  1.84     lukem 	#
    667  1.98     lukem 	TOOLDIR=$(getmakevar TOOLDIR)
    668  1.98     lukem 	statusmsg "TOOLDIR path:    ${TOOLDIR}"
    669  1.98     lukem 	DESTDIR=$(getmakevar DESTDIR)
    670  1.98     lukem 	RELEASEDIR=$(getmakevar RELEASEDIR)
    671  1.98     lukem 	export TOOLDIR DESTDIR RELEASEDIR
    672  1.98     lukem 	if ! $do_expertmode; then
    673  1.98     lukem 		_SRCTOPOBJ_=$(getmakevar _SRC_TOP_OBJ_)
    674  1.98     lukem 		: ${DESTDIR:=${_SRCTOPOBJ_}/destdir.${MACHINE}}
    675  1.98     lukem 		: ${RELEASEDIR:=${_SRCTOPOBJ_}/releasedir}
    676  1.98     lukem 	fi
    677  1.98     lukem 	statusmsg "DESTDIR path:    ${DESTDIR}"
    678  1.98     lukem 	statusmsg "RELEASEDIR path: ${RELEASEDIR}"
    679  1.84     lukem 
    680  1.84     lukem 	# Check validity of TOOLDIR and DESTDIR.
    681  1.84     lukem 	#
    682  1.98     lukem 	if [ -z "${TOOLDIR}" ] || [ "${TOOLDIR}" = "/" ]; then
    683  1.98     lukem 		bomb "TOOLDIR '${TOOLDIR}' invalid"
    684  1.84     lukem 	fi
    685  1.98     lukem 	removedirs="${TOOLDIR}"
    686  1.15        tv 
    687  1.98     lukem 	if [ -z "${DESTDIR}" ] || [ "${DESTDIR}" = "/" ]; then
    688  1.98     lukem 		if ${do_build} || ${do_distribution} || ${do_release}; then
    689  1.98     lukem 			if ! ${do_build} || \
    690  1.84     lukem 			   [ "${uname_s}" != "NetBSD" ] || \
    691  1.98     lukem 			   [ "${uname_m}" != "${MACHINE}" ]; then
    692  1.84     lukem 				bomb "DESTDIR must != / for cross builds, or ${progname} 'distribution' or 'release'."
    693  1.84     lukem 			fi
    694  1.98     lukem 			if ! ${do_expertmode}; then
    695  1.84     lukem 				bomb "DESTDIR must != / for non -E (expert) builds"
    696  1.84     lukem 			fi
    697  1.98     lukem 			statusmsg "WARNING: Building to /, in expert mode."
    698  1.98     lukem 			statusmsg "         This may cause your system to break!  Reasons include:"
    699  1.98     lukem 			statusmsg "            - your kernel is not up to date"
    700  1.98     lukem 			statusmsg "            - the libraries or toolchain have changed"
    701  1.98     lukem 			statusmsg "         YOU HAVE BEEN WARNED!"
    702   1.1        tv 		fi
    703  1.84     lukem 	else
    704  1.98     lukem 		removedirs="${removedirs} ${DESTDIR}"
    705  1.84     lukem 	fi
    706  1.98     lukem 	if ${do_build} || ${do_distribution} || ${do_release}; then
    707  1.98     lukem 		if ! ${do_expertmode} && \
    708  1.86     lukem 		    [ $(id -u 2>/dev/null) -ne 0 ] &&\
    709  1.98     lukem 		    [ -z "${UNPRIVED}" ] ; then
    710  1.86     lukem 			bomb "-U or -E must be set for build as an unprivileged user."
    711  1.86     lukem 		fi
    712  1.86     lukem         fi
    713  1.84     lukem }
    714  1.30       jmc 
    715  1.15        tv 
    716  1.84     lukem createmakewrapper()
    717  1.84     lukem {
    718  1.84     lukem 	# Remove the target directories.
    719  1.84     lukem 	#
    720  1.98     lukem 	if ${do_removedirs}; then
    721  1.98     lukem 		for f in ${removedirs}; do
    722  1.98     lukem 			statusmsg "Removing ${f}"
    723  1.98     lukem 			${runcmd} rm -r -f "${f}"
    724  1.84     lukem 		done
    725  1.84     lukem 	fi
    726  1.15        tv 
    727  1.84     lukem 	# Recreate $TOOLDIR.
    728  1.84     lukem 	#
    729  1.98     lukem 	${runcmd} mkdir -p "${TOOLDIR}/bin" ||
    730  1.98     lukem 	    bomb "mkdir of '${TOOLDIR}/bin' failed"
    731  1.84     lukem 
    732  1.84     lukem 	# Install ${toolprefix}make if it was built.
    733  1.84     lukem 	#
    734  1.98     lukem 	if ${do_rebuildmake}; then
    735  1.98     lukem 		${runcmd} rm -f "${TOOLDIR}/bin/${toolprefix}make"
    736  1.98     lukem 		${runcmd} cp "${make}" "${TOOLDIR}/bin/${toolprefix}make" ||
    737  1.98     lukem 		    bomb "Failed to install \$TOOLDIR/bin/${toolprefix}make"
    738  1.98     lukem 		make="${TOOLDIR}/bin/${toolprefix}make"
    739  1.98     lukem 		statusmsg "Created ${make}"
    740  1.84     lukem 	fi
    741  1.15        tv 
    742  1.84     lukem 	# Build a ${toolprefix}make wrapper script, usable by hand as
    743  1.84     lukem 	# well as by build.sh.
    744  1.84     lukem 	#
    745  1.98     lukem 	if [ -z "${makewrapper}" ]; then
    746  1.98     lukem 		makewrapper="${TOOLDIR}/bin/${toolprefix}make-${MACHINE}"
    747  1.98     lukem 		[ -z "${BUILDID}" ] || makewrapper="${makewrapper}-${BUILDID}"
    748  1.52   thorpej 	fi
    749   1.4        tv 
    750  1.98     lukem 	${runcmd} rm -f "${makewrapper}"
    751  1.98     lukem 	if [ "${runcmd}" = "echo" ]; then
    752  1.98     lukem 		echo 'cat <<EOF >'${makewrapper}
    753  1.84     lukem 		makewrapout=
    754  1.84     lukem 	else
    755  1.98     lukem 		makewrapout=">>\${makewrapper}"
    756  1.84     lukem 	fi
    757  1.18        tv 
    758  1.98     lukem 	eval cat <<EOF ${makewrapout}
    759   1.4        tv #! /bin/sh
    760   1.4        tv # Set proper variables to allow easy "make" building of a NetBSD subtree.
    761  1.98     lukem # Generated from:  \$NetBSD: build.sh,v 1.98 2003/05/08 14:19:39 lukem Exp $
    762   1.4        tv #
    763  1.18        tv 
    764  1.18        tv EOF
    765  1.98     lukem 	for f in ${makeenv}; do
    766  1.98     lukem 		eval echo "${f}=\'\$$(echo ${f})\'\;\ export\ ${f}" ${makewrapout}
    767  1.84     lukem 	done
    768  1.98     lukem 	eval echo "USETOOLS=yes\; export USETOOLS" ${makewrapout}
    769  1.18        tv 
    770  1.98     lukem 	eval cat <<EOF ${makewrapout}
    771  1.18        tv 
    772  1.98     lukem exec "\${TOOLDIR}/bin/${toolprefix}make" \${1+"\$@"}
    773   1.4        tv EOF
    774  1.98     lukem 	[ "${runcmd}" = "echo" ] && echo EOF
    775  1.98     lukem 	${runcmd} chmod +x "${makewrapper}"
    776  1.98     lukem 	statusmsg "Updated ${makewrapper}"
    777  1.84     lukem }
    778  1.84     lukem 
    779  1.84     lukem buildtools()
    780  1.84     lukem {
    781  1.98     lukem 	if [ "${MKOBJDIRS}" != "no" ]; then
    782  1.98     lukem 		${runcmd} "${makewrapper}" ${parallel} obj-tools ||
    783  1.98     lukem 		    bomb "Failed to make obj-tools"
    784  1.84     lukem 	fi
    785  1.98     lukem 	${runcmd} cd tools
    786  1.98     lukem 	if [ -z "${UPDATE}" ]; then
    787  1.84     lukem 		cleandir=cleandir
    788  1.84     lukem 	else
    789  1.84     lukem 		cleandir=
    790  1.84     lukem 	fi
    791  1.98     lukem 	${runcmd} "${makewrapper}" ${cleandir} dependall install ||
    792  1.98     lukem 	    bomb "Failed to make tools"
    793  1.98     lukem 	statusmsg "Tools built to ${TOOLDIR}"
    794  1.84     lukem }
    795   1.4        tv 
    796  1.84     lukem buildkernel()
    797  1.84     lukem {
    798  1.84     lukem 	kernconf="$1"
    799  1.98     lukem 	if ! ${do_tools}; then
    800  1.84     lukem 		# Building tools every time we build a kernel is clearly
    801  1.84     lukem 		# unnecessary.  We could try to figure out whether rebuilding
    802  1.84     lukem 		# the tools is necessary this time, but it doesn't seem worth
    803  1.84     lukem 		# the trouble.  Instead, we say it's the user's responsibility
    804  1.84     lukem 		# to rebuild the tools if necessary.
    805  1.84     lukem 		#
    806  1.98     lukem 		statusmsg "Building kernel without building new tools"
    807  1.84     lukem 	fi
    808  1.98     lukem 	statusmsg "Building kernel ${kernconf}"
    809  1.98     lukem 	if [ "${MKOBJDIRS}" != "no" ] && [ ! -z "${makeobjdir}" ]; then
    810  1.84     lukem 		# The correct value of KERNOBJDIR might
    811  1.84     lukem 		# depend on a prior "make obj" in
    812  1.84     lukem 		# ${KERNSRCDIR}/${KERNARCHDIR}/compile.
    813  1.84     lukem 		#
    814  1.98     lukem 		KERNSRCDIR="$(getmakevar KERNSRCDIR)"
    815  1.98     lukem 		KERNARCHDIR="$(getmakevar KERNARCHDIR)"
    816  1.98     lukem 		${runcmd} cd "${KERNSRCDIR}/${KERNARCHDIR}/compile"
    817  1.98     lukem 		${runcmd} "${makewrapper}" obj ||
    818  1.98     lukem 		    bomb "Failed to make obj in ${KERNSRCDIR}/${KERNARCHDIR}/compile"
    819  1.98     lukem 		${runcmd} cd "${TOP}"
    820  1.84     lukem 	fi
    821  1.98     lukem 	KERNCONFDIR="$(getmakevar KERNCONFDIR)"
    822  1.98     lukem 	KERNOBJDIR="$(getmakevar KERNOBJDIR)"
    823  1.84     lukem 	case "${kernconf}" in
    824  1.84     lukem 	*/*)
    825  1.84     lukem 		kernconfpath="${kernconf}"
    826  1.84     lukem 		kernconfbase="$(basename "${kernconf}")"
    827  1.84     lukem 		;;
    828  1.84     lukem 	*)
    829  1.84     lukem 		kernconfpath="${KERNCONFDIR}/${kernconf}"
    830  1.84     lukem 		kernconfbase="${kernconf}"
    831  1.84     lukem 		;;
    832  1.84     lukem 	esac
    833  1.84     lukem 	kernbuilddir="${KERNOBJDIR}/${kernconfbase}"
    834  1.98     lukem 	statusmsg "Kernel build directory: ${kernbuilddir}"
    835  1.98     lukem 	${runcmd} mkdir -p "${kernbuilddir}" ||
    836  1.98     lukem 	    bomb "Cannot mkdir: ${kernbuilddir}"
    837  1.98     lukem 	if [ -z "${UPDATE}" ]; then
    838  1.98     lukem 		${runcmd} cd "${kernbuilddir}"
    839  1.98     lukem 		${runcmd} "${makewrapper}" cleandir ||
    840  1.98     lukem 		    bomb "Failed to make cleandir in ${kernbuilddir}"
    841  1.98     lukem 		${runcmd} cd "${TOP}"
    842  1.16   thorpej 	fi
    843  1.98     lukem 	${runcmd} "${TOOLDIR}/bin/${toolprefix}config" -b "${kernbuilddir}" \
    844  1.84     lukem 		-s "${TOP}/sys" "${kernconfpath}" ||
    845  1.84     lukem 	    bomb "${toolprefix}config failed for ${kernconf}"
    846  1.98     lukem 	${runcmd} cd "${kernbuilddir}"
    847  1.98     lukem 	${runcmd} "${makewrapper}" depend ||
    848  1.98     lukem 	    bomb "Failed to make depend in ${kernbuilddir}"
    849  1.98     lukem 	${runcmd} "${makewrapper}" ${parallel} all ||
    850  1.98     lukem 	    bomb "Failed to make all in ${kernbuilddir}"
    851  1.98     lukem 	${runcmd} cd "${TOP}"
    852  1.91     lukem 
    853  1.98     lukem 	if [ "${runcmd}" != "echo" ]; then
    854  1.98     lukem 		statusmsg "Kernels built from ${kernconf}:"
    855  1.91     lukem 		kernlist=$(awk '$1 == "config" { print $2 }' ${kernconfpath})
    856  1.91     lukem 		for kern in ${kernlist:-netbsd}; do
    857  1.91     lukem 			[ -f "${kernbuilddir}/${kern}" ] && \
    858  1.91     lukem 			    echo "  ${kernbuilddir}/${kern}"
    859  1.98     lukem 		done | tee -a "${results}"
    860  1.91     lukem 	fi
    861  1.84     lukem }
    862  1.84     lukem 
    863  1.84     lukem installworld()
    864  1.84     lukem {
    865  1.84     lukem 	dir="$1"
    866  1.98     lukem 	${runcmd} "${makewrapper}" INSTALLWORLDDIR="${dir}" installworld ||
    867  1.98     lukem 	    bomb "Failed to make installworld to ${dir}"
    868  1.98     lukem 	statusmsg "Successful installworld to ${dir}"
    869  1.84     lukem }
    870  1.84     lukem 
    871  1.84     lukem 
    872  1.84     lukem main()
    873  1.84     lukem {
    874  1.84     lukem 	initdefaults
    875  1.84     lukem 	parseoptions "$@"
    876  1.93     lukem 
    877  1.93     lukem 	build_start=$(date)
    878  1.98     lukem 	statusmsg "${progname} command: $0 $@"
    879  1.98     lukem 	statusmsg "${progname} started: ${build_start}"
    880  1.93     lukem 
    881  1.84     lukem 	rebuildmake
    882  1.84     lukem 	validatemakeparams
    883  1.84     lukem 	createmakewrapper
    884  1.84     lukem 
    885  1.84     lukem 	# Perform the operations.
    886  1.84     lukem 	#
    887  1.98     lukem 	for op in ${operations}; do
    888  1.98     lukem 		case "${op}" in
    889  1.86     lukem 
    890  1.86     lukem 		makewrapper)
    891  1.86     lukem 			# no-op
    892  1.86     lukem 			;;
    893  1.84     lukem 
    894  1.84     lukem 		tools)
    895  1.84     lukem 			buildtools
    896  1.84     lukem 			;;
    897  1.84     lukem 
    898  1.87     lukem 		obj|build|distribution|release|sets)
    899  1.98     lukem 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
    900  1.98     lukem 			    bomb "Failed to make ${op}"
    901  1.98     lukem 			statusmsg "Successful make ${op}"
    902  1.84     lukem 			;;
    903  1.84     lukem 
    904  1.84     lukem 		kernel=*)
    905  1.84     lukem 			arg=${op#*=}
    906  1.84     lukem 			buildkernel "${arg}"
    907  1.84     lukem 			;;
    908  1.84     lukem 
    909  1.84     lukem 		install=*)
    910  1.84     lukem 			arg=${op#*=}
    911  1.85     lukem 			if [ "${arg}" = "/" ] && \
    912  1.85     lukem 			    (	[ "${uname_s}" != "NetBSD" ] || \
    913  1.98     lukem 				[ "${uname_m}" != "${MACHINE}" ] ); then
    914  1.85     lukem 				bomb "'${op}' must != / for cross builds."
    915  1.85     lukem 			fi
    916  1.84     lukem 			installworld "${arg}"
    917  1.70     lukem 			;;
    918  1.84     lukem 
    919  1.70     lukem 		*)
    920  1.84     lukem 			bomb "Unknown operation \`${op}'"
    921  1.70     lukem 			;;
    922  1.84     lukem 
    923  1.70     lukem 		esac
    924  1.84     lukem 	done
    925  1.93     lukem 
    926  1.98     lukem 	statusmsg "${progname} ended:   $(date)"
    927  1.98     lukem 	if [ -s "${results}" ]; then
    928  1.98     lukem 		echo "===> Summary of results:"
    929  1.98     lukem 		sed -e 's/^===>//;s/^/	/' "${results}"
    930  1.98     lukem 		echo "===> ."
    931  1.98     lukem 	fi
    932  1.84     lukem }
    933  1.84     lukem 
    934  1.84     lukem main "$@"
    935