Home | History | Annotate | Line # | Download | only in src
build.sh revision 1.383
      1   1.67   thorpej #! /usr/bin/env sh
      2  1.383    martin #	$NetBSD: build.sh,v 1.383 2024/12/20 14:05:54 martin Exp $
      3   1.84     lukem #
      4  1.369     lukem # Copyright (c) 2001-2023 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 #
     19   1.84     lukem # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20   1.84     lukem # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21   1.84     lukem # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22   1.84     lukem # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23   1.84     lukem # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24   1.84     lukem # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25   1.84     lukem # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26   1.84     lukem # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27   1.84     lukem # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28   1.84     lukem # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29   1.84     lukem # POSSIBILITY OF SUCH DAMAGE.
     30   1.84     lukem #
     31    1.1        tv #
     32  1.249       apb # Top level build wrapper, to build or cross-build NetBSD.
     33    1.1        tv #
     34  1.249       apb 
     35  1.249       apb #
     36  1.249       apb # {{{ Begin shell feature tests.
     37  1.249       apb #
     38  1.249       apb # We try to determine whether or not this script is being run under
     39  1.249       apb # a shell that supports the features that we use.  If not, we try to
     40  1.249       apb # re-exec the script under another shell.  If we can't find another
     41  1.369     lukem # suitable shell, then we show a message and exit.
     42  1.249       apb #
     43  1.249       apb 
     44  1.249       apb errmsg=''		# error message, if not empty
     45  1.249       apb shelltest=false		# if true, exit after testing the shell
     46  1.249       apb re_exec_allowed=true	# if true, we may exec under another shell
     47  1.249       apb 
     48  1.249       apb # Parse special command line options in $1.  These special options are
     49  1.249       apb # for internal use only, are not documented, and are not valid anywhere
     50  1.249       apb # other than $1.
     51  1.249       apb case "$1" in
     52  1.249       apb "--shelltest")
     53  1.249       apb     shelltest=true
     54  1.249       apb     re_exec_allowed=false
     55  1.249       apb     shift
     56  1.249       apb     ;;
     57  1.249       apb "--no-re-exec")
     58  1.249       apb     re_exec_allowed=false
     59  1.249       apb     shift
     60  1.249       apb     ;;
     61  1.249       apb esac
     62  1.249       apb 
     63  1.249       apb # Solaris /bin/sh, and other SVR4 shells, do not support "!".
     64  1.249       apb # This is the first feature that we test, because subsequent
     65  1.249       apb # tests use "!".
     66  1.249       apb #
     67  1.249       apb if test -z "$errmsg"; then
     68  1.249       apb     if ( eval '! false' ) >/dev/null 2>&1 ; then
     69  1.249       apb 	:
     70  1.249       apb     else
     71  1.249       apb 	errmsg='Shell does not support "!".'
     72  1.249       apb     fi
     73  1.249       apb fi
     74  1.249       apb 
     75  1.249       apb # Does the shell support functions?
     76  1.249       apb #
     77  1.249       apb if test -z "$errmsg"; then
     78  1.249       apb     if ! (
     79  1.249       apb 	eval 'somefunction() { : ; }'
     80  1.249       apb 	) >/dev/null 2>&1
     81  1.249       apb     then
     82  1.249       apb 	errmsg='Shell does not support functions.'
     83  1.249       apb     fi
     84  1.249       apb fi
     85  1.249       apb 
     86  1.249       apb # Does the shell support the "local" keyword for variables in functions?
     87  1.249       apb #
     88  1.249       apb # Local variables are not required by SUSv3, but some scripts run during
     89  1.249       apb # the NetBSD build use them.
     90  1.249       apb #
     91  1.249       apb # ksh93 fails this test; it uses an incompatible syntax involving the
     92  1.249       apb # keywords 'function' and 'typeset'.
     93  1.249       apb #
     94  1.249       apb if test -z "$errmsg"; then
     95  1.249       apb     if ! (
     96  1.249       apb 	eval 'f() { local v=2; }; v=1; f && test x"$v" = x"1"'
     97  1.249       apb 	) >/dev/null 2>&1
     98  1.249       apb     then
     99  1.249       apb 	errmsg='Shell does not support the "local" keyword in functions.'
    100  1.249       apb     fi
    101  1.249       apb fi
    102  1.249       apb 
    103  1.249       apb # Does the shell support ${var%suffix}, ${var#prefix}, and their variants?
    104  1.249       apb #
    105  1.249       apb # We don't bother testing for ${var+value}, ${var-value}, or their variants,
    106  1.249       apb # since shells without those are sure to fail other tests too.
    107  1.249       apb #
    108  1.249       apb if test -z "$errmsg"; then
    109  1.249       apb     if ! (
    110  1.249       apb 	eval 'var=a/b/c ;
    111  1.249       apb 	      test x"${var#*/};${var##*/};${var%/*};${var%%/*}" = \
    112  1.249       apb 		   x"b/c;c;a/b;a" ;'
    113  1.249       apb 	) >/dev/null 2>&1
    114  1.249       apb     then
    115  1.249       apb 	errmsg='Shell does not support "${var%suffix}" or "${var#prefix}".'
    116  1.249       apb     fi
    117  1.249       apb fi
    118  1.249       apb 
    119  1.249       apb # Does the shell support IFS?
    120  1.249       apb #
    121  1.249       apb # zsh in normal mode (as opposed to "emulate sh" mode) fails this test.
    122  1.249       apb #
    123  1.249       apb if test -z "$errmsg"; then
    124  1.249       apb     if ! (
    125  1.249       apb 	eval 'IFS=: ; v=":a b::c" ; set -- $v ; IFS=+ ;
    126  1.249       apb 		test x"$#;$1,$2,$3,$4;$*" = x"4;,a b,,c;+a b++c"'
    127  1.249       apb 	) >/dev/null 2>&1
    128  1.249       apb     then
    129  1.249       apb 	errmsg='Shell does not support IFS word splitting.'
    130  1.249       apb     fi
    131  1.249       apb fi
    132  1.249       apb 
    133  1.249       apb # Does the shell support ${1+"$@"}?
    134  1.249       apb #
    135  1.249       apb # Some versions of zsh fail this test, even in "emulate sh" mode.
    136  1.249       apb #
    137  1.249       apb if test -z "$errmsg"; then
    138  1.249       apb     if ! (
    139  1.249       apb 	eval 'set -- "a a a" "b b b"; set -- ${1+"$@"};
    140  1.249       apb 	      test x"$#;$1;$2" = x"2;a a a;b b b";'
    141  1.249       apb 	) >/dev/null 2>&1
    142  1.249       apb     then
    143  1.249       apb 	errmsg='Shell does not support ${1+"$@"}.'
    144  1.249       apb     fi
    145  1.249       apb fi
    146  1.249       apb 
    147  1.249       apb # Does the shell support $(...) command substitution?
    148  1.249       apb #
    149  1.249       apb if test -z "$errmsg"; then
    150  1.249       apb     if ! (
    151  1.249       apb 	eval 'var=$(echo abc); test x"$var" = x"abc"'
    152  1.249       apb 	) >/dev/null 2>&1
    153  1.249       apb     then
    154  1.249       apb 	errmsg='Shell does not support "$(...)" command substitution.'
    155  1.249       apb     fi
    156  1.249       apb fi
    157  1.249       apb 
    158  1.249       apb # Does the shell support $(...) command substitution with
    159  1.249       apb # unbalanced parentheses?
    160  1.249       apb #
    161  1.249       apb # Some shells known to fail this test are:  NetBSD /bin/ksh (as of 2009-12),
    162  1.249       apb # bash-3.1, pdksh-5.2.14, zsh-4.2.7 in "emulate sh" mode.
    163  1.249       apb #
    164  1.249       apb if test -z "$errmsg"; then
    165  1.249       apb     if ! (
    166  1.249       apb 	eval 'var=$(case x in x) echo abc;; esac); test x"$var" = x"abc"'
    167  1.249       apb 	) >/dev/null 2>&1
    168  1.249       apb     then
    169  1.249       apb 	# XXX: This test is ignored because so many shells fail it; instead,
    170  1.249       apb 	#      the NetBSD build avoids using the problematic construct.
    171  1.249       apb 	: ignore 'Shell does not support "$(...)" with unbalanced ")".'
    172  1.249       apb     fi
    173  1.249       apb fi
    174  1.249       apb 
    175  1.249       apb # Does the shell support getopts or getopt?
    176  1.249       apb #
    177  1.249       apb if test -z "$errmsg"; then
    178  1.249       apb     if ! (
    179  1.249       apb 	eval 'type getopts || type getopt'
    180  1.249       apb 	) >/dev/null 2>&1
    181  1.249       apb     then
    182  1.249       apb 	errmsg='Shell does not support getopts or getopt.'
    183  1.249       apb     fi
    184  1.249       apb fi
    185  1.249       apb 
    186  1.249       apb #
    187  1.251   mbalmer # If shelltest is true, exit now, reporting whether or not the shell is good.
    188  1.249       apb #
    189  1.249       apb if $shelltest; then
    190  1.249       apb     if test -n "$errmsg"; then
    191  1.249       apb 	echo >&2 "$0: $errmsg"
    192  1.249       apb 	exit 1
    193  1.249       apb     else
    194  1.249       apb 	exit 0
    195  1.249       apb     fi
    196  1.249       apb fi
    197  1.249       apb 
    198  1.249       apb #
    199  1.249       apb # If the shell was bad, try to exec a better shell, or report an error.
    200  1.249       apb #
    201  1.249       apb # Loops are broken by passing an extra "--no-re-exec" flag to the new
    202  1.249       apb # instance of this script.
    203  1.249       apb #
    204  1.249       apb if test -n "$errmsg"; then
    205  1.249       apb     if $re_exec_allowed; then
    206  1.249       apb 	for othershell in \
    207  1.298       apb 	    "${HOST_SH}" /usr/xpg4/bin/sh ksh ksh88 mksh pdksh dash bash
    208  1.249       apb 	    # NOTE: some shells known not to work are:
    209  1.249       apb 	    # any shell using csh syntax;
    210  1.249       apb 	    # Solaris /bin/sh (missing many modern features);
    211  1.249       apb 	    # ksh93 (incompatible syntax for local variables);
    212  1.249       apb 	    # zsh (many differences, unless run in compatibility mode).
    213  1.249       apb 	do
    214  1.249       apb 	    test -n "$othershell" || continue
    215  1.249       apb 	    if eval 'type "$othershell"' >/dev/null 2>&1 \
    216  1.249       apb 		&& "$othershell" "$0" --shelltest >/dev/null 2>&1
    217  1.249       apb 	    then
    218  1.249       apb 		cat <<EOF
    219  1.249       apb $0: $errmsg
    220  1.249       apb $0: Retrying under $othershell
    221  1.249       apb EOF
    222  1.249       apb 		HOST_SH="$othershell"
    223  1.249       apb 		export HOST_SH
    224  1.249       apb 		exec $othershell "$0" --no-re-exec "$@" # avoid ${1+"$@"}
    225  1.249       apb 	    fi
    226  1.249       apb 	    # If HOST_SH was set, but failed the test above,
    227  1.249       apb 	    # then give up without trying any other shells.
    228  1.249       apb 	    test x"${othershell}" = x"${HOST_SH}" && break
    229  1.249       apb 	done
    230  1.249       apb     fi
    231  1.249       apb 
    232  1.249       apb     #
    233  1.249       apb     # If we get here, then the shell is bad, and we either could not
    234  1.249       apb     # find a replacement, or were not allowed to try a replacement.
    235  1.249       apb     #
    236  1.249       apb     cat <<EOF
    237  1.249       apb $0: $errmsg
    238  1.249       apb 
    239  1.249       apb The NetBSD build system requires a shell that supports modern POSIX
    240  1.249       apb features, as well as the "local" keyword in functions (which is a
    241  1.249       apb widely-implemented but non-standardised feature).
    242  1.249       apb 
    243  1.249       apb Please re-run this script under a suitable shell.  For example:
    244  1.249       apb 
    245  1.249       apb 	/path/to/suitable/shell $0 ...
    246  1.249       apb 
    247  1.249       apb The above command will usually enable build.sh to automatically set
    248  1.249       apb HOST_SH=/path/to/suitable/shell, but if that fails, then you may also
    249  1.249       apb need to explicitly set the HOST_SH environment variable, as follows:
    250  1.249       apb 
    251  1.249       apb 	HOST_SH=/path/to/suitable/shell
    252  1.249       apb 	export HOST_SH
    253  1.249       apb 	\${HOST_SH} $0 ...
    254  1.249       apb EOF
    255  1.249       apb     exit 1
    256  1.249       apb fi
    257  1.249       apb 
    258  1.249       apb #
    259  1.249       apb # }}} End shell feature tests.
    260   1.67   thorpej #
    261    1.1        tv 
    262   1.84     lukem progname=${0##*/}
    263   1.84     lukem toppid=$$
    264   1.98     lukem results=/dev/null
    265  1.200       apb tab='	'
    266  1.258       apb nl='
    267  1.258       apb '
    268   1.82     lukem trap "exit 1" 1 2 3 15
    269   1.84     lukem 
    270   1.79     lukem bomb()
    271   1.79     lukem {
    272   1.82     lukem 	cat >&2 <<ERRORMESSAGE
    273   1.82     lukem 
    274   1.82     lukem ERROR: $@
    275  1.363     lukem 
    276   1.82     lukem *** BUILD ABORTED ***
    277   1.82     lukem ERRORMESSAGE
    278   1.98     lukem 	kill ${toppid}		# in case we were invoked from a subshell
    279    1.1        tv 	exit 1
    280    1.1        tv }
    281   1.78     lukem 
    282  1.285       apb # Quote args to make them safe in the shell.
    283  1.285       apb # Usage: quotedlist="$(shell_quote args...)"
    284  1.285       apb #
    285  1.285       apb # After building up a quoted list, use it by evaling it inside
    286  1.285       apb # double quotes, like this:
    287  1.285       apb #    eval "set -- $quotedlist"
    288  1.285       apb # or like this:
    289  1.285       apb #    eval "\$command $quotedlist \$filename"
    290  1.289       apb #
    291  1.285       apb shell_quote()
    292  1.289       apb {(
    293  1.285       apb 	local result=''
    294  1.289       apb 	local arg qarg
    295  1.289       apb 	LC_COLLATE=C ; export LC_COLLATE # so [a-zA-Z0-9] works in ASCII
    296  1.285       apb 	for arg in "$@" ; do
    297  1.289       apb 		case "${arg}" in
    298  1.289       apb 		'')
    299  1.289       apb 			qarg="''"
    300  1.289       apb 			;;
    301  1.289       apb 		*[!-./a-zA-Z0-9]*)
    302  1.289       apb 			# Convert each embedded ' to '\'',
    303  1.289       apb 			# then insert ' at the beginning of the first line,
    304  1.289       apb 			# and append ' at the end of the last line.
    305  1.289       apb 			# Finally, elide unnecessary '' pairs at the
    306  1.289       apb 			# beginning and end of the result and as part of
    307  1.289       apb 			# '\'''\'' sequences that result from multiple
    308  1.289       apb 			# adjacent quotes in he input.
    309  1.289       apb 			qarg="$(printf "%s\n" "$arg" | \
    310  1.289       apb 			    ${SED:-sed} -e "s/'/'\\\\''/g" \
    311  1.289       apb 				-e "1s/^/'/" -e "\$s/\$/'/" \
    312  1.289       apb 				-e "1s/^''//" -e "\$s/''\$//" \
    313  1.289       apb 				-e "s/'''/'/g"
    314  1.289       apb 				)"
    315  1.289       apb 			;;
    316  1.289       apb 		*)
    317  1.289       apb 			# Arg is not the empty string, and does not contain
    318  1.289       apb 			# any unsafe characters.  Leave it unchanged for
    319  1.289       apb 			# readability.
    320  1.289       apb 			qarg="${arg}"
    321  1.289       apb 			;;
    322  1.289       apb 		esac
    323  1.289       apb 		result="${result}${result:+ }${qarg}"
    324  1.285       apb 	done
    325  1.285       apb 	printf "%s\n" "$result"
    326  1.289       apb )}
    327   1.84     lukem 
    328   1.98     lukem statusmsg()
    329   1.98     lukem {
    330   1.98     lukem 	${runcmd} echo "===> $@" | tee -a "${results}"
    331   1.98     lukem }
    332   1.98     lukem 
    333  1.238  pgoyette statusmsg2()
    334  1.238  pgoyette {
    335  1.240  pgoyette 	local msg
    336  1.240  pgoyette 
    337  1.238  pgoyette 	msg="${1}"
    338  1.238  pgoyette 	shift
    339  1.239  pgoyette 	case "${msg}" in
    340  1.238  pgoyette 	????????????????*)	;;
    341  1.238  pgoyette 	??????????*)		msg="${msg}      ";;
    342  1.238  pgoyette 	?????*)			msg="${msg}           ";;
    343  1.238  pgoyette 	*)			msg="${msg}                ";;
    344  1.238  pgoyette 	esac
    345  1.239  pgoyette 	case "${msg}" in
    346  1.238  pgoyette 	?????????????????????*)	;;
    347  1.238  pgoyette 	????????????????????)	msg="${msg} ";;
    348  1.238  pgoyette 	???????????????????)	msg="${msg}  ";;
    349  1.238  pgoyette 	??????????????????)	msg="${msg}   ";;
    350  1.238  pgoyette 	?????????????????)	msg="${msg}    ";;
    351  1.238  pgoyette 	????????????????)	msg="${msg}     ";;
    352  1.238  pgoyette 	esac
    353  1.240  pgoyette 	statusmsg "${msg}$*"
    354  1.238  pgoyette }
    355  1.238  pgoyette 
    356  1.163       apb warning()
    357  1.163       apb {
    358  1.163       apb 	statusmsg "Warning: $@"
    359  1.163       apb }
    360  1.163       apb 
    361  1.369     lukem # Find a program in the PATH, and show the result.  If not found,
    362  1.369     lukem # show a default.  If $2 is defined (even if it is an empty string),
    363  1.168       apb # then that is the default; otherwise, $1 is used as the default.
    364  1.362     lukem #
    365  1.153       apb find_in_PATH()
    366  1.153       apb {
    367  1.153       apb 	local prog="$1"
    368  1.168       apb 	local result="${2-"$1"}"
    369  1.153       apb 	local oldIFS="${IFS}"
    370  1.153       apb 	local dir
    371  1.153       apb 	IFS=":"
    372  1.153       apb 	for dir in ${PATH}; do
    373  1.153       apb 		if [ -x "${dir}/${prog}" ]; then
    374  1.168       apb 			result="${dir}/${prog}"
    375  1.153       apb 			break
    376  1.153       apb 		fi
    377  1.153       apb 	done
    378  1.153       apb 	IFS="${oldIFS}"
    379  1.168       apb 	echo "${result}"
    380  1.153       apb }
    381  1.153       apb 
    382  1.153       apb # Try to find a working POSIX shell, and set HOST_SH to refer to it.
    383  1.153       apb # Assumes that uname_s, uname_m, and PWD have been set.
    384  1.362     lukem #
    385  1.153       apb set_HOST_SH()
    386  1.153       apb {
    387  1.153       apb 	# Even if ${HOST_SH} is already defined, we still do the
    388  1.153       apb 	# sanity checks at the end.
    389  1.153       apb 
    390  1.153       apb 	# Solaris has /usr/xpg4/bin/sh.
    391  1.153       apb 	#
    392  1.153       apb 	[ -z "${HOST_SH}" ] && [ x"${uname_s}" = x"SunOS" ] && \
    393  1.153       apb 		[ -x /usr/xpg4/bin/sh ] && HOST_SH="/usr/xpg4/bin/sh"
    394  1.153       apb 
    395  1.153       apb 	# Try to get the name of the shell that's running this script,
    396  1.153       apb 	# by parsing the output from "ps".  We assume that, if the host
    397  1.153       apb 	# system's ps command supports -o comm at all, it will do so
    398  1.153       apb 	# in the usual way: a one-line header followed by a one-line
    399  1.153       apb 	# result, possibly including trailing white space.  And if the
    400  1.153       apb 	# host system's ps command doesn't support -o comm, we assume
    401  1.153       apb 	# that we'll get an error message on stderr and nothing on
    402  1.153       apb 	# stdout.  (We don't try to use ps -o 'comm=' to suppress the
    403  1.153       apb 	# header line, because that is less widely supported.)
    404  1.153       apb 	#
    405  1.153       apb 	# If we get the wrong result here, the user can override it by
    406  1.153       apb 	# specifying HOST_SH in the environment.
    407  1.153       apb 	#
    408  1.153       apb 	[ -z "${HOST_SH}" ] && HOST_SH="$(
    409  1.200       apb 		(ps -p $$ -o comm | sed -ne "2s/[ ${tab}]*\$//p") 2>/dev/null )"
    410  1.153       apb 
    411  1.153       apb 	# If nothing above worked, use "sh".  We will later find the
    412  1.153       apb 	# first directory in the PATH that has a "sh" program.
    413  1.153       apb 	#
    414  1.153       apb 	[ -z "${HOST_SH}" ] && HOST_SH="sh"
    415  1.153       apb 
    416  1.153       apb 	# If the result so far is not an absolute path, try to prepend
    417  1.153       apb 	# PWD or search the PATH.
    418  1.153       apb 	#
    419  1.153       apb 	case "${HOST_SH}" in
    420  1.153       apb 	/*)	:
    421  1.153       apb 		;;
    422  1.153       apb 	*/*)	HOST_SH="${PWD}/${HOST_SH}"
    423  1.153       apb 		;;
    424  1.153       apb 	*)	HOST_SH="$(find_in_PATH "${HOST_SH}")"
    425  1.153       apb 		;;
    426  1.153       apb 	esac
    427  1.153       apb 
    428  1.153       apb 	# If we don't have an absolute path by now, bomb.
    429  1.153       apb 	#
    430  1.153       apb 	case "${HOST_SH}" in
    431  1.153       apb 	/*)	:
    432  1.153       apb 		;;
    433  1.363     lukem 	*)	bomb "HOST_SH=\"${HOST_SH}\" is not an absolute path"
    434  1.153       apb 		;;
    435  1.153       apb 	esac
    436  1.153       apb 
    437  1.153       apb 	# If HOST_SH is not executable, bomb.
    438  1.153       apb 	#
    439  1.153       apb 	[ -x "${HOST_SH}" ] ||
    440  1.363     lukem 	    bomb "HOST_SH=\"${HOST_SH}\" is not executable"
    441  1.249       apb 
    442  1.249       apb 	# If HOST_SH fails tests, bomb.
    443  1.249       apb 	# ("$0" may be a path that is no longer valid, because we have
    444  1.249       apb 	# performed "cd $(dirname $0)", so don't use $0 here.)
    445  1.249       apb 	#
    446  1.249       apb 	"${HOST_SH}" build.sh --shelltest ||
    447  1.363     lukem 	    bomb "HOST_SH=\"${HOST_SH}\" failed functionality tests"
    448  1.153       apb }
    449  1.153       apb 
    450  1.248       apb # initdefaults --
    451  1.248       apb # Set defaults before parsing command line options.
    452  1.248       apb #
    453   1.84     lukem initdefaults()
    454   1.84     lukem {
    455  1.171       apb 	makeenv=
    456  1.171       apb 	makewrapper=
    457  1.171       apb 	makewrappermachine=
    458  1.171       apb 	runcmd=
    459  1.171       apb 	operations=
    460  1.171       apb 	removedirs=
    461  1.171       apb 
    462  1.156       dsl 	[ -d usr.bin/make ] || cd "$(dirname $0)"
    463   1.84     lukem 	[ -d usr.bin/make ] ||
    464  1.315     sevan 	    bomb "usr.bin/make not found; build.sh must be run from the top \
    465  1.315     sevan level of source directory"
    466   1.84     lukem 	[ -f share/mk/bsd.own.mk ] ||
    467   1.84     lukem 	    bomb "src/share/mk is missing; please re-fetch the source tree"
    468   1.84     lukem 
    469  1.248       apb 	# Set various environment variables to known defaults,
    470  1.248       apb 	# to minimize (cross-)build problems observed "in the field".
    471  1.248       apb 	#
    472  1.248       apb 	# LC_ALL=C must be set before we try to parse the output from
    473  1.248       apb 	# any command.  Other variables are set (or unset) here, before
    474  1.248       apb 	# we parse command line arguments.
    475  1.248       apb 	#
    476  1.248       apb 	# These variables can be overridden via "-V var=value" if
    477  1.248       apb 	# you know what you are doing.
    478  1.248       apb 	#
    479  1.358  christos 	unsetmakeenv C_INCLUDE_PATH
    480  1.358  christos 	unsetmakeenv CPLUS_INCLUDE_PATH
    481  1.248       apb 	unsetmakeenv INFODIR
    482  1.248       apb 	unsetmakeenv LESSCHARSET
    483  1.248       apb 	unsetmakeenv MAKEFLAGS
    484  1.261     pooka 	unsetmakeenv TERMINFO
    485  1.218       apb 	setmakeenv LC_ALL C
    486  1.218       apb 
    487  1.204       apb 	# Find information about the build platform.  This should be
    488  1.204       apb 	# kept in sync with _HOST_OSNAME, _HOST_OSREL, and _HOST_ARCH
    489  1.204       apb 	# variables in share/mk/bsd.sys.mk.
    490  1.204       apb 	#
    491  1.204       apb 	# Note that "uname -p" is not part of POSIX, but we want uname_p
    492  1.204       apb 	# to be set to the host MACHINE_ARCH, if possible.  On systems
    493  1.369     lukem 	# where "uname -p" fails, shows "unknown", or shows a string
    494  1.204       apb 	# that does not look like an identifier, fall back to using the
    495  1.204       apb 	# output from "uname -m" instead.
    496  1.165       apb 	#
    497   1.84     lukem 	uname_s=$(uname -s 2>/dev/null)
    498  1.165       apb 	uname_r=$(uname -r 2>/dev/null)
    499   1.84     lukem 	uname_m=$(uname -m 2>/dev/null)
    500  1.204       apb 	uname_p=$(uname -p 2>/dev/null || echo "unknown")
    501  1.204       apb 	case "${uname_p}" in
    502  1.333  sborrill 	''|unknown|*[!-_A-Za-z0-9]*) uname_p="${uname_m}" ;;
    503  1.204       apb 	esac
    504   1.84     lukem 
    505  1.202    sketch 	id_u=$(id -u 2>/dev/null || /usr/xpg4/bin/id -u 2>/dev/null)
    506  1.202    sketch 
    507   1.84     lukem 	# If $PWD is a valid name of the current directory, POSIX mandates
    508   1.84     lukem 	# that pwd return it by default which causes problems in the
    509   1.84     lukem 	# presence of symlinks.  Unsetting PWD is simpler than changing
    510   1.84     lukem 	# every occurrence of pwd to use -P.
    511   1.84     lukem 	#
    512  1.147    dogcow 	# XXX Except that doesn't work on Solaris. Or many Linuces.
    513   1.98     lukem 	#
    514   1.84     lukem 	unset PWD
    515  1.310       kre 	TOP=$( (exec pwd -P 2>/dev/null) || (exec pwd 2>/dev/null) )
    516   1.84     lukem 
    517  1.153       apb 	# The user can set HOST_SH in the environment, or we try to
    518  1.153       apb 	# guess an appropriate value.  Then we set several other
    519  1.153       apb 	# variables from HOST_SH.
    520  1.153       apb 	#
    521  1.153       apb 	set_HOST_SH
    522  1.153       apb 	setmakeenv HOST_SH "${HOST_SH}"
    523  1.153       apb 	setmakeenv BSHELL "${HOST_SH}"
    524  1.153       apb 	setmakeenv CONFIG_SHELL "${HOST_SH}"
    525  1.153       apb 
    526   1.84     lukem 	# Set defaults.
    527   1.98     lukem 	#
    528   1.84     lukem 	toolprefix=nb
    529   1.98     lukem 
    530   1.95   thorpej 	# Some systems have a small ARG_MAX.  -X prevents make(1) from
    531   1.95   thorpej 	# exporting variables in the environment redundantly.
    532   1.98     lukem 	#
    533   1.95   thorpej 	case "${uname_s}" in
    534   1.97  christos 	Darwin | FreeBSD | CYGWIN*)
    535  1.248       apb 		MAKEFLAGS="-X ${MAKEFLAGS}"
    536   1.95   thorpej 		;;
    537   1.95   thorpej 	esac
    538   1.98     lukem 
    539  1.171       apb 	# do_{operation}=true if given operation is requested.
    540  1.171       apb 	#
    541   1.84     lukem 	do_expertmode=false
    542   1.84     lukem 	do_rebuildmake=false
    543   1.84     lukem 	do_removedirs=false
    544   1.84     lukem 	do_tools=false
    545  1.329  christos 	do_libs=false
    546  1.195     lukem 	do_cleandir=false
    547   1.84     lukem 	do_obj=false
    548   1.84     lukem 	do_build=false
    549   1.84     lukem 	do_distribution=false
    550   1.84     lukem 	do_release=false
    551   1.84     lukem 	do_kernel=false
    552  1.105     lukem 	do_releasekernel=false
    553  1.300  uebayasi 	do_kernels=false
    554  1.207   jnemeth 	do_modules=false
    555  1.245  jmcneill 	do_installmodules=false
    556   1.84     lukem 	do_install=false
    557   1.87     lukem 	do_sets=false
    558  1.100     lukem 	do_sourcesets=false
    559  1.142       apb 	do_syspkgs=false
    560  1.380  riastrad 	do_pkg=false
    561  1.146       apb 	do_iso_image=false
    562  1.172   jnemeth 	do_iso_image_source=false
    563  1.254   tsutsui 	do_live_image=false
    564  1.254   tsutsui 	do_install_image=false
    565  1.264  christos 	do_disk_image=false
    566  1.107     lukem 	do_params=false
    567  1.371     lukem 	do_show_params=false
    568  1.219     pooka 	do_rump=false
    569  1.335  jmcneill 	do_dtb=false
    570   1.98     lukem 
    571  1.211       apb 	# done_{operation}=true if given operation has been done.
    572  1.211       apb 	#
    573  1.211       apb 	done_rebuildmake=false
    574  1.211       apb 
    575   1.98     lukem 	# Create scratch directory
    576   1.98     lukem 	#
    577   1.98     lukem 	tmpdir="${TMPDIR-/tmp}/nbbuild$$"
    578   1.98     lukem 	mkdir "${tmpdir}" || bomb "Cannot mkdir: ${tmpdir}"
    579   1.98     lukem 	trap "cd /; rm -r -f \"${tmpdir}\"" 0
    580   1.98     lukem 	results="${tmpdir}/build.sh.results"
    581  1.116      jmmv 
    582  1.116      jmmv 	# Set source directories
    583  1.116      jmmv 	#
    584  1.116      jmmv 	setmakeenv NETBSDSRCDIR "${TOP}"
    585  1.136     lukem 
    586  1.233    cegger 	# Make sure KERNOBJDIR is an absolute path if defined
    587  1.233    cegger 	#
    588  1.233    cegger 	case "${KERNOBJDIR}" in
    589  1.233    cegger 	''|/*)	;;
    590  1.233    cegger 	*)	KERNOBJDIR="${TOP}/${KERNOBJDIR}"
    591  1.233    cegger 		setmakeenv KERNOBJDIR "${KERNOBJDIR}"
    592  1.233    cegger 		;;
    593  1.233    cegger 	esac
    594  1.233    cegger 
    595  1.165       apb 	# Find the version of NetBSD
    596  1.165       apb 	#
    597  1.165       apb 	DISTRIBVER="$(${HOST_SH} ${TOP}/sys/conf/osrelease.sh)"
    598  1.165       apb 
    599  1.190     perry 	# Set the BUILDSEED to NetBSD-"N"
    600  1.190     perry 	#
    601  1.190     perry 	setmakeenv BUILDSEED "NetBSD-$(${HOST_SH} ${TOP}/sys/conf/osrelease.sh -m)"
    602  1.190     perry 
    603  1.206     perry 	# Set MKARZERO to "yes"
    604  1.206     perry 	#
    605  1.206     perry 	setmakeenv MKARZERO "yes"
    606  1.206     perry 
    607   1.84     lukem }
    608   1.29       jmc 
    609  1.258       apb # valid_MACHINE_ARCH -- A multi-line string, listing all valid
    610  1.258       apb # MACHINE/MACHINE_ARCH pairs.
    611  1.258       apb #
    612  1.258       apb # Each line contains a MACHINE and MACHINE_ARCH value, an optional ALIAS
    613  1.258       apb # which may be used to refer to the MACHINE/MACHINE_ARCH pair, and an
    614  1.258       apb # optional DEFAULT or NO_DEFAULT keyword.
    615  1.258       apb #
    616  1.258       apb # When a MACHINE corresponds to multiple possible values of
    617  1.258       apb # MACHINE_ARCH, then this table should list all allowed combinations.
    618  1.258       apb # If the MACHINE is associated with a default MACHINE_ARCH (to be
    619  1.258       apb # used when the user specifies the MACHINE but fails to specify the
    620  1.258       apb # MACHINE_ARCH), then one of the lines should have the "DEFAULT"
    621  1.258       apb # keyword.  If there is no default MACHINE_ARCH for a particular
    622  1.258       apb # MACHINE, then there should be a line with the "NO_DEFAULT" keyword,
    623  1.258       apb # and with a blank MACHINE_ARCH.
    624  1.258       apb #
    625  1.258       apb valid_MACHINE_ARCH='
    626  1.328  christos MACHINE=acorn32		MACHINE_ARCH=earmv4	ALIAS=eacorn32 DEFAULT
    627  1.258       apb MACHINE=algor		MACHINE_ARCH=mips64el	ALIAS=algor64
    628  1.258       apb MACHINE=algor		MACHINE_ARCH=mipsel	DEFAULT
    629  1.258       apb MACHINE=alpha		MACHINE_ARCH=alpha
    630  1.258       apb MACHINE=amd64		MACHINE_ARCH=x86_64
    631  1.258       apb MACHINE=amiga		MACHINE_ARCH=m68k
    632  1.258       apb MACHINE=amigappc	MACHINE_ARCH=powerpc
    633  1.258       apb MACHINE=arc		MACHINE_ARCH=mips64el	ALIAS=arc64
    634  1.258       apb MACHINE=arc		MACHINE_ARCH=mipsel	DEFAULT
    635  1.258       apb MACHINE=atari		MACHINE_ARCH=m68k
    636  1.258       apb MACHINE=bebox		MACHINE_ARCH=powerpc
    637  1.286       riz MACHINE=cats		MACHINE_ARCH=earmv4	ALIAS=ecats DEFAULT
    638  1.258       apb MACHINE=cesfic		MACHINE_ARCH=m68k
    639  1.258       apb MACHINE=cobalt		MACHINE_ARCH=mips64el	ALIAS=cobalt64
    640  1.258       apb MACHINE=cobalt		MACHINE_ARCH=mipsel	DEFAULT
    641  1.258       apb MACHINE=dreamcast	MACHINE_ARCH=sh3el
    642  1.258       apb MACHINE=emips		MACHINE_ARCH=mipseb
    643  1.328  christos MACHINE=epoc32		MACHINE_ARCH=earmv4	ALIAS=eepoc32 DEFAULT
    644  1.337  jmcneill MACHINE=evbarm		MACHINE_ARCH=		NO_DEFAULT
    645  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv4	ALIAS=evbearmv4-el	ALIAS=evbarmv4-el
    646  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv4eb	ALIAS=evbearmv4-eb	ALIAS=evbarmv4-eb
    647  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv5	ALIAS=evbearmv5-el	ALIAS=evbarmv5-el
    648  1.339       rin MACHINE=evbarm		MACHINE_ARCH=earmv5hf	ALIAS=evbearmv5hf-el	ALIAS=evbarmv5hf-el
    649  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv5eb	ALIAS=evbearmv5-eb	ALIAS=evbarmv5-eb
    650  1.339       rin MACHINE=evbarm		MACHINE_ARCH=earmv5hfeb	ALIAS=evbearmv5hf-eb	ALIAS=evbarmv5hf-eb
    651  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv6	ALIAS=evbearmv6-el	ALIAS=evbarmv6-el
    652  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv6hf	ALIAS=evbearmv6hf-el	ALIAS=evbarmv6hf-el
    653  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv6eb	ALIAS=evbearmv6-eb	ALIAS=evbarmv6-eb
    654  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv6hfeb	ALIAS=evbearmv6hf-eb	ALIAS=evbarmv6hf-eb
    655  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv7	ALIAS=evbearmv7-el	ALIAS=evbarmv7-el
    656  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv7eb	ALIAS=evbearmv7-eb	ALIAS=evbarmv7-eb
    657  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv7hf	ALIAS=evbearmv7hf-el	ALIAS=evbarmv7hf-el
    658  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv7hfeb	ALIAS=evbearmv7hf-eb	ALIAS=evbarmv7hf-eb
    659  1.337  jmcneill MACHINE=evbarm		MACHINE_ARCH=aarch64	ALIAS=evbarm64-el	ALIAS=evbarm64
    660  1.325       ryo MACHINE=evbarm		MACHINE_ARCH=aarch64eb	ALIAS=evbarm64-eb
    661  1.270      matt MACHINE=evbcf		MACHINE_ARCH=coldfire
    662  1.258       apb MACHINE=evbmips		MACHINE_ARCH=		NO_DEFAULT
    663  1.258       apb MACHINE=evbmips		MACHINE_ARCH=mips64eb	ALIAS=evbmips64-eb
    664  1.258       apb MACHINE=evbmips		MACHINE_ARCH=mips64el	ALIAS=evbmips64-el
    665  1.258       apb MACHINE=evbmips		MACHINE_ARCH=mipseb	ALIAS=evbmips-eb
    666  1.258       apb MACHINE=evbmips		MACHINE_ARCH=mipsel	ALIAS=evbmips-el
    667  1.347  christos MACHINE=evbmips		MACHINE_ARCH=mipsn64eb	ALIAS=evbmipsn64-eb
    668  1.347  christos MACHINE=evbmips		MACHINE_ARCH=mipsn64el	ALIAS=evbmipsn64-el
    669  1.258       apb MACHINE=evbppc		MACHINE_ARCH=powerpc	DEFAULT
    670  1.258       apb MACHINE=evbppc		MACHINE_ARCH=powerpc64	ALIAS=evbppc64
    671  1.258       apb MACHINE=evbsh3		MACHINE_ARCH=		NO_DEFAULT
    672  1.258       apb MACHINE=evbsh3		MACHINE_ARCH=sh3eb	ALIAS=evbsh3-eb
    673  1.258       apb MACHINE=evbsh3		MACHINE_ARCH=sh3el	ALIAS=evbsh3-el
    674  1.258       apb MACHINE=ews4800mips	MACHINE_ARCH=mipseb
    675  1.258       apb MACHINE=hp300		MACHINE_ARCH=m68k
    676  1.276     skrll MACHINE=hppa		MACHINE_ARCH=hppa
    677  1.288       riz MACHINE=hpcarm		MACHINE_ARCH=earmv4	ALIAS=hpcearm DEFAULT
    678  1.258       apb MACHINE=hpcmips		MACHINE_ARCH=mipsel
    679  1.258       apb MACHINE=hpcsh		MACHINE_ARCH=sh3el
    680  1.258       apb MACHINE=i386		MACHINE_ARCH=i386
    681  1.258       apb MACHINE=ia64		MACHINE_ARCH=ia64
    682  1.258       apb MACHINE=ibmnws		MACHINE_ARCH=powerpc
    683  1.286       riz MACHINE=iyonix		MACHINE_ARCH=earm	ALIAS=eiyonix DEFAULT
    684  1.258       apb MACHINE=landisk		MACHINE_ARCH=sh3el
    685  1.258       apb MACHINE=luna68k		MACHINE_ARCH=m68k
    686  1.258       apb MACHINE=mac68k		MACHINE_ARCH=m68k
    687  1.258       apb MACHINE=macppc		MACHINE_ARCH=powerpc	DEFAULT
    688  1.258       apb MACHINE=macppc		MACHINE_ARCH=powerpc64	ALIAS=macppc64
    689  1.258       apb MACHINE=mipsco		MACHINE_ARCH=mipseb
    690  1.258       apb MACHINE=mmeye		MACHINE_ARCH=sh3eb
    691  1.258       apb MACHINE=mvme68k		MACHINE_ARCH=m68k
    692  1.258       apb MACHINE=mvmeppc		MACHINE_ARCH=powerpc
    693  1.286       riz MACHINE=netwinder	MACHINE_ARCH=earmv4	ALIAS=enetwinder DEFAULT
    694  1.258       apb MACHINE=news68k		MACHINE_ARCH=m68k
    695  1.258       apb MACHINE=newsmips	MACHINE_ARCH=mipseb
    696  1.258       apb MACHINE=next68k		MACHINE_ARCH=m68k
    697  1.258       apb MACHINE=ofppc		MACHINE_ARCH=powerpc	DEFAULT
    698  1.258       apb MACHINE=ofppc		MACHINE_ARCH=powerpc64	ALIAS=ofppc64
    699  1.296      matt MACHINE=or1k		MACHINE_ARCH=or1k
    700  1.278    martin MACHINE=playstation2	MACHINE_ARCH=mipsel
    701  1.258       apb MACHINE=pmax		MACHINE_ARCH=mips64el	ALIAS=pmax64
    702  1.258       apb MACHINE=pmax		MACHINE_ARCH=mipsel	DEFAULT
    703  1.258       apb MACHINE=prep		MACHINE_ARCH=powerpc
    704  1.297      matt MACHINE=riscv		MACHINE_ARCH=riscv64	ALIAS=riscv64 DEFAULT
    705  1.297      matt MACHINE=riscv		MACHINE_ARCH=riscv32	ALIAS=riscv32
    706  1.258       apb MACHINE=rs6000		MACHINE_ARCH=powerpc
    707  1.258       apb MACHINE=sandpoint	MACHINE_ARCH=powerpc
    708  1.258       apb MACHINE=sbmips		MACHINE_ARCH=		NO_DEFAULT
    709  1.258       apb MACHINE=sbmips		MACHINE_ARCH=mips64eb	ALIAS=sbmips64-eb
    710  1.258       apb MACHINE=sbmips		MACHINE_ARCH=mips64el	ALIAS=sbmips64-el
    711  1.258       apb MACHINE=sbmips		MACHINE_ARCH=mipseb	ALIAS=sbmips-eb
    712  1.258       apb MACHINE=sbmips		MACHINE_ARCH=mipsel	ALIAS=sbmips-el
    713  1.258       apb MACHINE=sgimips		MACHINE_ARCH=mips64eb	ALIAS=sgimips64
    714  1.258       apb MACHINE=sgimips		MACHINE_ARCH=mipseb	DEFAULT
    715  1.286       riz MACHINE=shark		MACHINE_ARCH=earmv4	ALIAS=eshark DEFAULT
    716  1.258       apb MACHINE=sparc		MACHINE_ARCH=sparc
    717  1.258       apb MACHINE=sparc64		MACHINE_ARCH=sparc64
    718  1.258       apb MACHINE=sun2		MACHINE_ARCH=m68000
    719  1.258       apb MACHINE=sun3		MACHINE_ARCH=m68k
    720  1.258       apb MACHINE=vax		MACHINE_ARCH=vax
    721  1.375   thorpej MACHINE=virt68k		MACHINE_ARCH=m68k
    722  1.258       apb MACHINE=x68k		MACHINE_ARCH=m68k
    723  1.286       riz MACHINE=zaurus		MACHINE_ARCH=earm	ALIAS=ezaurus DEFAULT
    724  1.258       apb '
    725  1.258       apb 
    726  1.258       apb # getarch -- find the default MACHINE_ARCH for a MACHINE,
    727  1.258       apb # or convert an alias to a MACHINE/MACHINE_ARCH pair.
    728  1.258       apb #
    729  1.291       apb # Saves the original value of MACHINE in makewrappermachine before
    730  1.291       apb # alias processing.
    731  1.258       apb #
    732  1.258       apb # Sets MACHINE and MACHINE_ARCH if the input MACHINE value is
    733  1.258       apb # recognised as an alias, or recognised as a machine that has a default
    734  1.258       apb # MACHINE_ARCH (or that has only one possible MACHINE_ARCH).
    735  1.258       apb #
    736  1.258       apb # Leaves MACHINE and MACHINE_ARCH unchanged if MACHINE is recognised
    737  1.258       apb # as being associated with multiple MACHINE_ARCH values with no default.
    738  1.258       apb #
    739  1.258       apb # Bombs if MACHINE is not recognised.
    740  1.258       apb #
    741   1.79     lukem getarch()
    742   1.79     lukem {
    743  1.258       apb 	local IFS
    744  1.258       apb 	local found=""
    745  1.258       apb 	local line
    746  1.258       apb 
    747  1.258       apb 	IFS="${nl}"
    748  1.258       apb 	makewrappermachine="${MACHINE}"
    749  1.258       apb 	for line in ${valid_MACHINE_ARCH}; do
    750  1.258       apb 		line="${line%%#*}" # ignore comments
    751  1.258       apb 		line="$( IFS=" ${tab}" ; echo $line )" # normalise white space
    752  1.258       apb 		case "${line} " in
    753  1.283       apb 		" ")
    754  1.258       apb 			# skip blank lines or comment lines
    755  1.258       apb 			continue
    756  1.258       apb 			;;
    757  1.258       apb 		*" ALIAS=${MACHINE} "*)
    758  1.258       apb 			# Found a line with a matching ALIAS=<alias>.
    759  1.258       apb 			found="$line"
    760  1.258       apb 			break
    761  1.258       apb 			;;
    762  1.258       apb 		"MACHINE=${MACHINE} "*" NO_DEFAULT"*)
    763  1.258       apb 			# Found an explicit "NO_DEFAULT" for this MACHINE.
    764  1.258       apb 			found="$line"
    765  1.258       apb 			break
    766  1.258       apb 			;;
    767  1.258       apb 		"MACHINE=${MACHINE} "*" DEFAULT"*)
    768  1.258       apb 			# Found an explicit "DEFAULT" for this MACHINE.
    769  1.258       apb 			found="$line"
    770  1.258       apb 			break
    771  1.258       apb 			;;
    772  1.258       apb 		"MACHINE=${MACHINE} "*)
    773  1.258       apb 			# Found a line for this MACHINE.  If it's the
    774  1.258       apb 			# first such line, then tentatively accept it.
    775  1.258       apb 			# If it's not the first matching line, then
    776  1.258       apb 			# remember that there was more than one match.
    777  1.258       apb 			case "$found" in
    778  1.258       apb 			'')	found="$line" ;;
    779  1.290       apb 			*)	found="MULTIPLE_MATCHES" ;;
    780  1.258       apb 			esac
    781  1.258       apb 			;;
    782  1.258       apb 		esac
    783  1.258       apb 	done
    784  1.158       apb 
    785  1.258       apb 	case "$found" in
    786  1.258       apb 	*NO_DEFAULT*|*MULTIPLE_MATCHES*)
    787  1.258       apb 		# MACHINE is OK, but MACHINE_ARCH is still unknown
    788  1.258       apb 		return
    789  1.258       apb 		;;
    790  1.258       apb 	"MACHINE="*" MACHINE_ARCH="*)
    791  1.258       apb 		# Obey the MACHINE= and MACHINE_ARCH= parts of the line.
    792  1.258       apb 		IFS=" "
    793  1.258       apb 		for frag in ${found}; do
    794  1.258       apb 			case "$frag" in
    795  1.258       apb 			MACHINE=*|MACHINE_ARCH=*)
    796  1.258       apb 				eval "$frag"
    797  1.258       apb 				;;
    798  1.258       apb 			esac
    799  1.258       apb 		done
    800  1.160      matt 		;;
    801   1.84     lukem 	*)
    802   1.98     lukem 		bomb "Unknown target MACHINE: ${MACHINE}"
    803   1.84     lukem 		;;
    804    1.1        tv 	esac
    805    1.1        tv }
    806    1.1        tv 
    807  1.258       apb # validatearch -- check that the MACHINE/MACHINE_ARCH pair is supported.
    808  1.258       apb #
    809  1.258       apb # Bombs if the pair is not supported.
    810  1.258       apb #
    811   1.79     lukem validatearch()
    812   1.79     lukem {
    813  1.258       apb 	local IFS
    814  1.258       apb 	local line
    815  1.258       apb 	local foundpair=false foundmachine=false foundarch=false
    816  1.258       apb 
    817   1.98     lukem 	case "${MACHINE_ARCH}" in
    818  1.101     lukem 	"")
    819  1.363     lukem 		bomb "No MACHINE_ARCH provided. Use 'build.sh -m ${MACHINE} list-arch' to show options"
    820  1.101     lukem 		;;
    821   1.98     lukem 	esac
    822   1.98     lukem 
    823  1.258       apb 	IFS="${nl}"
    824  1.258       apb 	for line in ${valid_MACHINE_ARCH}; do
    825  1.258       apb 		line="${line%%#*}" # ignore comments
    826  1.258       apb 		line="$( IFS=" ${tab}" ; echo $line )" # normalise white space
    827  1.258       apb 		case "${line} " in
    828  1.283       apb 		" ")
    829  1.258       apb 			# skip blank lines or comment lines
    830  1.258       apb 			continue
    831  1.258       apb 			;;
    832  1.258       apb 		"MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH} "*)
    833  1.258       apb 			foundpair=true
    834  1.258       apb 			;;
    835  1.258       apb 		"MACHINE=${MACHINE} "*)
    836  1.258       apb 			foundmachine=true
    837  1.258       apb 			;;
    838  1.258       apb 		*"MACHINE_ARCH=${MACHINE_ARCH} "*)
    839  1.258       apb 			foundarch=true
    840  1.258       apb 			;;
    841  1.258       apb 		esac
    842  1.258       apb 	done
    843   1.98     lukem 
    844  1.258       apb 	case "${foundpair}:${foundmachine}:${foundarch}" in
    845  1.258       apb 	true:*)
    846  1.258       apb 		: OK
    847  1.255      matt 		;;
    848  1.258       apb 	*:false:*)
    849  1.258       apb 		bomb "Unknown target MACHINE: ${MACHINE}"
    850   1.98     lukem 		;;
    851  1.258       apb 	*:*:false)
    852  1.258       apb 		bomb "Unknown target MACHINE_ARCH: ${MACHINE_ARCH}"
    853  1.148       mrg 		;;
    854   1.98     lukem 	*)
    855  1.258       apb 		bomb "MACHINE_ARCH '${MACHINE_ARCH}' does not support MACHINE '${MACHINE}'"
    856   1.84     lukem 		;;
    857   1.47        tv 	esac
    858   1.47        tv }
    859   1.47        tv 
    860  1.292       apb # listarch -- list valid MACHINE/MACHINE_ARCH/ALIAS values,
    861  1.292       apb # optionally restricted to those where the MACHINE and/or MACHINE_ARCH
    862  1.354    andvar # match specified glob patterns.
    863  1.292       apb #
    864  1.292       apb listarch()
    865  1.292       apb {
    866  1.292       apb 	local machglob="$1" archglob="$2"
    867  1.292       apb 	local IFS
    868  1.292       apb 	local wildcard="*"
    869  1.292       apb 	local line xline frag
    870  1.292       apb 	local line_matches_machine line_matches_arch
    871  1.292       apb 	local found=false
    872  1.292       apb 
    873  1.292       apb 	# Empty machglob or archglob should match anything
    874  1.292       apb 	: "${machglob:=${wildcard}}"
    875  1.292       apb 	: "${archglob:=${wildcard}}"
    876  1.292       apb 
    877  1.292       apb 	IFS="${nl}"
    878  1.292       apb 	for line in ${valid_MACHINE_ARCH}; do
    879  1.292       apb 		line="${line%%#*}" # ignore comments
    880  1.292       apb 		xline="$( IFS=" ${tab}" ; echo $line )" # normalise white space
    881  1.292       apb 		[ -z "${xline}" ] && continue # skip blank or comment lines
    882  1.292       apb 
    883  1.292       apb 		line_matches_machine=false
    884  1.292       apb 		line_matches_arch=false
    885  1.292       apb 
    886  1.292       apb 		IFS=" "
    887  1.292       apb 		for frag in ${xline}; do
    888  1.292       apb 			case "${frag}" in
    889  1.292       apb 			MACHINE=${machglob})
    890  1.292       apb 				line_matches_machine=true ;;
    891  1.292       apb 			ALIAS=${machglob})
    892  1.292       apb 				line_matches_machine=true ;;
    893  1.292       apb 			MACHINE_ARCH=${archglob})
    894  1.292       apb 				line_matches_arch=true ;;
    895  1.292       apb 			esac
    896  1.292       apb 		done
    897  1.292       apb 
    898  1.292       apb 		if $line_matches_machine && $line_matches_arch; then
    899  1.292       apb 			found=true
    900  1.292       apb 			echo "$line"
    901  1.292       apb 		fi
    902  1.292       apb 	done
    903  1.292       apb 	if ! $found; then
    904  1.292       apb 		echo >&2 "No match for" \
    905  1.292       apb 		    "MACHINE=${machglob} MACHINE_ARCH=${archglob}"
    906  1.292       apb 		return 1
    907  1.292       apb 	fi
    908  1.292       apb 	return 0
    909  1.292       apb }
    910  1.292       apb 
    911  1.210       apb # nobomb_getmakevar --
    912  1.369     lukem # Given the name of a make variable in $1, show make's idea of the
    913  1.210       apb # value of that variable, or return 1 if there's an error.
    914  1.210       apb #
    915  1.168       apb nobomb_getmakevar()
    916   1.79     lukem {
    917  1.168       apb 	[ -x "${make}" ] || return 1
    918  1.168       apb 	"${make}" -m ${TOP}/share/mk -s -B -f- _x_ <<EOF || return 1
    919   1.15        tv _x_:
    920   1.15        tv 	echo \${$1}
    921   1.15        tv .include <bsd.prog.mk>
    922   1.70     lukem .include <bsd.kernobj.mk>
    923   1.15        tv EOF
    924   1.15        tv }
    925   1.15        tv 
    926  1.250       apb # bomb_getmakevar --
    927  1.369     lukem # Given the name of a make variable in $1, show make's idea of the
    928  1.210       apb # value of that variable, or bomb if there's an error.
    929  1.210       apb #
    930  1.210       apb bomb_getmakevar()
    931  1.168       apb {
    932  1.210       apb 	[ -x "${make}" ] || bomb "bomb_getmakevar $1: ${make} is not executable"
    933  1.210       apb 	nobomb_getmakevar "$1" || bomb "bomb_getmakevar $1: ${make} failed"
    934  1.168       apb }
    935  1.168       apb 
    936  1.250       apb # getmakevar --
    937  1.369     lukem # Given the name of a make variable in $1, show make's idea of the
    938  1.369     lukem # value of that variable, or show a literal '$' followed by the
    939  1.210       apb # variable name if ${make} is not executable.  This is intended for use in
    940  1.210       apb # messages that need to be readable even if $make hasn't been built,
    941  1.210       apb # such as when build.sh is run with the "-n" option.
    942  1.210       apb #
    943   1.98     lukem getmakevar()
    944   1.82     lukem {
    945   1.98     lukem 	if [ -x "${make}" ]; then
    946  1.210       apb 		bomb_getmakevar "$1"
    947   1.82     lukem 	else
    948   1.82     lukem 		echo "\$$1"
    949   1.82     lukem 	fi
    950   1.82     lukem }
    951   1.82     lukem 
    952  1.109     lukem setmakeenv()
    953  1.109     lukem {
    954  1.109     lukem 	eval "$1='$2'; export $1"
    955  1.109     lukem 	makeenv="${makeenv} $1"
    956  1.109     lukem }
    957  1.362     lukem 
    958  1.321       kre safe_setmakeenv()
    959  1.321       kre {
    960  1.321       kre 	case "$1" in
    961  1.321       kre 
    962  1.321       kre 	#	Look for any vars we want to prohibit here, like:
    963  1.321       kre 	# Bad | Dangerous)	usage "Cannot override $1 with -V";;
    964  1.321       kre 
    965  1.321       kre 	# That first char is OK has already been verified.
    966  1.321       kre 	*[!A-Za-z0-9_]*)	usage "Bad variable name (-V): '$1'";;
    967  1.321       kre 	esac
    968  1.321       kre 	setmakeenv "$@"
    969  1.321       kre }
    970  1.109     lukem 
    971  1.111     lukem unsetmakeenv()
    972  1.111     lukem {
    973  1.111     lukem 	eval "unset $1"
    974  1.111     lukem 	makeenv="${makeenv} $1"
    975  1.111     lukem }
    976  1.362     lukem 
    977  1.321       kre safe_unsetmakeenv()
    978  1.321       kre {
    979  1.321       kre 	case "$1" in
    980  1.321       kre 
    981  1.321       kre 	#	Look for any vars user should not be able to unset
    982  1.321       kre 	# Needed | Must_Have)	usage "Variable $1 cannot be unset";;
    983  1.321       kre 
    984  1.321       kre 	[!A-Za-z_]* | *[!A-Za-z0-9_]*)	usage "Bad variable name (-Z): '$1'";;
    985  1.321       kre 	esac
    986  1.321       kre 	unsetmakeenv "$1"
    987  1.321       kre }
    988  1.111     lukem 
    989  1.380  riastrad # Clear all variables defined in makeenv.  Used to run a subprocess
    990  1.380  riastrad # outside the usual NetBSD build's make environment.
    991  1.380  riastrad #
    992  1.380  riastrad clearmakeenv()
    993  1.380  riastrad {
    994  1.380  riastrad 	local var
    995  1.380  riastrad 
    996  1.380  riastrad 	for var in ${makeenv}; do
    997  1.380  riastrad 		unset ${var}
    998  1.380  riastrad 	done
    999  1.380  riastrad }
   1000  1.380  riastrad 
   1001  1.208       apb # Given a variable name in $1, modify the variable in place as follows:
   1002  1.208       apb # For each space-separated word in the variable, call resolvepath.
   1003  1.362     lukem #
   1004  1.189    dyoung resolvepaths()
   1005  1.189    dyoung {
   1006  1.208       apb 	local var="$1"
   1007  1.208       apb 	local val
   1008  1.208       apb 	eval val=\"\${${var}}\"
   1009  1.208       apb 	local newval=''
   1010  1.208       apb 	local word
   1011  1.208       apb 	for word in ${val}; do
   1012  1.208       apb 		resolvepath word
   1013  1.208       apb 		newval="${newval}${newval:+ }${word}"
   1014  1.189    dyoung 	done
   1015  1.208       apb 	eval ${var}=\"\${newval}\"
   1016  1.189    dyoung }
   1017  1.189    dyoung 
   1018  1.208       apb # Given a variable name in $1, modify the variable in place as follows:
   1019  1.131  junyoung # Convert possibly-relative path to absolute path by prepending
   1020  1.131  junyoung # ${TOP} if necessary.  Also delete trailing "/", if any.
   1021  1.362     lukem #
   1022   1.79     lukem resolvepath()
   1023   1.79     lukem {
   1024  1.208       apb 	local var="$1"
   1025  1.208       apb 	local val
   1026  1.208       apb 	eval val=\"\${${var}}\"
   1027  1.208       apb 	case "${val}" in
   1028  1.131  junyoung 	/)
   1029  1.131  junyoung 		;;
   1030   1.84     lukem 	/*)
   1031  1.208       apb 		val="${val%/}"
   1032   1.84     lukem 		;;
   1033   1.84     lukem 	*)
   1034  1.208       apb 		val="${TOP}/${val%/}"
   1035   1.84     lukem 		;;
   1036   1.10        tv 	esac
   1037  1.208       apb 	eval ${var}=\"\${val}\"
   1038   1.10        tv }
   1039   1.10        tv 
   1040  1.369     lukem # Show synopsis to stdout.
   1041  1.369     lukem #
   1042  1.363     lukem synopsis()
   1043   1.79     lukem {
   1044   1.70     lukem 	cat <<_usage_
   1045   1.83     lukem 
   1046  1.365     lukem Usage: ${progname} [-EnoPRrUux] [-a ARCH] [-B BID] [-C EXTRAS]
   1047  1.365     lukem                 [-c COMPILER] [-D DEST] [-j NJOB] [-M MOBJ] [-m MACH]
   1048  1.365     lukem                 [-N NOISY] [-O OOBJ] [-R RELEASE] [-S SEED] [-T TOOLS]
   1049  1.365     lukem                 [-V VAR=[VALUE]] [-w WRAPPER] [-X X11SRC]
   1050  1.365     lukem                 [-Z VAR]
   1051  1.365     lukem                 OPERATION ...
   1052  1.363     lukem        ${progname} ( -h | -? )
   1053  1.363     lukem 
   1054  1.363     lukem _usage_
   1055  1.363     lukem }
   1056   1.84     lukem 
   1057  1.369     lukem # Show help to stdout.
   1058  1.363     lukem #
   1059  1.363     lukem help()
   1060  1.363     lukem {
   1061  1.363     lukem 	synopsis
   1062  1.363     lukem 	cat <<_usage_
   1063  1.365     lukem  Build OPERATIONs (all imply "obj" and "tools"):
   1064  1.125     lukem     build               Run "make build".
   1065  1.125     lukem     distribution        Run "make distribution" (includes DESTDIR/etc/ files).
   1066  1.125     lukem     release             Run "make release" (includes kernels & distrib media).
   1067   1.84     lukem 
   1068  1.365     lukem  Other OPERATIONs:
   1069  1.369     lukem     help                Show this help message, and exit.
   1070   1.98     lukem     makewrapper         Create ${toolprefix}make-\${MACHINE} wrapper and ${toolprefix}make.
   1071  1.125     lukem                         Always performed.
   1072  1.195     lukem     cleandir            Run "make cleandir".  [Default unless -u is used]
   1073  1.365     lukem     dtb                 Build devicetree blobs.
   1074  1.125     lukem     obj                 Run "make obj".  [Default unless -o is used]
   1075  1.125     lukem     tools               Build and install tools.
   1076  1.365     lukem     install=IDIR        Run "make installworld" to IDIR to install all sets
   1077  1.365     lukem                         except 'etc'.  Useful after "distribution" or "release".
   1078  1.365     lukem     kernel=CONF         Build kernel with config file CONF.
   1079  1.365     lukem     kernel.gdb=CONF     Build kernel (including netbsd.gdb) with config
   1080  1.365     lukem                         file CONF.
   1081  1.365     lukem     releasekernel=CONF  Install kernel built by kernel=CONF to RELEASEDIR.
   1082  1.365     lukem     kernels             Build all kernels.
   1083  1.365     lukem     installmodules=IDIR Run "make installmodules" to IDIR to install all
   1084  1.245  jmcneill                         kernel modules.
   1085  1.226   mbalmer     modules             Build kernel modules.
   1086  1.219     pooka     rumptest            Do a linktest for rump (for developers).
   1087  1.186     lukem     sets                Create binary sets in
   1088  1.195     lukem                         RELEASEDIR/RELEASEMACHINEDIR/binary/sets.
   1089  1.195     lukem                         DESTDIR should be populated beforehand.
   1090  1.345       mrg     distsets            Same as "distribution sets".
   1091  1.125     lukem     sourcesets          Create source sets in RELEASEDIR/source/sets.
   1092  1.186     lukem     syspkgs             Create syspkgs in
   1093  1.195     lukem                         RELEASEDIR/RELEASEMACHINEDIR/binary/syspkgs.
   1094  1.380  riastrad     pkg=CATEGORY/PKG    (EXPERIMENT) Build a package CATEGORY/PKG from pkgsrc.
   1095  1.299       snj     iso-image           Create CD-ROM image in RELEASEDIR/images.
   1096  1.299       snj     iso-image-source    Create CD-ROM image with source in RELEASEDIR/images.
   1097  1.253   tsutsui     live-image          Create bootable live image in
   1098  1.253   tsutsui                         RELEASEDIR/RELEASEMACHINEDIR/installation/liveimage.
   1099  1.253   tsutsui     install-image       Create bootable installation image in
   1100  1.253   tsutsui                         RELEASEDIR/RELEASEMACHINEDIR/installation/installimage.
   1101  1.365     lukem     disk-image=TARGET   Create bootable disk image in
   1102  1.365     lukem                         RELEASEDIR/RELEASEMACHINEDIR/binary/gzimg/TARGET.img.gz.
   1103  1.371     lukem     params              Create params file with various make(1) parameters.
   1104  1.371     lukem     show-params         Show various make(1) parameters.
   1105  1.369     lukem     list-arch           Show a list of valid MACHINE/MACHINE_ARCH values,
   1106  1.292       apb                         and exit.  The list may be narrowed by passing glob
   1107  1.292       apb                         patterns or exact values in MACHINE or MACHINE_ARCH.
   1108  1.376    rillig     mkrepro-timestamp   Show the latest source timestamp used for reproducible
   1109  1.356    martin                         builds and exit.  Requires -P or -V MKREPRO=yes.
   1110  1.383    martin     show-revisionid	Show the revision ID of the current directory
   1111  1.383    martin 			(in SCM dependend format) and exit.
   1112  1.383    martin 			Requires -P or -V MKREPRO=yes.
   1113   1.84     lukem 
   1114   1.84     lukem  Options:
   1115  1.365     lukem     -a ARCH        Set MACHINE_ARCH=ARCH.  [Default: deduced from MACHINE]
   1116  1.365     lukem     -B BID         Set BUILDID=BID.
   1117  1.365     lukem     -C EXTRAS      Append EXTRAS to CDEXTRA for inclusion on CD-ROM.
   1118  1.365     lukem     -c COMPILER    Select compiler from COMPILER:
   1119  1.342  riastrad                        clang
   1120  1.342  riastrad                        gcc
   1121  1.342  riastrad                    [Default: gcc]
   1122  1.365     lukem     -D DEST        Set DESTDIR=DEST.  [Default: destdir.\${MACHINE}]
   1123  1.246       wiz     -E             Set "expert" mode; disables various safety checks.
   1124  1.345       mrg                    Should not be used without expert knowledge of the build
   1125  1.345       mrg                    system.
   1126  1.369     lukem     -h             Show this help message, and exit.
   1127  1.365     lukem     -j NJOB        Run up to NJOB jobs in parallel; see make(1) -j.
   1128  1.365     lukem     -M MOBJ        Set obj root directory to MOBJ; sets MAKEOBJDIRPREFIX=MOBJ,
   1129  1.365     lukem                    unsets MAKEOBJDIR.
   1130  1.365     lukem     -m MACH        Set MACHINE=MACH.  Some MACH values are actually
   1131  1.291       apb                    aliases that set MACHINE/MACHINE_ARCH pairs.
   1132  1.291       apb                    [Default: deduced from the host system if the host
   1133  1.291       apb                    OS is NetBSD]
   1134  1.376    rillig     -N NOISY       Set the noisiness (MAKEVERBOSE) level of the build to NOISY:
   1135  1.365     lukem                        0   Minimal output ("quiet").
   1136  1.365     lukem                        1   Describe what is occurring.
   1137  1.345       mrg                        2   Describe what is occurring and echo the actual
   1138  1.365     lukem                            command.
   1139  1.365     lukem                        3   Ignore the effect of the "@" prefix in make
   1140  1.365     lukem                            commands.
   1141  1.365     lukem                        4   Trace shell commands using the shell's -x flag.
   1142  1.246       wiz                    [Default: 2]
   1143  1.365     lukem     -n             Show commands that would be executed, but do not execute
   1144  1.365     lukem                    them.
   1145  1.365     lukem     -O OOBJ        Set obj root directory to OOBJ; sets a MAKEOBJDIR pattern
   1146  1.365     lukem                    using OOBJ, unsets MAKEOBJDIRPREFIX.
   1147  1.246       wiz     -o             Set MKOBJDIRS=no; do not create objdirs at start of build.
   1148  1.312  christos     -P             Set MKREPRO and MKREPRO_TIMESTAMP to the latest source
   1149  1.312  christos                    CVS timestamp for reproducible builds.
   1150  1.365     lukem     -R RELEASE     Set RELEASEDIR=RELEASE.  [Default: releasedir]
   1151  1.246       wiz     -r             Remove contents of TOOLDIR and DESTDIR before building.
   1152  1.365     lukem     -S SEED        Set BUILDSEED=SEED.  [Default: NetBSD-majorversion]
   1153  1.365     lukem     -T TOOLS       Set TOOLDIR=TOOLS.  If unset, and TOOLDIR is not set
   1154  1.365     lukem                    in the environment, ${toolprefix}make will be (re)built
   1155  1.246       wiz                    unconditionally.
   1156  1.246       wiz     -U             Set MKUNPRIVED=yes; build without requiring root privileges,
   1157  1.365     lukem                    install from an unprivileged build with proper file
   1158  1.365     lukem                    permissions.
   1159  1.246       wiz     -u             Set MKUPDATE=yes; do not run "make cleandir" first.
   1160  1.246       wiz                    Without this, everything is rebuilt, including the tools.
   1161  1.365     lukem     -V VAR=[VALUE] Set variable VAR=VALUE.
   1162  1.365     lukem     -w WRAPPER     Create ${toolprefix}make script as WRAPPER.
   1163  1.246       wiz                    [Default: \${TOOLDIR}/bin/${toolprefix}make-\${MACHINE}]
   1164  1.365     lukem     -X X11SRC      Set X11SRCDIR=X11SRC.  [Default: /usr/xsrc]
   1165  1.365     lukem     -x             Set MKX11=yes; build X11 from X11SRCDIR.
   1166  1.365     lukem     -Z VAR         Unset ("zap") variable VAR.
   1167  1.369     lukem     -?             Show this help message, and exit.
   1168   1.83     lukem 
   1169   1.70     lukem _usage_
   1170  1.362     lukem }
   1171  1.362     lukem 
   1172  1.369     lukem # Show optional error message, help to stderr, and exit 1.
   1173  1.362     lukem #
   1174  1.362     lukem usage()
   1175  1.362     lukem {
   1176  1.362     lukem 	if [ -n "$*" ]; then
   1177  1.363     lukem 		echo 1>&2 ""
   1178  1.363     lukem 		echo 1>&2 "${progname}: $*"
   1179  1.362     lukem 	fi
   1180  1.363     lukem 	synopsis 1>&2
   1181    1.1        tv 	exit 1
   1182    1.1        tv }
   1183    1.1        tv 
   1184   1.84     lukem parseoptions()
   1185   1.84     lukem {
   1186  1.364     lukem 	opts='a:B:C:c:D:Ehj:M:m:N:nO:oPR:rS:T:UuV:w:X:xZ:'
   1187  1.293       apb 	opt_a=false
   1188  1.295       apb 	opt_m=false
   1189  1.383    martin 	local did_show_info=false
   1190   1.84     lukem 
   1191   1.84     lukem 	if type getopts >/dev/null 2>&1; then
   1192   1.84     lukem 		# Use POSIX getopts.
   1193   1.98     lukem 		#
   1194  1.363     lukem 		getoptcmd='getopts :${opts} opt && opt=-${opt}'
   1195   1.84     lukem 		optargcmd=':'
   1196   1.98     lukem 		optremcmd='shift $((${OPTIND} -1))'
   1197   1.84     lukem 	else
   1198   1.84     lukem 		type getopt >/dev/null 2>&1 ||
   1199  1.249       apb 		    bomb "Shell does not support getopts or getopt"
   1200   1.84     lukem 
   1201   1.84     lukem 		# Use old-style getopt(1) (doesn't handle whitespace in args).
   1202   1.98     lukem 		#
   1203   1.98     lukem 		args="$(getopt ${opts} $*)"
   1204   1.84     lukem 		[ $? = 0 ] || usage
   1205   1.98     lukem 		set -- ${args}
   1206   1.84     lukem 
   1207   1.84     lukem 		getoptcmd='[ $# -gt 0 ] && opt="$1" && shift'
   1208   1.84     lukem 		optargcmd='OPTARG="$1"; shift'
   1209   1.84     lukem 		optremcmd=':'
   1210   1.84     lukem 	fi
   1211   1.84     lukem 
   1212   1.84     lukem 	# Parse command line options.
   1213   1.84     lukem 	#
   1214   1.98     lukem 	while eval ${getoptcmd}; do
   1215   1.98     lukem 		case ${opt} in
   1216   1.84     lukem 
   1217   1.84     lukem 		-a)
   1218   1.98     lukem 			eval ${optargcmd}
   1219   1.98     lukem 			MACHINE_ARCH=${OPTARG}
   1220  1.293       apb 			opt_a=true
   1221   1.84     lukem 			;;
   1222   1.84     lukem 
   1223   1.84     lukem 		-B)
   1224   1.98     lukem 			eval ${optargcmd}
   1225   1.98     lukem 			BUILDID=${OPTARG}
   1226   1.84     lukem 			;;
   1227   1.84     lukem 
   1228  1.174   jnemeth 		-C)
   1229  1.208       apb 			eval ${optargcmd}; resolvepaths OPTARG
   1230  1.209       apb 			CDEXTRA="${CDEXTRA}${CDEXTRA:+ }${OPTARG}"
   1231  1.174   jnemeth 			;;
   1232  1.174   jnemeth 
   1233  1.342  riastrad 		-c)
   1234  1.342  riastrad 			eval ${optargcmd}
   1235  1.342  riastrad 			case "${OPTARG}" in
   1236  1.342  riastrad 			gcc)	# default, no variables needed
   1237  1.342  riastrad 				;;
   1238  1.342  riastrad 			clang)	setmakeenv HAVE_LLVM yes
   1239  1.342  riastrad 				setmakeenv MKLLVM yes
   1240  1.342  riastrad 				setmakeenv MKGCC no
   1241  1.342  riastrad 				;;
   1242  1.342  riastrad 			#pcc)	...
   1243  1.342  riastrad 			#	;;
   1244  1.342  riastrad 			*)	bomb "Unknown compiler: ${OPTARG}"
   1245  1.342  riastrad 			esac
   1246  1.342  riastrad 			;;
   1247  1.342  riastrad 
   1248   1.84     lukem 		-D)
   1249  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1250  1.109     lukem 			setmakeenv DESTDIR "${OPTARG}"
   1251   1.84     lukem 			;;
   1252   1.84     lukem 
   1253   1.84     lukem 		-E)
   1254   1.84     lukem 			do_expertmode=true
   1255   1.84     lukem 			;;
   1256   1.84     lukem 
   1257   1.84     lukem 		-j)
   1258   1.98     lukem 			eval ${optargcmd}
   1259   1.98     lukem 			parallel="-j ${OPTARG}"
   1260   1.84     lukem 			;;
   1261   1.84     lukem 
   1262   1.84     lukem 		-M)
   1263  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1264  1.212       apb 			case "${OPTARG}" in
   1265  1.247       apb 			\$*)	usage "-M argument must not begin with '\$'"
   1266  1.212       apb 				;;
   1267  1.212       apb 			*\$*)	# can use resolvepath, but can't set TOP_objdir
   1268  1.212       apb 				resolvepath OPTARG
   1269  1.212       apb 				;;
   1270  1.212       apb 			*)	resolvepath OPTARG
   1271  1.212       apb 				TOP_objdir="${OPTARG}${TOP}"
   1272  1.212       apb 				;;
   1273  1.212       apb 			esac
   1274  1.111     lukem 			unsetmakeenv MAKEOBJDIR
   1275  1.109     lukem 			setmakeenv MAKEOBJDIRPREFIX "${OPTARG}"
   1276   1.84     lukem 			;;
   1277   1.84     lukem 
   1278   1.84     lukem 			# -m overrides MACHINE_ARCH unless "-a" is specified
   1279   1.84     lukem 		-m)
   1280   1.98     lukem 			eval ${optargcmd}
   1281   1.98     lukem 			MACHINE="${OPTARG}"
   1282  1.295       apb 			opt_m=true
   1283   1.84     lukem 			;;
   1284   1.84     lukem 
   1285  1.119     lukem 		-N)
   1286  1.119     lukem 			eval ${optargcmd}
   1287  1.119     lukem 			case "${OPTARG}" in
   1288  1.199       apb 			0|1|2|3|4)
   1289  1.121     lukem 				setmakeenv MAKEVERBOSE "${OPTARG}"
   1290  1.119     lukem 				;;
   1291  1.119     lukem 			*)
   1292  1.119     lukem 				usage "'${OPTARG}' is not a valid value for -N"
   1293  1.119     lukem 				;;
   1294  1.119     lukem 			esac
   1295  1.119     lukem 			;;
   1296  1.119     lukem 
   1297   1.84     lukem 		-n)
   1298   1.84     lukem 			runcmd=echo
   1299   1.84     lukem 			;;
   1300   1.84     lukem 
   1301   1.84     lukem 		-O)
   1302  1.212       apb 			eval ${optargcmd}
   1303  1.212       apb 			case "${OPTARG}" in
   1304  1.247       apb 			*\$*)	usage "-O argument must not contain '\$'"
   1305  1.212       apb 				;;
   1306  1.212       apb 			*)	resolvepath OPTARG
   1307  1.212       apb 				TOP_objdir="${OPTARG}"
   1308  1.212       apb 				;;
   1309  1.212       apb 			esac
   1310  1.111     lukem 			unsetmakeenv MAKEOBJDIRPREFIX
   1311  1.109     lukem 			setmakeenv MAKEOBJDIR "\${.CURDIR:C,^$TOP,$OPTARG,}"
   1312   1.84     lukem 			;;
   1313   1.84     lukem 
   1314   1.84     lukem 		-o)
   1315   1.84     lukem 			MKOBJDIRS=no
   1316   1.84     lukem 			;;
   1317   1.84     lukem 
   1318  1.312  christos 		-P)
   1319  1.312  christos 			MKREPRO=yes
   1320  1.312  christos 			;;
   1321  1.312  christos 
   1322   1.84     lukem 		-R)
   1323  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1324  1.109     lukem 			setmakeenv RELEASEDIR "${OPTARG}"
   1325   1.84     lukem 			;;
   1326   1.84     lukem 
   1327   1.84     lukem 		-r)
   1328   1.84     lukem 			do_removedirs=true
   1329   1.84     lukem 			do_rebuildmake=true
   1330   1.84     lukem 			;;
   1331   1.84     lukem 
   1332  1.190     perry 		-S)
   1333  1.190     perry 			eval ${optargcmd}
   1334  1.190     perry 			setmakeenv BUILDSEED "${OPTARG}"
   1335  1.190     perry 			;;
   1336  1.190     perry 
   1337   1.84     lukem 		-T)
   1338  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1339   1.98     lukem 			TOOLDIR="${OPTARG}"
   1340   1.84     lukem 			export TOOLDIR
   1341   1.84     lukem 			;;
   1342   1.84     lukem 
   1343   1.84     lukem 		-U)
   1344  1.109     lukem 			setmakeenv MKUNPRIVED yes
   1345   1.84     lukem 			;;
   1346   1.44     lukem 
   1347   1.84     lukem 		-u)
   1348  1.109     lukem 			setmakeenv MKUPDATE yes
   1349   1.84     lukem 			;;
   1350   1.15        tv 
   1351   1.84     lukem 		-V)
   1352   1.98     lukem 			eval ${optargcmd}
   1353   1.84     lukem 			case "${OPTARG}" in
   1354   1.80     lukem 		    # XXX: consider restricting which variables can be changed?
   1355  1.321       kre 			[a-zA-Z_]*=*)
   1356  1.321       kre 				safe_setmakeenv "${OPTARG%%=*}" "${OPTARG#*=}"
   1357  1.321       kre 				;;
   1358  1.321       kre 			[a-zA-Z_]*)
   1359  1.321       kre 				safe_setmakeenv "${OPTARG}" ""
   1360   1.84     lukem 				;;
   1361   1.84     lukem 			*)
   1362  1.365     lukem 				usage "-V argument must be of the form 'VAR[=VALUE]'"
   1363   1.84     lukem 				;;
   1364   1.84     lukem 			esac
   1365   1.84     lukem 			;;
   1366   1.84     lukem 
   1367   1.84     lukem 		-w)
   1368  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1369   1.98     lukem 			makewrapper="${OPTARG}"
   1370   1.84     lukem 			;;
   1371   1.84     lukem 
   1372  1.127     lukem 		-X)
   1373  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1374  1.127     lukem 			setmakeenv X11SRCDIR "${OPTARG}"
   1375  1.127     lukem 			;;
   1376  1.127     lukem 
   1377  1.127     lukem 		-x)
   1378  1.127     lukem 			setmakeenv MKX11 yes
   1379  1.127     lukem 			;;
   1380  1.127     lukem 
   1381  1.111     lukem 		-Z)
   1382  1.111     lukem 			eval ${optargcmd}
   1383  1.111     lukem 		    # XXX: consider restricting which variables can be unset?
   1384  1.321       kre 			safe_unsetmakeenv "${OPTARG}"
   1385  1.111     lukem 			;;
   1386  1.111     lukem 
   1387   1.84     lukem 		--)
   1388   1.84     lukem 			break
   1389   1.84     lukem 			;;
   1390   1.84     lukem 
   1391  1.363     lukem 		-h)
   1392  1.362     lukem 			help
   1393  1.362     lukem 			exit 0
   1394   1.84     lukem 			;;
   1395   1.84     lukem 
   1396  1.363     lukem 		'-?')
   1397  1.363     lukem 			if [ "${OPTARG}" = '?' ]; then
   1398  1.363     lukem 				help
   1399  1.363     lukem 				exit 0
   1400  1.363     lukem 			fi
   1401  1.363     lukem 			usage "Unknown option -${OPTARG}"
   1402  1.363     lukem 			;;
   1403  1.363     lukem 
   1404  1.363     lukem 		-:)
   1405  1.363     lukem 			usage "Missing argument for option -${OPTARG}"
   1406  1.363     lukem 			;;
   1407  1.363     lukem 
   1408  1.363     lukem 		*)
   1409  1.363     lukem 			usage "Unimplemented option ${opt}"
   1410  1.363     lukem 			;;
   1411  1.363     lukem 
   1412   1.84     lukem 		esac
   1413   1.84     lukem 	done
   1414   1.84     lukem 
   1415   1.84     lukem 	# Validate operations.
   1416   1.84     lukem 	#
   1417   1.98     lukem 	eval ${optremcmd}
   1418   1.84     lukem 	while [ $# -gt 0 ]; do
   1419   1.84     lukem 		op=$1; shift
   1420   1.98     lukem 		operations="${operations} ${op}"
   1421   1.84     lukem 
   1422   1.98     lukem 		case "${op}" in
   1423   1.84     lukem 
   1424   1.87     lukem 		help)
   1425  1.362     lukem 			help
   1426  1.362     lukem 			exit 0
   1427   1.87     lukem 			;;
   1428   1.87     lukem 
   1429  1.292       apb 		list-arch)
   1430  1.292       apb 			listarch "${MACHINE}" "${MACHINE_ARCH}"
   1431  1.356    martin 			exit
   1432  1.356    martin 			;;
   1433  1.356    martin 		mkrepro-timestamp)
   1434  1.356    martin 			setup_mkrepro quiet
   1435  1.356    martin 			echo ${MKREPRO_TIMESTAMP:-0}
   1436  1.383    martin 			did_show_info=true
   1437  1.383    martin 			;;
   1438  1.383    martin 
   1439  1.383    martin 		show-revisionid)
   1440  1.383    martin 			setup_mkrepro quiet
   1441  1.383    martin 			echo ${NETBSD_REVISIONID}
   1442  1.383    martin 			did_show_info=true
   1443  1.292       apb 			;;
   1444  1.292       apb 
   1445  1.305  uebayasi 		kernel=*|releasekernel=*|kernel.gdb=*)
   1446   1.84     lukem 			arg=${op#*=}
   1447   1.84     lukem 			op=${op%%=*}
   1448   1.98     lukem 			[ -n "${arg}" ] ||
   1449  1.363     lukem 			    bomb "Must supply a kernel name with '${op}=...'"
   1450   1.84     lukem 			;;
   1451   1.84     lukem 
   1452  1.264  christos 		disk-image=*)
   1453  1.264  christos 			arg=${op#*=}
   1454  1.264  christos 			op=disk_image
   1455  1.264  christos 			[ -n "${arg}" ] ||
   1456  1.363     lukem 			    bomb "Must supply a target name with '${op}=...'"
   1457  1.264  christos 
   1458  1.264  christos 			;;
   1459  1.264  christos 
   1460  1.380  riastrad 		pkg=*)
   1461  1.380  riastrad 			arg=${op#*=}
   1462  1.380  riastrad 			op=${op%%=*}
   1463  1.380  riastrad 			[ -n "${arg}" ] ||
   1464  1.380  riastrad 			    bomb "Must supply category/package with 'pkg=...'"
   1465  1.380  riastrad 			;;
   1466  1.380  riastrad 
   1467  1.245  jmcneill 		install=*|installmodules=*)
   1468   1.84     lukem 			arg=${op#*=}
   1469   1.84     lukem 			op=${op%%=*}
   1470   1.98     lukem 			[ -n "${arg}" ] ||
   1471  1.363     lukem 			    bomb "Must supply a directory with 'install=...'"
   1472   1.84     lukem 			;;
   1473   1.84     lukem 
   1474  1.345       mrg 		distsets)
   1475  1.345       mrg 			operations="$(echo "$operations" | sed 's/distsets/distribution sets/')"
   1476  1.345       mrg 			do_sets=true
   1477  1.345       mrg 			op=distribution
   1478  1.345       mrg 			;;
   1479  1.345       mrg 
   1480  1.301       apb 		build|\
   1481  1.301       apb 		cleandir|\
   1482  1.301       apb 		distribution|\
   1483  1.335  jmcneill 		dtb|\
   1484  1.301       apb 		install-image|\
   1485  1.301       apb 		iso-image-source|\
   1486  1.301       apb 		iso-image|\
   1487  1.301       apb 		kernels|\
   1488  1.329  christos 		libs|\
   1489  1.301       apb 		live-image|\
   1490  1.301       apb 		makewrapper|\
   1491  1.301       apb 		modules|\
   1492  1.301       apb 		obj|\
   1493  1.301       apb 		params|\
   1494  1.301       apb 		release|\
   1495  1.301       apb 		rump|\
   1496  1.301       apb 		rumptest|\
   1497  1.301       apb 		sets|\
   1498  1.371     lukem 		show-params|\
   1499  1.301       apb 		sourcesets|\
   1500  1.301       apb 		syspkgs|\
   1501  1.301       apb 		tools)
   1502  1.219     pooka 			;;
   1503  1.219     pooka 
   1504   1.80     lukem 		*)
   1505  1.365     lukem 			usage "Unknown OPERATION '${op}'"
   1506   1.84     lukem 			;;
   1507   1.84     lukem 
   1508   1.80     lukem 		esac
   1509  1.301       apb 		# ${op} may contain chars that are not allowed in variable
   1510  1.301       apb 		# names.  Replace them with '_' before setting do_${op}.
   1511  1.301       apb 		op="$( echo "$op" | tr -s '.-' '__')"
   1512   1.98     lukem 		eval do_${op}=true
   1513   1.84     lukem 	done
   1514  1.383    martin 
   1515  1.383    martin 	[ "$did_show_info" = true ] && [ ${MKREPRO_TIMESTAMP:-0} -ne 0 ]; exit
   1516  1.383    martin 
   1517  1.365     lukem 	[ -n "${operations}" ] || usage "Missing OPERATION to perform"
   1518   1.84     lukem 
   1519   1.84     lukem 	# Set up MACHINE*.  On a NetBSD host, these are allowed to be unset.
   1520   1.84     lukem 	#
   1521   1.98     lukem 	if [ -z "${MACHINE}" ]; then
   1522   1.98     lukem 		[ "${uname_s}" = "NetBSD" ] ||
   1523  1.363     lukem 		    bomb "MACHINE must be set, or -m must be used, for cross builds"
   1524   1.84     lukem 		MACHINE=${uname_m}
   1525  1.332       mrg 		MACHINE_ARCH=${uname_p}
   1526   1.84     lukem 	fi
   1527  1.295       apb 	if $opt_m && ! $opt_a; then
   1528  1.295       apb 		# Settings implied by the command line -m option
   1529  1.295       apb 		# override MACHINE_ARCH from the environment (if any).
   1530  1.295       apb 		getarch
   1531  1.295       apb 	fi
   1532  1.295       apb 	[ -n "${MACHINE_ARCH}" ] || getarch
   1533   1.84     lukem 	validatearch
   1534   1.84     lukem 
   1535   1.84     lukem 	# Set up default make(1) environment.
   1536   1.84     lukem 	#
   1537   1.98     lukem 	makeenv="${makeenv} TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS"
   1538   1.98     lukem 	[ -z "${BUILDID}" ] || makeenv="${makeenv} BUILDID"
   1539  1.287       apb 	[ -z "${BUILDINFO}" ] || makeenv="${makeenv} BUILDINFO"
   1540  1.248       apb 	MAKEFLAGS="-de -m ${TOP}/share/mk ${MAKEFLAGS}"
   1541  1.248       apb 	MAKEFLAGS="${MAKEFLAGS} MKOBJDIRS=${MKOBJDIRS-yes}"
   1542   1.84     lukem 	export MAKEFLAGS MACHINE MACHINE_ARCH
   1543  1.284       apb 	setmakeenv USETOOLS "yes"
   1544  1.284       apb 	setmakeenv MAKEWRAPPERMACHINE "${makewrappermachine:-${MACHINE}}"
   1545  1.346    martin 	setmakeenv MAKE_OBJDIR_CHECK_WRITABLE no
   1546   1.84     lukem }
   1547   1.84     lukem 
   1548  1.248       apb # sanitycheck --
   1549  1.248       apb # Sanity check after parsing command line options, before rebuildmake.
   1550  1.248       apb #
   1551  1.163       apb sanitycheck()
   1552  1.163       apb {
   1553  1.260       apb 	# Install as non-root is a bad idea.
   1554  1.260       apb 	#
   1555  1.260       apb 	if ${do_install} && [ "$id_u" -ne 0 ] ; then
   1556  1.260       apb 		if ${do_expertmode}; then
   1557  1.363     lukem 			warning "Will install as an unprivileged user"
   1558  1.260       apb 		else
   1559  1.363     lukem 			bomb "-E must be set for install as an unprivileged user"
   1560  1.260       apb 		fi
   1561  1.260       apb 	fi
   1562  1.260       apb 
   1563  1.163       apb 	# If the PATH contains any non-absolute components (including,
   1564  1.170       apb 	# but not limited to, "." or ""), then complain.  As an exception,
   1565  1.170       apb 	# allow "" or "." as the last component of the PATH.  This is fatal
   1566  1.163       apb 	# if expert mode is not in effect.
   1567  1.163       apb 	#
   1568  1.170       apb 	local path="${PATH}"
   1569  1.170       apb 	path="${path%:}"	# delete trailing ":"
   1570  1.170       apb 	path="${path%:.}"	# delete trailing ":."
   1571  1.170       apb 	case ":${path}:/" in
   1572  1.334  jmcneill 	*:[!/~]*)
   1573  1.163       apb 		if ${do_expertmode}; then
   1574  1.163       apb 			warning "PATH contains non-absolute components"
   1575  1.163       apb 		else
   1576  1.164       apb 			bomb "PATH environment variable must not" \
   1577  1.164       apb 			     "contain non-absolute components"
   1578  1.163       apb 		fi
   1579  1.163       apb 		;;
   1580  1.163       apb 	esac
   1581  1.317      maya 
   1582  1.320       kre 	while [ ${MKX11-no} = "yes" ]; do		# not really a loop
   1583  1.320       kre 		test -n "${X11SRCDIR}" && {
   1584  1.379  riastrad 		    test -d "${X11SRCDIR}/external" ||
   1585  1.320       kre 		    	bomb "X11SRCDIR (${X11SRCDIR}) does not exist (with -x)"
   1586  1.320       kre 		    break
   1587  1.320       kre 		}
   1588  1.320       kre 		for _xd in \
   1589  1.320       kre 		    "${NETBSDSRCDIR%/*}/xsrc" \
   1590  1.320       kre 		    "${NETBSDSRCDIR}/xsrc" \
   1591  1.320       kre 		    /usr/xsrc
   1592  1.320       kre 		do
   1593  1.378  riastrad 		    test -f "${_xd}/Makefile" &&
   1594  1.320       kre 			setmakeenv X11SRCDIR "${_xd}" &&
   1595  1.320       kre 			break 2
   1596  1.320       kre 		done
   1597  1.318      maya 		bomb "Asked to build X11 but no xsrc"
   1598  1.320       kre 	done
   1599  1.380  riastrad 
   1600  1.380  riastrad 	while $do_pkg; do				# not really a loop
   1601  1.380  riastrad 		test -n "${PKGSRCDIR}" && {
   1602  1.380  riastrad 		    test -f "${PKGSRCDIR}/mk/bsd.pkg.mk" ||
   1603  1.381  riastrad 			bomb "PKGSRCDIR (${PKGSRCDIR}) does not exist"
   1604  1.380  riastrad 		    break
   1605  1.380  riastrad 		}
   1606  1.380  riastrad 		for _pd in \
   1607  1.380  riastrad 		    "${NETBSDSRCDIR%/*}/pkgsrc" \
   1608  1.380  riastrad 		    "${NETBSDSRCDIR}/pkgsrc" \
   1609  1.380  riastrad 		    /usr/pkgsrc
   1610  1.380  riastrad 		do
   1611  1.380  riastrad 		    test -f "${_pd}/mk/bsd.pkg.mk" &&
   1612  1.380  riastrad 			setmakeenv PKGSRCDIR "${_pd}" &&
   1613  1.380  riastrad 			break 2
   1614  1.380  riastrad 		done
   1615  1.380  riastrad 		bomb "Asked to build package but no pkgsrc"
   1616  1.380  riastrad 	done
   1617  1.163       apb }
   1618  1.317      maya 
   1619  1.369     lukem # print_tooldir_program --
   1620  1.369     lukem # Try to find and show a path to an existing
   1621  1.312  christos # ${TOOLDIR}/bin/${toolprefix}program
   1622  1.369     lukem #
   1623  1.312  christos print_tooldir_program()
   1624  1.168       apb {
   1625  1.213       apb 	local possible_TOP_OBJ
   1626  1.213       apb 	local possible_TOOLDIR
   1627  1.312  christos 	local possible_program
   1628  1.312  christos 	local tooldir_program
   1629  1.312  christos 	local program=${1}
   1630  1.213       apb 
   1631  1.213       apb 	if [ -n "${TOOLDIR}" ]; then
   1632  1.312  christos 		echo "${TOOLDIR}/bin/${toolprefix}${program}"
   1633  1.312  christos 		return
   1634  1.213       apb 	fi
   1635  1.168       apb 
   1636  1.198       apb 	# Set host_ostype to something like "NetBSD-4.5.6-i386".  This
   1637  1.198       apb 	# is intended to match the HOST_OSTYPE variable in <bsd.own.mk>.
   1638  1.198       apb 	#
   1639  1.168       apb 	local host_ostype="${uname_s}-$(
   1640  1.168       apb 		echo "${uname_r}" | sed -e 's/([^)]*)//g' -e 's/ /_/g'
   1641  1.194     lukem 		)-$(
   1642  1.168       apb 		echo "${uname_p}" | sed -e 's/([^)]*)//g' -e 's/ /_/g'
   1643  1.168       apb 		)"
   1644  1.168       apb 
   1645  1.198       apb 	# Look in a few potential locations for
   1646  1.312  christos 	# ${possible_TOOLDIR}/bin/${toolprefix}${program}.
   1647  1.312  christos 	# If we find it, then set possible_program.
   1648  1.198       apb 	#
   1649  1.198       apb 	# In the usual case (without interference from environment
   1650  1.198       apb 	# variables or /etc/mk.conf), <bsd.own.mk> should set TOOLDIR to
   1651  1.212       apb 	# "${_SRC_TOP_OBJ_}/tooldir.${host_ostype}".
   1652  1.212       apb 	#
   1653  1.212       apb 	# In practice it's difficult to figure out the correct value
   1654  1.212       apb 	# for _SRC_TOP_OBJ_.  In the easiest case, when the -M or -O
   1655  1.212       apb 	# options were passed to build.sh, then ${TOP_objdir} will be
   1656  1.212       apb 	# the correct value.  We also try a few other possibilities, but
   1657  1.212       apb 	# we do not replicate all the logic of <bsd.obj.mk>.
   1658  1.198       apb 	#
   1659  1.212       apb 	for possible_TOP_OBJ in \
   1660  1.212       apb 		"${TOP_objdir}" \
   1661  1.212       apb 		"${MAKEOBJDIRPREFIX:+${MAKEOBJDIRPREFIX}${TOP}}" \
   1662  1.212       apb 		"${TOP}" \
   1663  1.212       apb 		"${TOP}/obj" \
   1664  1.198       apb 		"${TOP}/obj.${MACHINE}"
   1665  1.198       apb 	do
   1666  1.212       apb 		[ -n "${possible_TOP_OBJ}" ] || continue
   1667  1.198       apb 		possible_TOOLDIR="${possible_TOP_OBJ}/tooldir.${host_ostype}"
   1668  1.312  christos 		possible_program="${possible_TOOLDIR}/bin/${toolprefix}${program}"
   1669  1.372  christos 		if [ -x "${possible_program}" ]; then
   1670  1.312  christos 			echo ${possible_program}
   1671  1.312  christos 			return;
   1672  1.198       apb 		fi
   1673  1.198       apb 	done
   1674  1.312  christos 	echo ""
   1675  1.312  christos }
   1676  1.369     lukem 
   1677  1.312  christos # print_tooldir_make --
   1678  1.369     lukem # Try to find and show a path to an existing
   1679  1.312  christos # ${TOOLDIR}/bin/${toolprefix}make, for use by rebuildmake() before a
   1680  1.312  christos # new version of ${toolprefix}make has been built.
   1681  1.312  christos #
   1682  1.312  christos # * If TOOLDIR was set in the environment or on the command line, use
   1683  1.312  christos #   that value.
   1684  1.312  christos # * Otherwise try to guess what TOOLDIR would be if not overridden by
   1685  1.312  christos #   /etc/mk.conf, and check whether the resulting directory contains
   1686  1.312  christos #   a copy of ${toolprefix}make (this should work for everybody who
   1687  1.312  christos #   doesn't override TOOLDIR via /etc/mk.conf);
   1688  1.312  christos # * Failing that, search for ${toolprefix}make, nbmake, bmake, or make,
   1689  1.312  christos #   in the PATH (this might accidentally find a version of make that
   1690  1.312  christos #   does not understand the syntax used by NetBSD make, and that will
   1691  1.312  christos #   lead to failure in the next step);
   1692  1.312  christos # * If a copy of make was found above, try to use it with
   1693  1.312  christos #   nobomb_getmakevar to find the correct value for TOOLDIR, and believe the
   1694  1.312  christos #   result only if it's a directory that already exists;
   1695  1.312  christos # * If a value of TOOLDIR was found above, and if
   1696  1.369     lukem #   ${TOOLDIR}/bin/${toolprefix}make exists, show that value.
   1697  1.312  christos #
   1698  1.312  christos print_tooldir_make()
   1699  1.312  christos {
   1700  1.312  christos 	local possible_make
   1701  1.312  christos 	local possible_TOOLDIR
   1702  1.312  christos 	local tooldir_make
   1703  1.198       apb 
   1704  1.312  christos 	possible_make=$(print_tooldir_program make)
   1705  1.198       apb 	# If the above didn't work, search the PATH for a suitable
   1706  1.198       apb 	# ${toolprefix}make, nbmake, bmake, or make.
   1707  1.198       apb 	#
   1708  1.213       apb 	: ${possible_make:=$(find_in_PATH ${toolprefix}make '')}
   1709  1.213       apb 	: ${possible_make:=$(find_in_PATH nbmake '')}
   1710  1.213       apb 	: ${possible_make:=$(find_in_PATH bmake '')}
   1711  1.213       apb 	: ${possible_make:=$(find_in_PATH make '')}
   1712  1.213       apb 
   1713  1.213       apb 	# At this point, we don't care whether possible_make is in the
   1714  1.213       apb 	# correct TOOLDIR or not; we simply want it to be usable by
   1715  1.213       apb 	# getmakevar to help us find the correct TOOLDIR.
   1716  1.213       apb 	#
   1717  1.213       apb 	# Use ${possible_make} with nobomb_getmakevar to try to find
   1718  1.213       apb 	# the value of TOOLDIR.  Believe the result only if it's
   1719  1.213       apb 	# a directory that already exists and contains bin/${toolprefix}make.
   1720  1.213       apb 	#
   1721  1.213       apb 	if [ -x "${possible_make}" ]; then
   1722  1.213       apb 		possible_TOOLDIR="$(
   1723  1.250       apb 			make="${possible_make}" \
   1724  1.250       apb 			nobomb_getmakevar TOOLDIR 2>/dev/null
   1725  1.213       apb 			)"
   1726  1.213       apb 		if [ $? = 0 ] && [ -n "${possible_TOOLDIR}" ] \
   1727  1.213       apb 		    && [ -d "${possible_TOOLDIR}" ];
   1728  1.213       apb 		then
   1729  1.213       apb 			tooldir_make="${possible_TOOLDIR}/bin/${toolprefix}make"
   1730  1.213       apb 			if [ -x "${tooldir_make}" ]; then
   1731  1.213       apb 				echo "${tooldir_make}"
   1732  1.213       apb 				return 0
   1733  1.213       apb 			fi
   1734  1.213       apb 		fi
   1735  1.168       apb 	fi
   1736  1.213       apb 	return 1
   1737  1.168       apb }
   1738  1.168       apb 
   1739  1.213       apb # rebuildmake --
   1740  1.213       apb # Rebuild nbmake in a temporary directory if necessary.  Sets $make
   1741  1.213       apb # to a path to the nbmake executable.  Sets done_rebuildmake=true
   1742  1.213       apb # if nbmake was rebuilt.
   1743  1.213       apb #
   1744  1.213       apb # There is a cyclic dependency between building nbmake and choosing
   1745  1.213       apb # TOOLDIR: TOOLDIR may be affected by settings in /etc/mk.conf, so we
   1746  1.213       apb # would like to use getmakevar to get the value of TOOLDIR; but we can't
   1747  1.213       apb # use getmakevar before we have an up to date version of nbmake; we
   1748  1.213       apb # might already have an up to date version of nbmake in TOOLDIR, but we
   1749  1.213       apb # don't yet know where TOOLDIR is.
   1750  1.213       apb #
   1751  1.213       apb # The default value of TOOLDIR also depends on the location of the top
   1752  1.213       apb # level object directory, so $(getmakevar TOOLDIR) invoked before or
   1753  1.213       apb # after making the top level object directory may produce different
   1754  1.213       apb # results.
   1755  1.213       apb #
   1756  1.213       apb # Strictly speaking, we should do the following:
   1757  1.213       apb #
   1758  1.213       apb #    1. build a new version of nbmake in a temporary directory;
   1759  1.213       apb #    2. use the temporary nbmake to create the top level obj directory;
   1760  1.213       apb #    3. use $(getmakevar TOOLDIR) with the temporary nbmake to
   1761  1.265       oki #       get the correct value of TOOLDIR;
   1762  1.214       apb #    4. move the temporary nbmake to ${TOOLDIR}/bin/nbmake.
   1763  1.213       apb #
   1764  1.213       apb # However, people don't like building nbmake unnecessarily if their
   1765  1.213       apb # TOOLDIR has not changed since an earlier build.  We try to avoid
   1766  1.213       apb # rebuilding a temporary version of nbmake by taking some shortcuts to
   1767  1.213       apb # guess a value for TOOLDIR, looking for an existing version of nbmake
   1768  1.213       apb # in that TOOLDIR, and checking whether that nbmake is newer than the
   1769  1.213       apb # sources used to build it.
   1770  1.213       apb #
   1771   1.84     lukem rebuildmake()
   1772   1.84     lukem {
   1773  1.213       apb 	make="$(print_tooldir_make)"
   1774  1.213       apb 	if [ -n "${make}" ] && [ -x "${make}" ]; then
   1775  1.343    rillig 		for f in usr.bin/make/*.[ch]; do
   1776   1.98     lukem 			if [ "${f}" -nt "${make}" ]; then
   1777  1.213       apb 				statusmsg "${make} outdated" \
   1778  1.213       apb 					"(older than ${f}), needs building."
   1779   1.84     lukem 				do_rebuildmake=true
   1780   1.84     lukem 				break
   1781   1.84     lukem 			fi
   1782   1.84     lukem 		done
   1783   1.84     lukem 	else
   1784  1.213       apb 		statusmsg "No \$TOOLDIR/bin/${toolprefix}make, needs building."
   1785   1.84     lukem 		do_rebuildmake=true
   1786   1.84     lukem 	fi
   1787   1.84     lukem 
   1788   1.84     lukem 	# Build bootstrap ${toolprefix}make if needed.
   1789  1.309  christos 	if ! ${do_rebuildmake}; then
   1790  1.309  christos 		return
   1791   1.84     lukem 	fi
   1792  1.341  riastrad 
   1793  1.340     lukem 	# Silent configure with MAKEVERBOSE==0
   1794  1.340     lukem 	if [ ${MAKEVERBOSE:-2} -eq 0 ]; then
   1795  1.340     lukem 		configure_args=--silent
   1796  1.340     lukem 	fi
   1797  1.309  christos 
   1798  1.309  christos 	statusmsg "Bootstrapping ${toolprefix}make"
   1799  1.309  christos 	${runcmd} cd "${tmpdir}"
   1800  1.323       uwe 	${runcmd} env CC="${HOST_CC-cc}" CPPFLAGS="${HOST_CPPFLAGS}" \
   1801  1.323       uwe 		CFLAGS="${HOST_CFLAGS--O}" LDFLAGS="${HOST_LDFLAGS}" \
   1802  1.340     lukem 	    ${HOST_SH} "${TOP}/tools/make/configure" ${configure_args} ||
   1803  1.309  christos 	( cp ${tmpdir}/config.log ${tmpdir}-config.log
   1804  1.309  christos 	      bomb "Configure of ${toolprefix}make failed, see ${tmpdir}-config.log for details" )
   1805  1.309  christos 	${runcmd} ${HOST_SH} buildmake.sh ||
   1806  1.309  christos 	    bomb "Build of ${toolprefix}make failed"
   1807  1.309  christos 	make="${tmpdir}/${toolprefix}make"
   1808  1.309  christos 	${runcmd} cd "${TOP}"
   1809  1.343    rillig 	${runcmd} rm -f usr.bin/make/*.o
   1810  1.309  christos 	done_rebuildmake=true
   1811   1.84     lukem }
   1812   1.84     lukem 
   1813  1.248       apb # validatemakeparams --
   1814  1.248       apb # Perform some late sanity checks, after rebuildmake,
   1815  1.248       apb # but before createmakewrapper or any real work.
   1816  1.248       apb #
   1817  1.257       apb # Creates the top-level obj directory, because that
   1818  1.257       apb # is needed by some of the sanity checks.
   1819  1.257       apb #
   1820  1.369     lukem # Shows status messages reporting the values of several variables.
   1821  1.248       apb #
   1822   1.84     lukem validatemakeparams()
   1823   1.84     lukem {
   1824  1.373     lukem 	# Determine MAKECONF first, and set in the makewrapper.
   1825  1.373     lukem 	# If set in the environment, then use that.
   1826  1.373     lukem 	# else if ./mk.conf exists, then set MAKECONF to that,
   1827  1.373     lukem 	# else use the default from share/mk/bsd.own.mk (/etc/mk.conf).
   1828  1.373     lukem 	#
   1829  1.373     lukem 	if [ -n "${MAKECONF+1}" ]; then
   1830  1.373     lukem 		setmakeenv MAKECONF "${MAKECONF}"
   1831  1.373     lukem 		statusmsg2 "getenv MAKECONF:" "${MAKECONF}"
   1832  1.373     lukem 	elif [ -f "${TOP}/mk.conf" ]; then
   1833  1.373     lukem 		setmakeenv MAKECONF "${TOP}/mk.conf"
   1834  1.373     lukem 		statusmsg2 "mk.conf MAKECONF:" "${MAKECONF}"
   1835  1.373     lukem 	else
   1836  1.373     lukem 		MAKECONF=$(getmakevar MAKECONF)
   1837  1.373     lukem 		setmakeenv MAKECONF "${MAKECONF}"
   1838  1.373     lukem 		statusmsg2 "share/mk MAKECONF:" "${MAKECONF}"
   1839  1.373     lukem 	fi
   1840  1.373     lukem 	if [ -z "${MAKECONF}" ]; then
   1841  1.373     lukem 		bomb "MAKECONF must not be empty"
   1842  1.373     lukem 	elif [ -e "${MAKECONF}" ]; then
   1843  1.257       apb 		statusmsg2 "MAKECONF file:" "${MAKECONF}"
   1844  1.257       apb 	else
   1845  1.257       apb 		statusmsg2 "MAKECONF file:" "${MAKECONF} (File not found)"
   1846  1.257       apb 	fi
   1847  1.257       apb 
   1848  1.275       apb 	# Normalise MKOBJDIRS, MKUNPRIVED, and MKUPDATE.
   1849  1.275       apb 	# These may be set as build.sh options or in "mk.conf".
   1850  1.275       apb 	# Don't export them as they're only used for tests in build.sh.
   1851  1.275       apb 	#
   1852  1.275       apb 	MKOBJDIRS=$(getmakevar MKOBJDIRS)
   1853  1.275       apb 	MKUNPRIVED=$(getmakevar MKUNPRIVED)
   1854  1.275       apb 	MKUPDATE=$(getmakevar MKUPDATE)
   1855  1.275       apb 
   1856  1.275       apb 	# Non-root should always use either the -U or -E flag.
   1857  1.275       apb 	#
   1858  1.275       apb 	if ! ${do_expertmode} && \
   1859  1.275       apb 	    [ "$id_u" -ne 0 ] && \
   1860  1.275       apb 	    [ "${MKUNPRIVED}" = "no" ] ; then
   1861  1.363     lukem 		bomb "-U or -E must be set for build as an unprivileged user"
   1862  1.275       apb 	fi
   1863  1.275       apb 
   1864   1.98     lukem 	if [ "${runcmd}" = "echo" ]; then
   1865   1.84     lukem 		TOOLCHAIN_MISSING=no
   1866   1.84     lukem 		EXTERNAL_TOOLCHAIN=""
   1867   1.84     lukem 	else
   1868  1.210       apb 		TOOLCHAIN_MISSING=$(bomb_getmakevar TOOLCHAIN_MISSING)
   1869  1.210       apb 		EXTERNAL_TOOLCHAIN=$(bomb_getmakevar EXTERNAL_TOOLCHAIN)
   1870   1.84     lukem 	fi
   1871   1.84     lukem 	if [ "${TOOLCHAIN_MISSING}" = "yes" ] && \
   1872   1.86     lukem 	   [ -z "${EXTERNAL_TOOLCHAIN}" ]; then
   1873   1.98     lukem 		${runcmd} echo "ERROR: build.sh (in-tree cross-toolchain) is not yet available for"
   1874   1.98     lukem 		${runcmd} echo "	MACHINE:      ${MACHINE}"
   1875   1.98     lukem 		${runcmd} echo "	MACHINE_ARCH: ${MACHINE_ARCH}"
   1876   1.98     lukem 		${runcmd} echo ""
   1877   1.98     lukem 		${runcmd} echo "All builds for this platform should be done via a traditional make"
   1878   1.98     lukem 		${runcmd} echo "If you wish to use an external cross-toolchain, set"
   1879   1.98     lukem 		${runcmd} echo "	EXTERNAL_TOOLCHAIN=<path to toolchain root>"
   1880   1.98     lukem 		${runcmd} echo "in either the environment or mk.conf and rerun"
   1881   1.98     lukem 		${runcmd} echo "	${progname} $*"
   1882   1.84     lukem 		exit 1
   1883   1.84     lukem 	fi
   1884   1.84     lukem 
   1885  1.106     lukem 	if [ "${MKOBJDIRS}" != "no" ]; then
   1886  1.212       apb 		# Create the top-level object directory.
   1887  1.106     lukem 		#
   1888  1.212       apb 		# "make obj NOSUBDIR=" can handle most cases, but it
   1889  1.212       apb 		# can't handle the case where MAKEOBJDIRPREFIX is set
   1890  1.212       apb 		# while the corresponding directory does not exist
   1891  1.212       apb 		# (rules in <bsd.obj.mk> would abort the build).  We
   1892  1.212       apb 		# therefore have to handle the MAKEOBJDIRPREFIX case
   1893  1.212       apb 		# without invoking "make obj".  The MAKEOBJDIR case
   1894  1.212       apb 		# could be handled either way, but we choose to handle
   1895  1.212       apb 		# it similarly to MAKEOBJDIRPREFIX.
   1896  1.191       apb 		#
   1897  1.212       apb 		if [ -n "${TOP_obj}" ]; then
   1898  1.212       apb 			# It must have been set by the "-M" or "-O"
   1899  1.212       apb 			# command line options, so there's no need to
   1900  1.212       apb 			# use getmakevar
   1901  1.212       apb 			:
   1902  1.212       apb 		elif [ -n "$MAKEOBJDIRPREFIX" ]; then
   1903  1.212       apb 			TOP_obj="$(getmakevar MAKEOBJDIRPREFIX)${TOP}"
   1904  1.212       apb 		elif [ -n "$MAKEOBJDIR" ]; then
   1905  1.212       apb 			TOP_obj="$(getmakevar MAKEOBJDIR)"
   1906  1.212       apb 		fi
   1907  1.212       apb 		if [ -n "$TOP_obj" ]; then
   1908  1.212       apb 			${runcmd} mkdir -p "${TOP_obj}" ||
   1909  1.212       apb 			    bomb "Can't create top level object directory" \
   1910  1.212       apb 					"${TOP_obj}"
   1911  1.212       apb 		else
   1912  1.212       apb 			${runcmd} "${make}" -m ${TOP}/share/mk obj NOSUBDIR= ||
   1913  1.212       apb 			    bomb "Can't create top level object directory" \
   1914  1.212       apb 					"using make obj"
   1915  1.106     lukem 		fi
   1916  1.106     lukem 
   1917  1.212       apb 		# make obj in tools to ensure that the objdir for "tools"
   1918  1.212       apb 		# is available.
   1919  1.106     lukem 		#
   1920   1.98     lukem 		${runcmd} cd tools
   1921   1.98     lukem 		${runcmd} "${make}" -m ${TOP}/share/mk obj NOSUBDIR= ||
   1922   1.98     lukem 		    bomb "Failed to make obj in tools"
   1923   1.98     lukem 		${runcmd} cd "${TOP}"
   1924   1.84     lukem 	fi
   1925   1.80     lukem 
   1926  1.215       apb 	# Find TOOLDIR, DESTDIR, and RELEASEDIR, according to getmakevar,
   1927  1.215       apb 	# and bomb if they have changed from the values we had from the
   1928  1.215       apb 	# command line or environment.
   1929  1.215       apb 	#
   1930  1.212       apb 	# This must be done after creating the top-level object directory.
   1931   1.84     lukem 	#
   1932  1.215       apb 	for var in TOOLDIR DESTDIR RELEASEDIR
   1933  1.215       apb 	do
   1934  1.215       apb 		eval oldval=\"\$${var}\"
   1935  1.215       apb 		newval="$(getmakevar $var)"
   1936  1.215       apb 		if ! $do_expertmode; then
   1937  1.216     enami 			: ${_SRC_TOP_OBJ_:=$(getmakevar _SRC_TOP_OBJ_)}
   1938  1.215       apb 			case "$var" in
   1939  1.215       apb 			DESTDIR)
   1940  1.215       apb 				: ${newval:=${_SRC_TOP_OBJ_}/destdir.${MACHINE}}
   1941  1.217       apb 				makeenv="${makeenv} DESTDIR"
   1942  1.215       apb 				;;
   1943  1.215       apb 			RELEASEDIR)
   1944  1.215       apb 				: ${newval:=${_SRC_TOP_OBJ_}/releasedir}
   1945  1.217       apb 				makeenv="${makeenv} RELEASEDIR"
   1946  1.215       apb 				;;
   1947  1.215       apb 			esac
   1948  1.215       apb 		fi
   1949  1.215       apb 		if [ -n "$oldval" ] && [ "$oldval" != "$newval" ]; then
   1950  1.215       apb 			bomb "Value of ${var} has changed" \
   1951  1.215       apb 				"(was \"${oldval}\", now \"${newval}\")"
   1952  1.215       apb 		fi
   1953  1.215       apb 		eval ${var}=\"\${newval}\"
   1954  1.215       apb 		eval export ${var}
   1955  1.238  pgoyette 		statusmsg2 "${var} path:" "${newval}"
   1956  1.215       apb 	done
   1957  1.215       apb 
   1958  1.215       apb 	# RELEASEMACHINEDIR is just a subdir name, e.g. "i386".
   1959  1.186     lukem 	RELEASEMACHINEDIR=$(getmakevar RELEASEMACHINEDIR)
   1960   1.84     lukem 
   1961   1.84     lukem 	# Check validity of TOOLDIR and DESTDIR.
   1962   1.84     lukem 	#
   1963   1.98     lukem 	if [ -z "${TOOLDIR}" ] || [ "${TOOLDIR}" = "/" ]; then
   1964   1.98     lukem 		bomb "TOOLDIR '${TOOLDIR}' invalid"
   1965   1.84     lukem 	fi
   1966   1.98     lukem 	removedirs="${TOOLDIR}"
   1967   1.15        tv 
   1968   1.98     lukem 	if [ -z "${DESTDIR}" ] || [ "${DESTDIR}" = "/" ]; then
   1969  1.260       apb 		if ${do_distribution} || ${do_release} || \
   1970  1.260       apb 		   [ "${uname_s}" != "NetBSD" ] || \
   1971  1.260       apb 		   [ "${uname_m}" != "${MACHINE}" ]; then
   1972  1.363     lukem 			bomb "DESTDIR must != / for cross builds, or ${progname} 'distribution' or 'release'"
   1973  1.260       apb 		fi
   1974  1.260       apb 		if ! ${do_expertmode}; then
   1975  1.260       apb 			bomb "DESTDIR must != / for non -E (expert) builds"
   1976    1.1        tv 		fi
   1977  1.260       apb 		statusmsg "WARNING: Building to /, in expert mode."
   1978  1.260       apb 		statusmsg "         This may cause your system to break!  Reasons include:"
   1979  1.260       apb 		statusmsg "            - your kernel is not up to date"
   1980  1.260       apb 		statusmsg "            - the libraries or toolchain have changed"
   1981  1.260       apb 		statusmsg "         YOU HAVE BEEN WARNED!"
   1982   1.84     lukem 	else
   1983   1.98     lukem 		removedirs="${removedirs} ${DESTDIR}"
   1984   1.84     lukem 	fi
   1985  1.105     lukem 	if ${do_releasekernel} && [ -z "${RELEASEDIR}" ]; then
   1986  1.363     lukem 		bomb "Must set RELEASEDIR with 'releasekernel=...'"
   1987  1.105     lukem 	fi
   1988  1.185       apb 
   1989  1.185       apb 	# If a previous build.sh run used -U (and therefore created a
   1990  1.185       apb 	# METALOG file), then most subsequent build.sh runs must also
   1991  1.185       apb 	# use -U.  If DESTDIR is about to be removed, then don't perform
   1992  1.185       apb 	# this check.
   1993  1.185       apb 	#
   1994  1.185       apb 	case "${do_removedirs} ${removedirs} " in
   1995  1.185       apb 	true*" ${DESTDIR} "*)
   1996  1.185       apb 		# DESTDIR is about to be removed
   1997  1.185       apb 		;;
   1998  1.185       apb 	*)
   1999  1.260       apb 		if [ -e "${DESTDIR}/METALOG" ] && \
   2000  1.185       apb 		    [ "${MKUNPRIVED}" = "no" ] ; then
   2001  1.185       apb 			if $do_expertmode; then
   2002  1.363     lukem 				warning "A previous build.sh run specified -U"
   2003  1.185       apb 			else
   2004  1.363     lukem 				bomb "A previous build.sh run specified -U; you must specify it again now"
   2005  1.185       apb 			fi
   2006  1.185       apb 		fi
   2007  1.185       apb 		;;
   2008  1.185       apb 	esac
   2009  1.254   tsutsui 
   2010  1.254   tsutsui 	# live-image and install-image targets require binary sets
   2011  1.254   tsutsui 	# (actually DESTDIR/etc/mtree/set.* files) built with MKUNPRIVED.
   2012  1.254   tsutsui 	# If release operation is specified with live-image or install-image,
   2013  1.254   tsutsui 	# the release op should be performed with -U for later image ops.
   2014  1.254   tsutsui 	#
   2015  1.254   tsutsui 	if ${do_release} && ( ${do_live_image} || ${do_install_image} ) && \
   2016  1.254   tsutsui 	    [ "${MKUNPRIVED}" = "no" ] ; then
   2017  1.363     lukem 		bomb "-U must be specified on building release to create images later"
   2018  1.254   tsutsui 	fi
   2019   1.84     lukem }
   2020   1.30       jmc 
   2021   1.15        tv 
   2022   1.84     lukem createmakewrapper()
   2023   1.84     lukem {
   2024   1.84     lukem 	# Remove the target directories.
   2025   1.84     lukem 	#
   2026   1.98     lukem 	if ${do_removedirs}; then
   2027   1.98     lukem 		for f in ${removedirs}; do
   2028   1.98     lukem 			statusmsg "Removing ${f}"
   2029   1.98     lukem 			${runcmd} rm -r -f "${f}"
   2030   1.84     lukem 		done
   2031   1.84     lukem 	fi
   2032   1.15        tv 
   2033   1.84     lukem 	# Recreate $TOOLDIR.
   2034   1.84     lukem 	#
   2035   1.98     lukem 	${runcmd} mkdir -p "${TOOLDIR}/bin" ||
   2036   1.98     lukem 	    bomb "mkdir of '${TOOLDIR}/bin' failed"
   2037   1.84     lukem 
   2038  1.214       apb 	# If we did not previously rebuild ${toolprefix}make, then
   2039  1.214       apb 	# check whether $make is still valid and the same as the output
   2040  1.214       apb 	# from print_tooldir_make.  If not, then rebuild make now.  A
   2041  1.214       apb 	# possible reason for this being necessary is that the actual
   2042  1.214       apb 	# value of TOOLDIR might be different from the value guessed
   2043  1.214       apb 	# before the top level obj dir was created.
   2044  1.214       apb 	#
   2045  1.214       apb 	if ! ${done_rebuildmake} && \
   2046  1.214       apb 	    ( [ ! -x "$make" ] || [ "$make" != "$(print_tooldir_make)" ] )
   2047  1.214       apb 	then
   2048  1.214       apb 		rebuildmake
   2049  1.214       apb 	fi
   2050  1.214       apb 
   2051   1.84     lukem 	# Install ${toolprefix}make if it was built.
   2052   1.84     lukem 	#
   2053  1.211       apb 	if ${done_rebuildmake}; then
   2054   1.98     lukem 		${runcmd} rm -f "${TOOLDIR}/bin/${toolprefix}make"
   2055   1.98     lukem 		${runcmd} cp "${make}" "${TOOLDIR}/bin/${toolprefix}make" ||
   2056   1.98     lukem 		    bomb "Failed to install \$TOOLDIR/bin/${toolprefix}make"
   2057   1.98     lukem 		make="${TOOLDIR}/bin/${toolprefix}make"
   2058   1.98     lukem 		statusmsg "Created ${make}"
   2059   1.84     lukem 	fi
   2060   1.15        tv 
   2061   1.84     lukem 	# Build a ${toolprefix}make wrapper script, usable by hand as
   2062   1.84     lukem 	# well as by build.sh.
   2063   1.84     lukem 	#
   2064   1.98     lukem 	if [ -z "${makewrapper}" ]; then
   2065  1.102     lukem 		makewrapper="${TOOLDIR}/bin/${toolprefix}make-${makewrappermachine:-${MACHINE}}"
   2066   1.98     lukem 		[ -z "${BUILDID}" ] || makewrapper="${makewrapper}-${BUILDID}"
   2067   1.52   thorpej 	fi
   2068    1.4        tv 
   2069   1.98     lukem 	${runcmd} rm -f "${makewrapper}"
   2070   1.98     lukem 	if [ "${runcmd}" = "echo" ]; then
   2071   1.98     lukem 		echo 'cat <<EOF >'${makewrapper}
   2072   1.84     lukem 		makewrapout=
   2073   1.84     lukem 	else
   2074   1.98     lukem 		makewrapout=">>\${makewrapper}"
   2075   1.84     lukem 	fi
   2076   1.18        tv 
   2077  1.139     isaki 	case "${KSH_VERSION:-${SH_VERSION}}" in
   2078  1.149   jnemeth 	*PD\ KSH*|*MIRBSD\ KSH*)
   2079  1.135     isaki 		set +o braceexpand
   2080  1.135     isaki 		;;
   2081  1.135     isaki 	esac
   2082  1.135     isaki 
   2083   1.98     lukem 	eval cat <<EOF ${makewrapout}
   2084  1.153       apb #! ${HOST_SH}
   2085    1.4        tv # Set proper variables to allow easy "make" building of a NetBSD subtree.
   2086  1.383    martin # Generated from:  \$NetBSD: build.sh,v 1.383 2024/12/20 14:05:54 martin Exp $
   2087  1.130       jmc # with these arguments: ${_args}
   2088    1.4        tv #
   2089  1.177  uebayasi 
   2090   1.18        tv EOF
   2091  1.177  uebayasi 	{
   2092  1.285       apb 		sorted_vars="$(for var in ${makeenv}; do echo "${var}" ; done \
   2093  1.285       apb 			| sort -u )"
   2094  1.285       apb 		for var in ${sorted_vars}; do
   2095  1.285       apb 			eval val=\"\${${var}}\"
   2096  1.285       apb 			eval is_set=\"\${${var}+set}\"
   2097  1.285       apb 			if [ -z "${is_set}" ]; then
   2098  1.285       apb 				echo "unset ${var}"
   2099  1.177  uebayasi 			else
   2100  1.285       apb 				qval="$(shell_quote "${val}")"
   2101  1.285       apb 				echo "${var}=${qval}; export ${var}"
   2102  1.177  uebayasi 			fi
   2103  1.177  uebayasi 		done
   2104   1.18        tv 
   2105  1.285       apb 		cat <<EOF
   2106   1.18        tv 
   2107   1.98     lukem exec "\${TOOLDIR}/bin/${toolprefix}make" \${1+"\$@"}
   2108    1.4        tv EOF
   2109  1.285       apb 	} | eval cat "${makewrapout}"
   2110   1.98     lukem 	[ "${runcmd}" = "echo" ] && echo EOF
   2111   1.98     lukem 	${runcmd} chmod +x "${makewrapper}"
   2112  1.238  pgoyette 	statusmsg2 "Updated makewrapper:" "${makewrapper}"
   2113   1.84     lukem }
   2114   1.84     lukem 
   2115  1.203     lukem make_in_dir()
   2116  1.203     lukem {
   2117  1.312  christos 	local dir="$1"
   2118  1.312  christos 	local op="$2"
   2119  1.203     lukem 	${runcmd} cd "${dir}" ||
   2120  1.203     lukem 	    bomb "Failed to cd to \"${dir}\""
   2121  1.203     lukem 	${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2122  1.203     lukem 	    bomb "Failed to make ${op} in \"${dir}\""
   2123  1.203     lukem 	${runcmd} cd "${TOP}" ||
   2124  1.203     lukem 	    bomb "Failed to cd back to \"${TOP}\""
   2125  1.203     lukem }
   2126  1.203     lukem 
   2127   1.84     lukem buildtools()
   2128   1.84     lukem {
   2129   1.98     lukem 	if [ "${MKOBJDIRS}" != "no" ]; then
   2130   1.98     lukem 		${runcmd} "${makewrapper}" ${parallel} obj-tools ||
   2131   1.98     lukem 		    bomb "Failed to make obj-tools"
   2132   1.84     lukem 	fi
   2133  1.124     lukem 	if [ "${MKUPDATE}" = "no" ]; then
   2134  1.203     lukem 		make_in_dir tools cleandir
   2135   1.84     lukem 	fi
   2136  1.259     joerg 	make_in_dir tools build_install
   2137   1.98     lukem 	statusmsg "Tools built to ${TOOLDIR}"
   2138   1.84     lukem }
   2139    1.4        tv 
   2140  1.329  christos buildlibs()
   2141  1.329  christos {
   2142  1.329  christos 	if [ "${MKOBJDIRS}" != "no" ]; then
   2143  1.329  christos 		${runcmd} "${makewrapper}" ${parallel} obj ||
   2144  1.329  christos 		    bomb "Failed to make obj"
   2145  1.329  christos 	fi
   2146  1.329  christos 	if [ "${MKUPDATE}" = "no" ]; then
   2147  1.329  christos 		make_in_dir lib cleandir
   2148  1.329  christos 	fi
   2149  1.329  christos 	make_in_dir . do-distrib-dirs
   2150  1.329  christos 	make_in_dir . includes
   2151  1.329  christos 	make_in_dir . do-lib
   2152  1.329  christos 	statusmsg "libs built"
   2153  1.329  christos }
   2154  1.329  christos 
   2155  1.105     lukem getkernelconf()
   2156   1.84     lukem {
   2157  1.105     lukem 	kernelconf="$1"
   2158  1.114     lukem 	if [ "${MKOBJDIRS}" != "no" ]; then
   2159   1.84     lukem 		# The correct value of KERNOBJDIR might
   2160   1.84     lukem 		# depend on a prior "make obj" in
   2161   1.84     lukem 		# ${KERNSRCDIR}/${KERNARCHDIR}/compile.
   2162   1.84     lukem 		#
   2163   1.98     lukem 		KERNSRCDIR="$(getmakevar KERNSRCDIR)"
   2164   1.98     lukem 		KERNARCHDIR="$(getmakevar KERNARCHDIR)"
   2165  1.203     lukem 		make_in_dir "${KERNSRCDIR}/${KERNARCHDIR}/compile" obj
   2166   1.84     lukem 	fi
   2167   1.98     lukem 	KERNCONFDIR="$(getmakevar KERNCONFDIR)"
   2168   1.98     lukem 	KERNOBJDIR="$(getmakevar KERNOBJDIR)"
   2169  1.105     lukem 	case "${kernelconf}" in
   2170   1.84     lukem 	*/*)
   2171  1.105     lukem 		kernelconfpath="${kernelconf}"
   2172  1.105     lukem 		kernelconfname="${kernelconf##*/}"
   2173   1.84     lukem 		;;
   2174   1.84     lukem 	*)
   2175  1.105     lukem 		kernelconfpath="${KERNCONFDIR}/${kernelconf}"
   2176  1.105     lukem 		kernelconfname="${kernelconf}"
   2177   1.84     lukem 		;;
   2178   1.84     lukem 	esac
   2179  1.105     lukem 	kernelbuildpath="${KERNOBJDIR}/${kernelconfname}"
   2180  1.105     lukem }
   2181  1.105     lukem 
   2182  1.264  christos diskimage()
   2183  1.264  christos {
   2184  1.264  christos 	ARG="$(echo $1 | tr '[:lower:]' '[:upper:]')"
   2185  1.341  riastrad 	[ -f "${DESTDIR}/etc/mtree/set.base" ] ||
   2186  1.264  christos 	    bomb "The release binaries must be built first"
   2187  1.264  christos 	kerneldir="${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/kernel"
   2188  1.264  christos 	kernel="${kerneldir}/netbsd-${ARG}.gz"
   2189  1.264  christos 	[ -f "${kernel}" ] ||
   2190  1.264  christos 	    bomb "The kernel ${kernel} must be built first"
   2191  1.264  christos 	make_in_dir "${NETBSDSRCDIR}/etc" "smp_${1}"
   2192  1.264  christos }
   2193  1.264  christos 
   2194  1.105     lukem buildkernel()
   2195  1.105     lukem {
   2196  1.105     lukem 	if ! ${do_tools} && ! ${buildkernelwarned:-false}; then
   2197  1.105     lukem 		# Building tools every time we build a kernel is clearly
   2198  1.105     lukem 		# unnecessary.  We could try to figure out whether rebuilding
   2199  1.105     lukem 		# the tools is necessary this time, but it doesn't seem worth
   2200  1.105     lukem 		# the trouble.  Instead, we say it's the user's responsibility
   2201  1.105     lukem 		# to rebuild the tools if necessary.
   2202  1.105     lukem 		#
   2203  1.105     lukem 		statusmsg "Building kernel without building new tools"
   2204  1.105     lukem 		buildkernelwarned=true
   2205  1.105     lukem 	fi
   2206  1.105     lukem 	getkernelconf $1
   2207  1.238  pgoyette 	statusmsg2 "Building kernel:" "${kernelconf}"
   2208  1.238  pgoyette 	statusmsg2 "Build directory:" "${kernelbuildpath}"
   2209  1.105     lukem 	${runcmd} mkdir -p "${kernelbuildpath}" ||
   2210  1.105     lukem 	    bomb "Cannot mkdir: ${kernelbuildpath}"
   2211  1.124     lukem 	if [ "${MKUPDATE}" = "no" ]; then
   2212  1.203     lukem 		make_in_dir "${kernelbuildpath}" cleandir
   2213   1.16   thorpej 	fi
   2214  1.157    rillig 	[ -x "${TOOLDIR}/bin/${toolprefix}config" ] \
   2215  1.363     lukem 	|| bomb "${TOOLDIR}/bin/${toolprefix}config does not exist. You need to \"$0 tools\" first"
   2216  1.305  uebayasi 	CONFIGOPTS=$(getmakevar CONFIGOPTS)
   2217  1.305  uebayasi 	${runcmd} "${TOOLDIR}/bin/${toolprefix}config" ${CONFIGOPTS} \
   2218  1.305  uebayasi 		-b "${kernelbuildpath}" -s "${TOP}/sys" ${configopts} \
   2219  1.305  uebayasi 		"${kernelconfpath}" ||
   2220  1.105     lukem 	    bomb "${toolprefix}config failed for ${kernelconf}"
   2221  1.203     lukem 	make_in_dir "${kernelbuildpath}" depend
   2222  1.203     lukem 	make_in_dir "${kernelbuildpath}" all
   2223   1.91     lukem 
   2224   1.98     lukem 	if [ "${runcmd}" != "echo" ]; then
   2225  1.105     lukem 		statusmsg "Kernels built from ${kernelconf}:"
   2226  1.105     lukem 		kernlist=$(awk '$1 == "config" { print $2 }' ${kernelconfpath})
   2227   1.91     lukem 		for kern in ${kernlist:-netbsd}; do
   2228  1.105     lukem 			[ -f "${kernelbuildpath}/${kern}" ] && \
   2229  1.105     lukem 			    echo "  ${kernelbuildpath}/${kern}"
   2230   1.98     lukem 		done | tee -a "${results}"
   2231   1.91     lukem 	fi
   2232   1.84     lukem }
   2233   1.84     lukem 
   2234  1.105     lukem releasekernel()
   2235  1.105     lukem {
   2236  1.105     lukem 	getkernelconf $1
   2237  1.186     lukem 	kernelreldir="${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/kernel"
   2238  1.105     lukem 	${runcmd} mkdir -p "${kernelreldir}"
   2239  1.105     lukem 	kernlist=$(awk '$1 == "config" { print $2 }' ${kernelconfpath})
   2240  1.105     lukem 	for kern in ${kernlist:-netbsd}; do
   2241  1.105     lukem 		builtkern="${kernelbuildpath}/${kern}"
   2242  1.105     lukem 		[ -f "${builtkern}" ] || continue
   2243  1.105     lukem 		releasekern="${kernelreldir}/${kern}-${kernelconfname}.gz"
   2244  1.238  pgoyette 		statusmsg2 "Kernel copy:" "${releasekern}"
   2245  1.196     lukem 		if [ "${runcmd}" = "echo" ]; then
   2246  1.196     lukem 			echo "gzip -c -9 < ${builtkern} > ${releasekern}"
   2247  1.196     lukem 		else
   2248  1.196     lukem 			gzip -c -9 < "${builtkern}" > "${releasekern}"
   2249  1.196     lukem 		fi
   2250  1.105     lukem 	done
   2251  1.105     lukem }
   2252  1.105     lukem 
   2253  1.300  uebayasi buildkernels()
   2254  1.300  uebayasi {
   2255  1.306  christos 	allkernels=$( runcmd= make_in_dir etc '-V ${ALL_KERNELS}' )
   2256  1.300  uebayasi 	for k in $allkernels; do
   2257  1.300  uebayasi 		buildkernel "${k}"
   2258  1.300  uebayasi 	done
   2259  1.300  uebayasi }
   2260  1.300  uebayasi 
   2261  1.207   jnemeth buildmodules()
   2262  1.207   jnemeth {
   2263  1.234      morr 	setmakeenv MKBINUTILS no
   2264  1.207   jnemeth 	if ! ${do_tools} && ! ${buildmoduleswarned:-false}; then
   2265  1.207   jnemeth 		# Building tools every time we build modules is clearly
   2266  1.207   jnemeth 		# unnecessary as well as a kernel.
   2267  1.207   jnemeth 		#
   2268  1.207   jnemeth 		statusmsg "Building modules without building new tools"
   2269  1.207   jnemeth 		buildmoduleswarned=true
   2270  1.207   jnemeth 	fi
   2271  1.207   jnemeth 
   2272  1.207   jnemeth 	statusmsg "Building kernel modules for NetBSD/${MACHINE} ${DISTRIBVER}"
   2273  1.207   jnemeth 	if [ "${MKOBJDIRS}" != "no" ]; then
   2274  1.256   tsutsui 		make_in_dir sys/modules obj
   2275  1.207   jnemeth 	fi
   2276  1.207   jnemeth 	if [ "${MKUPDATE}" = "no" ]; then
   2277  1.207   jnemeth 		make_in_dir sys/modules cleandir
   2278  1.207   jnemeth 	fi
   2279  1.256   tsutsui 	make_in_dir sys/modules dependall
   2280  1.256   tsutsui 	make_in_dir sys/modules install
   2281  1.207   jnemeth 
   2282  1.236  pgoyette 	statusmsg "Successful build of kernel modules for NetBSD/${MACHINE} ${DISTRIBVER}"
   2283  1.207   jnemeth }
   2284  1.207   jnemeth 
   2285  1.335  jmcneill builddtb()
   2286  1.335  jmcneill {
   2287  1.335  jmcneill 	statusmsg "Building devicetree blobs for NetBSD/${MACHINE} ${DISTRIBVER}"
   2288  1.335  jmcneill 	if [ "${MKOBJDIRS}" != "no" ]; then
   2289  1.335  jmcneill 		make_in_dir sys/dtb obj
   2290  1.335  jmcneill 	fi
   2291  1.335  jmcneill 	if [ "${MKUPDATE}" = "no" ]; then
   2292  1.335  jmcneill 		make_in_dir sys/dtb cleandir
   2293  1.335  jmcneill 	fi
   2294  1.335  jmcneill 	make_in_dir sys/dtb dependall
   2295  1.335  jmcneill 	make_in_dir sys/dtb install
   2296  1.335  jmcneill 
   2297  1.335  jmcneill 	statusmsg "Successful build of devicetree blobs for NetBSD/${MACHINE} ${DISTRIBVER}"
   2298  1.335  jmcneill }
   2299  1.335  jmcneill 
   2300  1.380  riastrad buildpkg()
   2301  1.380  riastrad {
   2302  1.380  riastrad 	local catpkg
   2303  1.380  riastrad 	local pkgroot
   2304  1.380  riastrad 	local makejobsarg
   2305  1.380  riastrad 	local makejobsvar
   2306  1.380  riastrad 	local quiet
   2307  1.380  riastrad 	local opsys_version
   2308  1.380  riastrad 
   2309  1.380  riastrad 	catpkg="$1"
   2310  1.380  riastrad 
   2311  1.380  riastrad 	pkgroot="${TOP_objdir:-${TOP}}/pkgroot"
   2312  1.380  riastrad 	${runcmd} mkdir -p "${pkgroot}" ||
   2313  1.380  riastrad 	    bomb "Can't create package root" "${pkgroot}"
   2314  1.380  riastrad 
   2315  1.380  riastrad 	# Get a symlink-free absolute path to pkg -- pkgsrc wants this.
   2316  1.380  riastrad 	#
   2317  1.380  riastrad 	# XXX See TOP= above regarding pwd -P.
   2318  1.380  riastrad 	pkgroot=$(unset PWD; cd "${pkgroot}" &&
   2319  1.380  riastrad 		((exec pwd -P 2>/dev/null) || (exec pwd 2>/dev/null)))
   2320  1.380  riastrad 
   2321  1.380  riastrad 	case $parallel in
   2322  1.380  riastrad 	"-j "*)
   2323  1.380  riastrad 		makejobsarg="--make-jobs ${parallel#-j }"
   2324  1.380  riastrad 		makejobsvar="MAKE_JOBS=${parallel#-j }"
   2325  1.380  riastrad 		;;
   2326  1.380  riastrad 	*)	makejobsarg=""
   2327  1.380  riastrad 		makejobsvar=""
   2328  1.380  riastrad 		;;
   2329  1.380  riastrad 	esac
   2330  1.380  riastrad 
   2331  1.380  riastrad 	if [ "${MAKEVERBOSE}" -eq 0 ]; then
   2332  1.380  riastrad 		quiet="--quiet"
   2333  1.380  riastrad 	else
   2334  1.380  riastrad 		quiet=""
   2335  1.380  riastrad 	fi
   2336  1.380  riastrad 
   2337  1.380  riastrad 	# Derived from pkgsrc/mk/bsd.prefs.mk rev. 1.451.
   2338  1.380  riastrad 	opsys_version=$(echo "${DISTRIBVER}" |
   2339  1.380  riastrad 		awk -F. '{major=int($1); minor=int($2); if (minor>=100) minor=99; patch=int($3); if (patch>=100) patch=99; printf "%02d%02d%02d", major, minor, patch}')
   2340  1.380  riastrad 
   2341  1.380  riastrad 	# Bootstrap pkgsrc if needed.
   2342  1.380  riastrad 	#
   2343  1.380  riastrad 	# XXX Redo this if it's out-of-date, not just if it's missing.
   2344  1.380  riastrad 	if ! [ -x "${pkgroot}/pkg/bin/bmake" ]; then
   2345  1.380  riastrad 		statusmsg "Bootstrapping pkgsrc"
   2346  1.380  riastrad 
   2347  1.380  riastrad 		cat >"${pkgroot}/mk.conf-fragment" <<EOF
   2348  1.380  riastrad USE_CROSS_COMPILE?=	no
   2349  1.380  riastrad TOOLDIR=		${TOOLDIR}
   2350  1.380  riastrad CROSS_DESTDIR=		${DESTDIR}
   2351  1.380  riastrad CROSS_MACHINE_ARCH=	${MACHINE_ARCH}
   2352  1.380  riastrad CROSS_OPSYS=		NetBSD
   2353  1.380  riastrad CROSS_OS_VERSION=	${DISTRIBVER}
   2354  1.380  riastrad CROSS_OPSYS_VERSION=	${opsys_version}
   2355  1.380  riastrad CROSS_LOWER_OPSYS=	netbsd
   2356  1.380  riastrad CROSS_LOWER_OPSYS_VERSUFFIX=	# empty
   2357  1.380  riastrad CROSS_LOWER_OS_VARIANT=		# empty
   2358  1.380  riastrad CROSS_LOWER_VARIANT_VERSION=	# empty
   2359  1.380  riastrad CROSS_LOWER_VENDOR=		# empty
   2360  1.380  riastrad CROSS_OBJECT_FMT=	ELF
   2361  1.380  riastrad 
   2362  1.380  riastrad ALLOW_VULNERABLE_PACKAGES=	yes
   2363  1.380  riastrad BINPKG_SITES=			# empty
   2364  1.380  riastrad FAILOVER_FETCH=			yes
   2365  1.380  riastrad FETCH_TIMEOUT=			1800
   2366  1.380  riastrad PASSIVE_FETCH=			yes
   2367  1.380  riastrad 
   2368  1.380  riastrad DISTDIR=		${pkgroot}/distfiles
   2369  1.380  riastrad PACKAGES=		${pkgroot}/packages
   2370  1.380  riastrad WRKOBJDIR=		${pkgroot}/work
   2371  1.380  riastrad 
   2372  1.382  riastrad # pkgsrc cross-builds are not set up to support native X, but also part
   2373  1.382  riastrad # of the point of pkgsrc cross-build infrastructure is to not need
   2374  1.382  riastrad # native X any more.
   2375  1.382  riastrad X11_TYPE=		modular
   2376  1.382  riastrad 
   2377  1.380  riastrad .-include "${MAKECONF}"
   2378  1.380  riastrad 
   2379  1.380  riastrad MKDEBUG=		no	# interferes with pkgsrc builds
   2380  1.380  riastrad EOF
   2381  1.380  riastrad 
   2382  1.380  riastrad 		# XXX Set --abi for mips and whatever else needs it?
   2383  1.380  riastrad 		# XXX Unprivileged native tools, privileged cross.
   2384  1.380  riastrad 		(cd "${PKGSRCDIR}" && clearmakeenv && ./bootstrap/bootstrap \
   2385  1.380  riastrad 			${makejobsarg} \
   2386  1.380  riastrad 			--mk-fragment "${pkgroot}/mk.conf-fragment" \
   2387  1.380  riastrad 			--prefix "${pkgroot}/pkg" \
   2388  1.380  riastrad 			${quiet} \
   2389  1.380  riastrad 			--unprivileged \
   2390  1.380  riastrad 			--workdir "${pkgroot}/bootwork") \
   2391  1.380  riastrad 		|| bomb "Failed to bootstrap pkgsrc"
   2392  1.380  riastrad 	fi
   2393  1.380  riastrad 
   2394  1.380  riastrad 	# Build the package.
   2395  1.380  riastrad 	(cd "${PKGSRCDIR}/${catpkg}" && clearmakeenv && \
   2396  1.380  riastrad 		"${pkgroot}/pkg/bin/bmake" package \
   2397  1.380  riastrad 			USE_CROSS_COMPILE=yes \
   2398  1.380  riastrad 			${makejobsvar}) \
   2399  1.380  riastrad 	|| bomb "Failed to build ${catpkg}"
   2400  1.380  riastrad }
   2401  1.380  riastrad 
   2402  1.245  jmcneill installmodules()
   2403  1.245  jmcneill {
   2404  1.245  jmcneill 	dir="$1"
   2405  1.245  jmcneill 	${runcmd} "${makewrapper}" INSTALLMODULESDIR="${dir}" installmodules ||
   2406  1.245  jmcneill 	    bomb "Failed to make installmodules to ${dir}"
   2407  1.245  jmcneill 	statusmsg "Successful installmodules to ${dir}"
   2408  1.245  jmcneill }
   2409  1.245  jmcneill 
   2410   1.84     lukem installworld()
   2411   1.84     lukem {
   2412   1.84     lukem 	dir="$1"
   2413   1.98     lukem 	${runcmd} "${makewrapper}" INSTALLWORLDDIR="${dir}" installworld ||
   2414   1.98     lukem 	    bomb "Failed to make installworld to ${dir}"
   2415   1.98     lukem 	statusmsg "Successful installworld to ${dir}"
   2416   1.84     lukem }
   2417   1.84     lukem 
   2418  1.219     pooka # Run rump build&link tests.
   2419  1.219     pooka #
   2420  1.219     pooka # To make this feasible for running without having to install includes and
   2421  1.219     pooka # libraries into destdir (i.e. quick), we only run ld.  This is possible
   2422  1.219     pooka # since the rump kernel is a closed namespace apart from calls to rumpuser.
   2423  1.219     pooka # Therefore, if ld complains only about rumpuser symbols, rump kernel
   2424  1.219     pooka # linking was successful.
   2425  1.246       wiz #
   2426  1.219     pooka # We test that rump links with a number of component configurations.
   2427  1.219     pooka # These attempt to mimic what is encountered in the full build.
   2428  1.219     pooka # See list below.  The list should probably be either autogenerated
   2429  1.246       wiz # or managed elsewhere; keep it here until a better idea arises.
   2430  1.219     pooka #
   2431  1.219     pooka # Above all, note that THIS IS NOT A SUBSTITUTE FOR A FULL BUILD.
   2432  1.219     pooka #
   2433  1.219     pooka 
   2434  1.367       uwe # XXX: uwe: kern/56599 - while riastradh addressed librump problems,
   2435  1.367       uwe # there are still unwanted dependencies:
   2436  1.367       uwe #    net -> net_net
   2437  1.367       uwe #    vfs -> fifo
   2438  1.367       uwe 
   2439  1.367       uwe # -lrumpvfs -> $LRUMPVFS for now
   2440  1.367       uwe LRUMPVFS="-lrumpvfs -lrumpvfs_nofifofs"
   2441  1.367       uwe 
   2442  1.367       uwe RUMP_LIBSETS="
   2443  1.367       uwe 	-lrump,
   2444  1.367       uwe         -lrumpvfs
   2445  1.367       uwe             --no-whole-archive -lrumpvfs_nofifofs -lrump,
   2446  1.367       uwe 	-lrumpkern_tty
   2447  1.367       uwe             --no-whole-archive $LRUMPVFS -lrump,
   2448  1.367       uwe 	-lrumpfs_tmpfs
   2449  1.367       uwe             --no-whole-archive $LRUMPVFS -lrump,
   2450  1.367       uwe 	-lrumpfs_ffs -lrumpfs_msdos
   2451  1.368       uwe             --no-whole-archive $LRUMPVFS -lrumpdev_disk -lrumpdev -lrump,
   2452  1.341  riastrad 	-lrumpnet_virtif -lrumpnet_netinet -lrumpnet_net -lrumpnet
   2453  1.367       uwe 	    --no-whole-archive -lrump,
   2454  1.367       uwe 	-lrumpfs_nfs
   2455  1.367       uwe 	    --no-whole-archive $LRUMPVFS
   2456  1.367       uwe 	    -lrumpnet_sockin -lrumpnet_virtif -lrumpnet_netinet
   2457  1.367       uwe             --start-group -lrumpnet_net -lrumpnet --end-group -lrump,
   2458  1.367       uwe 	-lrumpdev_cgd -lrumpdev_raidframe -lrumpdev_rnd -lrumpdev_dm
   2459  1.368       uwe             --no-whole-archive $LRUMPVFS -lrumpdev_disk -lrumpdev -lrumpkern_crypto -lrump
   2460  1.367       uwe "
   2461  1.367       uwe 
   2462  1.219     pooka dorump()
   2463  1.219     pooka {
   2464  1.219     pooka 	local doclean=""
   2465  1.219     pooka 	local doobjs=""
   2466  1.219     pooka 
   2467  1.273     pooka 	export RUMPKERN_ONLY=1
   2468  1.227     pooka 	# create obj and distrib dirs
   2469  1.228     pooka 	if [ "${MKOBJDIRS}" != "no" ]; then
   2470  1.228     pooka 		make_in_dir "${NETBSDSRCDIR}/etc/mtree" obj
   2471  1.228     pooka 		make_in_dir "${NETBSDSRCDIR}/sys/rump" obj
   2472  1.228     pooka 	fi
   2473  1.227     pooka 	${runcmd} "${makewrapper}" ${parallel} do-distrib-dirs \
   2474  1.363     lukem 	    || bomb "Could not create distrib-dirs"
   2475  1.227     pooka 
   2476  1.219     pooka 	[ "${MKUPDATE}" = "no" ] && doclean="cleandir"
   2477  1.219     pooka 	targlist="${doclean} ${doobjs} dependall install"
   2478  1.219     pooka 	# optimize: for test we build only static libs (3x test speedup)
   2479  1.219     pooka 	if [ "${1}" = "rumptest" ] ; then
   2480  1.219     pooka 		setmakeenv NOPIC 1
   2481  1.219     pooka 		setmakeenv NOPROFILE 1
   2482  1.219     pooka 	fi
   2483  1.219     pooka 	for cmd in ${targlist} ; do
   2484  1.219     pooka 		make_in_dir "${NETBSDSRCDIR}/sys/rump" ${cmd}
   2485  1.219     pooka 	done
   2486  1.219     pooka 
   2487  1.219     pooka 	# if we just wanted to build & install rump, we're done
   2488  1.219     pooka 	[ "${1}" != "rumptest" ] && return
   2489  1.219     pooka 
   2490  1.221     pooka 	${runcmd} cd "${NETBSDSRCDIR}/sys/rump/librump/rumpkern" \
   2491  1.221     pooka 	    || bomb "cd to rumpkern failed"
   2492  1.221     pooka 	md_quirks=`${runcmd} "${makewrapper}" -V '${_SYMQUIRK}'`
   2493  1.221     pooka 	# one little, two little, three little backslashes ...
   2494  1.231      hans 	md_quirks="$(echo ${md_quirks} | sed 's,\\,\\\\,g'";s/'//g" )"
   2495  1.221     pooka 	${runcmd} cd "${TOP}" || bomb "cd to ${TOP} failed"
   2496  1.219     pooka 	tool_ld=`${runcmd} "${makewrapper}" -V '${LD}'`
   2497  1.221     pooka 
   2498  1.219     pooka 	local oIFS="${IFS}"
   2499  1.219     pooka 	IFS=","
   2500  1.219     pooka 	for set in ${RUMP_LIBSETS} ; do
   2501  1.219     pooka 		IFS="${oIFS}"
   2502  1.219     pooka 		${runcmd} ${tool_ld} -nostdlib -L${DESTDIR}/usr/lib	\
   2503  1.367       uwe 		    -static --whole-archive ${set} --no-whole-archive -lpthread -lc 2>&1 -o /tmp/rumptest.$$ | \
   2504  1.221     pooka 		      awk -v quirks="${md_quirks}" '
   2505  1.219     pooka 			/undefined reference/ &&
   2506  1.219     pooka 			    !/more undefined references.*follow/{
   2507  1.221     pooka 				if (match($NF,
   2508  1.266     pooka 				    "`(rumpuser_|rumpcomp_|__" quirks ")") == 0)
   2509  1.219     pooka 					fails[NR] = $0
   2510  1.221     pooka 			}
   2511  1.230     pooka 			/cannot find -l/{fails[NR] = $0}
   2512  1.241     pooka 			/cannot open output file/{fails[NR] = $0}
   2513  1.219     pooka 			END{
   2514  1.219     pooka 				for (x in fails)
   2515  1.219     pooka 					print fails[x]
   2516  1.219     pooka 				exit x!=0
   2517  1.219     pooka 			}'
   2518  1.219     pooka 		[ $? -ne 0 ] && bomb "Testlink of rump failed: ${set}"
   2519  1.219     pooka 	done
   2520  1.219     pooka 	statusmsg "Rump build&link tests successful"
   2521  1.219     pooka }
   2522   1.84     lukem 
   2523  1.351  christos repro_date() {
   2524  1.359    andvar 	# try the bsd date fail back the linux one
   2525  1.352  christos 	date -u -r "$1" 2> /dev/null || date -u -d "@$1"
   2526  1.351  christos }
   2527  1.351  christos 
   2528  1.312  christos setup_mkrepro()
   2529  1.312  christos {
   2530  1.356    martin 	local quiet="$1"
   2531  1.356    martin 
   2532  1.312  christos 	if [ ${MKREPRO-no} != "yes" ]; then
   2533  1.312  christos 		return
   2534  1.312  christos 	fi
   2535  1.356    martin 	if [ ${MKREPRO_TIMESTAMP-0} -ne 0 ]; then
   2536  1.383    martin 		return
   2537  1.356    martin 	fi
   2538  1.349  christos 
   2539  1.314  christos 	local dirs=${NETBSDSRCDIR-/usr/src}/
   2540  1.312  christos 	if [ ${MKX11-no} = "yes" ]; then
   2541  1.314  christos 		dirs="$dirs ${X11SRCDIR-/usr/xsrc}/"
   2542  1.312  christos 	fi
   2543  1.349  christos 
   2544  1.349  christos 	MKREPRO_TIMESTAMP=0
   2545  1.383    martin 	NETBSD_REVISIONID=
   2546  1.349  christos 	local d
   2547  1.349  christos 	local t
   2548  1.383    martin 	local tag
   2549  1.349  christos 	local vcs
   2550  1.349  christos 	for d in ${dirs}; do
   2551  1.349  christos 		if [ -d "${d}CVS" ]; then
   2552  1.366    martin 			local cvslatest=$(print_tooldir_program cvslatest)
   2553  1.366    martin 			if [ ! -x "${cvslatest}" ]; then
   2554  1.366    martin 				buildtools
   2555  1.366    martin 			fi
   2556  1.383    martin 			local nbdate=$(print_tooldir_program date)
   2557  1.366    martin 
   2558  1.366    martin 			local cvslatestflags=
   2559  1.366    martin 			if ${do_expertmode}; then
   2560  1.366    martin 				cvslatestflags=-i
   2561  1.366    martin 			fi
   2562  1.366    martin 
   2563  1.349  christos 			t=$("${cvslatest}" ${cvslatestflags} "${d}")
   2564  1.383    martin 			if [ -f "${d}CVS/Tag" ]; then
   2565  1.383    martin 				tag=$( sed 's/^T//' < "${d}CVS/Tag" )
   2566  1.383    martin 			else
   2567  1.383    martin 				tag=HEAD
   2568  1.383    martin 			fi
   2569  1.383    martin 			NETBSD_REVISIONID="${tag}-"$(${nbdate} -u -r ${t} '+%Y%m%d%H%M%S')
   2570  1.349  christos 			vcs=cvs
   2571  1.374   khorben 		elif [ -d "${d}.git" -o -f "${d}.git" ]; then
   2572  1.349  christos 			t=$(cd "${d}" && git log -1 --format=%ct)
   2573  1.383    martin 			NETBSD_REVISIONID=$(cd "${d}" && git log -1 --format=%H)
   2574  1.349  christos 			vcs=git
   2575  1.349  christos 		elif [ -d "${d}.hg" ]; then
   2576  1.357     joerg 			t=$(hg --repo "$d" log -r . --template '{date.unixtime}\n')
   2577  1.383    martin 			NETBSD_REVISIONID=$(hg --repo "$d" identify --template '{id}\n')
   2578  1.357     joerg 			vcs=hg
   2579  1.357     joerg 		elif [ -f "${d}.hg_archival.txt" ]; then
   2580  1.357     joerg 			local stat=$(print_tooldir_program stat)
   2581  1.366    martin 			if [ ! -x "${stat}" ]; then
   2582  1.366    martin 				buildtools
   2583  1.366    martin 			fi
   2584  1.366    martin 
   2585  1.357     joerg 			t=$("${stat}" -t '%s' -f '%m' "${d}.hg_archival.txt")
   2586  1.383    martin 			NETBSD_REVISIONID=$(awk '/^node:/ { print $2 }' < "${d}.hg_archival.txt")
   2587  1.349  christos 			vcs=hg
   2588  1.349  christos 		else
   2589  1.349  christos 			bomb "Cannot determine VCS for '$d'"
   2590  1.349  christos 		fi
   2591  1.349  christos 
   2592  1.349  christos 		if [ -z "$t" ]; then
   2593  1.349  christos 			bomb "Failed to get timestamp for vcs=$vcs in '$d'"
   2594  1.349  christos 		fi
   2595  1.349  christos 
   2596  1.349  christos 		#echo "latest $d $vcs $t"
   2597  1.349  christos 		if [ "$t" -gt "$MKREPRO_TIMESTAMP" ]; then
   2598  1.349  christos 			MKREPRO_TIMESTAMP="$t"
   2599  1.349  christos 		fi
   2600  1.349  christos 	done
   2601  1.349  christos 
   2602  1.377    martin 	[ "${MKREPRO_TIMESTAMP}" -ne 0 ] || bomb "Failed to compute timestamp"
   2603  1.356    martin 	if [ -z "${quiet}" ]; then
   2604  1.356    martin 		statusmsg2 "MKREPRO_TIMESTAMP" \
   2605  1.356    martin 			"$(repro_date "${MKREPRO_TIMESTAMP}")"
   2606  1.356    martin 	fi
   2607  1.383    martin 	export MKREPRO MKREPRO_TIMESTAMP NETBSD_REVISIONID
   2608  1.312  christos }
   2609  1.312  christos 
   2610   1.84     lukem main()
   2611   1.84     lukem {
   2612   1.84     lukem 	initdefaults
   2613  1.130       jmc 	_args=$@
   2614   1.84     lukem 	parseoptions "$@"
   2615   1.93     lukem 
   2616  1.163       apb 	sanitycheck
   2617  1.163       apb 
   2618   1.93     lukem 	build_start=$(date)
   2619  1.240  pgoyette 	statusmsg2 "${progname} command:" "$0 $*"
   2620  1.238  pgoyette 	statusmsg2 "${progname} started:" "${build_start}"
   2621  1.238  pgoyette 	statusmsg2 "NetBSD version:"   "${DISTRIBVER}"
   2622  1.238  pgoyette 	statusmsg2 "MACHINE:"          "${MACHINE}"
   2623  1.238  pgoyette 	statusmsg2 "MACHINE_ARCH:"     "${MACHINE_ARCH}"
   2624  1.238  pgoyette 	statusmsg2 "Build platform:"   "${uname_s} ${uname_r} ${uname_m}"
   2625  1.238  pgoyette 	statusmsg2 "HOST_SH:"          "${HOST_SH}"
   2626  1.282       apb 	if [ -n "${BUILDID}" ]; then
   2627  1.282       apb 		statusmsg2 "BUILDID:"  "${BUILDID}"
   2628  1.282       apb 	fi
   2629  1.287       apb 	if [ -n "${BUILDINFO}" ]; then
   2630  1.287       apb 		printf "%b\n" "${BUILDINFO}" | \
   2631  1.287       apb 		while read -r line ; do
   2632  1.287       apb 			[ -s "${line}" ] && continue
   2633  1.287       apb 			statusmsg2 "BUILDINFO:"  "${line}"
   2634  1.287       apb 		done
   2635  1.287       apb 	fi
   2636  1.153       apb 
   2637  1.373     lukem 	if [ -n "${MAKECONF+1}" ] && [ -z "${MAKECONF}" ]; then
   2638  1.373     lukem 		bomb "MAKECONF must not be empty"
   2639  1.373     lukem 	fi
   2640  1.373     lukem 
   2641   1.84     lukem 	rebuildmake
   2642   1.84     lukem 	validatemakeparams
   2643   1.84     lukem 	createmakewrapper
   2644  1.316  christos 	setup_mkrepro
   2645   1.84     lukem 
   2646   1.84     lukem 	# Perform the operations.
   2647   1.84     lukem 	#
   2648   1.98     lukem 	for op in ${operations}; do
   2649   1.98     lukem 		case "${op}" in
   2650   1.86     lukem 
   2651   1.86     lukem 		makewrapper)
   2652   1.86     lukem 			# no-op
   2653   1.86     lukem 			;;
   2654   1.84     lukem 
   2655   1.84     lukem 		tools)
   2656   1.84     lukem 			buildtools
   2657   1.84     lukem 			;;
   2658  1.329  christos 		libs)
   2659  1.329  christos 			buildlibs
   2660  1.329  christos 			;;
   2661   1.84     lukem 
   2662  1.125     lukem 		sets)
   2663  1.125     lukem 			statusmsg "Building sets from pre-populated ${DESTDIR}"
   2664  1.125     lukem 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2665  1.125     lukem 			    bomb "Failed to make ${op}"
   2666  1.186     lukem 			setdir=${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets
   2667  1.186     lukem 			statusmsg "Built sets to ${setdir}"
   2668  1.125     lukem 			;;
   2669  1.142       apb 
   2670  1.312  christos 		build|distribution|release)
   2671  1.312  christos 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2672  1.312  christos 			    bomb "Failed to make ${op}"
   2673  1.312  christos 			statusmsg "Successful make ${op}"
   2674  1.312  christos 			;;
   2675  1.312  christos 
   2676  1.371     lukem 		cleandir|obj|sourcesets|syspkgs|params|show-params)
   2677   1.98     lukem 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2678   1.98     lukem 			    bomb "Failed to make ${op}"
   2679   1.98     lukem 			statusmsg "Successful make ${op}"
   2680   1.84     lukem 			;;
   2681   1.84     lukem 
   2682  1.173   jnemeth 		iso-image|iso-image-source)
   2683  1.173   jnemeth 			${runcmd} "${makewrapper}" ${parallel} \
   2684  1.209       apb 			    CDEXTRA="$CDEXTRA" ${op} ||
   2685  1.173   jnemeth 			    bomb "Failed to make ${op}"
   2686  1.173   jnemeth 			statusmsg "Successful make ${op}"
   2687  1.173   jnemeth 			;;
   2688  1.173   jnemeth 
   2689  1.254   tsutsui 		live-image|install-image)
   2690  1.254   tsutsui 			# install-image and live-image require mtree spec files
   2691  1.370     lukem 			# built with MKUNPRIVED.  Assume MKUNPRIVED build has been
   2692  1.254   tsutsui 			# performed if METALOG file is created in DESTDIR.
   2693  1.254   tsutsui 			if [ ! -e "${DESTDIR}/METALOG" ] ; then
   2694  1.363     lukem 				bomb "The release binaries must have been built with -U to create images"
   2695  1.254   tsutsui 			fi
   2696  1.253   tsutsui 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2697  1.253   tsutsui 			    bomb "Failed to make ${op}"
   2698  1.253   tsutsui 			statusmsg "Successful make ${op}"
   2699  1.253   tsutsui 			;;
   2700   1.84     lukem 		kernel=*)
   2701   1.84     lukem 			arg=${op#*=}
   2702   1.84     lukem 			buildkernel "${arg}"
   2703  1.105     lukem 			;;
   2704  1.281    martin 		kernel.gdb=*)
   2705  1.281    martin 			arg=${op#*=}
   2706  1.302  uebayasi 			configopts="-D DEBUG=-g"
   2707  1.302  uebayasi 			buildkernel "${arg}"
   2708  1.302  uebayasi 			;;
   2709  1.105     lukem 		releasekernel=*)
   2710  1.105     lukem 			arg=${op#*=}
   2711  1.105     lukem 			releasekernel "${arg}"
   2712   1.84     lukem 			;;
   2713   1.84     lukem 
   2714  1.300  uebayasi 		kernels)
   2715  1.300  uebayasi 			buildkernels
   2716  1.300  uebayasi 			;;
   2717  1.300  uebayasi 
   2718  1.264  christos 		disk-image=*)
   2719  1.264  christos 			arg=${op#*=}
   2720  1.264  christos 			diskimage "${arg}"
   2721  1.264  christos 			;;
   2722  1.264  christos 
   2723  1.335  jmcneill 		dtb)
   2724  1.335  jmcneill 			builddtb
   2725  1.335  jmcneill 			;;
   2726  1.335  jmcneill 
   2727  1.207   jnemeth 		modules)
   2728  1.207   jnemeth 			buildmodules
   2729  1.207   jnemeth 			;;
   2730  1.207   jnemeth 
   2731  1.380  riastrad 		pkg=*)
   2732  1.380  riastrad 			arg=${op#*=}
   2733  1.380  riastrad 			if ! [ -d "$PKGSRCDIR"/"$arg" ]; then
   2734  1.380  riastrad 				bomb "no such package ${arg}"
   2735  1.380  riastrad 			fi
   2736  1.380  riastrad 			buildpkg "${arg}"
   2737  1.380  riastrad 			;;
   2738  1.380  riastrad 
   2739  1.245  jmcneill 		installmodules=*)
   2740  1.245  jmcneill 			arg=${op#*=}
   2741  1.245  jmcneill 			if [ "${arg}" = "/" ] && \
   2742  1.245  jmcneill 			    (	[ "${uname_s}" != "NetBSD" ] || \
   2743  1.245  jmcneill 				[ "${uname_m}" != "${MACHINE}" ] ); then
   2744  1.363     lukem 				bomb "'${op}' must != / for cross builds"
   2745  1.245  jmcneill 			fi
   2746  1.245  jmcneill 			installmodules "${arg}"
   2747  1.245  jmcneill 			;;
   2748  1.245  jmcneill 
   2749   1.84     lukem 		install=*)
   2750   1.84     lukem 			arg=${op#*=}
   2751   1.85     lukem 			if [ "${arg}" = "/" ] && \
   2752   1.85     lukem 			    (	[ "${uname_s}" != "NetBSD" ] || \
   2753   1.98     lukem 				[ "${uname_m}" != "${MACHINE}" ] ); then
   2754  1.363     lukem 				bomb "'${op}' must != / for cross builds"
   2755   1.85     lukem 			fi
   2756   1.84     lukem 			installworld "${arg}"
   2757   1.70     lukem 			;;
   2758   1.84     lukem 
   2759  1.355  christos 		rump)
   2760  1.355  christos 			make_in_dir . do-distrib-dirs
   2761  1.355  christos 			make_in_dir . includes
   2762  1.355  christos 			make_in_dir lib/csu dependall
   2763  1.355  christos 			make_in_dir lib/csu install
   2764  1.355  christos 			make_in_dir external/gpl3/gcc/lib/libgcc dependall
   2765  1.355  christos 			make_in_dir external/gpl3/gcc/lib/libgcc install
   2766  1.355  christos 			dorump "${op}"
   2767  1.355  christos 			;;
   2768  1.355  christos 
   2769  1.355  christos 		rumptest)
   2770  1.219     pooka 			dorump "${op}"
   2771  1.219     pooka 			;;
   2772  1.219     pooka 
   2773   1.70     lukem 		*)
   2774  1.365     lukem 			bomb "Unknown OPERATION '${op}'"
   2775   1.70     lukem 			;;
   2776   1.84     lukem 
   2777   1.70     lukem 		esac
   2778   1.84     lukem 	done
   2779   1.93     lukem 
   2780  1.238  pgoyette 	statusmsg2 "${progname} ended:" "$(date)"
   2781   1.98     lukem 	if [ -s "${results}" ]; then
   2782   1.98     lukem 		echo "===> Summary of results:"
   2783   1.98     lukem 		sed -e 's/^===>//;s/^/	/' "${results}"
   2784   1.98     lukem 		echo "===> ."
   2785   1.98     lukem 	fi
   2786   1.84     lukem }
   2787   1.84     lukem 
   2788   1.84     lukem main "$@"
   2789