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