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