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