Home | History | Annotate | Line # | Download | only in src
build.sh revision 1.377
      1   1.67   thorpej #! /usr/bin/env sh
      2  1.377    martin #	$NetBSD: build.sh,v 1.377 2024/04/23 07:47:36 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.146       apb 	do_iso_image=false
    561  1.172   jnemeth 	do_iso_image_source=false
    562  1.254   tsutsui 	do_live_image=false
    563  1.254   tsutsui 	do_install_image=false
    564  1.264  christos 	do_disk_image=false
    565  1.107     lukem 	do_params=false
    566  1.371     lukem 	do_show_params=false
    567  1.219     pooka 	do_rump=false
    568  1.335  jmcneill 	do_dtb=false
    569   1.98     lukem 
    570  1.211       apb 	# done_{operation}=true if given operation has been done.
    571  1.211       apb 	#
    572  1.211       apb 	done_rebuildmake=false
    573  1.211       apb 
    574   1.98     lukem 	# Create scratch directory
    575   1.98     lukem 	#
    576   1.98     lukem 	tmpdir="${TMPDIR-/tmp}/nbbuild$$"
    577   1.98     lukem 	mkdir "${tmpdir}" || bomb "Cannot mkdir: ${tmpdir}"
    578   1.98     lukem 	trap "cd /; rm -r -f \"${tmpdir}\"" 0
    579   1.98     lukem 	results="${tmpdir}/build.sh.results"
    580  1.116      jmmv 
    581  1.116      jmmv 	# Set source directories
    582  1.116      jmmv 	#
    583  1.116      jmmv 	setmakeenv NETBSDSRCDIR "${TOP}"
    584  1.136     lukem 
    585  1.233    cegger 	# Make sure KERNOBJDIR is an absolute path if defined
    586  1.233    cegger 	#
    587  1.233    cegger 	case "${KERNOBJDIR}" in
    588  1.233    cegger 	''|/*)	;;
    589  1.233    cegger 	*)	KERNOBJDIR="${TOP}/${KERNOBJDIR}"
    590  1.233    cegger 		setmakeenv KERNOBJDIR "${KERNOBJDIR}"
    591  1.233    cegger 		;;
    592  1.233    cegger 	esac
    593  1.233    cegger 
    594  1.165       apb 	# Find the version of NetBSD
    595  1.165       apb 	#
    596  1.165       apb 	DISTRIBVER="$(${HOST_SH} ${TOP}/sys/conf/osrelease.sh)"
    597  1.165       apb 
    598  1.190     perry 	# Set the BUILDSEED to NetBSD-"N"
    599  1.190     perry 	#
    600  1.190     perry 	setmakeenv BUILDSEED "NetBSD-$(${HOST_SH} ${TOP}/sys/conf/osrelease.sh -m)"
    601  1.190     perry 
    602  1.206     perry 	# Set MKARZERO to "yes"
    603  1.206     perry 	#
    604  1.206     perry 	setmakeenv MKARZERO "yes"
    605  1.206     perry 
    606   1.84     lukem }
    607   1.29       jmc 
    608  1.258       apb # valid_MACHINE_ARCH -- A multi-line string, listing all valid
    609  1.258       apb # MACHINE/MACHINE_ARCH pairs.
    610  1.258       apb #
    611  1.258       apb # Each line contains a MACHINE and MACHINE_ARCH value, an optional ALIAS
    612  1.258       apb # which may be used to refer to the MACHINE/MACHINE_ARCH pair, and an
    613  1.258       apb # optional DEFAULT or NO_DEFAULT keyword.
    614  1.258       apb #
    615  1.258       apb # When a MACHINE corresponds to multiple possible values of
    616  1.258       apb # MACHINE_ARCH, then this table should list all allowed combinations.
    617  1.258       apb # If the MACHINE is associated with a default MACHINE_ARCH (to be
    618  1.258       apb # used when the user specifies the MACHINE but fails to specify the
    619  1.258       apb # MACHINE_ARCH), then one of the lines should have the "DEFAULT"
    620  1.258       apb # keyword.  If there is no default MACHINE_ARCH for a particular
    621  1.258       apb # MACHINE, then there should be a line with the "NO_DEFAULT" keyword,
    622  1.258       apb # and with a blank MACHINE_ARCH.
    623  1.258       apb #
    624  1.258       apb valid_MACHINE_ARCH='
    625  1.328  christos MACHINE=acorn32		MACHINE_ARCH=earmv4	ALIAS=eacorn32 DEFAULT
    626  1.258       apb MACHINE=algor		MACHINE_ARCH=mips64el	ALIAS=algor64
    627  1.258       apb MACHINE=algor		MACHINE_ARCH=mipsel	DEFAULT
    628  1.258       apb MACHINE=alpha		MACHINE_ARCH=alpha
    629  1.258       apb MACHINE=amd64		MACHINE_ARCH=x86_64
    630  1.258       apb MACHINE=amiga		MACHINE_ARCH=m68k
    631  1.258       apb MACHINE=amigappc	MACHINE_ARCH=powerpc
    632  1.258       apb MACHINE=arc		MACHINE_ARCH=mips64el	ALIAS=arc64
    633  1.258       apb MACHINE=arc		MACHINE_ARCH=mipsel	DEFAULT
    634  1.258       apb MACHINE=atari		MACHINE_ARCH=m68k
    635  1.258       apb MACHINE=bebox		MACHINE_ARCH=powerpc
    636  1.286       riz MACHINE=cats		MACHINE_ARCH=earmv4	ALIAS=ecats DEFAULT
    637  1.258       apb MACHINE=cesfic		MACHINE_ARCH=m68k
    638  1.258       apb MACHINE=cobalt		MACHINE_ARCH=mips64el	ALIAS=cobalt64
    639  1.258       apb MACHINE=cobalt		MACHINE_ARCH=mipsel	DEFAULT
    640  1.258       apb MACHINE=dreamcast	MACHINE_ARCH=sh3el
    641  1.258       apb MACHINE=emips		MACHINE_ARCH=mipseb
    642  1.328  christos MACHINE=epoc32		MACHINE_ARCH=earmv4	ALIAS=eepoc32 DEFAULT
    643  1.337  jmcneill MACHINE=evbarm		MACHINE_ARCH=		NO_DEFAULT
    644  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv4	ALIAS=evbearmv4-el	ALIAS=evbarmv4-el
    645  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv4eb	ALIAS=evbearmv4-eb	ALIAS=evbarmv4-eb
    646  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv5	ALIAS=evbearmv5-el	ALIAS=evbarmv5-el
    647  1.339       rin MACHINE=evbarm		MACHINE_ARCH=earmv5hf	ALIAS=evbearmv5hf-el	ALIAS=evbarmv5hf-el
    648  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv5eb	ALIAS=evbearmv5-eb	ALIAS=evbarmv5-eb
    649  1.339       rin MACHINE=evbarm		MACHINE_ARCH=earmv5hfeb	ALIAS=evbearmv5hf-eb	ALIAS=evbarmv5hf-eb
    650  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv6	ALIAS=evbearmv6-el	ALIAS=evbarmv6-el
    651  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv6hf	ALIAS=evbearmv6hf-el	ALIAS=evbarmv6hf-el
    652  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv6eb	ALIAS=evbearmv6-eb	ALIAS=evbarmv6-eb
    653  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv6hfeb	ALIAS=evbearmv6hf-eb	ALIAS=evbarmv6hf-eb
    654  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv7	ALIAS=evbearmv7-el	ALIAS=evbarmv7-el
    655  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv7eb	ALIAS=evbearmv7-eb	ALIAS=evbarmv7-eb
    656  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv7hf	ALIAS=evbearmv7hf-el	ALIAS=evbarmv7hf-el
    657  1.330       mrg MACHINE=evbarm		MACHINE_ARCH=earmv7hfeb	ALIAS=evbearmv7hf-eb	ALIAS=evbarmv7hf-eb
    658  1.337  jmcneill MACHINE=evbarm		MACHINE_ARCH=aarch64	ALIAS=evbarm64-el	ALIAS=evbarm64
    659  1.325       ryo MACHINE=evbarm		MACHINE_ARCH=aarch64eb	ALIAS=evbarm64-eb
    660  1.270      matt MACHINE=evbcf		MACHINE_ARCH=coldfire
    661  1.258       apb MACHINE=evbmips		MACHINE_ARCH=		NO_DEFAULT
    662  1.258       apb MACHINE=evbmips		MACHINE_ARCH=mips64eb	ALIAS=evbmips64-eb
    663  1.258       apb MACHINE=evbmips		MACHINE_ARCH=mips64el	ALIAS=evbmips64-el
    664  1.258       apb MACHINE=evbmips		MACHINE_ARCH=mipseb	ALIAS=evbmips-eb
    665  1.258       apb MACHINE=evbmips		MACHINE_ARCH=mipsel	ALIAS=evbmips-el
    666  1.347  christos MACHINE=evbmips		MACHINE_ARCH=mipsn64eb	ALIAS=evbmipsn64-eb
    667  1.347  christos MACHINE=evbmips		MACHINE_ARCH=mipsn64el	ALIAS=evbmipsn64-el
    668  1.258       apb MACHINE=evbppc		MACHINE_ARCH=powerpc	DEFAULT
    669  1.258       apb MACHINE=evbppc		MACHINE_ARCH=powerpc64	ALIAS=evbppc64
    670  1.258       apb MACHINE=evbsh3		MACHINE_ARCH=		NO_DEFAULT
    671  1.258       apb MACHINE=evbsh3		MACHINE_ARCH=sh3eb	ALIAS=evbsh3-eb
    672  1.258       apb MACHINE=evbsh3		MACHINE_ARCH=sh3el	ALIAS=evbsh3-el
    673  1.258       apb MACHINE=ews4800mips	MACHINE_ARCH=mipseb
    674  1.258       apb MACHINE=hp300		MACHINE_ARCH=m68k
    675  1.276     skrll MACHINE=hppa		MACHINE_ARCH=hppa
    676  1.288       riz MACHINE=hpcarm		MACHINE_ARCH=earmv4	ALIAS=hpcearm DEFAULT
    677  1.258       apb MACHINE=hpcmips		MACHINE_ARCH=mipsel
    678  1.258       apb MACHINE=hpcsh		MACHINE_ARCH=sh3el
    679  1.258       apb MACHINE=i386		MACHINE_ARCH=i386
    680  1.258       apb MACHINE=ia64		MACHINE_ARCH=ia64
    681  1.258       apb MACHINE=ibmnws		MACHINE_ARCH=powerpc
    682  1.286       riz MACHINE=iyonix		MACHINE_ARCH=earm	ALIAS=eiyonix DEFAULT
    683  1.258       apb MACHINE=landisk		MACHINE_ARCH=sh3el
    684  1.258       apb MACHINE=luna68k		MACHINE_ARCH=m68k
    685  1.258       apb MACHINE=mac68k		MACHINE_ARCH=m68k
    686  1.258       apb MACHINE=macppc		MACHINE_ARCH=powerpc	DEFAULT
    687  1.258       apb MACHINE=macppc		MACHINE_ARCH=powerpc64	ALIAS=macppc64
    688  1.258       apb MACHINE=mipsco		MACHINE_ARCH=mipseb
    689  1.258       apb MACHINE=mmeye		MACHINE_ARCH=sh3eb
    690  1.258       apb MACHINE=mvme68k		MACHINE_ARCH=m68k
    691  1.258       apb MACHINE=mvmeppc		MACHINE_ARCH=powerpc
    692  1.286       riz MACHINE=netwinder	MACHINE_ARCH=earmv4	ALIAS=enetwinder DEFAULT
    693  1.258       apb MACHINE=news68k		MACHINE_ARCH=m68k
    694  1.258       apb MACHINE=newsmips	MACHINE_ARCH=mipseb
    695  1.258       apb MACHINE=next68k		MACHINE_ARCH=m68k
    696  1.258       apb MACHINE=ofppc		MACHINE_ARCH=powerpc	DEFAULT
    697  1.258       apb MACHINE=ofppc		MACHINE_ARCH=powerpc64	ALIAS=ofppc64
    698  1.296      matt MACHINE=or1k		MACHINE_ARCH=or1k
    699  1.278    martin MACHINE=playstation2	MACHINE_ARCH=mipsel
    700  1.258       apb MACHINE=pmax		MACHINE_ARCH=mips64el	ALIAS=pmax64
    701  1.258       apb MACHINE=pmax		MACHINE_ARCH=mipsel	DEFAULT
    702  1.258       apb MACHINE=prep		MACHINE_ARCH=powerpc
    703  1.297      matt MACHINE=riscv		MACHINE_ARCH=riscv64	ALIAS=riscv64 DEFAULT
    704  1.297      matt MACHINE=riscv		MACHINE_ARCH=riscv32	ALIAS=riscv32
    705  1.258       apb MACHINE=rs6000		MACHINE_ARCH=powerpc
    706  1.258       apb MACHINE=sandpoint	MACHINE_ARCH=powerpc
    707  1.258       apb MACHINE=sbmips		MACHINE_ARCH=		NO_DEFAULT
    708  1.258       apb MACHINE=sbmips		MACHINE_ARCH=mips64eb	ALIAS=sbmips64-eb
    709  1.258       apb MACHINE=sbmips		MACHINE_ARCH=mips64el	ALIAS=sbmips64-el
    710  1.258       apb MACHINE=sbmips		MACHINE_ARCH=mipseb	ALIAS=sbmips-eb
    711  1.258       apb MACHINE=sbmips		MACHINE_ARCH=mipsel	ALIAS=sbmips-el
    712  1.258       apb MACHINE=sgimips		MACHINE_ARCH=mips64eb	ALIAS=sgimips64
    713  1.258       apb MACHINE=sgimips		MACHINE_ARCH=mipseb	DEFAULT
    714  1.286       riz MACHINE=shark		MACHINE_ARCH=earmv4	ALIAS=eshark DEFAULT
    715  1.258       apb MACHINE=sparc		MACHINE_ARCH=sparc
    716  1.258       apb MACHINE=sparc64		MACHINE_ARCH=sparc64
    717  1.258       apb MACHINE=sun2		MACHINE_ARCH=m68000
    718  1.258       apb MACHINE=sun3		MACHINE_ARCH=m68k
    719  1.258       apb MACHINE=vax		MACHINE_ARCH=vax
    720  1.375   thorpej MACHINE=virt68k		MACHINE_ARCH=m68k
    721  1.258       apb MACHINE=x68k		MACHINE_ARCH=m68k
    722  1.286       riz MACHINE=zaurus		MACHINE_ARCH=earm	ALIAS=ezaurus DEFAULT
    723  1.258       apb '
    724  1.258       apb 
    725  1.258       apb # getarch -- find the default MACHINE_ARCH for a MACHINE,
    726  1.258       apb # or convert an alias to a MACHINE/MACHINE_ARCH pair.
    727  1.258       apb #
    728  1.291       apb # Saves the original value of MACHINE in makewrappermachine before
    729  1.291       apb # alias processing.
    730  1.258       apb #
    731  1.258       apb # Sets MACHINE and MACHINE_ARCH if the input MACHINE value is
    732  1.258       apb # recognised as an alias, or recognised as a machine that has a default
    733  1.258       apb # MACHINE_ARCH (or that has only one possible MACHINE_ARCH).
    734  1.258       apb #
    735  1.258       apb # Leaves MACHINE and MACHINE_ARCH unchanged if MACHINE is recognised
    736  1.258       apb # as being associated with multiple MACHINE_ARCH values with no default.
    737  1.258       apb #
    738  1.258       apb # Bombs if MACHINE is not recognised.
    739  1.258       apb #
    740   1.79     lukem getarch()
    741   1.79     lukem {
    742  1.258       apb 	local IFS
    743  1.258       apb 	local found=""
    744  1.258       apb 	local line
    745  1.258       apb 
    746  1.258       apb 	IFS="${nl}"
    747  1.258       apb 	makewrappermachine="${MACHINE}"
    748  1.258       apb 	for line in ${valid_MACHINE_ARCH}; do
    749  1.258       apb 		line="${line%%#*}" # ignore comments
    750  1.258       apb 		line="$( IFS=" ${tab}" ; echo $line )" # normalise white space
    751  1.258       apb 		case "${line} " in
    752  1.283       apb 		" ")
    753  1.258       apb 			# skip blank lines or comment lines
    754  1.258       apb 			continue
    755  1.258       apb 			;;
    756  1.258       apb 		*" ALIAS=${MACHINE} "*)
    757  1.258       apb 			# Found a line with a matching ALIAS=<alias>.
    758  1.258       apb 			found="$line"
    759  1.258       apb 			break
    760  1.258       apb 			;;
    761  1.258       apb 		"MACHINE=${MACHINE} "*" NO_DEFAULT"*)
    762  1.258       apb 			# Found an explicit "NO_DEFAULT" for this MACHINE.
    763  1.258       apb 			found="$line"
    764  1.258       apb 			break
    765  1.258       apb 			;;
    766  1.258       apb 		"MACHINE=${MACHINE} "*" DEFAULT"*)
    767  1.258       apb 			# Found an explicit "DEFAULT" for this MACHINE.
    768  1.258       apb 			found="$line"
    769  1.258       apb 			break
    770  1.258       apb 			;;
    771  1.258       apb 		"MACHINE=${MACHINE} "*)
    772  1.258       apb 			# Found a line for this MACHINE.  If it's the
    773  1.258       apb 			# first such line, then tentatively accept it.
    774  1.258       apb 			# If it's not the first matching line, then
    775  1.258       apb 			# remember that there was more than one match.
    776  1.258       apb 			case "$found" in
    777  1.258       apb 			'')	found="$line" ;;
    778  1.290       apb 			*)	found="MULTIPLE_MATCHES" ;;
    779  1.258       apb 			esac
    780  1.258       apb 			;;
    781  1.258       apb 		esac
    782  1.258       apb 	done
    783  1.158       apb 
    784  1.258       apb 	case "$found" in
    785  1.258       apb 	*NO_DEFAULT*|*MULTIPLE_MATCHES*)
    786  1.258       apb 		# MACHINE is OK, but MACHINE_ARCH is still unknown
    787  1.258       apb 		return
    788  1.258       apb 		;;
    789  1.258       apb 	"MACHINE="*" MACHINE_ARCH="*)
    790  1.258       apb 		# Obey the MACHINE= and MACHINE_ARCH= parts of the line.
    791  1.258       apb 		IFS=" "
    792  1.258       apb 		for frag in ${found}; do
    793  1.258       apb 			case "$frag" in
    794  1.258       apb 			MACHINE=*|MACHINE_ARCH=*)
    795  1.258       apb 				eval "$frag"
    796  1.258       apb 				;;
    797  1.258       apb 			esac
    798  1.258       apb 		done
    799  1.160      matt 		;;
    800   1.84     lukem 	*)
    801   1.98     lukem 		bomb "Unknown target MACHINE: ${MACHINE}"
    802   1.84     lukem 		;;
    803    1.1        tv 	esac
    804    1.1        tv }
    805    1.1        tv 
    806  1.258       apb # validatearch -- check that the MACHINE/MACHINE_ARCH pair is supported.
    807  1.258       apb #
    808  1.258       apb # Bombs if the pair is not supported.
    809  1.258       apb #
    810   1.79     lukem validatearch()
    811   1.79     lukem {
    812  1.258       apb 	local IFS
    813  1.258       apb 	local line
    814  1.258       apb 	local foundpair=false foundmachine=false foundarch=false
    815  1.258       apb 
    816   1.98     lukem 	case "${MACHINE_ARCH}" in
    817  1.101     lukem 	"")
    818  1.363     lukem 		bomb "No MACHINE_ARCH provided. Use 'build.sh -m ${MACHINE} list-arch' to show options"
    819  1.101     lukem 		;;
    820   1.98     lukem 	esac
    821   1.98     lukem 
    822  1.258       apb 	IFS="${nl}"
    823  1.258       apb 	for line in ${valid_MACHINE_ARCH}; do
    824  1.258       apb 		line="${line%%#*}" # ignore comments
    825  1.258       apb 		line="$( IFS=" ${tab}" ; echo $line )" # normalise white space
    826  1.258       apb 		case "${line} " in
    827  1.283       apb 		" ")
    828  1.258       apb 			# skip blank lines or comment lines
    829  1.258       apb 			continue
    830  1.258       apb 			;;
    831  1.258       apb 		"MACHINE=${MACHINE} MACHINE_ARCH=${MACHINE_ARCH} "*)
    832  1.258       apb 			foundpair=true
    833  1.258       apb 			;;
    834  1.258       apb 		"MACHINE=${MACHINE} "*)
    835  1.258       apb 			foundmachine=true
    836  1.258       apb 			;;
    837  1.258       apb 		*"MACHINE_ARCH=${MACHINE_ARCH} "*)
    838  1.258       apb 			foundarch=true
    839  1.258       apb 			;;
    840  1.258       apb 		esac
    841  1.258       apb 	done
    842   1.98     lukem 
    843  1.258       apb 	case "${foundpair}:${foundmachine}:${foundarch}" in
    844  1.258       apb 	true:*)
    845  1.258       apb 		: OK
    846  1.255      matt 		;;
    847  1.258       apb 	*:false:*)
    848  1.258       apb 		bomb "Unknown target MACHINE: ${MACHINE}"
    849   1.98     lukem 		;;
    850  1.258       apb 	*:*:false)
    851  1.258       apb 		bomb "Unknown target MACHINE_ARCH: ${MACHINE_ARCH}"
    852  1.148       mrg 		;;
    853   1.98     lukem 	*)
    854  1.258       apb 		bomb "MACHINE_ARCH '${MACHINE_ARCH}' does not support MACHINE '${MACHINE}'"
    855   1.84     lukem 		;;
    856   1.47        tv 	esac
    857   1.47        tv }
    858   1.47        tv 
    859  1.292       apb # listarch -- list valid MACHINE/MACHINE_ARCH/ALIAS values,
    860  1.292       apb # optionally restricted to those where the MACHINE and/or MACHINE_ARCH
    861  1.354    andvar # match specified glob patterns.
    862  1.292       apb #
    863  1.292       apb listarch()
    864  1.292       apb {
    865  1.292       apb 	local machglob="$1" archglob="$2"
    866  1.292       apb 	local IFS
    867  1.292       apb 	local wildcard="*"
    868  1.292       apb 	local line xline frag
    869  1.292       apb 	local line_matches_machine line_matches_arch
    870  1.292       apb 	local found=false
    871  1.292       apb 
    872  1.292       apb 	# Empty machglob or archglob should match anything
    873  1.292       apb 	: "${machglob:=${wildcard}}"
    874  1.292       apb 	: "${archglob:=${wildcard}}"
    875  1.292       apb 
    876  1.292       apb 	IFS="${nl}"
    877  1.292       apb 	for line in ${valid_MACHINE_ARCH}; do
    878  1.292       apb 		line="${line%%#*}" # ignore comments
    879  1.292       apb 		xline="$( IFS=" ${tab}" ; echo $line )" # normalise white space
    880  1.292       apb 		[ -z "${xline}" ] && continue # skip blank or comment lines
    881  1.292       apb 
    882  1.292       apb 		line_matches_machine=false
    883  1.292       apb 		line_matches_arch=false
    884  1.292       apb 
    885  1.292       apb 		IFS=" "
    886  1.292       apb 		for frag in ${xline}; do
    887  1.292       apb 			case "${frag}" in
    888  1.292       apb 			MACHINE=${machglob})
    889  1.292       apb 				line_matches_machine=true ;;
    890  1.292       apb 			ALIAS=${machglob})
    891  1.292       apb 				line_matches_machine=true ;;
    892  1.292       apb 			MACHINE_ARCH=${archglob})
    893  1.292       apb 				line_matches_arch=true ;;
    894  1.292       apb 			esac
    895  1.292       apb 		done
    896  1.292       apb 
    897  1.292       apb 		if $line_matches_machine && $line_matches_arch; then
    898  1.292       apb 			found=true
    899  1.292       apb 			echo "$line"
    900  1.292       apb 		fi
    901  1.292       apb 	done
    902  1.292       apb 	if ! $found; then
    903  1.292       apb 		echo >&2 "No match for" \
    904  1.292       apb 		    "MACHINE=${machglob} MACHINE_ARCH=${archglob}"
    905  1.292       apb 		return 1
    906  1.292       apb 	fi
    907  1.292       apb 	return 0
    908  1.292       apb }
    909  1.292       apb 
    910  1.210       apb # nobomb_getmakevar --
    911  1.369     lukem # Given the name of a make variable in $1, show make's idea of the
    912  1.210       apb # value of that variable, or return 1 if there's an error.
    913  1.210       apb #
    914  1.168       apb nobomb_getmakevar()
    915   1.79     lukem {
    916  1.168       apb 	[ -x "${make}" ] || return 1
    917  1.168       apb 	"${make}" -m ${TOP}/share/mk -s -B -f- _x_ <<EOF || return 1
    918   1.15        tv _x_:
    919   1.15        tv 	echo \${$1}
    920   1.15        tv .include <bsd.prog.mk>
    921   1.70     lukem .include <bsd.kernobj.mk>
    922   1.15        tv EOF
    923   1.15        tv }
    924   1.15        tv 
    925  1.250       apb # bomb_getmakevar --
    926  1.369     lukem # Given the name of a make variable in $1, show make's idea of the
    927  1.210       apb # value of that variable, or bomb if there's an error.
    928  1.210       apb #
    929  1.210       apb bomb_getmakevar()
    930  1.168       apb {
    931  1.210       apb 	[ -x "${make}" ] || bomb "bomb_getmakevar $1: ${make} is not executable"
    932  1.210       apb 	nobomb_getmakevar "$1" || bomb "bomb_getmakevar $1: ${make} failed"
    933  1.168       apb }
    934  1.168       apb 
    935  1.250       apb # getmakevar --
    936  1.369     lukem # Given the name of a make variable in $1, show make's idea of the
    937  1.369     lukem # value of that variable, or show a literal '$' followed by the
    938  1.210       apb # variable name if ${make} is not executable.  This is intended for use in
    939  1.210       apb # messages that need to be readable even if $make hasn't been built,
    940  1.210       apb # such as when build.sh is run with the "-n" option.
    941  1.210       apb #
    942   1.98     lukem getmakevar()
    943   1.82     lukem {
    944   1.98     lukem 	if [ -x "${make}" ]; then
    945  1.210       apb 		bomb_getmakevar "$1"
    946   1.82     lukem 	else
    947   1.82     lukem 		echo "\$$1"
    948   1.82     lukem 	fi
    949   1.82     lukem }
    950   1.82     lukem 
    951  1.109     lukem setmakeenv()
    952  1.109     lukem {
    953  1.109     lukem 	eval "$1='$2'; export $1"
    954  1.109     lukem 	makeenv="${makeenv} $1"
    955  1.109     lukem }
    956  1.362     lukem 
    957  1.321       kre safe_setmakeenv()
    958  1.321       kre {
    959  1.321       kre 	case "$1" in
    960  1.321       kre 
    961  1.321       kre 	#	Look for any vars we want to prohibit here, like:
    962  1.321       kre 	# Bad | Dangerous)	usage "Cannot override $1 with -V";;
    963  1.321       kre 
    964  1.321       kre 	# That first char is OK has already been verified.
    965  1.321       kre 	*[!A-Za-z0-9_]*)	usage "Bad variable name (-V): '$1'";;
    966  1.321       kre 	esac
    967  1.321       kre 	setmakeenv "$@"
    968  1.321       kre }
    969  1.109     lukem 
    970  1.111     lukem unsetmakeenv()
    971  1.111     lukem {
    972  1.111     lukem 	eval "unset $1"
    973  1.111     lukem 	makeenv="${makeenv} $1"
    974  1.111     lukem }
    975  1.362     lukem 
    976  1.321       kre safe_unsetmakeenv()
    977  1.321       kre {
    978  1.321       kre 	case "$1" in
    979  1.321       kre 
    980  1.321       kre 	#	Look for any vars user should not be able to unset
    981  1.321       kre 	# Needed | Must_Have)	usage "Variable $1 cannot be unset";;
    982  1.321       kre 
    983  1.321       kre 	[!A-Za-z_]* | *[!A-Za-z0-9_]*)	usage "Bad variable name (-Z): '$1'";;
    984  1.321       kre 	esac
    985  1.321       kre 	unsetmakeenv "$1"
    986  1.321       kre }
    987  1.111     lukem 
    988  1.208       apb # Given a variable name in $1, modify the variable in place as follows:
    989  1.208       apb # For each space-separated word in the variable, call resolvepath.
    990  1.362     lukem #
    991  1.189    dyoung resolvepaths()
    992  1.189    dyoung {
    993  1.208       apb 	local var="$1"
    994  1.208       apb 	local val
    995  1.208       apb 	eval val=\"\${${var}}\"
    996  1.208       apb 	local newval=''
    997  1.208       apb 	local word
    998  1.208       apb 	for word in ${val}; do
    999  1.208       apb 		resolvepath word
   1000  1.208       apb 		newval="${newval}${newval:+ }${word}"
   1001  1.189    dyoung 	done
   1002  1.208       apb 	eval ${var}=\"\${newval}\"
   1003  1.189    dyoung }
   1004  1.189    dyoung 
   1005  1.208       apb # Given a variable name in $1, modify the variable in place as follows:
   1006  1.131  junyoung # Convert possibly-relative path to absolute path by prepending
   1007  1.131  junyoung # ${TOP} if necessary.  Also delete trailing "/", if any.
   1008  1.362     lukem #
   1009   1.79     lukem resolvepath()
   1010   1.79     lukem {
   1011  1.208       apb 	local var="$1"
   1012  1.208       apb 	local val
   1013  1.208       apb 	eval val=\"\${${var}}\"
   1014  1.208       apb 	case "${val}" in
   1015  1.131  junyoung 	/)
   1016  1.131  junyoung 		;;
   1017   1.84     lukem 	/*)
   1018  1.208       apb 		val="${val%/}"
   1019   1.84     lukem 		;;
   1020   1.84     lukem 	*)
   1021  1.208       apb 		val="${TOP}/${val%/}"
   1022   1.84     lukem 		;;
   1023   1.10        tv 	esac
   1024  1.208       apb 	eval ${var}=\"\${val}\"
   1025   1.10        tv }
   1026   1.10        tv 
   1027  1.369     lukem # Show synopsis to stdout.
   1028  1.369     lukem #
   1029  1.363     lukem synopsis()
   1030   1.79     lukem {
   1031   1.70     lukem 	cat <<_usage_
   1032   1.83     lukem 
   1033  1.365     lukem Usage: ${progname} [-EnoPRrUux] [-a ARCH] [-B BID] [-C EXTRAS]
   1034  1.365     lukem                 [-c COMPILER] [-D DEST] [-j NJOB] [-M MOBJ] [-m MACH]
   1035  1.365     lukem                 [-N NOISY] [-O OOBJ] [-R RELEASE] [-S SEED] [-T TOOLS]
   1036  1.365     lukem                 [-V VAR=[VALUE]] [-w WRAPPER] [-X X11SRC]
   1037  1.365     lukem                 [-Z VAR]
   1038  1.365     lukem                 OPERATION ...
   1039  1.363     lukem        ${progname} ( -h | -? )
   1040  1.363     lukem 
   1041  1.363     lukem _usage_
   1042  1.363     lukem }
   1043   1.84     lukem 
   1044  1.369     lukem # Show help to stdout.
   1045  1.363     lukem #
   1046  1.363     lukem help()
   1047  1.363     lukem {
   1048  1.363     lukem 	synopsis
   1049  1.363     lukem 	cat <<_usage_
   1050  1.365     lukem  Build OPERATIONs (all imply "obj" and "tools"):
   1051  1.125     lukem     build               Run "make build".
   1052  1.125     lukem     distribution        Run "make distribution" (includes DESTDIR/etc/ files).
   1053  1.125     lukem     release             Run "make release" (includes kernels & distrib media).
   1054   1.84     lukem 
   1055  1.365     lukem  Other OPERATIONs:
   1056  1.369     lukem     help                Show this help message, and exit.
   1057   1.98     lukem     makewrapper         Create ${toolprefix}make-\${MACHINE} wrapper and ${toolprefix}make.
   1058  1.125     lukem                         Always performed.
   1059  1.195     lukem     cleandir            Run "make cleandir".  [Default unless -u is used]
   1060  1.365     lukem     dtb                 Build devicetree blobs.
   1061  1.125     lukem     obj                 Run "make obj".  [Default unless -o is used]
   1062  1.125     lukem     tools               Build and install tools.
   1063  1.365     lukem     install=IDIR        Run "make installworld" to IDIR to install all sets
   1064  1.365     lukem                         except 'etc'.  Useful after "distribution" or "release".
   1065  1.365     lukem     kernel=CONF         Build kernel with config file CONF.
   1066  1.365     lukem     kernel.gdb=CONF     Build kernel (including netbsd.gdb) with config
   1067  1.365     lukem                         file CONF.
   1068  1.365     lukem     releasekernel=CONF  Install kernel built by kernel=CONF to RELEASEDIR.
   1069  1.365     lukem     kernels             Build all kernels.
   1070  1.365     lukem     installmodules=IDIR Run "make installmodules" to IDIR to install all
   1071  1.245  jmcneill                         kernel modules.
   1072  1.226   mbalmer     modules             Build kernel modules.
   1073  1.219     pooka     rumptest            Do a linktest for rump (for developers).
   1074  1.186     lukem     sets                Create binary sets in
   1075  1.195     lukem                         RELEASEDIR/RELEASEMACHINEDIR/binary/sets.
   1076  1.195     lukem                         DESTDIR should be populated beforehand.
   1077  1.345       mrg     distsets            Same as "distribution sets".
   1078  1.125     lukem     sourcesets          Create source sets in RELEASEDIR/source/sets.
   1079  1.186     lukem     syspkgs             Create syspkgs in
   1080  1.195     lukem                         RELEASEDIR/RELEASEMACHINEDIR/binary/syspkgs.
   1081  1.299       snj     iso-image           Create CD-ROM image in RELEASEDIR/images.
   1082  1.299       snj     iso-image-source    Create CD-ROM image with source in RELEASEDIR/images.
   1083  1.253   tsutsui     live-image          Create bootable live image in
   1084  1.253   tsutsui                         RELEASEDIR/RELEASEMACHINEDIR/installation/liveimage.
   1085  1.253   tsutsui     install-image       Create bootable installation image in
   1086  1.253   tsutsui                         RELEASEDIR/RELEASEMACHINEDIR/installation/installimage.
   1087  1.365     lukem     disk-image=TARGET   Create bootable disk image in
   1088  1.365     lukem                         RELEASEDIR/RELEASEMACHINEDIR/binary/gzimg/TARGET.img.gz.
   1089  1.371     lukem     params              Create params file with various make(1) parameters.
   1090  1.371     lukem     show-params         Show various make(1) parameters.
   1091  1.369     lukem     list-arch           Show a list of valid MACHINE/MACHINE_ARCH values,
   1092  1.292       apb                         and exit.  The list may be narrowed by passing glob
   1093  1.292       apb                         patterns or exact values in MACHINE or MACHINE_ARCH.
   1094  1.376    rillig     mkrepro-timestamp   Show the latest source timestamp used for reproducible
   1095  1.356    martin                         builds and exit.  Requires -P or -V MKREPRO=yes.
   1096   1.84     lukem 
   1097   1.84     lukem  Options:
   1098  1.365     lukem     -a ARCH        Set MACHINE_ARCH=ARCH.  [Default: deduced from MACHINE]
   1099  1.365     lukem     -B BID         Set BUILDID=BID.
   1100  1.365     lukem     -C EXTRAS      Append EXTRAS to CDEXTRA for inclusion on CD-ROM.
   1101  1.365     lukem     -c COMPILER    Select compiler from COMPILER:
   1102  1.342  riastrad                        clang
   1103  1.342  riastrad                        gcc
   1104  1.342  riastrad                    [Default: gcc]
   1105  1.365     lukem     -D DEST        Set DESTDIR=DEST.  [Default: destdir.\${MACHINE}]
   1106  1.246       wiz     -E             Set "expert" mode; disables various safety checks.
   1107  1.345       mrg                    Should not be used without expert knowledge of the build
   1108  1.345       mrg                    system.
   1109  1.369     lukem     -h             Show this help message, and exit.
   1110  1.365     lukem     -j NJOB        Run up to NJOB jobs in parallel; see make(1) -j.
   1111  1.365     lukem     -M MOBJ        Set obj root directory to MOBJ; sets MAKEOBJDIRPREFIX=MOBJ,
   1112  1.365     lukem                    unsets MAKEOBJDIR.
   1113  1.365     lukem     -m MACH        Set MACHINE=MACH.  Some MACH values are actually
   1114  1.291       apb                    aliases that set MACHINE/MACHINE_ARCH pairs.
   1115  1.291       apb                    [Default: deduced from the host system if the host
   1116  1.291       apb                    OS is NetBSD]
   1117  1.376    rillig     -N NOISY       Set the noisiness (MAKEVERBOSE) level of the build to NOISY:
   1118  1.365     lukem                        0   Minimal output ("quiet").
   1119  1.365     lukem                        1   Describe what is occurring.
   1120  1.345       mrg                        2   Describe what is occurring and echo the actual
   1121  1.365     lukem                            command.
   1122  1.365     lukem                        3   Ignore the effect of the "@" prefix in make
   1123  1.365     lukem                            commands.
   1124  1.365     lukem                        4   Trace shell commands using the shell's -x flag.
   1125  1.246       wiz                    [Default: 2]
   1126  1.365     lukem     -n             Show commands that would be executed, but do not execute
   1127  1.365     lukem                    them.
   1128  1.365     lukem     -O OOBJ        Set obj root directory to OOBJ; sets a MAKEOBJDIR pattern
   1129  1.365     lukem                    using OOBJ, unsets MAKEOBJDIRPREFIX.
   1130  1.246       wiz     -o             Set MKOBJDIRS=no; do not create objdirs at start of build.
   1131  1.312  christos     -P             Set MKREPRO and MKREPRO_TIMESTAMP to the latest source
   1132  1.312  christos                    CVS timestamp for reproducible builds.
   1133  1.365     lukem     -R RELEASE     Set RELEASEDIR=RELEASE.  [Default: releasedir]
   1134  1.246       wiz     -r             Remove contents of TOOLDIR and DESTDIR before building.
   1135  1.365     lukem     -S SEED        Set BUILDSEED=SEED.  [Default: NetBSD-majorversion]
   1136  1.365     lukem     -T TOOLS       Set TOOLDIR=TOOLS.  If unset, and TOOLDIR is not set
   1137  1.365     lukem                    in the environment, ${toolprefix}make will be (re)built
   1138  1.246       wiz                    unconditionally.
   1139  1.246       wiz     -U             Set MKUNPRIVED=yes; build without requiring root privileges,
   1140  1.365     lukem                    install from an unprivileged build with proper file
   1141  1.365     lukem                    permissions.
   1142  1.246       wiz     -u             Set MKUPDATE=yes; do not run "make cleandir" first.
   1143  1.246       wiz                    Without this, everything is rebuilt, including the tools.
   1144  1.365     lukem     -V VAR=[VALUE] Set variable VAR=VALUE.
   1145  1.365     lukem     -w WRAPPER     Create ${toolprefix}make script as WRAPPER.
   1146  1.246       wiz                    [Default: \${TOOLDIR}/bin/${toolprefix}make-\${MACHINE}]
   1147  1.365     lukem     -X X11SRC      Set X11SRCDIR=X11SRC.  [Default: /usr/xsrc]
   1148  1.365     lukem     -x             Set MKX11=yes; build X11 from X11SRCDIR.
   1149  1.365     lukem     -Z VAR         Unset ("zap") variable VAR.
   1150  1.369     lukem     -?             Show this help message, and exit.
   1151   1.83     lukem 
   1152   1.70     lukem _usage_
   1153  1.362     lukem }
   1154  1.362     lukem 
   1155  1.369     lukem # Show optional error message, help to stderr, and exit 1.
   1156  1.362     lukem #
   1157  1.362     lukem usage()
   1158  1.362     lukem {
   1159  1.362     lukem 	if [ -n "$*" ]; then
   1160  1.363     lukem 		echo 1>&2 ""
   1161  1.363     lukem 		echo 1>&2 "${progname}: $*"
   1162  1.362     lukem 	fi
   1163  1.363     lukem 	synopsis 1>&2
   1164    1.1        tv 	exit 1
   1165    1.1        tv }
   1166    1.1        tv 
   1167   1.84     lukem parseoptions()
   1168   1.84     lukem {
   1169  1.364     lukem 	opts='a:B:C:c:D:Ehj:M:m:N:nO:oPR:rS:T:UuV:w:X:xZ:'
   1170  1.293       apb 	opt_a=false
   1171  1.295       apb 	opt_m=false
   1172   1.84     lukem 
   1173   1.84     lukem 	if type getopts >/dev/null 2>&1; then
   1174   1.84     lukem 		# Use POSIX getopts.
   1175   1.98     lukem 		#
   1176  1.363     lukem 		getoptcmd='getopts :${opts} opt && opt=-${opt}'
   1177   1.84     lukem 		optargcmd=':'
   1178   1.98     lukem 		optremcmd='shift $((${OPTIND} -1))'
   1179   1.84     lukem 	else
   1180   1.84     lukem 		type getopt >/dev/null 2>&1 ||
   1181  1.249       apb 		    bomb "Shell does not support getopts or getopt"
   1182   1.84     lukem 
   1183   1.84     lukem 		# Use old-style getopt(1) (doesn't handle whitespace in args).
   1184   1.98     lukem 		#
   1185   1.98     lukem 		args="$(getopt ${opts} $*)"
   1186   1.84     lukem 		[ $? = 0 ] || usage
   1187   1.98     lukem 		set -- ${args}
   1188   1.84     lukem 
   1189   1.84     lukem 		getoptcmd='[ $# -gt 0 ] && opt="$1" && shift'
   1190   1.84     lukem 		optargcmd='OPTARG="$1"; shift'
   1191   1.84     lukem 		optremcmd=':'
   1192   1.84     lukem 	fi
   1193   1.84     lukem 
   1194   1.84     lukem 	# Parse command line options.
   1195   1.84     lukem 	#
   1196   1.98     lukem 	while eval ${getoptcmd}; do
   1197   1.98     lukem 		case ${opt} in
   1198   1.84     lukem 
   1199   1.84     lukem 		-a)
   1200   1.98     lukem 			eval ${optargcmd}
   1201   1.98     lukem 			MACHINE_ARCH=${OPTARG}
   1202  1.293       apb 			opt_a=true
   1203   1.84     lukem 			;;
   1204   1.84     lukem 
   1205   1.84     lukem 		-B)
   1206   1.98     lukem 			eval ${optargcmd}
   1207   1.98     lukem 			BUILDID=${OPTARG}
   1208   1.84     lukem 			;;
   1209   1.84     lukem 
   1210  1.174   jnemeth 		-C)
   1211  1.208       apb 			eval ${optargcmd}; resolvepaths OPTARG
   1212  1.209       apb 			CDEXTRA="${CDEXTRA}${CDEXTRA:+ }${OPTARG}"
   1213  1.174   jnemeth 			;;
   1214  1.174   jnemeth 
   1215  1.342  riastrad 		-c)
   1216  1.342  riastrad 			eval ${optargcmd}
   1217  1.342  riastrad 			case "${OPTARG}" in
   1218  1.342  riastrad 			gcc)	# default, no variables needed
   1219  1.342  riastrad 				;;
   1220  1.342  riastrad 			clang)	setmakeenv HAVE_LLVM yes
   1221  1.342  riastrad 				setmakeenv MKLLVM yes
   1222  1.342  riastrad 				setmakeenv MKGCC no
   1223  1.342  riastrad 				;;
   1224  1.342  riastrad 			#pcc)	...
   1225  1.342  riastrad 			#	;;
   1226  1.342  riastrad 			*)	bomb "Unknown compiler: ${OPTARG}"
   1227  1.342  riastrad 			esac
   1228  1.342  riastrad 			;;
   1229  1.342  riastrad 
   1230   1.84     lukem 		-D)
   1231  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1232  1.109     lukem 			setmakeenv DESTDIR "${OPTARG}"
   1233   1.84     lukem 			;;
   1234   1.84     lukem 
   1235   1.84     lukem 		-E)
   1236   1.84     lukem 			do_expertmode=true
   1237   1.84     lukem 			;;
   1238   1.84     lukem 
   1239   1.84     lukem 		-j)
   1240   1.98     lukem 			eval ${optargcmd}
   1241   1.98     lukem 			parallel="-j ${OPTARG}"
   1242   1.84     lukem 			;;
   1243   1.84     lukem 
   1244   1.84     lukem 		-M)
   1245  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1246  1.212       apb 			case "${OPTARG}" in
   1247  1.247       apb 			\$*)	usage "-M argument must not begin with '\$'"
   1248  1.212       apb 				;;
   1249  1.212       apb 			*\$*)	# can use resolvepath, but can't set TOP_objdir
   1250  1.212       apb 				resolvepath OPTARG
   1251  1.212       apb 				;;
   1252  1.212       apb 			*)	resolvepath OPTARG
   1253  1.212       apb 				TOP_objdir="${OPTARG}${TOP}"
   1254  1.212       apb 				;;
   1255  1.212       apb 			esac
   1256  1.111     lukem 			unsetmakeenv MAKEOBJDIR
   1257  1.109     lukem 			setmakeenv MAKEOBJDIRPREFIX "${OPTARG}"
   1258   1.84     lukem 			;;
   1259   1.84     lukem 
   1260   1.84     lukem 			# -m overrides MACHINE_ARCH unless "-a" is specified
   1261   1.84     lukem 		-m)
   1262   1.98     lukem 			eval ${optargcmd}
   1263   1.98     lukem 			MACHINE="${OPTARG}"
   1264  1.295       apb 			opt_m=true
   1265   1.84     lukem 			;;
   1266   1.84     lukem 
   1267  1.119     lukem 		-N)
   1268  1.119     lukem 			eval ${optargcmd}
   1269  1.119     lukem 			case "${OPTARG}" in
   1270  1.199       apb 			0|1|2|3|4)
   1271  1.121     lukem 				setmakeenv MAKEVERBOSE "${OPTARG}"
   1272  1.119     lukem 				;;
   1273  1.119     lukem 			*)
   1274  1.119     lukem 				usage "'${OPTARG}' is not a valid value for -N"
   1275  1.119     lukem 				;;
   1276  1.119     lukem 			esac
   1277  1.119     lukem 			;;
   1278  1.119     lukem 
   1279   1.84     lukem 		-n)
   1280   1.84     lukem 			runcmd=echo
   1281   1.84     lukem 			;;
   1282   1.84     lukem 
   1283   1.84     lukem 		-O)
   1284  1.212       apb 			eval ${optargcmd}
   1285  1.212       apb 			case "${OPTARG}" in
   1286  1.247       apb 			*\$*)	usage "-O argument must not contain '\$'"
   1287  1.212       apb 				;;
   1288  1.212       apb 			*)	resolvepath OPTARG
   1289  1.212       apb 				TOP_objdir="${OPTARG}"
   1290  1.212       apb 				;;
   1291  1.212       apb 			esac
   1292  1.111     lukem 			unsetmakeenv MAKEOBJDIRPREFIX
   1293  1.109     lukem 			setmakeenv MAKEOBJDIR "\${.CURDIR:C,^$TOP,$OPTARG,}"
   1294   1.84     lukem 			;;
   1295   1.84     lukem 
   1296   1.84     lukem 		-o)
   1297   1.84     lukem 			MKOBJDIRS=no
   1298   1.84     lukem 			;;
   1299   1.84     lukem 
   1300  1.312  christos 		-P)
   1301  1.312  christos 			MKREPRO=yes
   1302  1.312  christos 			;;
   1303  1.312  christos 
   1304   1.84     lukem 		-R)
   1305  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1306  1.109     lukem 			setmakeenv RELEASEDIR "${OPTARG}"
   1307   1.84     lukem 			;;
   1308   1.84     lukem 
   1309   1.84     lukem 		-r)
   1310   1.84     lukem 			do_removedirs=true
   1311   1.84     lukem 			do_rebuildmake=true
   1312   1.84     lukem 			;;
   1313   1.84     lukem 
   1314  1.190     perry 		-S)
   1315  1.190     perry 			eval ${optargcmd}
   1316  1.190     perry 			setmakeenv BUILDSEED "${OPTARG}"
   1317  1.190     perry 			;;
   1318  1.190     perry 
   1319   1.84     lukem 		-T)
   1320  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1321   1.98     lukem 			TOOLDIR="${OPTARG}"
   1322   1.84     lukem 			export TOOLDIR
   1323   1.84     lukem 			;;
   1324   1.84     lukem 
   1325   1.84     lukem 		-U)
   1326  1.109     lukem 			setmakeenv MKUNPRIVED yes
   1327   1.84     lukem 			;;
   1328   1.44     lukem 
   1329   1.84     lukem 		-u)
   1330  1.109     lukem 			setmakeenv MKUPDATE yes
   1331   1.84     lukem 			;;
   1332   1.15        tv 
   1333   1.84     lukem 		-V)
   1334   1.98     lukem 			eval ${optargcmd}
   1335   1.84     lukem 			case "${OPTARG}" in
   1336   1.80     lukem 		    # XXX: consider restricting which variables can be changed?
   1337  1.321       kre 			[a-zA-Z_]*=*)
   1338  1.321       kre 				safe_setmakeenv "${OPTARG%%=*}" "${OPTARG#*=}"
   1339  1.321       kre 				;;
   1340  1.321       kre 			[a-zA-Z_]*)
   1341  1.321       kre 				safe_setmakeenv "${OPTARG}" ""
   1342   1.84     lukem 				;;
   1343   1.84     lukem 			*)
   1344  1.365     lukem 				usage "-V argument must be of the form 'VAR[=VALUE]'"
   1345   1.84     lukem 				;;
   1346   1.84     lukem 			esac
   1347   1.84     lukem 			;;
   1348   1.84     lukem 
   1349   1.84     lukem 		-w)
   1350  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1351   1.98     lukem 			makewrapper="${OPTARG}"
   1352   1.84     lukem 			;;
   1353   1.84     lukem 
   1354  1.127     lukem 		-X)
   1355  1.208       apb 			eval ${optargcmd}; resolvepath OPTARG
   1356  1.127     lukem 			setmakeenv X11SRCDIR "${OPTARG}"
   1357  1.127     lukem 			;;
   1358  1.127     lukem 
   1359  1.127     lukem 		-x)
   1360  1.127     lukem 			setmakeenv MKX11 yes
   1361  1.127     lukem 			;;
   1362  1.127     lukem 
   1363  1.111     lukem 		-Z)
   1364  1.111     lukem 			eval ${optargcmd}
   1365  1.111     lukem 		    # XXX: consider restricting which variables can be unset?
   1366  1.321       kre 			safe_unsetmakeenv "${OPTARG}"
   1367  1.111     lukem 			;;
   1368  1.111     lukem 
   1369   1.84     lukem 		--)
   1370   1.84     lukem 			break
   1371   1.84     lukem 			;;
   1372   1.84     lukem 
   1373  1.363     lukem 		-h)
   1374  1.362     lukem 			help
   1375  1.362     lukem 			exit 0
   1376   1.84     lukem 			;;
   1377   1.84     lukem 
   1378  1.363     lukem 		'-?')
   1379  1.363     lukem 			if [ "${OPTARG}" = '?' ]; then
   1380  1.363     lukem 				help
   1381  1.363     lukem 				exit 0
   1382  1.363     lukem 			fi
   1383  1.363     lukem 			usage "Unknown option -${OPTARG}"
   1384  1.363     lukem 			;;
   1385  1.363     lukem 
   1386  1.363     lukem 		-:)
   1387  1.363     lukem 			usage "Missing argument for option -${OPTARG}"
   1388  1.363     lukem 			;;
   1389  1.363     lukem 
   1390  1.363     lukem 		*)
   1391  1.363     lukem 			usage "Unimplemented option ${opt}"
   1392  1.363     lukem 			;;
   1393  1.363     lukem 
   1394   1.84     lukem 		esac
   1395   1.84     lukem 	done
   1396   1.84     lukem 
   1397   1.84     lukem 	# Validate operations.
   1398   1.84     lukem 	#
   1399   1.98     lukem 	eval ${optremcmd}
   1400   1.84     lukem 	while [ $# -gt 0 ]; do
   1401   1.84     lukem 		op=$1; shift
   1402   1.98     lukem 		operations="${operations} ${op}"
   1403   1.84     lukem 
   1404   1.98     lukem 		case "${op}" in
   1405   1.84     lukem 
   1406   1.87     lukem 		help)
   1407  1.362     lukem 			help
   1408  1.362     lukem 			exit 0
   1409   1.87     lukem 			;;
   1410   1.87     lukem 
   1411  1.292       apb 		list-arch)
   1412  1.292       apb 			listarch "${MACHINE}" "${MACHINE_ARCH}"
   1413  1.356    martin 			exit
   1414  1.356    martin 			;;
   1415  1.356    martin 		mkrepro-timestamp)
   1416  1.356    martin 			setup_mkrepro quiet
   1417  1.356    martin 			echo ${MKREPRO_TIMESTAMP:-0}
   1418  1.356    martin 			[ ${MKREPRO_TIMESTAMP:-0} -ne 0 ]; exit
   1419  1.292       apb 			;;
   1420  1.292       apb 
   1421  1.305  uebayasi 		kernel=*|releasekernel=*|kernel.gdb=*)
   1422   1.84     lukem 			arg=${op#*=}
   1423   1.84     lukem 			op=${op%%=*}
   1424   1.98     lukem 			[ -n "${arg}" ] ||
   1425  1.363     lukem 			    bomb "Must supply a kernel name with '${op}=...'"
   1426   1.84     lukem 			;;
   1427   1.84     lukem 
   1428  1.264  christos 		disk-image=*)
   1429  1.264  christos 			arg=${op#*=}
   1430  1.264  christos 			op=disk_image
   1431  1.264  christos 			[ -n "${arg}" ] ||
   1432  1.363     lukem 			    bomb "Must supply a target name with '${op}=...'"
   1433  1.264  christos 
   1434  1.264  christos 			;;
   1435  1.264  christos 
   1436  1.245  jmcneill 		install=*|installmodules=*)
   1437   1.84     lukem 			arg=${op#*=}
   1438   1.84     lukem 			op=${op%%=*}
   1439   1.98     lukem 			[ -n "${arg}" ] ||
   1440  1.363     lukem 			    bomb "Must supply a directory with 'install=...'"
   1441   1.84     lukem 			;;
   1442   1.84     lukem 
   1443  1.345       mrg 		distsets)
   1444  1.345       mrg 			operations="$(echo "$operations" | sed 's/distsets/distribution sets/')"
   1445  1.345       mrg 			do_sets=true
   1446  1.345       mrg 			op=distribution
   1447  1.345       mrg 			;;
   1448  1.345       mrg 
   1449  1.301       apb 		build|\
   1450  1.301       apb 		cleandir|\
   1451  1.301       apb 		distribution|\
   1452  1.335  jmcneill 		dtb|\
   1453  1.301       apb 		install-image|\
   1454  1.301       apb 		iso-image-source|\
   1455  1.301       apb 		iso-image|\
   1456  1.301       apb 		kernels|\
   1457  1.329  christos 		libs|\
   1458  1.301       apb 		live-image|\
   1459  1.301       apb 		makewrapper|\
   1460  1.301       apb 		modules|\
   1461  1.301       apb 		obj|\
   1462  1.301       apb 		params|\
   1463  1.301       apb 		release|\
   1464  1.301       apb 		rump|\
   1465  1.301       apb 		rumptest|\
   1466  1.301       apb 		sets|\
   1467  1.371     lukem 		show-params|\
   1468  1.301       apb 		sourcesets|\
   1469  1.301       apb 		syspkgs|\
   1470  1.301       apb 		tools)
   1471  1.219     pooka 			;;
   1472  1.219     pooka 
   1473   1.80     lukem 		*)
   1474  1.365     lukem 			usage "Unknown OPERATION '${op}'"
   1475   1.84     lukem 			;;
   1476   1.84     lukem 
   1477   1.80     lukem 		esac
   1478  1.301       apb 		# ${op} may contain chars that are not allowed in variable
   1479  1.301       apb 		# names.  Replace them with '_' before setting do_${op}.
   1480  1.301       apb 		op="$( echo "$op" | tr -s '.-' '__')"
   1481   1.98     lukem 		eval do_${op}=true
   1482   1.84     lukem 	done
   1483  1.365     lukem 	[ -n "${operations}" ] || usage "Missing OPERATION to perform"
   1484   1.84     lukem 
   1485   1.84     lukem 	# Set up MACHINE*.  On a NetBSD host, these are allowed to be unset.
   1486   1.84     lukem 	#
   1487   1.98     lukem 	if [ -z "${MACHINE}" ]; then
   1488   1.98     lukem 		[ "${uname_s}" = "NetBSD" ] ||
   1489  1.363     lukem 		    bomb "MACHINE must be set, or -m must be used, for cross builds"
   1490   1.84     lukem 		MACHINE=${uname_m}
   1491  1.332       mrg 		MACHINE_ARCH=${uname_p}
   1492   1.84     lukem 	fi
   1493  1.295       apb 	if $opt_m && ! $opt_a; then
   1494  1.295       apb 		# Settings implied by the command line -m option
   1495  1.295       apb 		# override MACHINE_ARCH from the environment (if any).
   1496  1.295       apb 		getarch
   1497  1.295       apb 	fi
   1498  1.295       apb 	[ -n "${MACHINE_ARCH}" ] || getarch
   1499   1.84     lukem 	validatearch
   1500   1.84     lukem 
   1501   1.84     lukem 	# Set up default make(1) environment.
   1502   1.84     lukem 	#
   1503   1.98     lukem 	makeenv="${makeenv} TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS"
   1504   1.98     lukem 	[ -z "${BUILDID}" ] || makeenv="${makeenv} BUILDID"
   1505  1.287       apb 	[ -z "${BUILDINFO}" ] || makeenv="${makeenv} BUILDINFO"
   1506  1.248       apb 	MAKEFLAGS="-de -m ${TOP}/share/mk ${MAKEFLAGS}"
   1507  1.248       apb 	MAKEFLAGS="${MAKEFLAGS} MKOBJDIRS=${MKOBJDIRS-yes}"
   1508   1.84     lukem 	export MAKEFLAGS MACHINE MACHINE_ARCH
   1509  1.284       apb 	setmakeenv USETOOLS "yes"
   1510  1.284       apb 	setmakeenv MAKEWRAPPERMACHINE "${makewrappermachine:-${MACHINE}}"
   1511  1.346    martin 	setmakeenv MAKE_OBJDIR_CHECK_WRITABLE no
   1512   1.84     lukem }
   1513   1.84     lukem 
   1514  1.248       apb # sanitycheck --
   1515  1.248       apb # Sanity check after parsing command line options, before rebuildmake.
   1516  1.248       apb #
   1517  1.163       apb sanitycheck()
   1518  1.163       apb {
   1519  1.260       apb 	# Install as non-root is a bad idea.
   1520  1.260       apb 	#
   1521  1.260       apb 	if ${do_install} && [ "$id_u" -ne 0 ] ; then
   1522  1.260       apb 		if ${do_expertmode}; then
   1523  1.363     lukem 			warning "Will install as an unprivileged user"
   1524  1.260       apb 		else
   1525  1.363     lukem 			bomb "-E must be set for install as an unprivileged user"
   1526  1.260       apb 		fi
   1527  1.260       apb 	fi
   1528  1.260       apb 
   1529  1.163       apb 	# If the PATH contains any non-absolute components (including,
   1530  1.170       apb 	# but not limited to, "." or ""), then complain.  As an exception,
   1531  1.170       apb 	# allow "" or "." as the last component of the PATH.  This is fatal
   1532  1.163       apb 	# if expert mode is not in effect.
   1533  1.163       apb 	#
   1534  1.170       apb 	local path="${PATH}"
   1535  1.170       apb 	path="${path%:}"	# delete trailing ":"
   1536  1.170       apb 	path="${path%:.}"	# delete trailing ":."
   1537  1.170       apb 	case ":${path}:/" in
   1538  1.334  jmcneill 	*:[!/~]*)
   1539  1.163       apb 		if ${do_expertmode}; then
   1540  1.163       apb 			warning "PATH contains non-absolute components"
   1541  1.163       apb 		else
   1542  1.164       apb 			bomb "PATH environment variable must not" \
   1543  1.164       apb 			     "contain non-absolute components"
   1544  1.163       apb 		fi
   1545  1.163       apb 		;;
   1546  1.163       apb 	esac
   1547  1.317      maya 
   1548  1.320       kre 	while [ ${MKX11-no} = "yes" ]; do		# not really a loop
   1549  1.320       kre 		test -n "${X11SRCDIR}" && {
   1550  1.320       kre 		    test -d "${X11SRCDIR}" ||
   1551  1.320       kre 		    	bomb "X11SRCDIR (${X11SRCDIR}) does not exist (with -x)"
   1552  1.320       kre 		    break
   1553  1.320       kre 		}
   1554  1.320       kre 		for _xd in \
   1555  1.320       kre 		    "${NETBSDSRCDIR%/*}/xsrc" \
   1556  1.320       kre 		    "${NETBSDSRCDIR}/xsrc" \
   1557  1.320       kre 		    /usr/xsrc
   1558  1.320       kre 		do
   1559  1.320       kre 		    test -d "${_xd}" &&
   1560  1.320       kre 			setmakeenv X11SRCDIR "${_xd}" &&
   1561  1.320       kre 			break 2
   1562  1.320       kre 		done
   1563  1.318      maya 		bomb "Asked to build X11 but no xsrc"
   1564  1.320       kre 	done
   1565  1.163       apb }
   1566  1.317      maya 
   1567  1.369     lukem # print_tooldir_program --
   1568  1.369     lukem # Try to find and show a path to an existing
   1569  1.312  christos # ${TOOLDIR}/bin/${toolprefix}program
   1570  1.369     lukem #
   1571  1.312  christos print_tooldir_program()
   1572  1.168       apb {
   1573  1.213       apb 	local possible_TOP_OBJ
   1574  1.213       apb 	local possible_TOOLDIR
   1575  1.312  christos 	local possible_program
   1576  1.312  christos 	local tooldir_program
   1577  1.312  christos 	local program=${1}
   1578  1.213       apb 
   1579  1.213       apb 	if [ -n "${TOOLDIR}" ]; then
   1580  1.312  christos 		echo "${TOOLDIR}/bin/${toolprefix}${program}"
   1581  1.312  christos 		return
   1582  1.213       apb 	fi
   1583  1.168       apb 
   1584  1.198       apb 	# Set host_ostype to something like "NetBSD-4.5.6-i386".  This
   1585  1.198       apb 	# is intended to match the HOST_OSTYPE variable in <bsd.own.mk>.
   1586  1.198       apb 	#
   1587  1.168       apb 	local host_ostype="${uname_s}-$(
   1588  1.168       apb 		echo "${uname_r}" | sed -e 's/([^)]*)//g' -e 's/ /_/g'
   1589  1.194     lukem 		)-$(
   1590  1.168       apb 		echo "${uname_p}" | sed -e 's/([^)]*)//g' -e 's/ /_/g'
   1591  1.168       apb 		)"
   1592  1.168       apb 
   1593  1.198       apb 	# Look in a few potential locations for
   1594  1.312  christos 	# ${possible_TOOLDIR}/bin/${toolprefix}${program}.
   1595  1.312  christos 	# If we find it, then set possible_program.
   1596  1.198       apb 	#
   1597  1.198       apb 	# In the usual case (without interference from environment
   1598  1.198       apb 	# variables or /etc/mk.conf), <bsd.own.mk> should set TOOLDIR to
   1599  1.212       apb 	# "${_SRC_TOP_OBJ_}/tooldir.${host_ostype}".
   1600  1.212       apb 	#
   1601  1.212       apb 	# In practice it's difficult to figure out the correct value
   1602  1.212       apb 	# for _SRC_TOP_OBJ_.  In the easiest case, when the -M or -O
   1603  1.212       apb 	# options were passed to build.sh, then ${TOP_objdir} will be
   1604  1.212       apb 	# the correct value.  We also try a few other possibilities, but
   1605  1.212       apb 	# we do not replicate all the logic of <bsd.obj.mk>.
   1606  1.198       apb 	#
   1607  1.212       apb 	for possible_TOP_OBJ in \
   1608  1.212       apb 		"${TOP_objdir}" \
   1609  1.212       apb 		"${MAKEOBJDIRPREFIX:+${MAKEOBJDIRPREFIX}${TOP}}" \
   1610  1.212       apb 		"${TOP}" \
   1611  1.212       apb 		"${TOP}/obj" \
   1612  1.198       apb 		"${TOP}/obj.${MACHINE}"
   1613  1.198       apb 	do
   1614  1.212       apb 		[ -n "${possible_TOP_OBJ}" ] || continue
   1615  1.198       apb 		possible_TOOLDIR="${possible_TOP_OBJ}/tooldir.${host_ostype}"
   1616  1.312  christos 		possible_program="${possible_TOOLDIR}/bin/${toolprefix}${program}"
   1617  1.372  christos 		if [ -x "${possible_program}" ]; then
   1618  1.312  christos 			echo ${possible_program}
   1619  1.312  christos 			return;
   1620  1.198       apb 		fi
   1621  1.198       apb 	done
   1622  1.312  christos 	echo ""
   1623  1.312  christos }
   1624  1.369     lukem 
   1625  1.312  christos # print_tooldir_make --
   1626  1.369     lukem # Try to find and show a path to an existing
   1627  1.312  christos # ${TOOLDIR}/bin/${toolprefix}make, for use by rebuildmake() before a
   1628  1.312  christos # new version of ${toolprefix}make has been built.
   1629  1.312  christos #
   1630  1.312  christos # * If TOOLDIR was set in the environment or on the command line, use
   1631  1.312  christos #   that value.
   1632  1.312  christos # * Otherwise try to guess what TOOLDIR would be if not overridden by
   1633  1.312  christos #   /etc/mk.conf, and check whether the resulting directory contains
   1634  1.312  christos #   a copy of ${toolprefix}make (this should work for everybody who
   1635  1.312  christos #   doesn't override TOOLDIR via /etc/mk.conf);
   1636  1.312  christos # * Failing that, search for ${toolprefix}make, nbmake, bmake, or make,
   1637  1.312  christos #   in the PATH (this might accidentally find a version of make that
   1638  1.312  christos #   does not understand the syntax used by NetBSD make, and that will
   1639  1.312  christos #   lead to failure in the next step);
   1640  1.312  christos # * If a copy of make was found above, try to use it with
   1641  1.312  christos #   nobomb_getmakevar to find the correct value for TOOLDIR, and believe the
   1642  1.312  christos #   result only if it's a directory that already exists;
   1643  1.312  christos # * If a value of TOOLDIR was found above, and if
   1644  1.369     lukem #   ${TOOLDIR}/bin/${toolprefix}make exists, show that value.
   1645  1.312  christos #
   1646  1.312  christos print_tooldir_make()
   1647  1.312  christos {
   1648  1.312  christos 	local possible_make
   1649  1.312  christos 	local possible_TOOLDIR
   1650  1.312  christos 	local tooldir_make
   1651  1.198       apb 
   1652  1.312  christos 	possible_make=$(print_tooldir_program make)
   1653  1.198       apb 	# If the above didn't work, search the PATH for a suitable
   1654  1.198       apb 	# ${toolprefix}make, nbmake, bmake, or make.
   1655  1.198       apb 	#
   1656  1.213       apb 	: ${possible_make:=$(find_in_PATH ${toolprefix}make '')}
   1657  1.213       apb 	: ${possible_make:=$(find_in_PATH nbmake '')}
   1658  1.213       apb 	: ${possible_make:=$(find_in_PATH bmake '')}
   1659  1.213       apb 	: ${possible_make:=$(find_in_PATH make '')}
   1660  1.213       apb 
   1661  1.213       apb 	# At this point, we don't care whether possible_make is in the
   1662  1.213       apb 	# correct TOOLDIR or not; we simply want it to be usable by
   1663  1.213       apb 	# getmakevar to help us find the correct TOOLDIR.
   1664  1.213       apb 	#
   1665  1.213       apb 	# Use ${possible_make} with nobomb_getmakevar to try to find
   1666  1.213       apb 	# the value of TOOLDIR.  Believe the result only if it's
   1667  1.213       apb 	# a directory that already exists and contains bin/${toolprefix}make.
   1668  1.213       apb 	#
   1669  1.213       apb 	if [ -x "${possible_make}" ]; then
   1670  1.213       apb 		possible_TOOLDIR="$(
   1671  1.250       apb 			make="${possible_make}" \
   1672  1.250       apb 			nobomb_getmakevar TOOLDIR 2>/dev/null
   1673  1.213       apb 			)"
   1674  1.213       apb 		if [ $? = 0 ] && [ -n "${possible_TOOLDIR}" ] \
   1675  1.213       apb 		    && [ -d "${possible_TOOLDIR}" ];
   1676  1.213       apb 		then
   1677  1.213       apb 			tooldir_make="${possible_TOOLDIR}/bin/${toolprefix}make"
   1678  1.213       apb 			if [ -x "${tooldir_make}" ]; then
   1679  1.213       apb 				echo "${tooldir_make}"
   1680  1.213       apb 				return 0
   1681  1.213       apb 			fi
   1682  1.213       apb 		fi
   1683  1.168       apb 	fi
   1684  1.213       apb 	return 1
   1685  1.168       apb }
   1686  1.168       apb 
   1687  1.213       apb # rebuildmake --
   1688  1.213       apb # Rebuild nbmake in a temporary directory if necessary.  Sets $make
   1689  1.213       apb # to a path to the nbmake executable.  Sets done_rebuildmake=true
   1690  1.213       apb # if nbmake was rebuilt.
   1691  1.213       apb #
   1692  1.213       apb # There is a cyclic dependency between building nbmake and choosing
   1693  1.213       apb # TOOLDIR: TOOLDIR may be affected by settings in /etc/mk.conf, so we
   1694  1.213       apb # would like to use getmakevar to get the value of TOOLDIR; but we can't
   1695  1.213       apb # use getmakevar before we have an up to date version of nbmake; we
   1696  1.213       apb # might already have an up to date version of nbmake in TOOLDIR, but we
   1697  1.213       apb # don't yet know where TOOLDIR is.
   1698  1.213       apb #
   1699  1.213       apb # The default value of TOOLDIR also depends on the location of the top
   1700  1.213       apb # level object directory, so $(getmakevar TOOLDIR) invoked before or
   1701  1.213       apb # after making the top level object directory may produce different
   1702  1.213       apb # results.
   1703  1.213       apb #
   1704  1.213       apb # Strictly speaking, we should do the following:
   1705  1.213       apb #
   1706  1.213       apb #    1. build a new version of nbmake in a temporary directory;
   1707  1.213       apb #    2. use the temporary nbmake to create the top level obj directory;
   1708  1.213       apb #    3. use $(getmakevar TOOLDIR) with the temporary nbmake to
   1709  1.265       oki #       get the correct value of TOOLDIR;
   1710  1.214       apb #    4. move the temporary nbmake to ${TOOLDIR}/bin/nbmake.
   1711  1.213       apb #
   1712  1.213       apb # However, people don't like building nbmake unnecessarily if their
   1713  1.213       apb # TOOLDIR has not changed since an earlier build.  We try to avoid
   1714  1.213       apb # rebuilding a temporary version of nbmake by taking some shortcuts to
   1715  1.213       apb # guess a value for TOOLDIR, looking for an existing version of nbmake
   1716  1.213       apb # in that TOOLDIR, and checking whether that nbmake is newer than the
   1717  1.213       apb # sources used to build it.
   1718  1.213       apb #
   1719   1.84     lukem rebuildmake()
   1720   1.84     lukem {
   1721  1.213       apb 	make="$(print_tooldir_make)"
   1722  1.213       apb 	if [ -n "${make}" ] && [ -x "${make}" ]; then
   1723  1.343    rillig 		for f in usr.bin/make/*.[ch]; do
   1724   1.98     lukem 			if [ "${f}" -nt "${make}" ]; then
   1725  1.213       apb 				statusmsg "${make} outdated" \
   1726  1.213       apb 					"(older than ${f}), needs building."
   1727   1.84     lukem 				do_rebuildmake=true
   1728   1.84     lukem 				break
   1729   1.84     lukem 			fi
   1730   1.84     lukem 		done
   1731   1.84     lukem 	else
   1732  1.213       apb 		statusmsg "No \$TOOLDIR/bin/${toolprefix}make, needs building."
   1733   1.84     lukem 		do_rebuildmake=true
   1734   1.84     lukem 	fi
   1735   1.84     lukem 
   1736   1.84     lukem 	# Build bootstrap ${toolprefix}make if needed.
   1737  1.309  christos 	if ! ${do_rebuildmake}; then
   1738  1.309  christos 		return
   1739   1.84     lukem 	fi
   1740  1.341  riastrad 
   1741  1.340     lukem 	# Silent configure with MAKEVERBOSE==0
   1742  1.340     lukem 	if [ ${MAKEVERBOSE:-2} -eq 0 ]; then
   1743  1.340     lukem 		configure_args=--silent
   1744  1.340     lukem 	fi
   1745  1.309  christos 
   1746  1.309  christos 	statusmsg "Bootstrapping ${toolprefix}make"
   1747  1.309  christos 	${runcmd} cd "${tmpdir}"
   1748  1.323       uwe 	${runcmd} env CC="${HOST_CC-cc}" CPPFLAGS="${HOST_CPPFLAGS}" \
   1749  1.323       uwe 		CFLAGS="${HOST_CFLAGS--O}" LDFLAGS="${HOST_LDFLAGS}" \
   1750  1.340     lukem 	    ${HOST_SH} "${TOP}/tools/make/configure" ${configure_args} ||
   1751  1.309  christos 	( cp ${tmpdir}/config.log ${tmpdir}-config.log
   1752  1.309  christos 	      bomb "Configure of ${toolprefix}make failed, see ${tmpdir}-config.log for details" )
   1753  1.309  christos 	${runcmd} ${HOST_SH} buildmake.sh ||
   1754  1.309  christos 	    bomb "Build of ${toolprefix}make failed"
   1755  1.309  christos 	make="${tmpdir}/${toolprefix}make"
   1756  1.309  christos 	${runcmd} cd "${TOP}"
   1757  1.343    rillig 	${runcmd} rm -f usr.bin/make/*.o
   1758  1.309  christos 	done_rebuildmake=true
   1759   1.84     lukem }
   1760   1.84     lukem 
   1761  1.248       apb # validatemakeparams --
   1762  1.248       apb # Perform some late sanity checks, after rebuildmake,
   1763  1.248       apb # but before createmakewrapper or any real work.
   1764  1.248       apb #
   1765  1.257       apb # Creates the top-level obj directory, because that
   1766  1.257       apb # is needed by some of the sanity checks.
   1767  1.257       apb #
   1768  1.369     lukem # Shows status messages reporting the values of several variables.
   1769  1.248       apb #
   1770   1.84     lukem validatemakeparams()
   1771   1.84     lukem {
   1772  1.373     lukem 	# Determine MAKECONF first, and set in the makewrapper.
   1773  1.373     lukem 	# If set in the environment, then use that.
   1774  1.373     lukem 	# else if ./mk.conf exists, then set MAKECONF to that,
   1775  1.373     lukem 	# else use the default from share/mk/bsd.own.mk (/etc/mk.conf).
   1776  1.373     lukem 	#
   1777  1.373     lukem 	if [ -n "${MAKECONF+1}" ]; then
   1778  1.373     lukem 		setmakeenv MAKECONF "${MAKECONF}"
   1779  1.373     lukem 		statusmsg2 "getenv MAKECONF:" "${MAKECONF}"
   1780  1.373     lukem 	elif [ -f "${TOP}/mk.conf" ]; then
   1781  1.373     lukem 		setmakeenv MAKECONF "${TOP}/mk.conf"
   1782  1.373     lukem 		statusmsg2 "mk.conf MAKECONF:" "${MAKECONF}"
   1783  1.373     lukem 	else
   1784  1.373     lukem 		MAKECONF=$(getmakevar MAKECONF)
   1785  1.373     lukem 		setmakeenv MAKECONF "${MAKECONF}"
   1786  1.373     lukem 		statusmsg2 "share/mk MAKECONF:" "${MAKECONF}"
   1787  1.373     lukem 	fi
   1788  1.373     lukem 	if [ -z "${MAKECONF}" ]; then
   1789  1.373     lukem 		bomb "MAKECONF must not be empty"
   1790  1.373     lukem 	elif [ -e "${MAKECONF}" ]; then
   1791  1.257       apb 		statusmsg2 "MAKECONF file:" "${MAKECONF}"
   1792  1.257       apb 	else
   1793  1.257       apb 		statusmsg2 "MAKECONF file:" "${MAKECONF} (File not found)"
   1794  1.257       apb 	fi
   1795  1.257       apb 
   1796  1.275       apb 	# Normalise MKOBJDIRS, MKUNPRIVED, and MKUPDATE.
   1797  1.275       apb 	# These may be set as build.sh options or in "mk.conf".
   1798  1.275       apb 	# Don't export them as they're only used for tests in build.sh.
   1799  1.275       apb 	#
   1800  1.275       apb 	MKOBJDIRS=$(getmakevar MKOBJDIRS)
   1801  1.275       apb 	MKUNPRIVED=$(getmakevar MKUNPRIVED)
   1802  1.275       apb 	MKUPDATE=$(getmakevar MKUPDATE)
   1803  1.275       apb 
   1804  1.275       apb 	# Non-root should always use either the -U or -E flag.
   1805  1.275       apb 	#
   1806  1.275       apb 	if ! ${do_expertmode} && \
   1807  1.275       apb 	    [ "$id_u" -ne 0 ] && \
   1808  1.275       apb 	    [ "${MKUNPRIVED}" = "no" ] ; then
   1809  1.363     lukem 		bomb "-U or -E must be set for build as an unprivileged user"
   1810  1.275       apb 	fi
   1811  1.275       apb 
   1812   1.98     lukem 	if [ "${runcmd}" = "echo" ]; then
   1813   1.84     lukem 		TOOLCHAIN_MISSING=no
   1814   1.84     lukem 		EXTERNAL_TOOLCHAIN=""
   1815   1.84     lukem 	else
   1816  1.210       apb 		TOOLCHAIN_MISSING=$(bomb_getmakevar TOOLCHAIN_MISSING)
   1817  1.210       apb 		EXTERNAL_TOOLCHAIN=$(bomb_getmakevar EXTERNAL_TOOLCHAIN)
   1818   1.84     lukem 	fi
   1819   1.84     lukem 	if [ "${TOOLCHAIN_MISSING}" = "yes" ] && \
   1820   1.86     lukem 	   [ -z "${EXTERNAL_TOOLCHAIN}" ]; then
   1821   1.98     lukem 		${runcmd} echo "ERROR: build.sh (in-tree cross-toolchain) is not yet available for"
   1822   1.98     lukem 		${runcmd} echo "	MACHINE:      ${MACHINE}"
   1823   1.98     lukem 		${runcmd} echo "	MACHINE_ARCH: ${MACHINE_ARCH}"
   1824   1.98     lukem 		${runcmd} echo ""
   1825   1.98     lukem 		${runcmd} echo "All builds for this platform should be done via a traditional make"
   1826   1.98     lukem 		${runcmd} echo "If you wish to use an external cross-toolchain, set"
   1827   1.98     lukem 		${runcmd} echo "	EXTERNAL_TOOLCHAIN=<path to toolchain root>"
   1828   1.98     lukem 		${runcmd} echo "in either the environment or mk.conf and rerun"
   1829   1.98     lukem 		${runcmd} echo "	${progname} $*"
   1830   1.84     lukem 		exit 1
   1831   1.84     lukem 	fi
   1832   1.84     lukem 
   1833  1.106     lukem 	if [ "${MKOBJDIRS}" != "no" ]; then
   1834  1.212       apb 		# Create the top-level object directory.
   1835  1.106     lukem 		#
   1836  1.212       apb 		# "make obj NOSUBDIR=" can handle most cases, but it
   1837  1.212       apb 		# can't handle the case where MAKEOBJDIRPREFIX is set
   1838  1.212       apb 		# while the corresponding directory does not exist
   1839  1.212       apb 		# (rules in <bsd.obj.mk> would abort the build).  We
   1840  1.212       apb 		# therefore have to handle the MAKEOBJDIRPREFIX case
   1841  1.212       apb 		# without invoking "make obj".  The MAKEOBJDIR case
   1842  1.212       apb 		# could be handled either way, but we choose to handle
   1843  1.212       apb 		# it similarly to MAKEOBJDIRPREFIX.
   1844  1.191       apb 		#
   1845  1.212       apb 		if [ -n "${TOP_obj}" ]; then
   1846  1.212       apb 			# It must have been set by the "-M" or "-O"
   1847  1.212       apb 			# command line options, so there's no need to
   1848  1.212       apb 			# use getmakevar
   1849  1.212       apb 			:
   1850  1.212       apb 		elif [ -n "$MAKEOBJDIRPREFIX" ]; then
   1851  1.212       apb 			TOP_obj="$(getmakevar MAKEOBJDIRPREFIX)${TOP}"
   1852  1.212       apb 		elif [ -n "$MAKEOBJDIR" ]; then
   1853  1.212       apb 			TOP_obj="$(getmakevar MAKEOBJDIR)"
   1854  1.212       apb 		fi
   1855  1.212       apb 		if [ -n "$TOP_obj" ]; then
   1856  1.212       apb 			${runcmd} mkdir -p "${TOP_obj}" ||
   1857  1.212       apb 			    bomb "Can't create top level object directory" \
   1858  1.212       apb 					"${TOP_obj}"
   1859  1.212       apb 		else
   1860  1.212       apb 			${runcmd} "${make}" -m ${TOP}/share/mk obj NOSUBDIR= ||
   1861  1.212       apb 			    bomb "Can't create top level object directory" \
   1862  1.212       apb 					"using make obj"
   1863  1.106     lukem 		fi
   1864  1.106     lukem 
   1865  1.212       apb 		# make obj in tools to ensure that the objdir for "tools"
   1866  1.212       apb 		# is available.
   1867  1.106     lukem 		#
   1868   1.98     lukem 		${runcmd} cd tools
   1869   1.98     lukem 		${runcmd} "${make}" -m ${TOP}/share/mk obj NOSUBDIR= ||
   1870   1.98     lukem 		    bomb "Failed to make obj in tools"
   1871   1.98     lukem 		${runcmd} cd "${TOP}"
   1872   1.84     lukem 	fi
   1873   1.80     lukem 
   1874  1.215       apb 	# Find TOOLDIR, DESTDIR, and RELEASEDIR, according to getmakevar,
   1875  1.215       apb 	# and bomb if they have changed from the values we had from the
   1876  1.215       apb 	# command line or environment.
   1877  1.215       apb 	#
   1878  1.212       apb 	# This must be done after creating the top-level object directory.
   1879   1.84     lukem 	#
   1880  1.215       apb 	for var in TOOLDIR DESTDIR RELEASEDIR
   1881  1.215       apb 	do
   1882  1.215       apb 		eval oldval=\"\$${var}\"
   1883  1.215       apb 		newval="$(getmakevar $var)"
   1884  1.215       apb 		if ! $do_expertmode; then
   1885  1.216     enami 			: ${_SRC_TOP_OBJ_:=$(getmakevar _SRC_TOP_OBJ_)}
   1886  1.215       apb 			case "$var" in
   1887  1.215       apb 			DESTDIR)
   1888  1.215       apb 				: ${newval:=${_SRC_TOP_OBJ_}/destdir.${MACHINE}}
   1889  1.217       apb 				makeenv="${makeenv} DESTDIR"
   1890  1.215       apb 				;;
   1891  1.215       apb 			RELEASEDIR)
   1892  1.215       apb 				: ${newval:=${_SRC_TOP_OBJ_}/releasedir}
   1893  1.217       apb 				makeenv="${makeenv} RELEASEDIR"
   1894  1.215       apb 				;;
   1895  1.215       apb 			esac
   1896  1.215       apb 		fi
   1897  1.215       apb 		if [ -n "$oldval" ] && [ "$oldval" != "$newval" ]; then
   1898  1.215       apb 			bomb "Value of ${var} has changed" \
   1899  1.215       apb 				"(was \"${oldval}\", now \"${newval}\")"
   1900  1.215       apb 		fi
   1901  1.215       apb 		eval ${var}=\"\${newval}\"
   1902  1.215       apb 		eval export ${var}
   1903  1.238  pgoyette 		statusmsg2 "${var} path:" "${newval}"
   1904  1.215       apb 	done
   1905  1.215       apb 
   1906  1.215       apb 	# RELEASEMACHINEDIR is just a subdir name, e.g. "i386".
   1907  1.186     lukem 	RELEASEMACHINEDIR=$(getmakevar RELEASEMACHINEDIR)
   1908   1.84     lukem 
   1909   1.84     lukem 	# Check validity of TOOLDIR and DESTDIR.
   1910   1.84     lukem 	#
   1911   1.98     lukem 	if [ -z "${TOOLDIR}" ] || [ "${TOOLDIR}" = "/" ]; then
   1912   1.98     lukem 		bomb "TOOLDIR '${TOOLDIR}' invalid"
   1913   1.84     lukem 	fi
   1914   1.98     lukem 	removedirs="${TOOLDIR}"
   1915   1.15        tv 
   1916   1.98     lukem 	if [ -z "${DESTDIR}" ] || [ "${DESTDIR}" = "/" ]; then
   1917  1.260       apb 		if ${do_distribution} || ${do_release} || \
   1918  1.260       apb 		   [ "${uname_s}" != "NetBSD" ] || \
   1919  1.260       apb 		   [ "${uname_m}" != "${MACHINE}" ]; then
   1920  1.363     lukem 			bomb "DESTDIR must != / for cross builds, or ${progname} 'distribution' or 'release'"
   1921  1.260       apb 		fi
   1922  1.260       apb 		if ! ${do_expertmode}; then
   1923  1.260       apb 			bomb "DESTDIR must != / for non -E (expert) builds"
   1924    1.1        tv 		fi
   1925  1.260       apb 		statusmsg "WARNING: Building to /, in expert mode."
   1926  1.260       apb 		statusmsg "         This may cause your system to break!  Reasons include:"
   1927  1.260       apb 		statusmsg "            - your kernel is not up to date"
   1928  1.260       apb 		statusmsg "            - the libraries or toolchain have changed"
   1929  1.260       apb 		statusmsg "         YOU HAVE BEEN WARNED!"
   1930   1.84     lukem 	else
   1931   1.98     lukem 		removedirs="${removedirs} ${DESTDIR}"
   1932   1.84     lukem 	fi
   1933  1.105     lukem 	if ${do_releasekernel} && [ -z "${RELEASEDIR}" ]; then
   1934  1.363     lukem 		bomb "Must set RELEASEDIR with 'releasekernel=...'"
   1935  1.105     lukem 	fi
   1936  1.185       apb 
   1937  1.185       apb 	# If a previous build.sh run used -U (and therefore created a
   1938  1.185       apb 	# METALOG file), then most subsequent build.sh runs must also
   1939  1.185       apb 	# use -U.  If DESTDIR is about to be removed, then don't perform
   1940  1.185       apb 	# this check.
   1941  1.185       apb 	#
   1942  1.185       apb 	case "${do_removedirs} ${removedirs} " in
   1943  1.185       apb 	true*" ${DESTDIR} "*)
   1944  1.185       apb 		# DESTDIR is about to be removed
   1945  1.185       apb 		;;
   1946  1.185       apb 	*)
   1947  1.260       apb 		if [ -e "${DESTDIR}/METALOG" ] && \
   1948  1.185       apb 		    [ "${MKUNPRIVED}" = "no" ] ; then
   1949  1.185       apb 			if $do_expertmode; then
   1950  1.363     lukem 				warning "A previous build.sh run specified -U"
   1951  1.185       apb 			else
   1952  1.363     lukem 				bomb "A previous build.sh run specified -U; you must specify it again now"
   1953  1.185       apb 			fi
   1954  1.185       apb 		fi
   1955  1.185       apb 		;;
   1956  1.185       apb 	esac
   1957  1.254   tsutsui 
   1958  1.254   tsutsui 	# live-image and install-image targets require binary sets
   1959  1.254   tsutsui 	# (actually DESTDIR/etc/mtree/set.* files) built with MKUNPRIVED.
   1960  1.254   tsutsui 	# If release operation is specified with live-image or install-image,
   1961  1.254   tsutsui 	# the release op should be performed with -U for later image ops.
   1962  1.254   tsutsui 	#
   1963  1.254   tsutsui 	if ${do_release} && ( ${do_live_image} || ${do_install_image} ) && \
   1964  1.254   tsutsui 	    [ "${MKUNPRIVED}" = "no" ] ; then
   1965  1.363     lukem 		bomb "-U must be specified on building release to create images later"
   1966  1.254   tsutsui 	fi
   1967   1.84     lukem }
   1968   1.30       jmc 
   1969   1.15        tv 
   1970   1.84     lukem createmakewrapper()
   1971   1.84     lukem {
   1972   1.84     lukem 	# Remove the target directories.
   1973   1.84     lukem 	#
   1974   1.98     lukem 	if ${do_removedirs}; then
   1975   1.98     lukem 		for f in ${removedirs}; do
   1976   1.98     lukem 			statusmsg "Removing ${f}"
   1977   1.98     lukem 			${runcmd} rm -r -f "${f}"
   1978   1.84     lukem 		done
   1979   1.84     lukem 	fi
   1980   1.15        tv 
   1981   1.84     lukem 	# Recreate $TOOLDIR.
   1982   1.84     lukem 	#
   1983   1.98     lukem 	${runcmd} mkdir -p "${TOOLDIR}/bin" ||
   1984   1.98     lukem 	    bomb "mkdir of '${TOOLDIR}/bin' failed"
   1985   1.84     lukem 
   1986  1.214       apb 	# If we did not previously rebuild ${toolprefix}make, then
   1987  1.214       apb 	# check whether $make is still valid and the same as the output
   1988  1.214       apb 	# from print_tooldir_make.  If not, then rebuild make now.  A
   1989  1.214       apb 	# possible reason for this being necessary is that the actual
   1990  1.214       apb 	# value of TOOLDIR might be different from the value guessed
   1991  1.214       apb 	# before the top level obj dir was created.
   1992  1.214       apb 	#
   1993  1.214       apb 	if ! ${done_rebuildmake} && \
   1994  1.214       apb 	    ( [ ! -x "$make" ] || [ "$make" != "$(print_tooldir_make)" ] )
   1995  1.214       apb 	then
   1996  1.214       apb 		rebuildmake
   1997  1.214       apb 	fi
   1998  1.214       apb 
   1999   1.84     lukem 	# Install ${toolprefix}make if it was built.
   2000   1.84     lukem 	#
   2001  1.211       apb 	if ${done_rebuildmake}; then
   2002   1.98     lukem 		${runcmd} rm -f "${TOOLDIR}/bin/${toolprefix}make"
   2003   1.98     lukem 		${runcmd} cp "${make}" "${TOOLDIR}/bin/${toolprefix}make" ||
   2004   1.98     lukem 		    bomb "Failed to install \$TOOLDIR/bin/${toolprefix}make"
   2005   1.98     lukem 		make="${TOOLDIR}/bin/${toolprefix}make"
   2006   1.98     lukem 		statusmsg "Created ${make}"
   2007   1.84     lukem 	fi
   2008   1.15        tv 
   2009   1.84     lukem 	# Build a ${toolprefix}make wrapper script, usable by hand as
   2010   1.84     lukem 	# well as by build.sh.
   2011   1.84     lukem 	#
   2012   1.98     lukem 	if [ -z "${makewrapper}" ]; then
   2013  1.102     lukem 		makewrapper="${TOOLDIR}/bin/${toolprefix}make-${makewrappermachine:-${MACHINE}}"
   2014   1.98     lukem 		[ -z "${BUILDID}" ] || makewrapper="${makewrapper}-${BUILDID}"
   2015   1.52   thorpej 	fi
   2016    1.4        tv 
   2017   1.98     lukem 	${runcmd} rm -f "${makewrapper}"
   2018   1.98     lukem 	if [ "${runcmd}" = "echo" ]; then
   2019   1.98     lukem 		echo 'cat <<EOF >'${makewrapper}
   2020   1.84     lukem 		makewrapout=
   2021   1.84     lukem 	else
   2022   1.98     lukem 		makewrapout=">>\${makewrapper}"
   2023   1.84     lukem 	fi
   2024   1.18        tv 
   2025  1.139     isaki 	case "${KSH_VERSION:-${SH_VERSION}}" in
   2026  1.149   jnemeth 	*PD\ KSH*|*MIRBSD\ KSH*)
   2027  1.135     isaki 		set +o braceexpand
   2028  1.135     isaki 		;;
   2029  1.135     isaki 	esac
   2030  1.135     isaki 
   2031   1.98     lukem 	eval cat <<EOF ${makewrapout}
   2032  1.153       apb #! ${HOST_SH}
   2033    1.4        tv # Set proper variables to allow easy "make" building of a NetBSD subtree.
   2034  1.377    martin # Generated from:  \$NetBSD: build.sh,v 1.377 2024/04/23 07:47:36 martin Exp $
   2035  1.130       jmc # with these arguments: ${_args}
   2036    1.4        tv #
   2037  1.177  uebayasi 
   2038   1.18        tv EOF
   2039  1.177  uebayasi 	{
   2040  1.285       apb 		sorted_vars="$(for var in ${makeenv}; do echo "${var}" ; done \
   2041  1.285       apb 			| sort -u )"
   2042  1.285       apb 		for var in ${sorted_vars}; do
   2043  1.285       apb 			eval val=\"\${${var}}\"
   2044  1.285       apb 			eval is_set=\"\${${var}+set}\"
   2045  1.285       apb 			if [ -z "${is_set}" ]; then
   2046  1.285       apb 				echo "unset ${var}"
   2047  1.177  uebayasi 			else
   2048  1.285       apb 				qval="$(shell_quote "${val}")"
   2049  1.285       apb 				echo "${var}=${qval}; export ${var}"
   2050  1.177  uebayasi 			fi
   2051  1.177  uebayasi 		done
   2052   1.18        tv 
   2053  1.285       apb 		cat <<EOF
   2054   1.18        tv 
   2055   1.98     lukem exec "\${TOOLDIR}/bin/${toolprefix}make" \${1+"\$@"}
   2056    1.4        tv EOF
   2057  1.285       apb 	} | eval cat "${makewrapout}"
   2058   1.98     lukem 	[ "${runcmd}" = "echo" ] && echo EOF
   2059   1.98     lukem 	${runcmd} chmod +x "${makewrapper}"
   2060  1.238  pgoyette 	statusmsg2 "Updated makewrapper:" "${makewrapper}"
   2061   1.84     lukem }
   2062   1.84     lukem 
   2063  1.203     lukem make_in_dir()
   2064  1.203     lukem {
   2065  1.312  christos 	local dir="$1"
   2066  1.312  christos 	local op="$2"
   2067  1.203     lukem 	${runcmd} cd "${dir}" ||
   2068  1.203     lukem 	    bomb "Failed to cd to \"${dir}\""
   2069  1.203     lukem 	${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2070  1.203     lukem 	    bomb "Failed to make ${op} in \"${dir}\""
   2071  1.203     lukem 	${runcmd} cd "${TOP}" ||
   2072  1.203     lukem 	    bomb "Failed to cd back to \"${TOP}\""
   2073  1.203     lukem }
   2074  1.203     lukem 
   2075   1.84     lukem buildtools()
   2076   1.84     lukem {
   2077   1.98     lukem 	if [ "${MKOBJDIRS}" != "no" ]; then
   2078   1.98     lukem 		${runcmd} "${makewrapper}" ${parallel} obj-tools ||
   2079   1.98     lukem 		    bomb "Failed to make obj-tools"
   2080   1.84     lukem 	fi
   2081  1.124     lukem 	if [ "${MKUPDATE}" = "no" ]; then
   2082  1.203     lukem 		make_in_dir tools cleandir
   2083   1.84     lukem 	fi
   2084  1.259     joerg 	make_in_dir tools build_install
   2085   1.98     lukem 	statusmsg "Tools built to ${TOOLDIR}"
   2086   1.84     lukem }
   2087    1.4        tv 
   2088  1.329  christos buildlibs()
   2089  1.329  christos {
   2090  1.329  christos 	if [ "${MKOBJDIRS}" != "no" ]; then
   2091  1.329  christos 		${runcmd} "${makewrapper}" ${parallel} obj ||
   2092  1.329  christos 		    bomb "Failed to make obj"
   2093  1.329  christos 	fi
   2094  1.329  christos 	if [ "${MKUPDATE}" = "no" ]; then
   2095  1.329  christos 		make_in_dir lib cleandir
   2096  1.329  christos 	fi
   2097  1.329  christos 	make_in_dir . do-distrib-dirs
   2098  1.329  christos 	make_in_dir . includes
   2099  1.329  christos 	make_in_dir . do-lib
   2100  1.329  christos 	statusmsg "libs built"
   2101  1.329  christos }
   2102  1.329  christos 
   2103  1.105     lukem getkernelconf()
   2104   1.84     lukem {
   2105  1.105     lukem 	kernelconf="$1"
   2106  1.114     lukem 	if [ "${MKOBJDIRS}" != "no" ]; then
   2107   1.84     lukem 		# The correct value of KERNOBJDIR might
   2108   1.84     lukem 		# depend on a prior "make obj" in
   2109   1.84     lukem 		# ${KERNSRCDIR}/${KERNARCHDIR}/compile.
   2110   1.84     lukem 		#
   2111   1.98     lukem 		KERNSRCDIR="$(getmakevar KERNSRCDIR)"
   2112   1.98     lukem 		KERNARCHDIR="$(getmakevar KERNARCHDIR)"
   2113  1.203     lukem 		make_in_dir "${KERNSRCDIR}/${KERNARCHDIR}/compile" obj
   2114   1.84     lukem 	fi
   2115   1.98     lukem 	KERNCONFDIR="$(getmakevar KERNCONFDIR)"
   2116   1.98     lukem 	KERNOBJDIR="$(getmakevar KERNOBJDIR)"
   2117  1.105     lukem 	case "${kernelconf}" in
   2118   1.84     lukem 	*/*)
   2119  1.105     lukem 		kernelconfpath="${kernelconf}"
   2120  1.105     lukem 		kernelconfname="${kernelconf##*/}"
   2121   1.84     lukem 		;;
   2122   1.84     lukem 	*)
   2123  1.105     lukem 		kernelconfpath="${KERNCONFDIR}/${kernelconf}"
   2124  1.105     lukem 		kernelconfname="${kernelconf}"
   2125   1.84     lukem 		;;
   2126   1.84     lukem 	esac
   2127  1.105     lukem 	kernelbuildpath="${KERNOBJDIR}/${kernelconfname}"
   2128  1.105     lukem }
   2129  1.105     lukem 
   2130  1.264  christos diskimage()
   2131  1.264  christos {
   2132  1.264  christos 	ARG="$(echo $1 | tr '[:lower:]' '[:upper:]')"
   2133  1.341  riastrad 	[ -f "${DESTDIR}/etc/mtree/set.base" ] ||
   2134  1.264  christos 	    bomb "The release binaries must be built first"
   2135  1.264  christos 	kerneldir="${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/kernel"
   2136  1.264  christos 	kernel="${kerneldir}/netbsd-${ARG}.gz"
   2137  1.264  christos 	[ -f "${kernel}" ] ||
   2138  1.264  christos 	    bomb "The kernel ${kernel} must be built first"
   2139  1.264  christos 	make_in_dir "${NETBSDSRCDIR}/etc" "smp_${1}"
   2140  1.264  christos }
   2141  1.264  christos 
   2142  1.105     lukem buildkernel()
   2143  1.105     lukem {
   2144  1.105     lukem 	if ! ${do_tools} && ! ${buildkernelwarned:-false}; then
   2145  1.105     lukem 		# Building tools every time we build a kernel is clearly
   2146  1.105     lukem 		# unnecessary.  We could try to figure out whether rebuilding
   2147  1.105     lukem 		# the tools is necessary this time, but it doesn't seem worth
   2148  1.105     lukem 		# the trouble.  Instead, we say it's the user's responsibility
   2149  1.105     lukem 		# to rebuild the tools if necessary.
   2150  1.105     lukem 		#
   2151  1.105     lukem 		statusmsg "Building kernel without building new tools"
   2152  1.105     lukem 		buildkernelwarned=true
   2153  1.105     lukem 	fi
   2154  1.105     lukem 	getkernelconf $1
   2155  1.238  pgoyette 	statusmsg2 "Building kernel:" "${kernelconf}"
   2156  1.238  pgoyette 	statusmsg2 "Build directory:" "${kernelbuildpath}"
   2157  1.105     lukem 	${runcmd} mkdir -p "${kernelbuildpath}" ||
   2158  1.105     lukem 	    bomb "Cannot mkdir: ${kernelbuildpath}"
   2159  1.124     lukem 	if [ "${MKUPDATE}" = "no" ]; then
   2160  1.203     lukem 		make_in_dir "${kernelbuildpath}" cleandir
   2161   1.16   thorpej 	fi
   2162  1.157    rillig 	[ -x "${TOOLDIR}/bin/${toolprefix}config" ] \
   2163  1.363     lukem 	|| bomb "${TOOLDIR}/bin/${toolprefix}config does not exist. You need to \"$0 tools\" first"
   2164  1.305  uebayasi 	CONFIGOPTS=$(getmakevar CONFIGOPTS)
   2165  1.305  uebayasi 	${runcmd} "${TOOLDIR}/bin/${toolprefix}config" ${CONFIGOPTS} \
   2166  1.305  uebayasi 		-b "${kernelbuildpath}" -s "${TOP}/sys" ${configopts} \
   2167  1.305  uebayasi 		"${kernelconfpath}" ||
   2168  1.105     lukem 	    bomb "${toolprefix}config failed for ${kernelconf}"
   2169  1.203     lukem 	make_in_dir "${kernelbuildpath}" depend
   2170  1.203     lukem 	make_in_dir "${kernelbuildpath}" all
   2171   1.91     lukem 
   2172   1.98     lukem 	if [ "${runcmd}" != "echo" ]; then
   2173  1.105     lukem 		statusmsg "Kernels built from ${kernelconf}:"
   2174  1.105     lukem 		kernlist=$(awk '$1 == "config" { print $2 }' ${kernelconfpath})
   2175   1.91     lukem 		for kern in ${kernlist:-netbsd}; do
   2176  1.105     lukem 			[ -f "${kernelbuildpath}/${kern}" ] && \
   2177  1.105     lukem 			    echo "  ${kernelbuildpath}/${kern}"
   2178   1.98     lukem 		done | tee -a "${results}"
   2179   1.91     lukem 	fi
   2180   1.84     lukem }
   2181   1.84     lukem 
   2182  1.105     lukem releasekernel()
   2183  1.105     lukem {
   2184  1.105     lukem 	getkernelconf $1
   2185  1.186     lukem 	kernelreldir="${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/kernel"
   2186  1.105     lukem 	${runcmd} mkdir -p "${kernelreldir}"
   2187  1.105     lukem 	kernlist=$(awk '$1 == "config" { print $2 }' ${kernelconfpath})
   2188  1.105     lukem 	for kern in ${kernlist:-netbsd}; do
   2189  1.105     lukem 		builtkern="${kernelbuildpath}/${kern}"
   2190  1.105     lukem 		[ -f "${builtkern}" ] || continue
   2191  1.105     lukem 		releasekern="${kernelreldir}/${kern}-${kernelconfname}.gz"
   2192  1.238  pgoyette 		statusmsg2 "Kernel copy:" "${releasekern}"
   2193  1.196     lukem 		if [ "${runcmd}" = "echo" ]; then
   2194  1.196     lukem 			echo "gzip -c -9 < ${builtkern} > ${releasekern}"
   2195  1.196     lukem 		else
   2196  1.196     lukem 			gzip -c -9 < "${builtkern}" > "${releasekern}"
   2197  1.196     lukem 		fi
   2198  1.105     lukem 	done
   2199  1.105     lukem }
   2200  1.105     lukem 
   2201  1.300  uebayasi buildkernels()
   2202  1.300  uebayasi {
   2203  1.306  christos 	allkernels=$( runcmd= make_in_dir etc '-V ${ALL_KERNELS}' )
   2204  1.300  uebayasi 	for k in $allkernels; do
   2205  1.300  uebayasi 		buildkernel "${k}"
   2206  1.300  uebayasi 	done
   2207  1.300  uebayasi }
   2208  1.300  uebayasi 
   2209  1.207   jnemeth buildmodules()
   2210  1.207   jnemeth {
   2211  1.234      morr 	setmakeenv MKBINUTILS no
   2212  1.207   jnemeth 	if ! ${do_tools} && ! ${buildmoduleswarned:-false}; then
   2213  1.207   jnemeth 		# Building tools every time we build modules is clearly
   2214  1.207   jnemeth 		# unnecessary as well as a kernel.
   2215  1.207   jnemeth 		#
   2216  1.207   jnemeth 		statusmsg "Building modules without building new tools"
   2217  1.207   jnemeth 		buildmoduleswarned=true
   2218  1.207   jnemeth 	fi
   2219  1.207   jnemeth 
   2220  1.207   jnemeth 	statusmsg "Building kernel modules for NetBSD/${MACHINE} ${DISTRIBVER}"
   2221  1.207   jnemeth 	if [ "${MKOBJDIRS}" != "no" ]; then
   2222  1.256   tsutsui 		make_in_dir sys/modules obj
   2223  1.207   jnemeth 	fi
   2224  1.207   jnemeth 	if [ "${MKUPDATE}" = "no" ]; then
   2225  1.207   jnemeth 		make_in_dir sys/modules cleandir
   2226  1.207   jnemeth 	fi
   2227  1.256   tsutsui 	make_in_dir sys/modules dependall
   2228  1.256   tsutsui 	make_in_dir sys/modules install
   2229  1.207   jnemeth 
   2230  1.236  pgoyette 	statusmsg "Successful build of kernel modules for NetBSD/${MACHINE} ${DISTRIBVER}"
   2231  1.207   jnemeth }
   2232  1.207   jnemeth 
   2233  1.335  jmcneill builddtb()
   2234  1.335  jmcneill {
   2235  1.335  jmcneill 	statusmsg "Building devicetree blobs for NetBSD/${MACHINE} ${DISTRIBVER}"
   2236  1.335  jmcneill 	if [ "${MKOBJDIRS}" != "no" ]; then
   2237  1.335  jmcneill 		make_in_dir sys/dtb obj
   2238  1.335  jmcneill 	fi
   2239  1.335  jmcneill 	if [ "${MKUPDATE}" = "no" ]; then
   2240  1.335  jmcneill 		make_in_dir sys/dtb cleandir
   2241  1.335  jmcneill 	fi
   2242  1.335  jmcneill 	make_in_dir sys/dtb dependall
   2243  1.335  jmcneill 	make_in_dir sys/dtb install
   2244  1.335  jmcneill 
   2245  1.335  jmcneill 	statusmsg "Successful build of devicetree blobs for NetBSD/${MACHINE} ${DISTRIBVER}"
   2246  1.335  jmcneill }
   2247  1.335  jmcneill 
   2248  1.245  jmcneill installmodules()
   2249  1.245  jmcneill {
   2250  1.245  jmcneill 	dir="$1"
   2251  1.245  jmcneill 	${runcmd} "${makewrapper}" INSTALLMODULESDIR="${dir}" installmodules ||
   2252  1.245  jmcneill 	    bomb "Failed to make installmodules to ${dir}"
   2253  1.245  jmcneill 	statusmsg "Successful installmodules to ${dir}"
   2254  1.245  jmcneill }
   2255  1.245  jmcneill 
   2256   1.84     lukem installworld()
   2257   1.84     lukem {
   2258   1.84     lukem 	dir="$1"
   2259   1.98     lukem 	${runcmd} "${makewrapper}" INSTALLWORLDDIR="${dir}" installworld ||
   2260   1.98     lukem 	    bomb "Failed to make installworld to ${dir}"
   2261   1.98     lukem 	statusmsg "Successful installworld to ${dir}"
   2262   1.84     lukem }
   2263   1.84     lukem 
   2264  1.219     pooka # Run rump build&link tests.
   2265  1.219     pooka #
   2266  1.219     pooka # To make this feasible for running without having to install includes and
   2267  1.219     pooka # libraries into destdir (i.e. quick), we only run ld.  This is possible
   2268  1.219     pooka # since the rump kernel is a closed namespace apart from calls to rumpuser.
   2269  1.219     pooka # Therefore, if ld complains only about rumpuser symbols, rump kernel
   2270  1.219     pooka # linking was successful.
   2271  1.246       wiz #
   2272  1.219     pooka # We test that rump links with a number of component configurations.
   2273  1.219     pooka # These attempt to mimic what is encountered in the full build.
   2274  1.219     pooka # See list below.  The list should probably be either autogenerated
   2275  1.246       wiz # or managed elsewhere; keep it here until a better idea arises.
   2276  1.219     pooka #
   2277  1.219     pooka # Above all, note that THIS IS NOT A SUBSTITUTE FOR A FULL BUILD.
   2278  1.219     pooka #
   2279  1.219     pooka 
   2280  1.367       uwe # XXX: uwe: kern/56599 - while riastradh addressed librump problems,
   2281  1.367       uwe # there are still unwanted dependencies:
   2282  1.367       uwe #    net -> net_net
   2283  1.367       uwe #    vfs -> fifo
   2284  1.367       uwe 
   2285  1.367       uwe # -lrumpvfs -> $LRUMPVFS for now
   2286  1.367       uwe LRUMPVFS="-lrumpvfs -lrumpvfs_nofifofs"
   2287  1.367       uwe 
   2288  1.367       uwe RUMP_LIBSETS="
   2289  1.367       uwe 	-lrump,
   2290  1.367       uwe         -lrumpvfs
   2291  1.367       uwe             --no-whole-archive -lrumpvfs_nofifofs -lrump,
   2292  1.367       uwe 	-lrumpkern_tty
   2293  1.367       uwe             --no-whole-archive $LRUMPVFS -lrump,
   2294  1.367       uwe 	-lrumpfs_tmpfs
   2295  1.367       uwe             --no-whole-archive $LRUMPVFS -lrump,
   2296  1.367       uwe 	-lrumpfs_ffs -lrumpfs_msdos
   2297  1.368       uwe             --no-whole-archive $LRUMPVFS -lrumpdev_disk -lrumpdev -lrump,
   2298  1.341  riastrad 	-lrumpnet_virtif -lrumpnet_netinet -lrumpnet_net -lrumpnet
   2299  1.367       uwe 	    --no-whole-archive -lrump,
   2300  1.367       uwe 	-lrumpfs_nfs
   2301  1.367       uwe 	    --no-whole-archive $LRUMPVFS
   2302  1.367       uwe 	    -lrumpnet_sockin -lrumpnet_virtif -lrumpnet_netinet
   2303  1.367       uwe             --start-group -lrumpnet_net -lrumpnet --end-group -lrump,
   2304  1.367       uwe 	-lrumpdev_cgd -lrumpdev_raidframe -lrumpdev_rnd -lrumpdev_dm
   2305  1.368       uwe             --no-whole-archive $LRUMPVFS -lrumpdev_disk -lrumpdev -lrumpkern_crypto -lrump
   2306  1.367       uwe "
   2307  1.367       uwe 
   2308  1.219     pooka dorump()
   2309  1.219     pooka {
   2310  1.219     pooka 	local doclean=""
   2311  1.219     pooka 	local doobjs=""
   2312  1.219     pooka 
   2313  1.273     pooka 	export RUMPKERN_ONLY=1
   2314  1.227     pooka 	# create obj and distrib dirs
   2315  1.228     pooka 	if [ "${MKOBJDIRS}" != "no" ]; then
   2316  1.228     pooka 		make_in_dir "${NETBSDSRCDIR}/etc/mtree" obj
   2317  1.228     pooka 		make_in_dir "${NETBSDSRCDIR}/sys/rump" obj
   2318  1.228     pooka 	fi
   2319  1.227     pooka 	${runcmd} "${makewrapper}" ${parallel} do-distrib-dirs \
   2320  1.363     lukem 	    || bomb "Could not create distrib-dirs"
   2321  1.227     pooka 
   2322  1.219     pooka 	[ "${MKUPDATE}" = "no" ] && doclean="cleandir"
   2323  1.219     pooka 	targlist="${doclean} ${doobjs} dependall install"
   2324  1.219     pooka 	# optimize: for test we build only static libs (3x test speedup)
   2325  1.219     pooka 	if [ "${1}" = "rumptest" ] ; then
   2326  1.219     pooka 		setmakeenv NOPIC 1
   2327  1.219     pooka 		setmakeenv NOPROFILE 1
   2328  1.219     pooka 	fi
   2329  1.219     pooka 	for cmd in ${targlist} ; do
   2330  1.219     pooka 		make_in_dir "${NETBSDSRCDIR}/sys/rump" ${cmd}
   2331  1.219     pooka 	done
   2332  1.219     pooka 
   2333  1.219     pooka 	# if we just wanted to build & install rump, we're done
   2334  1.219     pooka 	[ "${1}" != "rumptest" ] && return
   2335  1.219     pooka 
   2336  1.221     pooka 	${runcmd} cd "${NETBSDSRCDIR}/sys/rump/librump/rumpkern" \
   2337  1.221     pooka 	    || bomb "cd to rumpkern failed"
   2338  1.221     pooka 	md_quirks=`${runcmd} "${makewrapper}" -V '${_SYMQUIRK}'`
   2339  1.221     pooka 	# one little, two little, three little backslashes ...
   2340  1.231      hans 	md_quirks="$(echo ${md_quirks} | sed 's,\\,\\\\,g'";s/'//g" )"
   2341  1.221     pooka 	${runcmd} cd "${TOP}" || bomb "cd to ${TOP} failed"
   2342  1.219     pooka 	tool_ld=`${runcmd} "${makewrapper}" -V '${LD}'`
   2343  1.221     pooka 
   2344  1.219     pooka 	local oIFS="${IFS}"
   2345  1.219     pooka 	IFS=","
   2346  1.219     pooka 	for set in ${RUMP_LIBSETS} ; do
   2347  1.219     pooka 		IFS="${oIFS}"
   2348  1.219     pooka 		${runcmd} ${tool_ld} -nostdlib -L${DESTDIR}/usr/lib	\
   2349  1.367       uwe 		    -static --whole-archive ${set} --no-whole-archive -lpthread -lc 2>&1 -o /tmp/rumptest.$$ | \
   2350  1.221     pooka 		      awk -v quirks="${md_quirks}" '
   2351  1.219     pooka 			/undefined reference/ &&
   2352  1.219     pooka 			    !/more undefined references.*follow/{
   2353  1.221     pooka 				if (match($NF,
   2354  1.266     pooka 				    "`(rumpuser_|rumpcomp_|__" quirks ")") == 0)
   2355  1.219     pooka 					fails[NR] = $0
   2356  1.221     pooka 			}
   2357  1.230     pooka 			/cannot find -l/{fails[NR] = $0}
   2358  1.241     pooka 			/cannot open output file/{fails[NR] = $0}
   2359  1.219     pooka 			END{
   2360  1.219     pooka 				for (x in fails)
   2361  1.219     pooka 					print fails[x]
   2362  1.219     pooka 				exit x!=0
   2363  1.219     pooka 			}'
   2364  1.219     pooka 		[ $? -ne 0 ] && bomb "Testlink of rump failed: ${set}"
   2365  1.219     pooka 	done
   2366  1.219     pooka 	statusmsg "Rump build&link tests successful"
   2367  1.219     pooka }
   2368   1.84     lukem 
   2369  1.351  christos repro_date() {
   2370  1.359    andvar 	# try the bsd date fail back the linux one
   2371  1.352  christos 	date -u -r "$1" 2> /dev/null || date -u -d "@$1"
   2372  1.351  christos }
   2373  1.351  christos 
   2374  1.312  christos setup_mkrepro()
   2375  1.312  christos {
   2376  1.356    martin 	local quiet="$1"
   2377  1.356    martin 
   2378  1.312  christos 	if [ ${MKREPRO-no} != "yes" ]; then
   2379  1.312  christos 		return
   2380  1.312  christos 	fi
   2381  1.356    martin 	if [ ${MKREPRO_TIMESTAMP-0} -ne 0 ]; then
   2382  1.356    martin 		return;
   2383  1.356    martin 	fi
   2384  1.349  christos 
   2385  1.314  christos 	local dirs=${NETBSDSRCDIR-/usr/src}/
   2386  1.312  christos 	if [ ${MKX11-no} = "yes" ]; then
   2387  1.314  christos 		dirs="$dirs ${X11SRCDIR-/usr/xsrc}/"
   2388  1.312  christos 	fi
   2389  1.349  christos 
   2390  1.349  christos 	MKREPRO_TIMESTAMP=0
   2391  1.349  christos 	local d
   2392  1.349  christos 	local t
   2393  1.349  christos 	local vcs
   2394  1.349  christos 	for d in ${dirs}; do
   2395  1.349  christos 		if [ -d "${d}CVS" ]; then
   2396  1.366    martin 			local cvslatest=$(print_tooldir_program cvslatest)
   2397  1.366    martin 			if [ ! -x "${cvslatest}" ]; then
   2398  1.366    martin 				buildtools
   2399  1.366    martin 			fi
   2400  1.366    martin 
   2401  1.366    martin 			local cvslatestflags=
   2402  1.366    martin 			if ${do_expertmode}; then
   2403  1.366    martin 				cvslatestflags=-i
   2404  1.366    martin 			fi
   2405  1.366    martin 
   2406  1.349  christos 			t=$("${cvslatest}" ${cvslatestflags} "${d}")
   2407  1.349  christos 			vcs=cvs
   2408  1.374   khorben 		elif [ -d "${d}.git" -o -f "${d}.git" ]; then
   2409  1.349  christos 			t=$(cd "${d}" && git log -1 --format=%ct)
   2410  1.349  christos 			vcs=git
   2411  1.349  christos 		elif [ -d "${d}.hg" ]; then
   2412  1.357     joerg 			t=$(hg --repo "$d" log -r . --template '{date.unixtime}\n')
   2413  1.357     joerg 			vcs=hg
   2414  1.357     joerg 		elif [ -f "${d}.hg_archival.txt" ]; then
   2415  1.357     joerg 			local stat=$(print_tooldir_program stat)
   2416  1.366    martin 			if [ ! -x "${stat}" ]; then
   2417  1.366    martin 				buildtools
   2418  1.366    martin 			fi
   2419  1.366    martin 
   2420  1.357     joerg 			t=$("${stat}" -t '%s' -f '%m' "${d}.hg_archival.txt")
   2421  1.349  christos 			vcs=hg
   2422  1.349  christos 		else
   2423  1.349  christos 			bomb "Cannot determine VCS for '$d'"
   2424  1.349  christos 		fi
   2425  1.349  christos 
   2426  1.349  christos 		if [ -z "$t" ]; then
   2427  1.349  christos 			bomb "Failed to get timestamp for vcs=$vcs in '$d'"
   2428  1.349  christos 		fi
   2429  1.349  christos 
   2430  1.349  christos 		#echo "latest $d $vcs $t"
   2431  1.349  christos 		if [ "$t" -gt "$MKREPRO_TIMESTAMP" ]; then
   2432  1.349  christos 			MKREPRO_TIMESTAMP="$t"
   2433  1.349  christos 		fi
   2434  1.349  christos 	done
   2435  1.349  christos 
   2436  1.377    martin 	[ "${MKREPRO_TIMESTAMP}" -ne 0 ] || bomb "Failed to compute timestamp"
   2437  1.356    martin 	if [ -z "${quiet}" ]; then
   2438  1.356    martin 		statusmsg2 "MKREPRO_TIMESTAMP" \
   2439  1.356    martin 			"$(repro_date "${MKREPRO_TIMESTAMP}")"
   2440  1.356    martin 	fi
   2441  1.312  christos 	export MKREPRO MKREPRO_TIMESTAMP
   2442  1.312  christos }
   2443  1.312  christos 
   2444   1.84     lukem main()
   2445   1.84     lukem {
   2446   1.84     lukem 	initdefaults
   2447  1.130       jmc 	_args=$@
   2448   1.84     lukem 	parseoptions "$@"
   2449   1.93     lukem 
   2450  1.163       apb 	sanitycheck
   2451  1.163       apb 
   2452   1.93     lukem 	build_start=$(date)
   2453  1.240  pgoyette 	statusmsg2 "${progname} command:" "$0 $*"
   2454  1.238  pgoyette 	statusmsg2 "${progname} started:" "${build_start}"
   2455  1.238  pgoyette 	statusmsg2 "NetBSD version:"   "${DISTRIBVER}"
   2456  1.238  pgoyette 	statusmsg2 "MACHINE:"          "${MACHINE}"
   2457  1.238  pgoyette 	statusmsg2 "MACHINE_ARCH:"     "${MACHINE_ARCH}"
   2458  1.238  pgoyette 	statusmsg2 "Build platform:"   "${uname_s} ${uname_r} ${uname_m}"
   2459  1.238  pgoyette 	statusmsg2 "HOST_SH:"          "${HOST_SH}"
   2460  1.282       apb 	if [ -n "${BUILDID}" ]; then
   2461  1.282       apb 		statusmsg2 "BUILDID:"  "${BUILDID}"
   2462  1.282       apb 	fi
   2463  1.287       apb 	if [ -n "${BUILDINFO}" ]; then
   2464  1.287       apb 		printf "%b\n" "${BUILDINFO}" | \
   2465  1.287       apb 		while read -r line ; do
   2466  1.287       apb 			[ -s "${line}" ] && continue
   2467  1.287       apb 			statusmsg2 "BUILDINFO:"  "${line}"
   2468  1.287       apb 		done
   2469  1.287       apb 	fi
   2470  1.153       apb 
   2471  1.373     lukem 	if [ -n "${MAKECONF+1}" ] && [ -z "${MAKECONF}" ]; then
   2472  1.373     lukem 		bomb "MAKECONF must not be empty"
   2473  1.373     lukem 	fi
   2474  1.373     lukem 
   2475   1.84     lukem 	rebuildmake
   2476   1.84     lukem 	validatemakeparams
   2477   1.84     lukem 	createmakewrapper
   2478  1.316  christos 	setup_mkrepro
   2479   1.84     lukem 
   2480   1.84     lukem 	# Perform the operations.
   2481   1.84     lukem 	#
   2482   1.98     lukem 	for op in ${operations}; do
   2483   1.98     lukem 		case "${op}" in
   2484   1.86     lukem 
   2485   1.86     lukem 		makewrapper)
   2486   1.86     lukem 			# no-op
   2487   1.86     lukem 			;;
   2488   1.84     lukem 
   2489   1.84     lukem 		tools)
   2490   1.84     lukem 			buildtools
   2491   1.84     lukem 			;;
   2492  1.329  christos 		libs)
   2493  1.329  christos 			buildlibs
   2494  1.329  christos 			;;
   2495   1.84     lukem 
   2496  1.125     lukem 		sets)
   2497  1.125     lukem 			statusmsg "Building sets from pre-populated ${DESTDIR}"
   2498  1.125     lukem 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2499  1.125     lukem 			    bomb "Failed to make ${op}"
   2500  1.186     lukem 			setdir=${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets
   2501  1.186     lukem 			statusmsg "Built sets to ${setdir}"
   2502  1.125     lukem 			;;
   2503  1.142       apb 
   2504  1.312  christos 		build|distribution|release)
   2505  1.312  christos 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2506  1.312  christos 			    bomb "Failed to make ${op}"
   2507  1.312  christos 			statusmsg "Successful make ${op}"
   2508  1.312  christos 			;;
   2509  1.312  christos 
   2510  1.371     lukem 		cleandir|obj|sourcesets|syspkgs|params|show-params)
   2511   1.98     lukem 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2512   1.98     lukem 			    bomb "Failed to make ${op}"
   2513   1.98     lukem 			statusmsg "Successful make ${op}"
   2514   1.84     lukem 			;;
   2515   1.84     lukem 
   2516  1.173   jnemeth 		iso-image|iso-image-source)
   2517  1.173   jnemeth 			${runcmd} "${makewrapper}" ${parallel} \
   2518  1.209       apb 			    CDEXTRA="$CDEXTRA" ${op} ||
   2519  1.173   jnemeth 			    bomb "Failed to make ${op}"
   2520  1.173   jnemeth 			statusmsg "Successful make ${op}"
   2521  1.173   jnemeth 			;;
   2522  1.173   jnemeth 
   2523  1.254   tsutsui 		live-image|install-image)
   2524  1.254   tsutsui 			# install-image and live-image require mtree spec files
   2525  1.370     lukem 			# built with MKUNPRIVED.  Assume MKUNPRIVED build has been
   2526  1.254   tsutsui 			# performed if METALOG file is created in DESTDIR.
   2527  1.254   tsutsui 			if [ ! -e "${DESTDIR}/METALOG" ] ; then
   2528  1.363     lukem 				bomb "The release binaries must have been built with -U to create images"
   2529  1.254   tsutsui 			fi
   2530  1.253   tsutsui 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2531  1.253   tsutsui 			    bomb "Failed to make ${op}"
   2532  1.253   tsutsui 			statusmsg "Successful make ${op}"
   2533  1.253   tsutsui 			;;
   2534   1.84     lukem 		kernel=*)
   2535   1.84     lukem 			arg=${op#*=}
   2536   1.84     lukem 			buildkernel "${arg}"
   2537  1.105     lukem 			;;
   2538  1.281    martin 		kernel.gdb=*)
   2539  1.281    martin 			arg=${op#*=}
   2540  1.302  uebayasi 			configopts="-D DEBUG=-g"
   2541  1.302  uebayasi 			buildkernel "${arg}"
   2542  1.302  uebayasi 			;;
   2543  1.105     lukem 		releasekernel=*)
   2544  1.105     lukem 			arg=${op#*=}
   2545  1.105     lukem 			releasekernel "${arg}"
   2546   1.84     lukem 			;;
   2547   1.84     lukem 
   2548  1.300  uebayasi 		kernels)
   2549  1.300  uebayasi 			buildkernels
   2550  1.300  uebayasi 			;;
   2551  1.300  uebayasi 
   2552  1.264  christos 		disk-image=*)
   2553  1.264  christos 			arg=${op#*=}
   2554  1.264  christos 			diskimage "${arg}"
   2555  1.264  christos 			;;
   2556  1.264  christos 
   2557  1.335  jmcneill 		dtb)
   2558  1.335  jmcneill 			builddtb
   2559  1.335  jmcneill 			;;
   2560  1.335  jmcneill 
   2561  1.207   jnemeth 		modules)
   2562  1.207   jnemeth 			buildmodules
   2563  1.207   jnemeth 			;;
   2564  1.207   jnemeth 
   2565  1.245  jmcneill 		installmodules=*)
   2566  1.245  jmcneill 			arg=${op#*=}
   2567  1.245  jmcneill 			if [ "${arg}" = "/" ] && \
   2568  1.245  jmcneill 			    (	[ "${uname_s}" != "NetBSD" ] || \
   2569  1.245  jmcneill 				[ "${uname_m}" != "${MACHINE}" ] ); then
   2570  1.363     lukem 				bomb "'${op}' must != / for cross builds"
   2571  1.245  jmcneill 			fi
   2572  1.245  jmcneill 			installmodules "${arg}"
   2573  1.245  jmcneill 			;;
   2574  1.245  jmcneill 
   2575   1.84     lukem 		install=*)
   2576   1.84     lukem 			arg=${op#*=}
   2577   1.85     lukem 			if [ "${arg}" = "/" ] && \
   2578   1.85     lukem 			    (	[ "${uname_s}" != "NetBSD" ] || \
   2579   1.98     lukem 				[ "${uname_m}" != "${MACHINE}" ] ); then
   2580  1.363     lukem 				bomb "'${op}' must != / for cross builds"
   2581   1.85     lukem 			fi
   2582   1.84     lukem 			installworld "${arg}"
   2583   1.70     lukem 			;;
   2584   1.84     lukem 
   2585  1.355  christos 		rump)
   2586  1.355  christos 			make_in_dir . do-distrib-dirs
   2587  1.355  christos 			make_in_dir . includes
   2588  1.355  christos 			make_in_dir lib/csu dependall
   2589  1.355  christos 			make_in_dir lib/csu install
   2590  1.355  christos 			make_in_dir external/gpl3/gcc/lib/libgcc dependall
   2591  1.355  christos 			make_in_dir external/gpl3/gcc/lib/libgcc install
   2592  1.355  christos 			dorump "${op}"
   2593  1.355  christos 			;;
   2594  1.355  christos 
   2595  1.355  christos 		rumptest)
   2596  1.219     pooka 			dorump "${op}"
   2597  1.219     pooka 			;;
   2598  1.219     pooka 
   2599   1.70     lukem 		*)
   2600  1.365     lukem 			bomb "Unknown OPERATION '${op}'"
   2601   1.70     lukem 			;;
   2602   1.84     lukem 
   2603   1.70     lukem 		esac
   2604   1.84     lukem 	done
   2605   1.93     lukem 
   2606  1.238  pgoyette 	statusmsg2 "${progname} ended:" "$(date)"
   2607   1.98     lukem 	if [ -s "${results}" ]; then
   2608   1.98     lukem 		echo "===> Summary of results:"
   2609   1.98     lukem 		sed -e 's/^===>//;s/^/	/' "${results}"
   2610   1.98     lukem 		echo "===> ."
   2611   1.98     lukem 	fi
   2612   1.84     lukem }
   2613   1.84     lukem 
   2614   1.84     lukem main "$@"
   2615