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