Home | History | Annotate | Line # | Download | only in src
build.sh revision 1.390
      1   1.67   thorpej #! /usr/bin/env sh
      2  1.390    martin #	$NetBSD: build.sh,v 1.390 2025/04/22 10:22:29 martin Exp $
      3   1.84     lukem #
      4  1.369     lukem # Copyright (c) 2001-2023 The NetBSD Foundation, Inc.
      5   1.84     lukem # All rights reserved.
      6   1.84     lukem #
      7   1.84     lukem # This code is derived from software contributed to The NetBSD Foundation
      8   1.84     lukem # by Todd Vierling and Luke Mewburn.
      9   1.84     lukem #
     10   1.84     lukem # Redistribution and use in source and binary forms, with or without
     11   1.84     lukem # modification, are permitted provided that the following conditions
     12   1.84     lukem # are met:
     13   1.84     lukem # 1. Redistributions of source code must retain the above copyright
     14   1.84     lukem #    notice, this list of conditions and the following disclaimer.
     15   1.84     lukem # 2. Redistributions in binary form must reproduce the above copyright
     16   1.84     lukem #    notice, this list of conditions and the following disclaimer in the
     17   1.84     lukem #    documentation and/or other materials provided with the distribution.
     18   1.84     lukem #
     19   1.84     lukem # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
     20   1.84     lukem # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
     21   1.84     lukem # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     22   1.84     lukem # PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
     23   1.84     lukem # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     24   1.84     lukem # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     25   1.84     lukem # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     26   1.84     lukem # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     27   1.84     lukem # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     28   1.84     lukem # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     29   1.84     lukem # POSSIBILITY OF SUCH DAMAGE.
     30   1.84     lukem #
     31    1.1        tv #
     32  1.249       apb # Top level build wrapper, to build or cross-build NetBSD.
     33    1.1        tv #
     34  1.249       apb 
     35  1.249       apb #
     36  1.249       apb # {{{ Begin shell feature tests.
     37  1.249       apb #
     38  1.249       apb # We try to determine whether or not this script is being run under
     39  1.249       apb # a shell that supports the features that we use.  If not, we try to
     40  1.249       apb # re-exec the script under another shell.  If we can't find another
     41  1.369     lukem # suitable shell, then we show a message and exit.
     42  1.249       apb #
     43  1.249       apb 
     44  1.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.312  christos 			;;
   1373  1.312  christos 
   1374   1.84     lukem 		-R)
   1375  1.386       kre 			eval ${optargcmd}
   1376  1.386       kre 			resolvepath OPTARG
   1377  1.109     lukem 			setmakeenv RELEASEDIR "${OPTARG}"
   1378   1.84     lukem 			;;
   1379   1.84     lukem 
   1380   1.84     lukem 		-r)
   1381   1.84     lukem 			do_removedirs=true
   1382   1.84     lukem 			do_rebuildmake=true
   1383   1.84     lukem 			;;
   1384   1.84     lukem 
   1385  1.190     perry 		-S)
   1386  1.190     perry 			eval ${optargcmd}
   1387  1.190     perry 			setmakeenv BUILDSEED "${OPTARG}"
   1388  1.190     perry 			;;
   1389  1.190     perry 
   1390   1.84     lukem 		-T)
   1391  1.386       kre 			eval ${optargcmd}
   1392  1.386       kre 			resolvepath OPTARG
   1393   1.98     lukem 			TOOLDIR="${OPTARG}"
   1394   1.84     lukem 			export TOOLDIR
   1395   1.84     lukem 			;;
   1396   1.84     lukem 
   1397   1.84     lukem 		-U)
   1398  1.109     lukem 			setmakeenv MKUNPRIVED yes
   1399   1.84     lukem 			;;
   1400   1.44     lukem 
   1401   1.84     lukem 		-u)
   1402  1.109     lukem 			setmakeenv MKUPDATE yes
   1403   1.84     lukem 			;;
   1404   1.15        tv 
   1405   1.84     lukem 		-V)
   1406   1.98     lukem 			eval ${optargcmd}
   1407   1.84     lukem 			case "${OPTARG}" in
   1408   1.80     lukem 		    # XXX: consider restricting which variables can be changed?
   1409  1.321       kre 			[a-zA-Z_]*=*)
   1410  1.321       kre 				safe_setmakeenv "${OPTARG%%=*}" "${OPTARG#*=}"
   1411  1.321       kre 				;;
   1412  1.321       kre 			[a-zA-Z_]*)
   1413  1.321       kre 				safe_setmakeenv "${OPTARG}" ""
   1414   1.84     lukem 				;;
   1415   1.84     lukem 			*)
   1416  1.365     lukem 				usage "-V argument must be of the form 'VAR[=VALUE]'"
   1417   1.84     lukem 				;;
   1418   1.84     lukem 			esac
   1419   1.84     lukem 			;;
   1420   1.84     lukem 
   1421   1.84     lukem 		-w)
   1422  1.386       kre 			eval ${optargcmd}
   1423  1.386       kre 			resolvepath OPTARG
   1424   1.98     lukem 			makewrapper="${OPTARG}"
   1425   1.84     lukem 			;;
   1426   1.84     lukem 
   1427  1.127     lukem 		-X)
   1428  1.386       kre 			eval ${optargcmd}
   1429  1.386       kre 			resolvepath OPTARG
   1430  1.127     lukem 			setmakeenv X11SRCDIR "${OPTARG}"
   1431  1.127     lukem 			;;
   1432  1.127     lukem 
   1433  1.127     lukem 		-x)
   1434  1.127     lukem 			setmakeenv MKX11 yes
   1435  1.127     lukem 			;;
   1436  1.127     lukem 
   1437  1.111     lukem 		-Z)
   1438  1.111     lukem 			eval ${optargcmd}
   1439  1.111     lukem 		    # XXX: consider restricting which variables can be unset?
   1440  1.321       kre 			safe_unsetmakeenv "${OPTARG}"
   1441  1.111     lukem 			;;
   1442  1.111     lukem 
   1443   1.84     lukem 		--)
   1444   1.84     lukem 			break
   1445   1.84     lukem 			;;
   1446   1.84     lukem 
   1447  1.363     lukem 		-h)
   1448  1.362     lukem 			help
   1449  1.362     lukem 			exit 0
   1450   1.84     lukem 			;;
   1451   1.84     lukem 
   1452  1.363     lukem 		'-?')
   1453  1.386       kre 			if [ "${OPTARG}" = '?' ]
   1454  1.386       kre 			then
   1455  1.363     lukem 				help
   1456  1.363     lukem 				exit 0
   1457  1.363     lukem 			fi
   1458  1.363     lukem 			usage "Unknown option -${OPTARG}"
   1459  1.363     lukem 			;;
   1460  1.363     lukem 
   1461  1.363     lukem 		-:)
   1462  1.363     lukem 			usage "Missing argument for option -${OPTARG}"
   1463  1.363     lukem 			;;
   1464  1.363     lukem 
   1465  1.363     lukem 		*)
   1466  1.363     lukem 			usage "Unimplemented option ${opt}"
   1467  1.363     lukem 			;;
   1468  1.363     lukem 
   1469   1.84     lukem 		esac
   1470   1.84     lukem 	done
   1471   1.84     lukem 
   1472   1.84     lukem 	# Validate operations.
   1473   1.84     lukem 	#
   1474   1.98     lukem 	eval ${optremcmd}
   1475  1.386       kre 	while [ $# -gt 0 ]
   1476  1.386       kre 	do
   1477   1.84     lukem 		op=$1; shift
   1478   1.98     lukem 		operations="${operations} ${op}"
   1479   1.84     lukem 
   1480   1.98     lukem 		case "${op}" in
   1481   1.84     lukem 
   1482   1.87     lukem 		help)
   1483  1.362     lukem 			help
   1484  1.362     lukem 			exit 0
   1485   1.87     lukem 			;;
   1486   1.87     lukem 
   1487  1.292       apb 		list-arch)
   1488  1.292       apb 			listarch "${MACHINE}" "${MACHINE_ARCH}"
   1489  1.356    martin 			exit
   1490  1.356    martin 			;;
   1491  1.356    martin 		mkrepro-timestamp)
   1492  1.356    martin 			setup_mkrepro quiet
   1493  1.386       kre 			echo "${MKREPRO_TIMESTAMP:-0}"
   1494  1.383    martin 			did_show_info=true
   1495  1.383    martin 			;;
   1496  1.383    martin 
   1497  1.383    martin 		show-revisionid)
   1498  1.383    martin 			setup_mkrepro quiet
   1499  1.386       kre 			echo "${NETBSD_REVISIONID}"
   1500  1.383    martin 			did_show_info=true
   1501  1.292       apb 			;;
   1502  1.292       apb 
   1503  1.305  uebayasi 		kernel=*|releasekernel=*|kernel.gdb=*)
   1504   1.84     lukem 			arg=${op#*=}
   1505   1.84     lukem 			op=${op%%=*}
   1506   1.98     lukem 			[ -n "${arg}" ] ||
   1507  1.363     lukem 			    bomb "Must supply a kernel name with '${op}=...'"
   1508   1.84     lukem 			;;
   1509   1.84     lukem 
   1510  1.264  christos 		disk-image=*)
   1511  1.264  christos 			arg=${op#*=}
   1512  1.264  christos 			op=disk_image
   1513  1.264  christos 			[ -n "${arg}" ] ||
   1514  1.363     lukem 			    bomb "Must supply a target name with '${op}=...'"
   1515  1.264  christos 
   1516  1.264  christos 			;;
   1517  1.264  christos 
   1518  1.380  riastrad 		pkg=*)
   1519  1.380  riastrad 			arg=${op#*=}
   1520  1.380  riastrad 			op=${op%%=*}
   1521  1.380  riastrad 			[ -n "${arg}" ] ||
   1522  1.380  riastrad 			    bomb "Must supply category/package with 'pkg=...'"
   1523  1.380  riastrad 			;;
   1524  1.380  riastrad 
   1525  1.245  jmcneill 		install=*|installmodules=*)
   1526   1.84     lukem 			arg=${op#*=}
   1527   1.84     lukem 			op=${op%%=*}
   1528   1.98     lukem 			[ -n "${arg}" ] ||
   1529  1.363     lukem 			    bomb "Must supply a directory with 'install=...'"
   1530   1.84     lukem 			;;
   1531   1.84     lukem 
   1532  1.345       mrg 		distsets)
   1533  1.345       mrg 			operations="$(echo "$operations" | sed 's/distsets/distribution sets/')"
   1534  1.345       mrg 			do_sets=true
   1535  1.345       mrg 			op=distribution
   1536  1.345       mrg 			;;
   1537  1.345       mrg 
   1538  1.301       apb 		build|\
   1539  1.301       apb 		cleandir|\
   1540  1.301       apb 		distribution|\
   1541  1.335  jmcneill 		dtb|\
   1542  1.301       apb 		install-image|\
   1543  1.301       apb 		iso-image-source|\
   1544  1.301       apb 		iso-image|\
   1545  1.301       apb 		kernels|\
   1546  1.329  christos 		libs|\
   1547  1.301       apb 		live-image|\
   1548  1.301       apb 		makewrapper|\
   1549  1.301       apb 		modules|\
   1550  1.301       apb 		obj|\
   1551  1.301       apb 		params|\
   1552  1.301       apb 		release|\
   1553  1.301       apb 		rump|\
   1554  1.301       apb 		rumptest|\
   1555  1.301       apb 		sets|\
   1556  1.371     lukem 		show-params|\
   1557  1.301       apb 		sourcesets|\
   1558  1.301       apb 		syspkgs|\
   1559  1.301       apb 		tools)
   1560  1.219     pooka 			;;
   1561  1.219     pooka 
   1562   1.80     lukem 		*)
   1563  1.365     lukem 			usage "Unknown OPERATION '${op}'"
   1564   1.84     lukem 			;;
   1565   1.84     lukem 
   1566   1.80     lukem 		esac
   1567  1.301       apb 		# ${op} may contain chars that are not allowed in variable
   1568  1.301       apb 		# names.  Replace them with '_' before setting do_${op}.
   1569  1.301       apb 		op="$( echo "$op" | tr -s '.-' '__')"
   1570   1.98     lukem 		eval do_${op}=true
   1571   1.84     lukem 	done
   1572  1.383    martin 
   1573  1.386       kre 	"$did_show_info" && [ "${MKREPRO_TIMESTAMP:-0}" -ne 0 ] && exit
   1574  1.383    martin 
   1575  1.365     lukem 	[ -n "${operations}" ] || usage "Missing OPERATION to perform"
   1576   1.84     lukem 
   1577   1.84     lukem 	# Set up MACHINE*.  On a NetBSD host, these are allowed to be unset.
   1578   1.84     lukem 	#
   1579  1.386       kre 	if [ -z "${MACHINE}" ]
   1580  1.386       kre 	then
   1581  1.386       kre 		[ "${uname_s}" = NetBSD ] || {
   1582  1.386       kre 		    bomb "MACHINE must be set, or -m must be used," \
   1583  1.386       kre 		         "for cross builds"
   1584  1.386       kre 		}
   1585   1.84     lukem 		MACHINE=${uname_m}
   1586  1.332       mrg 		MACHINE_ARCH=${uname_p}
   1587   1.84     lukem 	fi
   1588  1.386       kre 	if $opt_m && ! $opt_a
   1589  1.386       kre 	then
   1590  1.295       apb 		# Settings implied by the command line -m option
   1591  1.295       apb 		# override MACHINE_ARCH from the environment (if any).
   1592  1.295       apb 		getarch
   1593  1.295       apb 	fi
   1594  1.295       apb 	[ -n "${MACHINE_ARCH}" ] || getarch
   1595   1.84     lukem 	validatearch
   1596   1.84     lukem 
   1597   1.84     lukem 	# Set up default make(1) environment.
   1598   1.84     lukem 	#
   1599   1.98     lukem 	makeenv="${makeenv} TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS"
   1600   1.98     lukem 	[ -z "${BUILDID}" ] || makeenv="${makeenv} BUILDID"
   1601  1.287       apb 	[ -z "${BUILDINFO}" ] || makeenv="${makeenv} BUILDINFO"
   1602  1.248       apb 	MAKEFLAGS="-de -m ${TOP}/share/mk ${MAKEFLAGS}"
   1603  1.248       apb 	MAKEFLAGS="${MAKEFLAGS} MKOBJDIRS=${MKOBJDIRS-yes}"
   1604   1.84     lukem 	export MAKEFLAGS MACHINE MACHINE_ARCH
   1605  1.386       kre 	setmakeenv USETOOLS yes
   1606  1.284       apb 	setmakeenv MAKEWRAPPERMACHINE "${makewrappermachine:-${MACHINE}}"
   1607  1.346    martin 	setmakeenv MAKE_OBJDIR_CHECK_WRITABLE no
   1608   1.84     lukem }
   1609   1.84     lukem 
   1610  1.248       apb # sanitycheck --
   1611  1.248       apb # Sanity check after parsing command line options, before rebuildmake.
   1612  1.248       apb #
   1613  1.163       apb sanitycheck()
   1614  1.163       apb {
   1615  1.260       apb 	# Install as non-root is a bad idea.
   1616  1.260       apb 	#
   1617  1.386       kre 	if ${do_install} && [ "$id_u" -ne 0 ]
   1618  1.386       kre 	then
   1619  1.386       kre 		if ${do_expertmode}
   1620  1.386       kre 		then
   1621  1.386       kre 		    warning "Will install as an unprivileged user"
   1622  1.260       apb 		else
   1623  1.386       kre 		    bomb "-E must be set for install as an unprivileged user"
   1624  1.260       apb 		fi
   1625  1.260       apb 	fi
   1626  1.260       apb 
   1627  1.163       apb 	# If the PATH contains any non-absolute components (including,
   1628  1.170       apb 	# but not limited to, "." or ""), then complain.  As an exception,
   1629  1.170       apb 	# allow "" or "." as the last component of the PATH.  This is fatal
   1630  1.163       apb 	# if expert mode is not in effect.
   1631  1.163       apb 	#
   1632  1.170       apb 	local path="${PATH}"
   1633  1.170       apb 	path="${path%:}"	# delete trailing ":"
   1634  1.170       apb 	path="${path%:.}"	# delete trailing ":."
   1635  1.170       apb 	case ":${path}:/" in
   1636  1.334  jmcneill 	*:[!/~]*)
   1637  1.386       kre 		if ${do_expertmode}
   1638  1.386       kre 		then
   1639  1.163       apb 			warning "PATH contains non-absolute components"
   1640  1.163       apb 		else
   1641  1.164       apb 			bomb "PATH environment variable must not" \
   1642  1.164       apb 			     "contain non-absolute components"
   1643  1.163       apb 		fi
   1644  1.163       apb 		;;
   1645  1.163       apb 	esac
   1646  1.317      maya 
   1647  1.386       kre 	while [ "${MKX11-no}" = yes ]		# not really a loop
   1648  1.386       kre 	do
   1649  1.320       kre 		test -n "${X11SRCDIR}" && {
   1650  1.379  riastrad 		    test -d "${X11SRCDIR}/external" ||
   1651  1.386       kre 			bomb "X11SRCDIR (${X11SRCDIR}) does not exist (with -x)"
   1652  1.320       kre 		    break
   1653  1.320       kre 		}
   1654  1.320       kre 		for _xd in \
   1655  1.320       kre 		    "${NETBSDSRCDIR%/*}/xsrc" \
   1656  1.320       kre 		    "${NETBSDSRCDIR}/xsrc" \
   1657  1.320       kre 		    /usr/xsrc
   1658  1.320       kre 		do
   1659  1.378  riastrad 		    test -f "${_xd}/Makefile" &&
   1660  1.320       kre 			setmakeenv X11SRCDIR "${_xd}" &&
   1661  1.386       kre 			    break 2
   1662  1.320       kre 		done
   1663  1.318      maya 		bomb "Asked to build X11 but no xsrc"
   1664  1.320       kre 	done
   1665  1.380  riastrad 
   1666  1.386       kre 	while $do_pkg				# not really a loop
   1667  1.386       kre 	do
   1668  1.380  riastrad 		test -n "${PKGSRCDIR}" && {
   1669  1.380  riastrad 		    test -f "${PKGSRCDIR}/mk/bsd.pkg.mk" ||
   1670  1.381  riastrad 			bomb "PKGSRCDIR (${PKGSRCDIR}) does not exist"
   1671  1.380  riastrad 		    break
   1672  1.380  riastrad 		}
   1673  1.380  riastrad 		for _pd in \
   1674  1.380  riastrad 		    "${NETBSDSRCDIR%/*}/pkgsrc" \
   1675  1.380  riastrad 		    "${NETBSDSRCDIR}/pkgsrc" \
   1676  1.380  riastrad 		    /usr/pkgsrc
   1677  1.380  riastrad 		do
   1678  1.380  riastrad 		    test -f "${_pd}/mk/bsd.pkg.mk" &&
   1679  1.380  riastrad 			setmakeenv PKGSRCDIR "${_pd}" &&
   1680  1.386       kre 			    break 2
   1681  1.380  riastrad 		done
   1682  1.380  riastrad 		bomb "Asked to build package but no pkgsrc"
   1683  1.380  riastrad 	done
   1684  1.386       kre 	if $do_pkg && [ "${MKX11-no}" = yes ]
   1685  1.386       kre 	then
   1686  1.385  riastrad 		# See comment below about X11_TYPE in pkgsrc mk.conf.
   1687  1.385  riastrad 		# (Feel free to remove this, and set X11_TYPE to
   1688  1.385  riastrad 		# native/modular according to MKX11=yes/no, if you want
   1689  1.385  riastrad 		# to do the work to make X11_TYPE=native cross-builds
   1690  1.385  riastrad 		# work.)
   1691  1.385  riastrad 		bomb "Experimental \`build.sh pkg=...'" \
   1692  1.386       kre 		     "does not support -x/MKX11=yes"
   1693  1.385  riastrad 	fi
   1694  1.163       apb }
   1695  1.317      maya 
   1696  1.369     lukem # print_tooldir_program --
   1697  1.369     lukem # Try to find and show a path to an existing
   1698  1.312  christos # ${TOOLDIR}/bin/${toolprefix}program
   1699  1.369     lukem #
   1700  1.312  christos print_tooldir_program()
   1701  1.168       apb {
   1702  1.213       apb 	local possible_TOP_OBJ
   1703  1.213       apb 	local possible_TOOLDIR
   1704  1.312  christos 	local possible_program
   1705  1.312  christos 	local tooldir_program
   1706  1.387       kre 	local program="${1}"
   1707  1.213       apb 
   1708  1.386       kre 	if [ -n "${TOOLDIR}" ]
   1709  1.386       kre 	then
   1710  1.312  christos 		echo "${TOOLDIR}/bin/${toolprefix}${program}"
   1711  1.312  christos 		return
   1712  1.213       apb 	fi
   1713  1.168       apb 
   1714  1.198       apb 	# Set host_ostype to something like "NetBSD-4.5.6-i386".  This
   1715  1.198       apb 	# is intended to match the HOST_OSTYPE variable in <bsd.own.mk>.
   1716  1.198       apb 	#
   1717  1.387       kre 	local host_ostype="${uname_s}-$(
   1718  1.386       kre 			echo "${uname_r}" | sed -e 's/([^)]*)//g' -e 's/ /_/g'
   1719  1.194     lukem 		)-$(
   1720  1.386       kre 			echo "${uname_p}" | sed -e 's/([^)]*)//g' -e 's/ /_/g'
   1721  1.387       kre 		)"
   1722  1.168       apb 
   1723  1.198       apb 	# Look in a few potential locations for
   1724  1.312  christos 	# ${possible_TOOLDIR}/bin/${toolprefix}${program}.
   1725  1.312  christos 	# If we find it, then set possible_program.
   1726  1.198       apb 	#
   1727  1.198       apb 	# In the usual case (without interference from environment
   1728  1.198       apb 	# variables or /etc/mk.conf), <bsd.own.mk> should set TOOLDIR to
   1729  1.212       apb 	# "${_SRC_TOP_OBJ_}/tooldir.${host_ostype}".
   1730  1.212       apb 	#
   1731  1.212       apb 	# In practice it's difficult to figure out the correct value
   1732  1.212       apb 	# for _SRC_TOP_OBJ_.  In the easiest case, when the -M or -O
   1733  1.212       apb 	# options were passed to build.sh, then ${TOP_objdir} will be
   1734  1.212       apb 	# the correct value.  We also try a few other possibilities, but
   1735  1.212       apb 	# we do not replicate all the logic of <bsd.obj.mk>.
   1736  1.198       apb 	#
   1737  1.212       apb 	for possible_TOP_OBJ in \
   1738  1.212       apb 		"${TOP_objdir}" \
   1739  1.212       apb 		"${MAKEOBJDIRPREFIX:+${MAKEOBJDIRPREFIX}${TOP}}" \
   1740  1.212       apb 		"${TOP}" \
   1741  1.212       apb 		"${TOP}/obj" \
   1742  1.198       apb 		"${TOP}/obj.${MACHINE}"
   1743  1.198       apb 	do
   1744  1.386       kre 	    [ -n "${possible_TOP_OBJ}" ] || continue
   1745  1.386       kre 	    possible_TOOLDIR="${possible_TOP_OBJ}/tooldir.${host_ostype}"
   1746  1.386       kre 	    possible_program="${possible_TOOLDIR}/bin/${toolprefix}${program}"
   1747  1.386       kre 	    if [ -x "${possible_program}" ]
   1748  1.386       kre 	    then
   1749  1.386       kre 		echo ${possible_program}
   1750  1.386       kre 		return
   1751  1.386       kre 	    fi
   1752  1.198       apb 	done
   1753  1.386       kre 	echo ''
   1754  1.312  christos }
   1755  1.369     lukem 
   1756  1.312  christos # print_tooldir_make --
   1757  1.369     lukem # Try to find and show a path to an existing
   1758  1.312  christos # ${TOOLDIR}/bin/${toolprefix}make, for use by rebuildmake() before a
   1759  1.312  christos # new version of ${toolprefix}make has been built.
   1760  1.312  christos #
   1761  1.312  christos # * If TOOLDIR was set in the environment or on the command line, use
   1762  1.312  christos #   that value.
   1763  1.312  christos # * Otherwise try to guess what TOOLDIR would be if not overridden by
   1764  1.312  christos #   /etc/mk.conf, and check whether the resulting directory contains
   1765  1.312  christos #   a copy of ${toolprefix}make (this should work for everybody who
   1766  1.312  christos #   doesn't override TOOLDIR via /etc/mk.conf);
   1767  1.312  christos # * Failing that, search for ${toolprefix}make, nbmake, bmake, or make,
   1768  1.312  christos #   in the PATH (this might accidentally find a version of make that
   1769  1.312  christos #   does not understand the syntax used by NetBSD make, and that will
   1770  1.312  christos #   lead to failure in the next step);
   1771  1.312  christos # * If a copy of make was found above, try to use it with
   1772  1.312  christos #   nobomb_getmakevar to find the correct value for TOOLDIR, and believe the
   1773  1.312  christos #   result only if it's a directory that already exists;
   1774  1.312  christos # * If a value of TOOLDIR was found above, and if
   1775  1.369     lukem #   ${TOOLDIR}/bin/${toolprefix}make exists, show that value.
   1776  1.312  christos #
   1777  1.312  christos print_tooldir_make()
   1778  1.312  christos {
   1779  1.312  christos 	local possible_make
   1780  1.312  christos 	local possible_TOOLDIR
   1781  1.312  christos 	local tooldir_make
   1782  1.198       apb 
   1783  1.312  christos 	possible_make=$(print_tooldir_program make)
   1784  1.198       apb 	# If the above didn't work, search the PATH for a suitable
   1785  1.198       apb 	# ${toolprefix}make, nbmake, bmake, or make.
   1786  1.198       apb 	#
   1787  1.213       apb 	: ${possible_make:=$(find_in_PATH ${toolprefix}make '')}
   1788  1.213       apb 	: ${possible_make:=$(find_in_PATH nbmake '')}
   1789  1.213       apb 	: ${possible_make:=$(find_in_PATH bmake '')}
   1790  1.213       apb 	: ${possible_make:=$(find_in_PATH make '')}
   1791  1.213       apb 
   1792  1.213       apb 	# At this point, we don't care whether possible_make is in the
   1793  1.213       apb 	# correct TOOLDIR or not; we simply want it to be usable by
   1794  1.213       apb 	# getmakevar to help us find the correct TOOLDIR.
   1795  1.213       apb 	#
   1796  1.213       apb 	# Use ${possible_make} with nobomb_getmakevar to try to find
   1797  1.213       apb 	# the value of TOOLDIR.  Believe the result only if it's
   1798  1.213       apb 	# a directory that already exists and contains bin/${toolprefix}make.
   1799  1.213       apb 	#
   1800  1.386       kre 	if [ -x "${possible_make}" ]
   1801  1.386       kre 	then
   1802  1.386       kre 		possible_TOOLDIR=$(
   1803  1.250       apb 			make="${possible_make}" \
   1804  1.386       kre 			    nobomb_getmakevar TOOLDIR 2>/dev/null
   1805  1.386       kre 			)
   1806  1.386       kre 		if [ $? = 0 ] &&
   1807  1.386       kre 		   [ -n "${possible_TOOLDIR}" ] &&
   1808  1.386       kre 		   [ -d "${possible_TOOLDIR}" ]
   1809  1.213       apb 		then
   1810  1.213       apb 			tooldir_make="${possible_TOOLDIR}/bin/${toolprefix}make"
   1811  1.386       kre 			if [ -x "${tooldir_make}" ]
   1812  1.386       kre 			then
   1813  1.213       apb 				echo "${tooldir_make}"
   1814  1.213       apb 				return 0
   1815  1.213       apb 			fi
   1816  1.213       apb 		fi
   1817  1.168       apb 	fi
   1818  1.213       apb 	return 1
   1819  1.168       apb }
   1820  1.168       apb 
   1821  1.213       apb # rebuildmake --
   1822  1.213       apb # Rebuild nbmake in a temporary directory if necessary.  Sets $make
   1823  1.213       apb # to a path to the nbmake executable.  Sets done_rebuildmake=true
   1824  1.213       apb # if nbmake was rebuilt.
   1825  1.213       apb #
   1826  1.213       apb # There is a cyclic dependency between building nbmake and choosing
   1827  1.213       apb # TOOLDIR: TOOLDIR may be affected by settings in /etc/mk.conf, so we
   1828  1.213       apb # would like to use getmakevar to get the value of TOOLDIR; but we can't
   1829  1.213       apb # use getmakevar before we have an up to date version of nbmake; we
   1830  1.213       apb # might already have an up to date version of nbmake in TOOLDIR, but we
   1831  1.213       apb # don't yet know where TOOLDIR is.
   1832  1.213       apb #
   1833  1.213       apb # The default value of TOOLDIR also depends on the location of the top
   1834  1.213       apb # level object directory, so $(getmakevar TOOLDIR) invoked before or
   1835  1.213       apb # after making the top level object directory may produce different
   1836  1.213       apb # results.
   1837  1.213       apb #
   1838  1.213       apb # Strictly speaking, we should do the following:
   1839  1.213       apb #
   1840  1.213       apb #    1. build a new version of nbmake in a temporary directory;
   1841  1.213       apb #    2. use the temporary nbmake to create the top level obj directory;
   1842  1.213       apb #    3. use $(getmakevar TOOLDIR) with the temporary nbmake to
   1843  1.265       oki #       get the correct value of TOOLDIR;
   1844  1.214       apb #    4. move the temporary nbmake to ${TOOLDIR}/bin/nbmake.
   1845  1.213       apb #
   1846  1.213       apb # However, people don't like building nbmake unnecessarily if their
   1847  1.213       apb # TOOLDIR has not changed since an earlier build.  We try to avoid
   1848  1.213       apb # rebuilding a temporary version of nbmake by taking some shortcuts to
   1849  1.213       apb # guess a value for TOOLDIR, looking for an existing version of nbmake
   1850  1.213       apb # in that TOOLDIR, and checking whether that nbmake is newer than the
   1851  1.213       apb # sources used to build it.
   1852  1.213       apb #
   1853   1.84     lukem rebuildmake()
   1854   1.84     lukem {
   1855  1.213       apb 	make="$(print_tooldir_make)"
   1856  1.386       kre 	if [ -n "${make}" ] && [ -x "${make}" ]
   1857  1.386       kre 	then
   1858  1.386       kre 		for f in usr.bin/make/*.[ch]
   1859  1.386       kre 		do
   1860  1.386       kre 			if [ "${f}" -nt "${make}" ]
   1861  1.386       kre 			then
   1862  1.213       apb 				statusmsg "${make} outdated" \
   1863  1.213       apb 					"(older than ${f}), needs building."
   1864   1.84     lukem 				do_rebuildmake=true
   1865   1.84     lukem 				break
   1866   1.84     lukem 			fi
   1867   1.84     lukem 		done
   1868   1.84     lukem 	else
   1869  1.213       apb 		statusmsg "No \$TOOLDIR/bin/${toolprefix}make, needs building."
   1870   1.84     lukem 		do_rebuildmake=true
   1871   1.84     lukem 	fi
   1872   1.84     lukem 
   1873   1.84     lukem 	# Build bootstrap ${toolprefix}make if needed.
   1874  1.386       kre 	if ! ${do_rebuildmake}
   1875  1.386       kre 	then
   1876  1.309  christos 		return
   1877   1.84     lukem 	fi
   1878  1.341  riastrad 
   1879  1.340     lukem 	# Silent configure with MAKEVERBOSE==0
   1880  1.386       kre 	if [ ${MAKEVERBOSE:-2} -eq 0 ]
   1881  1.386       kre 	then
   1882  1.340     lukem 		configure_args=--silent
   1883  1.340     lukem 	fi
   1884  1.309  christos 
   1885  1.309  christos 	statusmsg "Bootstrapping ${toolprefix}make"
   1886  1.309  christos 	${runcmd} cd "${tmpdir}"
   1887  1.323       uwe 	${runcmd} env CC="${HOST_CC-cc}" CPPFLAGS="${HOST_CPPFLAGS}" \
   1888  1.323       uwe 		CFLAGS="${HOST_CFLAGS--O}" LDFLAGS="${HOST_LDFLAGS}" \
   1889  1.340     lukem 	    ${HOST_SH} "${TOP}/tools/make/configure" ${configure_args} ||
   1890  1.309  christos 	( cp ${tmpdir}/config.log ${tmpdir}-config.log
   1891  1.386       kre 	      bomb "Configure of ${toolprefix}make failed," \
   1892  1.386       kre 		   "see ${tmpdir}-config.log for details" )
   1893  1.309  christos 	${runcmd} ${HOST_SH} buildmake.sh ||
   1894  1.309  christos 	    bomb "Build of ${toolprefix}make failed"
   1895  1.309  christos 	make="${tmpdir}/${toolprefix}make"
   1896  1.309  christos 	${runcmd} cd "${TOP}"
   1897  1.343    rillig 	${runcmd} rm -f usr.bin/make/*.o
   1898  1.309  christos 	done_rebuildmake=true
   1899   1.84     lukem }
   1900   1.84     lukem 
   1901  1.248       apb # validatemakeparams --
   1902  1.248       apb # Perform some late sanity checks, after rebuildmake,
   1903  1.248       apb # but before createmakewrapper or any real work.
   1904  1.248       apb #
   1905  1.257       apb # Creates the top-level obj directory, because that
   1906  1.257       apb # is needed by some of the sanity checks.
   1907  1.257       apb #
   1908  1.369     lukem # Shows status messages reporting the values of several variables.
   1909  1.248       apb #
   1910   1.84     lukem validatemakeparams()
   1911   1.84     lukem {
   1912  1.373     lukem 	# Determine MAKECONF first, and set in the makewrapper.
   1913  1.373     lukem 	# If set in the environment, then use that.
   1914  1.373     lukem 	# else if ./mk.conf exists, then set MAKECONF to that,
   1915  1.373     lukem 	# else use the default from share/mk/bsd.own.mk (/etc/mk.conf).
   1916  1.373     lukem 	#
   1917  1.386       kre 	if [ -n "${MAKECONF+1}" ]
   1918  1.386       kre 	then
   1919  1.373     lukem 		setmakeenv MAKECONF "${MAKECONF}"
   1920  1.373     lukem 		statusmsg2 "getenv MAKECONF:" "${MAKECONF}"
   1921  1.386       kre 	elif [ -f "${TOP}/mk.conf" ]
   1922  1.386       kre 	then
   1923  1.373     lukem 		setmakeenv MAKECONF "${TOP}/mk.conf"
   1924  1.373     lukem 		statusmsg2 "mk.conf MAKECONF:" "${MAKECONF}"
   1925  1.373     lukem 	else
   1926  1.373     lukem 		MAKECONF=$(getmakevar MAKECONF)
   1927  1.373     lukem 		setmakeenv MAKECONF "${MAKECONF}"
   1928  1.373     lukem 		statusmsg2 "share/mk MAKECONF:" "${MAKECONF}"
   1929  1.373     lukem 	fi
   1930  1.386       kre 	if [ -z "${MAKECONF}" ]
   1931  1.386       kre 	then
   1932  1.373     lukem 		bomb "MAKECONF must not be empty"
   1933  1.386       kre 	elif [ -e "${MAKECONF}" ]
   1934  1.386       kre 	then
   1935  1.257       apb 		statusmsg2 "MAKECONF file:" "${MAKECONF}"
   1936  1.257       apb 	else
   1937  1.257       apb 		statusmsg2 "MAKECONF file:" "${MAKECONF} (File not found)"
   1938  1.257       apb 	fi
   1939  1.257       apb 
   1940  1.275       apb 	# Normalise MKOBJDIRS, MKUNPRIVED, and MKUPDATE.
   1941  1.275       apb 	# These may be set as build.sh options or in "mk.conf".
   1942  1.275       apb 	# Don't export them as they're only used for tests in build.sh.
   1943  1.275       apb 	#
   1944  1.275       apb 	MKOBJDIRS=$(getmakevar MKOBJDIRS)
   1945  1.275       apb 	MKUNPRIVED=$(getmakevar MKUNPRIVED)
   1946  1.275       apb 	MKUPDATE=$(getmakevar MKUPDATE)
   1947  1.275       apb 
   1948  1.275       apb 	# Non-root should always use either the -U or -E flag.
   1949  1.275       apb 	#
   1950  1.386       kre 	if ! ${do_expertmode} && [ "$id_u" -ne 0 ] && [ "${MKUNPRIVED}" = no ]
   1951  1.386       kre 	then
   1952  1.363     lukem 		bomb "-U or -E must be set for build as an unprivileged user"
   1953  1.275       apb 	fi
   1954  1.275       apb 
   1955  1.386       kre 	if [ "${runcmd}" = echo ]
   1956  1.386       kre 	then
   1957   1.84     lukem 		TOOLCHAIN_MISSING=no
   1958  1.386       kre 		EXTERNAL_TOOLCHAIN=
   1959   1.84     lukem 	else
   1960  1.210       apb 		TOOLCHAIN_MISSING=$(bomb_getmakevar TOOLCHAIN_MISSING)
   1961  1.210       apb 		EXTERNAL_TOOLCHAIN=$(bomb_getmakevar EXTERNAL_TOOLCHAIN)
   1962   1.84     lukem 	fi
   1963  1.386       kre 	if [ "${TOOLCHAIN_MISSING}" = yes ] && [ -z "${EXTERNAL_TOOLCHAIN}" ]
   1964  1.386       kre 	then
   1965  1.386       kre 		${runcmd} echo "ERROR: build.sh (in-tree cross-toolchain)" \
   1966  1.386       kre 						"is not yet available for"
   1967   1.98     lukem 		${runcmd} echo "	MACHINE:      ${MACHINE}"
   1968   1.98     lukem 		${runcmd} echo "	MACHINE_ARCH: ${MACHINE_ARCH}"
   1969   1.98     lukem 		${runcmd} echo ""
   1970  1.386       kre 		${runcmd} echo "All builds for this platform should be done" \
   1971  1.386       kre 						"via a traditional make"
   1972  1.386       kre 		${runcmd} echo "If you wish to use an external" \
   1973  1.386       kre 						"cross-toolchain, set"
   1974  1.386       kre 		${runcmd} echo "	EXTERNAL_TOOLCHAIN=<path to" \
   1975  1.386       kre 						"toolchain root>"
   1976   1.98     lukem 		${runcmd} echo "in either the environment or mk.conf and rerun"
   1977   1.98     lukem 		${runcmd} echo "	${progname} $*"
   1978   1.84     lukem 		exit 1
   1979   1.84     lukem 	fi
   1980   1.84     lukem 
   1981  1.386       kre 	if [ "${MKOBJDIRS}" != no ]
   1982  1.386       kre 	then
   1983  1.212       apb 		# Create the top-level object directory.
   1984  1.106     lukem 		#
   1985  1.212       apb 		# "make obj NOSUBDIR=" can handle most cases, but it
   1986  1.212       apb 		# can't handle the case where MAKEOBJDIRPREFIX is set
   1987  1.212       apb 		# while the corresponding directory does not exist
   1988  1.212       apb 		# (rules in <bsd.obj.mk> would abort the build).  We
   1989  1.212       apb 		# therefore have to handle the MAKEOBJDIRPREFIX case
   1990  1.212       apb 		# without invoking "make obj".  The MAKEOBJDIR case
   1991  1.212       apb 		# could be handled either way, but we choose to handle
   1992  1.212       apb 		# it similarly to MAKEOBJDIRPREFIX.
   1993  1.191       apb 		#
   1994  1.386       kre 		if [ -n "${TOP_obj}" ]
   1995  1.386       kre 		then
   1996  1.212       apb 			# It must have been set by the "-M" or "-O"
   1997  1.212       apb 			# command line options, so there's no need to
   1998  1.212       apb 			# use getmakevar
   1999  1.212       apb 			:
   2000  1.386       kre 		elif [ -n "$MAKEOBJDIRPREFIX" ]
   2001  1.386       kre 		then
   2002  1.212       apb 			TOP_obj="$(getmakevar MAKEOBJDIRPREFIX)${TOP}"
   2003  1.386       kre 		elif [ -n "$MAKEOBJDIR" ]
   2004  1.386       kre 		then
   2005  1.212       apb 			TOP_obj="$(getmakevar MAKEOBJDIR)"
   2006  1.212       apb 		fi
   2007  1.386       kre 		if [ -n "$TOP_obj" ]
   2008  1.386       kre 		then
   2009  1.386       kre 		    ${runcmd} mkdir -p "${TOP_obj}" ||
   2010  1.386       kre 			bomb "Can't create top level object directory" \
   2011  1.386       kre 			     "${TOP_obj}"
   2012  1.212       apb 		else
   2013  1.386       kre 		    ${runcmd} "${make}" -m "${TOP}/share/mk" obj NOSUBDIR= ||
   2014  1.212       apb 			    bomb "Can't create top level object directory" \
   2015  1.386       kre 				 "using make obj"
   2016  1.106     lukem 		fi
   2017  1.106     lukem 
   2018  1.212       apb 		# make obj in tools to ensure that the objdir for "tools"
   2019  1.212       apb 		# is available.
   2020  1.106     lukem 		#
   2021   1.98     lukem 		${runcmd} cd tools
   2022  1.386       kre 		${runcmd} "${make}" -m "${TOP}/share/mk" obj NOSUBDIR= ||
   2023   1.98     lukem 		    bomb "Failed to make obj in tools"
   2024   1.98     lukem 		${runcmd} cd "${TOP}"
   2025   1.84     lukem 	fi
   2026   1.80     lukem 
   2027  1.215       apb 	# Find TOOLDIR, DESTDIR, and RELEASEDIR, according to getmakevar,
   2028  1.215       apb 	# and bomb if they have changed from the values we had from the
   2029  1.215       apb 	# command line or environment.
   2030  1.215       apb 	#
   2031  1.212       apb 	# This must be done after creating the top-level object directory.
   2032   1.84     lukem 	#
   2033  1.215       apb 	for var in TOOLDIR DESTDIR RELEASEDIR
   2034  1.215       apb 	do
   2035  1.215       apb 		eval oldval=\"\$${var}\"
   2036  1.215       apb 		newval="$(getmakevar $var)"
   2037  1.386       kre 		if ! $do_expertmode
   2038  1.386       kre 		then
   2039  1.216     enami 			: ${_SRC_TOP_OBJ_:=$(getmakevar _SRC_TOP_OBJ_)}
   2040  1.215       apb 			case "$var" in
   2041  1.215       apb 			DESTDIR)
   2042  1.215       apb 				: ${newval:=${_SRC_TOP_OBJ_}/destdir.${MACHINE}}
   2043  1.217       apb 				makeenv="${makeenv} DESTDIR"
   2044  1.215       apb 				;;
   2045  1.215       apb 			RELEASEDIR)
   2046  1.215       apb 				: ${newval:=${_SRC_TOP_OBJ_}/releasedir}
   2047  1.217       apb 				makeenv="${makeenv} RELEASEDIR"
   2048  1.215       apb 				;;
   2049  1.215       apb 			esac
   2050  1.215       apb 		fi
   2051  1.386       kre 		if [ -n "$oldval" ] && [ "$oldval" != "$newval" ]
   2052  1.386       kre 		then
   2053  1.215       apb 			bomb "Value of ${var} has changed" \
   2054  1.386       kre 			     "(was \"${oldval}\", now \"${newval}\")"
   2055  1.215       apb 		fi
   2056  1.215       apb 		eval ${var}=\"\${newval}\"
   2057  1.215       apb 		eval export ${var}
   2058  1.238  pgoyette 		statusmsg2 "${var} path:" "${newval}"
   2059  1.215       apb 	done
   2060  1.215       apb 
   2061  1.215       apb 	# RELEASEMACHINEDIR is just a subdir name, e.g. "i386".
   2062  1.186     lukem 	RELEASEMACHINEDIR=$(getmakevar RELEASEMACHINEDIR)
   2063   1.84     lukem 
   2064   1.84     lukem 	# Check validity of TOOLDIR and DESTDIR.
   2065   1.84     lukem 	#
   2066  1.386       kre 	if [ -z "${TOOLDIR}" ] || [ "${TOOLDIR}" = / ]
   2067  1.386       kre 	then
   2068   1.98     lukem 		bomb "TOOLDIR '${TOOLDIR}' invalid"
   2069   1.84     lukem 	fi
   2070   1.98     lukem 	removedirs="${TOOLDIR}"
   2071   1.15        tv 
   2072  1.386       kre 	if [ -z "${DESTDIR}" ] || [ "${DESTDIR}" = / ]
   2073  1.386       kre 	then
   2074  1.386       kre 		if ${do_distribution} || ${do_release} ||
   2075  1.386       kre 		   [ "${uname_s}" != NetBSD ] ||
   2076  1.386       kre 		   [ "${uname_m}" != "${MACHINE}" ]
   2077  1.386       kre 		then
   2078  1.386       kre 			bomb "DESTDIR must != / for cross builds," \
   2079  1.386       kre 			     "or ${progname} 'distribution' or 'release'"
   2080  1.260       apb 		fi
   2081  1.386       kre 		if ! ${do_expertmode}
   2082  1.386       kre 		then
   2083  1.260       apb 			bomb "DESTDIR must != / for non -E (expert) builds"
   2084    1.1        tv 		fi
   2085  1.260       apb 		statusmsg "WARNING: Building to /, in expert mode."
   2086  1.386       kre 		statusmsg "         This may cause your system to break!"
   2087  1.386       kre 		statusmsg "         Reasons include:"
   2088  1.386       kre 		statusmsg "           - your kernel is not up to date"
   2089  1.386       kre 		statusmsg "           - the libraries or toolchain have changed"
   2090  1.260       apb 		statusmsg "         YOU HAVE BEEN WARNED!"
   2091   1.84     lukem 	else
   2092   1.98     lukem 		removedirs="${removedirs} ${DESTDIR}"
   2093   1.84     lukem 	fi
   2094  1.386       kre 	if ${do_releasekernel} && [ -z "${RELEASEDIR}" ]
   2095  1.386       kre 	then
   2096  1.363     lukem 		bomb "Must set RELEASEDIR with 'releasekernel=...'"
   2097  1.105     lukem 	fi
   2098  1.185       apb 
   2099  1.185       apb 	# If a previous build.sh run used -U (and therefore created a
   2100  1.185       apb 	# METALOG file), then most subsequent build.sh runs must also
   2101  1.185       apb 	# use -U.  If DESTDIR is about to be removed, then don't perform
   2102  1.185       apb 	# this check.
   2103  1.185       apb 	#
   2104  1.185       apb 	case "${do_removedirs} ${removedirs} " in
   2105  1.185       apb 	true*" ${DESTDIR} "*)
   2106  1.185       apb 		# DESTDIR is about to be removed
   2107  1.185       apb 		;;
   2108  1.185       apb 	*)
   2109  1.386       kre 		if [ -e "${DESTDIR}/METALOG" ] &&
   2110  1.386       kre 		   [ "${MKUNPRIVED}" = no ]
   2111  1.386       kre 		then
   2112  1.386       kre 			if $do_expertmode
   2113  1.386       kre 			then
   2114  1.363     lukem 				warning "A previous build.sh run specified -U"
   2115  1.185       apb 			else
   2116  1.386       kre 				bomb "A previous build.sh run specified -U;" \
   2117  1.386       kre 				     "you must specify it again now"
   2118  1.185       apb 			fi
   2119  1.185       apb 		fi
   2120  1.185       apb 		;;
   2121  1.185       apb 	esac
   2122  1.254   tsutsui 
   2123  1.254   tsutsui 	# live-image and install-image targets require binary sets
   2124  1.254   tsutsui 	# (actually DESTDIR/etc/mtree/set.* files) built with MKUNPRIVED.
   2125  1.254   tsutsui 	# If release operation is specified with live-image or install-image,
   2126  1.254   tsutsui 	# the release op should be performed with -U for later image ops.
   2127  1.254   tsutsui 	#
   2128  1.386       kre 	if ${do_release} &&
   2129  1.386       kre 	    { ${do_live_image} || ${do_install_image} ; } &&
   2130  1.386       kre 	    [ "${MKUNPRIVED}" = no ]
   2131  1.386       kre 	then
   2132  1.386       kre 		bomb "-U must be specified on building release" \
   2133  1.386       kre 		     "to create images later"
   2134  1.254   tsutsui 	fi
   2135   1.84     lukem }
   2136   1.30       jmc 
   2137   1.15        tv 
   2138   1.84     lukem createmakewrapper()
   2139   1.84     lukem {
   2140   1.84     lukem 	# Remove the target directories.
   2141   1.84     lukem 	#
   2142  1.386       kre 	if ${do_removedirs}
   2143  1.386       kre 	then
   2144  1.386       kre 		for f in ${removedirs}
   2145  1.386       kre 		do
   2146   1.98     lukem 			statusmsg "Removing ${f}"
   2147   1.98     lukem 			${runcmd} rm -r -f "${f}"
   2148   1.84     lukem 		done
   2149   1.84     lukem 	fi
   2150   1.15        tv 
   2151   1.84     lukem 	# Recreate $TOOLDIR.
   2152   1.84     lukem 	#
   2153   1.98     lukem 	${runcmd} mkdir -p "${TOOLDIR}/bin" ||
   2154   1.98     lukem 	    bomb "mkdir of '${TOOLDIR}/bin' failed"
   2155   1.84     lukem 
   2156  1.214       apb 	# If we did not previously rebuild ${toolprefix}make, then
   2157  1.214       apb 	# check whether $make is still valid and the same as the output
   2158  1.214       apb 	# from print_tooldir_make.  If not, then rebuild make now.  A
   2159  1.214       apb 	# possible reason for this being necessary is that the actual
   2160  1.214       apb 	# value of TOOLDIR might be different from the value guessed
   2161  1.214       apb 	# before the top level obj dir was created.
   2162  1.214       apb 	#
   2163  1.386       kre 	if ! ${done_rebuildmake} &&
   2164  1.386       kre 	   { ! [ -x "$make" ] || [ "$make" != "$(print_tooldir_make)" ] ; }
   2165  1.214       apb 	then
   2166  1.214       apb 		rebuildmake
   2167  1.214       apb 	fi
   2168  1.214       apb 
   2169   1.84     lukem 	# Install ${toolprefix}make if it was built.
   2170   1.84     lukem 	#
   2171  1.386       kre 	if ${done_rebuildmake}
   2172  1.386       kre 	then
   2173   1.98     lukem 		${runcmd} rm -f "${TOOLDIR}/bin/${toolprefix}make"
   2174   1.98     lukem 		${runcmd} cp "${make}" "${TOOLDIR}/bin/${toolprefix}make" ||
   2175   1.98     lukem 		    bomb "Failed to install \$TOOLDIR/bin/${toolprefix}make"
   2176   1.98     lukem 		make="${TOOLDIR}/bin/${toolprefix}make"
   2177   1.98     lukem 		statusmsg "Created ${make}"
   2178   1.84     lukem 	fi
   2179   1.15        tv 
   2180   1.84     lukem 	# Build a ${toolprefix}make wrapper script, usable by hand as
   2181   1.84     lukem 	# well as by build.sh.
   2182   1.84     lukem 	#
   2183  1.386       kre 	if [ -z "${makewrapper}" ]
   2184  1.386       kre 	then
   2185  1.386       kre 		makewrapper="${TOOLDIR}/bin/${toolprefix}make"
   2186  1.386       kre 		makewrapper="${makewrapper}-${makewrappermachine:-${MACHINE}}"
   2187   1.98     lukem 		[ -z "${BUILDID}" ] || makewrapper="${makewrapper}-${BUILDID}"
   2188   1.52   thorpej 	fi
   2189    1.4        tv 
   2190   1.98     lukem 	${runcmd} rm -f "${makewrapper}"
   2191  1.386       kre 	if [ "${runcmd}" = echo ]
   2192  1.386       kre 	then
   2193   1.98     lukem 		echo 'cat <<EOF >'${makewrapper}
   2194   1.84     lukem 		makewrapout=
   2195   1.84     lukem 	else
   2196   1.98     lukem 		makewrapout=">>\${makewrapper}"
   2197   1.84     lukem 	fi
   2198   1.18        tv 
   2199  1.139     isaki 	case "${KSH_VERSION:-${SH_VERSION}}" in
   2200  1.149   jnemeth 	*PD\ KSH*|*MIRBSD\ KSH*)
   2201  1.135     isaki 		set +o braceexpand
   2202  1.135     isaki 		;;
   2203  1.135     isaki 	esac
   2204  1.135     isaki 
   2205   1.98     lukem 	eval cat <<EOF ${makewrapout}
   2206  1.153       apb #! ${HOST_SH}
   2207    1.4        tv # Set proper variables to allow easy "make" building of a NetBSD subtree.
   2208  1.390    martin # Generated from:  \$NetBSD: build.sh,v 1.390 2025/04/22 10:22:29 martin Exp $
   2209  1.130       jmc # with these arguments: ${_args}
   2210    1.4        tv #
   2211  1.177  uebayasi 
   2212   1.18        tv EOF
   2213  1.177  uebayasi 	{
   2214  1.386       kre 		sorted_vars=$(
   2215  1.386       kre 			for var in ${makeenv}
   2216  1.386       kre 			do
   2217  1.386       kre 				echo "${var}"
   2218  1.386       kre 			done |
   2219  1.386       kre 				sort -u
   2220  1.386       kre 		)
   2221  1.386       kre 		for var in ${sorted_vars}
   2222  1.386       kre 		do
   2223  1.285       apb 			eval val=\"\${${var}}\"
   2224  1.285       apb 			eval is_set=\"\${${var}+set}\"
   2225  1.386       kre 			if [ -z "${is_set}" ]
   2226  1.386       kre 			then
   2227  1.285       apb 				echo "unset ${var}"
   2228  1.177  uebayasi 			else
   2229  1.285       apb 				qval="$(shell_quote "${val}")"
   2230  1.285       apb 				echo "${var}=${qval}; export ${var}"
   2231  1.177  uebayasi 			fi
   2232  1.177  uebayasi 		done
   2233   1.18        tv 
   2234  1.386       kre 		cat <<-EOF
   2235   1.18        tv 
   2236  1.386       kre 			exec "\${TOOLDIR}/bin/${toolprefix}make" \${1+"\$@"}
   2237  1.386       kre 		EOF
   2238  1.285       apb 	} | eval cat "${makewrapout}"
   2239  1.386       kre 	[ "${runcmd}" = echo ] && echo EOF
   2240   1.98     lukem 	${runcmd} chmod +x "${makewrapper}"
   2241  1.238  pgoyette 	statusmsg2 "Updated makewrapper:" "${makewrapper}"
   2242   1.84     lukem }
   2243   1.84     lukem 
   2244  1.203     lukem make_in_dir()
   2245  1.203     lukem {
   2246  1.387       kre 	local dir="$1"
   2247  1.387       kre 	local op="$2"
   2248  1.203     lukem 	${runcmd} cd "${dir}" ||
   2249  1.203     lukem 	    bomb "Failed to cd to \"${dir}\""
   2250  1.203     lukem 	${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2251  1.203     lukem 	    bomb "Failed to make ${op} in \"${dir}\""
   2252  1.203     lukem 	${runcmd} cd "${TOP}" ||
   2253  1.203     lukem 	    bomb "Failed to cd back to \"${TOP}\""
   2254  1.203     lukem }
   2255  1.203     lukem 
   2256   1.84     lukem buildtools()
   2257   1.84     lukem {
   2258  1.386       kre 	if [ "${MKOBJDIRS}" != no ]
   2259  1.386       kre 	then
   2260   1.98     lukem 		${runcmd} "${makewrapper}" ${parallel} obj-tools ||
   2261   1.98     lukem 		    bomb "Failed to make obj-tools"
   2262   1.84     lukem 	fi
   2263  1.386       kre 	if [ "${MKUPDATE}" = no ]
   2264  1.386       kre 	then
   2265  1.203     lukem 		make_in_dir tools cleandir
   2266   1.84     lukem 	fi
   2267  1.259     joerg 	make_in_dir tools build_install
   2268   1.98     lukem 	statusmsg "Tools built to ${TOOLDIR}"
   2269   1.84     lukem }
   2270    1.4        tv 
   2271  1.329  christos buildlibs()
   2272  1.329  christos {
   2273  1.386       kre 	if [ "${MKOBJDIRS}" != no ]
   2274  1.386       kre 	then
   2275  1.329  christos 		${runcmd} "${makewrapper}" ${parallel} obj ||
   2276  1.329  christos 		    bomb "Failed to make obj"
   2277  1.329  christos 	fi
   2278  1.386       kre 	if [ "${MKUPDATE}" = no ]
   2279  1.386       kre 	then
   2280  1.329  christos 		make_in_dir lib cleandir
   2281  1.329  christos 	fi
   2282  1.329  christos 	make_in_dir . do-distrib-dirs
   2283  1.329  christos 	make_in_dir . includes
   2284  1.329  christos 	make_in_dir . do-lib
   2285  1.329  christos 	statusmsg "libs built"
   2286  1.329  christos }
   2287  1.329  christos 
   2288  1.105     lukem getkernelconf()
   2289   1.84     lukem {
   2290  1.386       kre 	kernelconf=$1
   2291  1.386       kre 	if [ "${MKOBJDIRS}" != no ]
   2292  1.386       kre 	then
   2293   1.84     lukem 		# The correct value of KERNOBJDIR might
   2294   1.84     lukem 		# depend on a prior "make obj" in
   2295   1.84     lukem 		# ${KERNSRCDIR}/${KERNARCHDIR}/compile.
   2296   1.84     lukem 		#
   2297   1.98     lukem 		KERNSRCDIR="$(getmakevar KERNSRCDIR)"
   2298   1.98     lukem 		KERNARCHDIR="$(getmakevar KERNARCHDIR)"
   2299  1.203     lukem 		make_in_dir "${KERNSRCDIR}/${KERNARCHDIR}/compile" obj
   2300   1.84     lukem 	fi
   2301  1.386       kre 	KERNCONFDIR=$(getmakevar KERNCONFDIR)
   2302  1.386       kre 	KERNOBJDIR=$(getmakevar KERNOBJDIR)
   2303  1.105     lukem 	case "${kernelconf}" in
   2304   1.84     lukem 	*/*)
   2305  1.386       kre 		kernelconfpath=${kernelconf}
   2306  1.386       kre 		kernelconfname=${kernelconf##*/}
   2307   1.84     lukem 		;;
   2308   1.84     lukem 	*)
   2309  1.386       kre 		kernelconfpath=${KERNCONFDIR}/${kernelconf}
   2310  1.386       kre 		kernelconfname=${kernelconf}
   2311   1.84     lukem 		;;
   2312   1.84     lukem 	esac
   2313  1.386       kre 	kernelbuildpath=${KERNOBJDIR}/${kernelconfname}
   2314  1.105     lukem }
   2315  1.105     lukem 
   2316  1.264  christos diskimage()
   2317  1.264  christos {
   2318  1.386       kre 	ARG="$(echo "$1" | tr '[:lower:]' '[:upper:]')"
   2319  1.341  riastrad 	[ -f "${DESTDIR}/etc/mtree/set.base" ] ||
   2320  1.264  christos 	    bomb "The release binaries must be built first"
   2321  1.264  christos 	kerneldir="${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/kernel"
   2322  1.264  christos 	kernel="${kerneldir}/netbsd-${ARG}.gz"
   2323  1.264  christos 	[ -f "${kernel}" ] ||
   2324  1.264  christos 	    bomb "The kernel ${kernel} must be built first"
   2325  1.264  christos 	make_in_dir "${NETBSDSRCDIR}/etc" "smp_${1}"
   2326  1.264  christos }
   2327  1.264  christos 
   2328  1.105     lukem buildkernel()
   2329  1.105     lukem {
   2330  1.386       kre 	if ! ${do_tools} && ! ${buildkernelwarned:-false}
   2331  1.386       kre 	then
   2332  1.105     lukem 		# Building tools every time we build a kernel is clearly
   2333  1.105     lukem 		# unnecessary.  We could try to figure out whether rebuilding
   2334  1.105     lukem 		# the tools is necessary this time, but it doesn't seem worth
   2335  1.105     lukem 		# the trouble.  Instead, we say it's the user's responsibility
   2336  1.105     lukem 		# to rebuild the tools if necessary.
   2337  1.105     lukem 		#
   2338  1.105     lukem 		statusmsg "Building kernel without building new tools"
   2339  1.105     lukem 		buildkernelwarned=true
   2340  1.105     lukem 	fi
   2341  1.105     lukem 	getkernelconf $1
   2342  1.238  pgoyette 	statusmsg2 "Building kernel:" "${kernelconf}"
   2343  1.238  pgoyette 	statusmsg2 "Build directory:" "${kernelbuildpath}"
   2344  1.105     lukem 	${runcmd} mkdir -p "${kernelbuildpath}" ||
   2345  1.105     lukem 	    bomb "Cannot mkdir: ${kernelbuildpath}"
   2346  1.386       kre 	if [ "${MKUPDATE}" = no ]
   2347  1.386       kre 	then
   2348  1.203     lukem 		make_in_dir "${kernelbuildpath}" cleandir
   2349   1.16   thorpej 	fi
   2350  1.386       kre 	[ -x "${TOOLDIR}/bin/${toolprefix}config" ] ||
   2351  1.386       kre 		bomb "${TOOLDIR}/bin/${toolprefix}config does not exist." \
   2352  1.386       kre 		     "You need to \"$0 tools\" first"
   2353  1.305  uebayasi 	CONFIGOPTS=$(getmakevar CONFIGOPTS)
   2354  1.305  uebayasi 	${runcmd} "${TOOLDIR}/bin/${toolprefix}config" ${CONFIGOPTS} \
   2355  1.305  uebayasi 		-b "${kernelbuildpath}" -s "${TOP}/sys" ${configopts} \
   2356  1.305  uebayasi 		"${kernelconfpath}" ||
   2357  1.105     lukem 	    bomb "${toolprefix}config failed for ${kernelconf}"
   2358  1.203     lukem 	make_in_dir "${kernelbuildpath}" depend
   2359  1.203     lukem 	make_in_dir "${kernelbuildpath}" all
   2360   1.91     lukem 
   2361  1.386       kre 	if [ "${runcmd}" != echo ]
   2362  1.386       kre 	then
   2363  1.105     lukem 		statusmsg "Kernels built from ${kernelconf}:"
   2364  1.105     lukem 		kernlist=$(awk '$1 == "config" { print $2 }' ${kernelconfpath})
   2365  1.386       kre 		for kern in ${kernlist:-netbsd}
   2366  1.386       kre 		do
   2367  1.386       kre 			[ -f "${kernelbuildpath}/${kern}" ] &&
   2368  1.105     lukem 			    echo "  ${kernelbuildpath}/${kern}"
   2369   1.98     lukem 		done | tee -a "${results}"
   2370   1.91     lukem 	fi
   2371   1.84     lukem }
   2372   1.84     lukem 
   2373  1.105     lukem releasekernel()
   2374  1.105     lukem {
   2375  1.105     lukem 	getkernelconf $1
   2376  1.186     lukem 	kernelreldir="${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/kernel"
   2377  1.105     lukem 	${runcmd} mkdir -p "${kernelreldir}"
   2378  1.105     lukem 	kernlist=$(awk '$1 == "config" { print $2 }' ${kernelconfpath})
   2379  1.386       kre 	for kern in ${kernlist:-netbsd}
   2380  1.386       kre 	do
   2381  1.105     lukem 		builtkern="${kernelbuildpath}/${kern}"
   2382  1.105     lukem 		[ -f "${builtkern}" ] || continue
   2383  1.105     lukem 		releasekern="${kernelreldir}/${kern}-${kernelconfname}.gz"
   2384  1.238  pgoyette 		statusmsg2 "Kernel copy:" "${releasekern}"
   2385  1.386       kre 		if [ "${runcmd}" = echo ]
   2386  1.386       kre 		then
   2387  1.196     lukem 			echo "gzip -c -9 < ${builtkern} > ${releasekern}"
   2388  1.196     lukem 		else
   2389  1.196     lukem 			gzip -c -9 < "${builtkern}" > "${releasekern}"
   2390  1.196     lukem 		fi
   2391  1.105     lukem 	done
   2392  1.105     lukem }
   2393  1.105     lukem 
   2394  1.300  uebayasi buildkernels()
   2395  1.300  uebayasi {
   2396  1.306  christos 	allkernels=$( runcmd= make_in_dir etc '-V ${ALL_KERNELS}' )
   2397  1.386       kre 	for k in $allkernels
   2398  1.386       kre 	do
   2399  1.300  uebayasi 		buildkernel "${k}"
   2400  1.300  uebayasi 	done
   2401  1.300  uebayasi }
   2402  1.300  uebayasi 
   2403  1.207   jnemeth buildmodules()
   2404  1.207   jnemeth {
   2405  1.234      morr 	setmakeenv MKBINUTILS no
   2406  1.386       kre 	if ! ${do_tools} && ! ${buildmoduleswarned:-false}
   2407  1.386       kre 	then
   2408  1.207   jnemeth 		# Building tools every time we build modules is clearly
   2409  1.207   jnemeth 		# unnecessary as well as a kernel.
   2410  1.207   jnemeth 		#
   2411  1.207   jnemeth 		statusmsg "Building modules without building new tools"
   2412  1.207   jnemeth 		buildmoduleswarned=true
   2413  1.207   jnemeth 	fi
   2414  1.207   jnemeth 
   2415  1.207   jnemeth 	statusmsg "Building kernel modules for NetBSD/${MACHINE} ${DISTRIBVER}"
   2416  1.386       kre 	if [ "${MKOBJDIRS}" != no ]
   2417  1.386       kre 	then
   2418  1.256   tsutsui 		make_in_dir sys/modules obj
   2419  1.207   jnemeth 	fi
   2420  1.386       kre 	if [ "${MKUPDATE}" = no ]
   2421  1.386       kre 	then
   2422  1.207   jnemeth 		make_in_dir sys/modules cleandir
   2423  1.207   jnemeth 	fi
   2424  1.256   tsutsui 	make_in_dir sys/modules dependall
   2425  1.256   tsutsui 	make_in_dir sys/modules install
   2426  1.207   jnemeth 
   2427  1.386       kre 	statusmsg "Successful build of kernel modules for" \
   2428  1.386       kre 		  "NetBSD/${MACHINE} ${DISTRIBVER}"
   2429  1.207   jnemeth }
   2430  1.207   jnemeth 
   2431  1.335  jmcneill builddtb()
   2432  1.335  jmcneill {
   2433  1.386       kre 	statusmsg "Building devicetree blobs for" \
   2434  1.386       kre 		  "NetBSD/${MACHINE} ${DISTRIBVER}"
   2435  1.386       kre 	if [ "${MKOBJDIRS}" != no ]
   2436  1.386       kre 	then
   2437  1.335  jmcneill 		make_in_dir sys/dtb obj
   2438  1.335  jmcneill 	fi
   2439  1.386       kre 	if [ "${MKUPDATE}" = no ]
   2440  1.386       kre 	then
   2441  1.335  jmcneill 		make_in_dir sys/dtb cleandir
   2442  1.335  jmcneill 	fi
   2443  1.335  jmcneill 	make_in_dir sys/dtb dependall
   2444  1.335  jmcneill 	make_in_dir sys/dtb install
   2445  1.335  jmcneill 
   2446  1.386       kre 	statusmsg "Successful build of devicetree blobs for" \
   2447  1.386       kre 		  "NetBSD/${MACHINE} ${DISTRIBVER}"
   2448  1.335  jmcneill }
   2449  1.335  jmcneill 
   2450  1.380  riastrad buildpkg()
   2451  1.380  riastrad {
   2452  1.380  riastrad 	local catpkg
   2453  1.380  riastrad 	local pkgroot
   2454  1.380  riastrad 	local makejobsarg
   2455  1.380  riastrad 	local makejobsvar
   2456  1.380  riastrad 	local quiet
   2457  1.380  riastrad 	local opsys_version
   2458  1.380  riastrad 
   2459  1.380  riastrad 	catpkg="$1"
   2460  1.380  riastrad 
   2461  1.380  riastrad 	pkgroot="${TOP_objdir:-${TOP}}/pkgroot"
   2462  1.380  riastrad 	${runcmd} mkdir -p "${pkgroot}" ||
   2463  1.380  riastrad 	    bomb "Can't create package root" "${pkgroot}"
   2464  1.380  riastrad 
   2465  1.380  riastrad 	# Get a symlink-free absolute path to pkg -- pkgsrc wants this.
   2466  1.380  riastrad 	#
   2467  1.380  riastrad 	# XXX See TOP= above regarding pwd -P.
   2468  1.380  riastrad 	pkgroot=$(unset PWD; cd "${pkgroot}" &&
   2469  1.380  riastrad 		((exec pwd -P 2>/dev/null) || (exec pwd 2>/dev/null)))
   2470  1.380  riastrad 
   2471  1.380  riastrad 	case $parallel in
   2472  1.380  riastrad 	"-j "*)
   2473  1.380  riastrad 		makejobsarg="--make-jobs ${parallel#-j }"
   2474  1.380  riastrad 		makejobsvar="MAKE_JOBS=${parallel#-j }"
   2475  1.380  riastrad 		;;
   2476  1.386       kre 	*)	makejobsarg=
   2477  1.386       kre 		makejobsvar=
   2478  1.380  riastrad 		;;
   2479  1.380  riastrad 	esac
   2480  1.380  riastrad 
   2481  1.386       kre 	if [ "${MAKEVERBOSE}" -eq 0 ]
   2482  1.386       kre 	then
   2483  1.380  riastrad 		quiet="--quiet"
   2484  1.380  riastrad 	else
   2485  1.386       kre 		quiet=
   2486  1.380  riastrad 	fi
   2487  1.380  riastrad 
   2488  1.380  riastrad 	# Derived from pkgsrc/mk/bsd.prefs.mk rev. 1.451.
   2489  1.380  riastrad 	opsys_version=$(echo "${DISTRIBVER}" |
   2490  1.386       kre 		awk -F. '{
   2491  1.386       kre 				major=int($1)
   2492  1.386       kre 				minor=int($2)
   2493  1.386       kre 				if (minor>=100) minor=99
   2494  1.386       kre 				patch=int($3)
   2495  1.386       kre 				if (patch>=100) patch=99
   2496  1.386       kre 				printf "%02d%02d%02d", major, minor, patch
   2497  1.386       kre 			}'
   2498  1.386       kre 	)
   2499  1.380  riastrad 
   2500  1.380  riastrad 	# Bootstrap pkgsrc if needed.
   2501  1.380  riastrad 	#
   2502  1.380  riastrad 	# XXX Redo this if it's out-of-date, not just if it's missing.
   2503  1.386       kre 	if ! [ -x "${pkgroot}/pkg/bin/bmake" ]
   2504  1.386       kre 	then
   2505  1.380  riastrad 		statusmsg "Bootstrapping pkgsrc"
   2506  1.380  riastrad 
   2507  1.380  riastrad 		cat >"${pkgroot}/mk.conf-fragment" <<EOF
   2508  1.380  riastrad USE_CROSS_COMPILE?=	no
   2509  1.380  riastrad TOOLDIR=		${TOOLDIR}
   2510  1.380  riastrad CROSS_DESTDIR=		${DESTDIR}
   2511  1.380  riastrad CROSS_MACHINE_ARCH=	${MACHINE_ARCH}
   2512  1.380  riastrad CROSS_OPSYS=		NetBSD
   2513  1.380  riastrad CROSS_OS_VERSION=	${DISTRIBVER}
   2514  1.380  riastrad CROSS_OPSYS_VERSION=	${opsys_version}
   2515  1.380  riastrad CROSS_LOWER_OPSYS=	netbsd
   2516  1.380  riastrad CROSS_LOWER_OPSYS_VERSUFFIX=	# empty
   2517  1.380  riastrad CROSS_LOWER_OS_VARIANT=		# empty
   2518  1.380  riastrad CROSS_LOWER_VARIANT_VERSION=	# empty
   2519  1.380  riastrad CROSS_LOWER_VENDOR=		# empty
   2520  1.380  riastrad CROSS_OBJECT_FMT=	ELF
   2521  1.380  riastrad 
   2522  1.380  riastrad ALLOW_VULNERABLE_PACKAGES=	yes
   2523  1.380  riastrad BINPKG_SITES=			# empty
   2524  1.380  riastrad FAILOVER_FETCH=			yes
   2525  1.380  riastrad FETCH_TIMEOUT=			1800
   2526  1.380  riastrad PASSIVE_FETCH=			yes
   2527  1.380  riastrad 
   2528  1.380  riastrad DISTDIR=		${pkgroot}/distfiles
   2529  1.380  riastrad PACKAGES=		${pkgroot}/packages
   2530  1.380  riastrad WRKOBJDIR=		${pkgroot}/work
   2531  1.380  riastrad 
   2532  1.382  riastrad # pkgsrc cross-builds are not set up to support native X, but also part
   2533  1.382  riastrad # of the point of pkgsrc cross-build infrastructure is to not need
   2534  1.382  riastrad # native X any more.
   2535  1.385  riastrad #
   2536  1.385  riastrad # (If you fix this, remove the bomb in build.sh pkg=... on MKX11=yes.)
   2537  1.382  riastrad X11_TYPE=		modular
   2538  1.382  riastrad 
   2539  1.380  riastrad .-include "${MAKECONF}"
   2540  1.380  riastrad 
   2541  1.380  riastrad MKDEBUG=		no	# interferes with pkgsrc builds
   2542  1.380  riastrad EOF
   2543  1.380  riastrad 
   2544  1.380  riastrad 		# XXX Set --abi for mips and whatever else needs it?
   2545  1.380  riastrad 		# XXX Unprivileged native tools, privileged cross.
   2546  1.386       kre 		(
   2547  1.386       kre 			cd "${PKGSRCDIR}" &&
   2548  1.386       kre 			clearmakeenv &&
   2549  1.386       kre 			./bootstrap/bootstrap \
   2550  1.386       kre 				${makejobsarg} \
   2551  1.386       kre 				--mk-fragment "${pkgroot}/mk.conf-fragment" \
   2552  1.386       kre 				--prefix "${pkgroot}/pkg" \
   2553  1.386       kre 				${quiet} \
   2554  1.386       kre 				--unprivileged \
   2555  1.386       kre 				--workdir "${pkgroot}/bootwork"
   2556  1.386       kre 		) ||
   2557  1.386       kre 			 bomb "Failed to bootstrap pkgsrc"
   2558  1.380  riastrad 	fi
   2559  1.380  riastrad 
   2560  1.380  riastrad 	# Build the package.
   2561  1.386       kre 	(
   2562  1.386       kre 		cd "${PKGSRCDIR}/${catpkg}" &&
   2563  1.386       kre 		clearmakeenv &&
   2564  1.380  riastrad 		"${pkgroot}/pkg/bin/bmake" package \
   2565  1.380  riastrad 			USE_CROSS_COMPILE=yes \
   2566  1.386       kre 			${makejobsvar}
   2567  1.386       kre 	) ||
   2568  1.386       kre 		bomb "Failed to build ${catpkg}"
   2569  1.380  riastrad }
   2570  1.380  riastrad 
   2571  1.245  jmcneill installmodules()
   2572  1.245  jmcneill {
   2573  1.245  jmcneill 	dir="$1"
   2574  1.245  jmcneill 	${runcmd} "${makewrapper}" INSTALLMODULESDIR="${dir}" installmodules ||
   2575  1.245  jmcneill 	    bomb "Failed to make installmodules to ${dir}"
   2576  1.245  jmcneill 	statusmsg "Successful installmodules to ${dir}"
   2577  1.245  jmcneill }
   2578  1.245  jmcneill 
   2579   1.84     lukem installworld()
   2580   1.84     lukem {
   2581   1.84     lukem 	dir="$1"
   2582   1.98     lukem 	${runcmd} "${makewrapper}" INSTALLWORLDDIR="${dir}" installworld ||
   2583   1.98     lukem 	    bomb "Failed to make installworld to ${dir}"
   2584   1.98     lukem 	statusmsg "Successful installworld to ${dir}"
   2585   1.84     lukem }
   2586   1.84     lukem 
   2587  1.219     pooka # Run rump build&link tests.
   2588  1.219     pooka #
   2589  1.219     pooka # To make this feasible for running without having to install includes and
   2590  1.219     pooka # libraries into destdir (i.e. quick), we only run ld.  This is possible
   2591  1.219     pooka # since the rump kernel is a closed namespace apart from calls to rumpuser.
   2592  1.219     pooka # Therefore, if ld complains only about rumpuser symbols, rump kernel
   2593  1.219     pooka # linking was successful.
   2594  1.246       wiz #
   2595  1.219     pooka # We test that rump links with a number of component configurations.
   2596  1.219     pooka # These attempt to mimic what is encountered in the full build.
   2597  1.219     pooka # See list below.  The list should probably be either autogenerated
   2598  1.246       wiz # or managed elsewhere; keep it here until a better idea arises.
   2599  1.219     pooka #
   2600  1.219     pooka # Above all, note that THIS IS NOT A SUBSTITUTE FOR A FULL BUILD.
   2601  1.219     pooka #
   2602  1.219     pooka 
   2603  1.367       uwe # XXX: uwe: kern/56599 - while riastradh addressed librump problems,
   2604  1.367       uwe # there are still unwanted dependencies:
   2605  1.367       uwe #    net -> net_net
   2606  1.367       uwe #    vfs -> fifo
   2607  1.367       uwe 
   2608  1.367       uwe # -lrumpvfs -> $LRUMPVFS for now
   2609  1.367       uwe LRUMPVFS="-lrumpvfs -lrumpvfs_nofifofs"
   2610  1.367       uwe 
   2611  1.367       uwe RUMP_LIBSETS="
   2612  1.367       uwe 	-lrump,
   2613  1.367       uwe         -lrumpvfs
   2614  1.367       uwe             --no-whole-archive -lrumpvfs_nofifofs -lrump,
   2615  1.367       uwe 	-lrumpkern_tty
   2616  1.367       uwe             --no-whole-archive $LRUMPVFS -lrump,
   2617  1.367       uwe 	-lrumpfs_tmpfs
   2618  1.367       uwe             --no-whole-archive $LRUMPVFS -lrump,
   2619  1.367       uwe 	-lrumpfs_ffs -lrumpfs_msdos
   2620  1.368       uwe             --no-whole-archive $LRUMPVFS -lrumpdev_disk -lrumpdev -lrump,
   2621  1.341  riastrad 	-lrumpnet_virtif -lrumpnet_netinet -lrumpnet_net -lrumpnet
   2622  1.367       uwe 	    --no-whole-archive -lrump,
   2623  1.367       uwe 	-lrumpfs_nfs
   2624  1.367       uwe 	    --no-whole-archive $LRUMPVFS
   2625  1.367       uwe 	    -lrumpnet_sockin -lrumpnet_virtif -lrumpnet_netinet
   2626  1.367       uwe             --start-group -lrumpnet_net -lrumpnet --end-group -lrump,
   2627  1.367       uwe 	-lrumpdev_cgd -lrumpdev_raidframe -lrumpdev_rnd -lrumpdev_dm
   2628  1.368       uwe             --no-whole-archive $LRUMPVFS -lrumpdev_disk -lrumpdev -lrumpkern_crypto -lrump
   2629  1.367       uwe "
   2630  1.367       uwe 
   2631  1.219     pooka dorump()
   2632  1.219     pooka {
   2633  1.386       kre 	local doclean=
   2634  1.386       kre 	local doobjs=
   2635  1.219     pooka 
   2636  1.273     pooka 	export RUMPKERN_ONLY=1
   2637  1.227     pooka 	# create obj and distrib dirs
   2638  1.386       kre 	if [ "${MKOBJDIRS}" != no ]
   2639  1.386       kre 	then
   2640  1.228     pooka 		make_in_dir "${NETBSDSRCDIR}/etc/mtree" obj
   2641  1.228     pooka 		make_in_dir "${NETBSDSRCDIR}/sys/rump" obj
   2642  1.228     pooka 	fi
   2643  1.227     pooka 	${runcmd} "${makewrapper}" ${parallel} do-distrib-dirs \
   2644  1.363     lukem 	    || bomb "Could not create distrib-dirs"
   2645  1.227     pooka 
   2646  1.386       kre 	[ "${MKUPDATE}" = no ] && doclean="cleandir"
   2647  1.219     pooka 	targlist="${doclean} ${doobjs} dependall install"
   2648  1.386       kre 
   2649  1.219     pooka 	# optimize: for test we build only static libs (3x test speedup)
   2650  1.386       kre 	if [ "${1}" = rumptest ]
   2651  1.386       kre 	then
   2652  1.219     pooka 		setmakeenv NOPIC 1
   2653  1.219     pooka 		setmakeenv NOPROFILE 1
   2654  1.219     pooka 	fi
   2655  1.386       kre 
   2656  1.386       kre 	for cmd in ${targlist}
   2657  1.386       kre 	do
   2658  1.219     pooka 		make_in_dir "${NETBSDSRCDIR}/sys/rump" ${cmd}
   2659  1.219     pooka 	done
   2660  1.219     pooka 
   2661  1.219     pooka 	# if we just wanted to build & install rump, we're done
   2662  1.386       kre 	[ "${1}" != rumptest ] && return
   2663  1.386       kre 
   2664  1.386       kre 	${runcmd} cd "${NETBSDSRCDIR}/sys/rump/librump/rumpkern" ||
   2665  1.386       kre 		bomb "cd to rumpkern failed"
   2666  1.219     pooka 
   2667  1.221     pooka 	md_quirks=`${runcmd} "${makewrapper}" -V '${_SYMQUIRK}'`
   2668  1.221     pooka 	# one little, two little, three little backslashes ...
   2669  1.231      hans 	md_quirks="$(echo ${md_quirks} | sed 's,\\,\\\\,g'";s/'//g" )"
   2670  1.221     pooka 	${runcmd} cd "${TOP}" || bomb "cd to ${TOP} failed"
   2671  1.219     pooka 	tool_ld=`${runcmd} "${makewrapper}" -V '${LD}'`
   2672  1.221     pooka 
   2673  1.387       kre 	local oIFS="${IFS-UnSeTT}"
   2674  1.219     pooka 	IFS=","
   2675  1.386       kre 	for set in ${RUMP_LIBSETS}
   2676  1.386       kre 	do
   2677  1.387       kre 		case "${oIFS}" in
   2678  1.387       kre 		UnSeTT)	unset IFS;;
   2679  1.387       kre 		*)	IFS="${oIFS}";;
   2680  1.387       kre 		esac
   2681  1.219     pooka 		${runcmd} ${tool_ld} -nostdlib -L${DESTDIR}/usr/lib	\
   2682  1.386       kre 		    -static --whole-archive ${set} --no-whole-archive   \
   2683  1.386       kre 		    -lpthread -lc 2>&1 -o /tmp/rumptest.$$ |
   2684  1.221     pooka 		      awk -v quirks="${md_quirks}" '
   2685  1.219     pooka 			/undefined reference/ &&
   2686  1.219     pooka 			    !/more undefined references.*follow/{
   2687  1.221     pooka 				if (match($NF,
   2688  1.266     pooka 				    "`(rumpuser_|rumpcomp_|__" quirks ")") == 0)
   2689  1.219     pooka 					fails[NR] = $0
   2690  1.221     pooka 			}
   2691  1.230     pooka 			/cannot find -l/{fails[NR] = $0}
   2692  1.241     pooka 			/cannot open output file/{fails[NR] = $0}
   2693  1.219     pooka 			END{
   2694  1.219     pooka 				for (x in fails)
   2695  1.219     pooka 					print fails[x]
   2696  1.219     pooka 				exit x!=0
   2697  1.219     pooka 			}'
   2698  1.219     pooka 		[ $? -ne 0 ] && bomb "Testlink of rump failed: ${set}"
   2699  1.219     pooka 	done
   2700  1.219     pooka 	statusmsg "Rump build&link tests successful"
   2701  1.219     pooka }
   2702   1.84     lukem 
   2703  1.351  christos repro_date() {
   2704  1.359    andvar 	# try the bsd date fail back the linux one
   2705  1.352  christos 	date -u -r "$1" 2> /dev/null || date -u -d "@$1"
   2706  1.351  christos }
   2707  1.351  christos 
   2708  1.312  christos setup_mkrepro()
   2709  1.312  christos {
   2710  1.356    martin 	local quiet="$1"
   2711  1.356    martin 
   2712  1.386       kre 	if [ "${MKREPRO-no}" != yes ]
   2713  1.386       kre 	then
   2714  1.312  christos 		return
   2715  1.312  christos 	fi
   2716  1.386       kre 	if [ "${MKREPRO_TIMESTAMP-0}" -ne 0 ]
   2717  1.386       kre 	then
   2718  1.383    martin 		return
   2719  1.356    martin 	fi
   2720  1.349  christos 
   2721  1.387       kre 	local dirs="${NETBSDSRCDIR-/usr/src}/"
   2722  1.386       kre 	if [ "${MKX11-no}" = yes ]
   2723  1.386       kre 	then
   2724  1.314  christos 		dirs="$dirs ${X11SRCDIR-/usr/xsrc}/"
   2725  1.312  christos 	fi
   2726  1.349  christos 
   2727  1.349  christos 	MKREPRO_TIMESTAMP=0
   2728  1.383    martin 	NETBSD_REVISIONID=
   2729  1.349  christos 	local d
   2730  1.349  christos 	local t
   2731  1.390    martin 	local rid
   2732  1.383    martin 	local tag
   2733  1.349  christos 	local vcs
   2734  1.386       kre 	for d in ${dirs}
   2735  1.386       kre 	do
   2736  1.389    martin 		local base=$( basename "$d" )
   2737  1.386       kre 		if [ -d "${d}CVS" ]
   2738  1.386       kre 		then
   2739  1.387       kre 			local cvslatest="$(print_tooldir_program cvslatest)"
   2740  1.386       kre 			if ! [ -x "${cvslatest}" ]
   2741  1.386       kre 			then
   2742  1.366    martin 				buildtools
   2743  1.366    martin 			fi
   2744  1.387       kre 			local nbdate="$(print_tooldir_program date)"
   2745  1.366    martin 
   2746  1.366    martin 			local cvslatestflags=
   2747  1.387       kre 			if "${do_expertmode}"
   2748  1.386       kre 			then
   2749  1.366    martin 				cvslatestflags=-i
   2750  1.366    martin 			fi
   2751  1.366    martin 
   2752  1.386       kre 			t=$("${cvslatest}" ${cvslatestflags} "${d}") ||
   2753  1.386       kre 				bomb "${cvslatest} failed"
   2754  1.386       kre 			if [ -f "${d}CVS/Tag" ]
   2755  1.386       kre 			then
   2756  1.383    martin 				tag=$( sed 's/^T//' < "${d}CVS/Tag" )
   2757  1.383    martin 			else
   2758  1.383    martin 				tag=HEAD
   2759  1.383    martin 			fi
   2760  1.389    martin 			if [ -z "$NETBSD_REVISIONID" ]; then
   2761  1.389    martin 				NETBSD_REVISIONID="${tag}"
   2762  1.389    martin 			fi
   2763  1.389    martin 			NETBSD_REVISIONID="${NETBSD_REVISIONID}-${base}:$(
   2764  1.386       kre 				${nbdate} -u -r ${t} '+%Y%m%d%H%M%S')"
   2765  1.349  christos 			vcs=cvs
   2766  1.386       kre 		elif [ -d "${d}.git" ] || [ -f "${d}.git" ]
   2767  1.386       kre 		then
   2768  1.390    martin 			t=$(cd "${d}" && git log -1 --format=%ct) ||
   2769  1.386       kre 				bomb "git log %ct failed"
   2770  1.390    martin 			rid="${base}:$(
   2771  1.389    martin 			   cd "${d}" && git log -1 --format=%H)" ||
   2772  1.386       kre 				bomb "git log %H failed"
   2773  1.389    martin 			if [ -n "$NETBSD_REVISIONID" ]; then
   2774  1.389    martin 				NETBSD_REVISIONID="${NETBSD_REVISIONID}-${rid}"
   2775  1.389    martin 			else
   2776  1.389    martin 				NETBSD_REVISIONID="$rid"
   2777  1.389    martin 			fi
   2778  1.349  christos 			vcs=git
   2779  1.386       kre 		elif [ -d "${d}.hg" ]
   2780  1.386       kre 		then
   2781  1.386       kre 			t=$(hg --repo "$d" \
   2782  1.386       kre 			    log -r . --template '{date.unixtime}\n') ||
   2783  1.386       kre 				bomb "hg log failed"
   2784  1.390    martin 			rid=$(hg --repo "$d" \
   2785  1.386       kre 			    identify --template '{id}\n') ||
   2786  1.386       kre 				bomb "hg identify failed"
   2787  1.389    martin 			if [ -n "$NETBSD_REVISIONID" ]; then
   2788  1.389    martin 				NETBSD_REVISIONID="${NETBSD_REVISIONID}-${rid}"
   2789  1.389    martin 			else
   2790  1.389    martin 				NETBSD_REVISIONID="$rid"
   2791  1.389    martin 			fi
   2792  1.357     joerg 			vcs=hg
   2793  1.386       kre 		elif [ -f "${d}.hg_archival.txt" ]
   2794  1.386       kre 		then
   2795  1.386       kre 			local stat
   2796  1.386       kre 			stat=$(print_tooldir_program stat) ||
   2797  1.386       kre 				bomb "print_tooldir_program stat failed"
   2798  1.386       kre 			if ! [ -x "${stat}" ]
   2799  1.386       kre 			then
   2800  1.366    martin 				buildtools
   2801  1.366    martin 			fi
   2802  1.366    martin 
   2803  1.386       kre 			t=$("${stat}" -t '%s' -f '%m' "${d}.hg_archival.txt") ||
   2804  1.386       kre 				bomb "stat failed on ${d}.hg_archival.txt"
   2805  1.390    martin 			rid=$(
   2806  1.386       kre 			    awk '/^node:/ { print $2 }' <"${d}.hg_archival.txt"
   2807  1.386       kre 			  ) || bomb \
   2808  1.386       kre 			      "awk failed to find node: in ${d}.hg_archival.txt"
   2809  1.389    martin 			if [ -n "$NETBSD_REVISIONID" ]; then
   2810  1.389    martin 				NETBSD_REVISIONID="${NETBSD_REVISIONID}-${rid}"
   2811  1.389    martin 			else
   2812  1.389    martin 				NETBSD_REVISIONID="$rid"
   2813  1.389    martin 			fi
   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.349  christos 
   2819  1.386       kre 		if [ -z "$t" ]
   2820  1.386       kre 		then
   2821  1.349  christos 			bomb "Failed to get timestamp for vcs=$vcs in '$d'"
   2822  1.349  christos 		fi
   2823  1.349  christos 
   2824  1.349  christos 		#echo "latest $d $vcs $t"
   2825  1.386       kre 		if [ "$t" -gt "$MKREPRO_TIMESTAMP" ]
   2826  1.386       kre 		then
   2827  1.349  christos 			MKREPRO_TIMESTAMP="$t"
   2828  1.349  christos 		fi
   2829  1.349  christos 	done
   2830  1.349  christos 
   2831  1.377    martin 	[ "${MKREPRO_TIMESTAMP}" -ne 0 ] || bomb "Failed to compute timestamp"
   2832  1.386       kre 	if [ -z "${quiet}" ]
   2833  1.386       kre 	then
   2834  1.356    martin 		statusmsg2 "MKREPRO_TIMESTAMP" \
   2835  1.356    martin 			"$(repro_date "${MKREPRO_TIMESTAMP}")"
   2836  1.356    martin 	fi
   2837  1.383    martin 	export MKREPRO MKREPRO_TIMESTAMP NETBSD_REVISIONID
   2838  1.312  christos }
   2839  1.312  christos 
   2840   1.84     lukem main()
   2841   1.84     lukem {
   2842   1.84     lukem 	initdefaults
   2843  1.386       kre 	_args=$*
   2844   1.84     lukem 	parseoptions "$@"
   2845   1.93     lukem 
   2846  1.163       apb 	sanitycheck
   2847  1.163       apb 
   2848   1.93     lukem 	build_start=$(date)
   2849  1.240  pgoyette 	statusmsg2 "${progname} command:" "$0 $*"
   2850  1.238  pgoyette 	statusmsg2 "${progname} started:" "${build_start}"
   2851  1.238  pgoyette 	statusmsg2 "NetBSD version:"   "${DISTRIBVER}"
   2852  1.238  pgoyette 	statusmsg2 "MACHINE:"          "${MACHINE}"
   2853  1.238  pgoyette 	statusmsg2 "MACHINE_ARCH:"     "${MACHINE_ARCH}"
   2854  1.238  pgoyette 	statusmsg2 "Build platform:"   "${uname_s} ${uname_r} ${uname_m}"
   2855  1.238  pgoyette 	statusmsg2 "HOST_SH:"          "${HOST_SH}"
   2856  1.386       kre 	if [ -n "${BUILDID}" ]
   2857  1.386       kre 	then
   2858  1.386       kre 		statusmsg2 BUILDID: "${BUILDID}"
   2859  1.282       apb 	fi
   2860  1.386       kre 	if [ -n "${BUILDINFO}" ]
   2861  1.386       kre 	then
   2862  1.386       kre 		printf "%b\n" "${BUILDINFO}" |
   2863  1.386       kre 		while read -r line
   2864  1.386       kre 		do
   2865  1.287       apb 			[ -s "${line}" ] && continue
   2866  1.386       kre 			statusmsg2 BUILDINFO: "${line}"
   2867  1.287       apb 		done
   2868  1.287       apb 	fi
   2869  1.153       apb 
   2870  1.386       kre 	if [ -n "${MAKECONF+1}" ] && [ -z "${MAKECONF}" ]
   2871  1.386       kre 	then
   2872  1.373     lukem 		bomb "MAKECONF must not be empty"
   2873  1.373     lukem 	fi
   2874  1.373     lukem 
   2875   1.84     lukem 	rebuildmake
   2876   1.84     lukem 	validatemakeparams
   2877   1.84     lukem 	createmakewrapper
   2878  1.316  christos 	setup_mkrepro
   2879   1.84     lukem 
   2880   1.84     lukem 	# Perform the operations.
   2881   1.84     lukem 	#
   2882  1.386       kre 	for op in ${operations}
   2883  1.386       kre 	do
   2884   1.98     lukem 		case "${op}" in
   2885   1.86     lukem 
   2886   1.86     lukem 		makewrapper)
   2887   1.86     lukem 			# no-op
   2888   1.86     lukem 			;;
   2889   1.84     lukem 
   2890   1.84     lukem 		tools)
   2891   1.84     lukem 			buildtools
   2892   1.84     lukem 			;;
   2893  1.329  christos 		libs)
   2894  1.329  christos 			buildlibs
   2895  1.329  christos 			;;
   2896   1.84     lukem 
   2897  1.125     lukem 		sets)
   2898  1.125     lukem 			statusmsg "Building sets from pre-populated ${DESTDIR}"
   2899  1.125     lukem 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2900  1.125     lukem 			    bomb "Failed to make ${op}"
   2901  1.186     lukem 			setdir=${RELEASEDIR}/${RELEASEMACHINEDIR}/binary/sets
   2902  1.186     lukem 			statusmsg "Built sets to ${setdir}"
   2903  1.125     lukem 			;;
   2904  1.142       apb 
   2905  1.312  christos 		build|distribution|release)
   2906  1.312  christos 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2907  1.312  christos 			    bomb "Failed to make ${op}"
   2908  1.312  christos 			statusmsg "Successful make ${op}"
   2909  1.312  christos 			;;
   2910  1.312  christos 
   2911  1.371     lukem 		cleandir|obj|sourcesets|syspkgs|params|show-params)
   2912   1.98     lukem 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2913   1.98     lukem 			    bomb "Failed to make ${op}"
   2914   1.98     lukem 			statusmsg "Successful make ${op}"
   2915   1.84     lukem 			;;
   2916   1.84     lukem 
   2917  1.173   jnemeth 		iso-image|iso-image-source)
   2918  1.173   jnemeth 			${runcmd} "${makewrapper}" ${parallel} \
   2919  1.209       apb 			    CDEXTRA="$CDEXTRA" ${op} ||
   2920  1.386       kre 				bomb "Failed to make ${op}"
   2921  1.173   jnemeth 			statusmsg "Successful make ${op}"
   2922  1.173   jnemeth 			;;
   2923  1.173   jnemeth 
   2924  1.254   tsutsui 		live-image|install-image)
   2925  1.254   tsutsui 			# install-image and live-image require mtree spec files
   2926  1.386       kre 			# built with MKUNPRIVED.  Assume MKUNPRIVED build has
   2927  1.386       kre 			# been performed if METALOG file is created in DESTDIR.
   2928  1.386       kre 			if [ ! -e "${DESTDIR}/METALOG" ]
   2929  1.386       kre 			then
   2930  1.386       kre 				bomb "The release binaries must have been" \
   2931  1.386       kre 				     "built with -U to create images"
   2932  1.254   tsutsui 			fi
   2933  1.253   tsutsui 			${runcmd} "${makewrapper}" ${parallel} ${op} ||
   2934  1.253   tsutsui 			    bomb "Failed to make ${op}"
   2935  1.253   tsutsui 			statusmsg "Successful make ${op}"
   2936  1.253   tsutsui 			;;
   2937   1.84     lukem 		kernel=*)
   2938   1.84     lukem 			arg=${op#*=}
   2939   1.84     lukem 			buildkernel "${arg}"
   2940  1.105     lukem 			;;
   2941  1.281    martin 		kernel.gdb=*)
   2942  1.281    martin 			arg=${op#*=}
   2943  1.302  uebayasi 			configopts="-D DEBUG=-g"
   2944  1.302  uebayasi 			buildkernel "${arg}"
   2945  1.302  uebayasi 			;;
   2946  1.105     lukem 		releasekernel=*)
   2947  1.105     lukem 			arg=${op#*=}
   2948  1.105     lukem 			releasekernel "${arg}"
   2949   1.84     lukem 			;;
   2950   1.84     lukem 
   2951  1.300  uebayasi 		kernels)
   2952  1.300  uebayasi 			buildkernels
   2953  1.300  uebayasi 			;;
   2954  1.300  uebayasi 
   2955  1.264  christos 		disk-image=*)
   2956  1.264  christos 			arg=${op#*=}
   2957  1.264  christos 			diskimage "${arg}"
   2958  1.264  christos 			;;
   2959  1.264  christos 
   2960  1.335  jmcneill 		dtb)
   2961  1.335  jmcneill 			builddtb
   2962  1.335  jmcneill 			;;
   2963  1.335  jmcneill 
   2964  1.207   jnemeth 		modules)
   2965  1.207   jnemeth 			buildmodules
   2966  1.207   jnemeth 			;;
   2967  1.207   jnemeth 
   2968  1.380  riastrad 		pkg=*)
   2969  1.380  riastrad 			arg=${op#*=}
   2970  1.386       kre 			if ! [ -d "${PKGSRCDIR}/${arg}" ]
   2971  1.386       kre 			then
   2972  1.380  riastrad 				bomb "no such package ${arg}"
   2973  1.380  riastrad 			fi
   2974  1.380  riastrad 			buildpkg "${arg}"
   2975  1.380  riastrad 			;;
   2976  1.380  riastrad 
   2977  1.245  jmcneill 		installmodules=*)
   2978  1.245  jmcneill 			arg=${op#*=}
   2979  1.386       kre 			if [ "${arg}" = / ] && {
   2980  1.386       kre 				[ "${uname_s}" != NetBSD ] ||
   2981  1.386       kre 				[ "${uname_m}" != "${MACHINE}" ]
   2982  1.386       kre 			    }
   2983  1.386       kre 			then
   2984  1.363     lukem 				bomb "'${op}' must != / for cross builds"
   2985  1.245  jmcneill 			fi
   2986  1.245  jmcneill 			installmodules "${arg}"
   2987  1.245  jmcneill 			;;
   2988  1.245  jmcneill 
   2989   1.84     lukem 		install=*)
   2990   1.84     lukem 			arg=${op#*=}
   2991  1.386       kre 			if [ "${arg}" = / ] && {
   2992  1.386       kre 				[ "${uname_s}" != NetBSD ] ||
   2993  1.386       kre 				[ "${uname_m}" != "${MACHINE}" ]
   2994  1.386       kre 			   }
   2995  1.386       kre 			then
   2996  1.363     lukem 				bomb "'${op}' must != / for cross builds"
   2997   1.85     lukem 			fi
   2998   1.84     lukem 			installworld "${arg}"
   2999   1.70     lukem 			;;
   3000   1.84     lukem 
   3001  1.355  christos 		rump)
   3002  1.355  christos 			make_in_dir . do-distrib-dirs
   3003  1.355  christos 			make_in_dir . includes
   3004  1.355  christos 			make_in_dir lib/csu dependall
   3005  1.355  christos 			make_in_dir lib/csu install
   3006  1.355  christos 			make_in_dir external/gpl3/gcc/lib/libgcc dependall
   3007  1.355  christos 			make_in_dir external/gpl3/gcc/lib/libgcc install
   3008  1.355  christos 			dorump "${op}"
   3009  1.355  christos 			;;
   3010  1.355  christos 
   3011  1.355  christos 		rumptest)
   3012  1.219     pooka 			dorump "${op}"
   3013  1.219     pooka 			;;
   3014  1.219     pooka 
   3015   1.70     lukem 		*)
   3016  1.365     lukem 			bomb "Unknown OPERATION '${op}'"
   3017   1.70     lukem 			;;
   3018   1.84     lukem 
   3019   1.70     lukem 		esac
   3020   1.84     lukem 	done
   3021   1.93     lukem 
   3022  1.238  pgoyette 	statusmsg2 "${progname} ended:" "$(date)"
   3023  1.386       kre 	if [ -s "${results}" ]
   3024  1.386       kre 	then
   3025   1.98     lukem 		echo "===> Summary of results:"
   3026   1.98     lukem 		sed -e 's/^===>//;s/^/	/' "${results}"
   3027   1.98     lukem 		echo "===> ."
   3028   1.98     lukem 	fi
   3029   1.84     lukem }
   3030   1.84     lukem 
   3031   1.84     lukem main "$@"
   3032