Thu May 27 21:03:26 2021 UTC ()
kre@ does not like the subshell :-)


(christos)
diff -r1.351 -r1.352 src/build.sh

cvs diff -r1.351 -r1.352 src/build.sh (switch to unified diff)

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