Annotation of src/build.sh, Revision 1.82
1.67 thorpej 1: #! /usr/bin/env sh
1.82 ! lukem 2: # $NetBSD: build.sh,v 1.81 2003/01/04 14:55:44 lukem Exp $
1.1 tv 3: #
4: # Top level build wrapper, for a system containing no tools.
5: #
6: # This script should run on any POSIX-compliant shell. For systems
1.33 tv 7: # with a strange /bin/sh, "ksh" or "bash" may be an ample alternative.
1.1 tv 8: #
1.67 thorpej 9: # Note, however, that due to the way the interpreter is invoked above,
10: # if a POSIX-compliant shell is the first in the PATH, you won't have
11: # to take any further action.
12: #
1.1 tv 13:
1.82 ! lukem 14: trap "exit 1" 1 2 3 15
! 15: toppid=$$
1.79 lukem 16: bomb()
17: {
1.82 ! lukem 18: cat >&2 <<ERRORMESSAGE
! 19:
! 20: ERROR: $@
! 21: *** BUILD ABORTED ***
! 22: ERRORMESSAGE
! 23: kill $toppid # in case we were invoked from a subshell
1.1 tv 24: exit 1
25: }
1.78 lukem 26:
1.79 lukem 27: cd "$(dirname $0)"
28: [ -d usr.bin/make ] ||
29: bomb "build.sh must be run from the top source level"
30: [ -f share/mk/bsd.own.mk ] ||
31: bomb "src/share/mk is missing; please re-fetch the source tree"
1.1 tv 32:
1.77 lukem 33: uname_s=$(uname -s 2>/dev/null)
34: uname_m=$(uname -m 2>/dev/null)
35:
1.64 bjh21 36: # If $PWD is a valid name of the current directory, POSIX mandates that pwd
37: # return it by default which causes problems in the presence of symlinks.
38: # Unsetting PWD is simpler than changing every occurrence of pwd to use -P.
1.67 thorpej 39: #
40: # XXX Except that doesn't work on Solaris.
1.64 bjh21 41: unset PWD
1.77 lukem 42: if [ "${uname_s}" = "SunOS" ]; then
1.79 lukem 43: TOP=$(pwd -P)
1.67 thorpej 44: else
1.79 lukem 45: TOP=$(pwd)
1.67 thorpej 46: fi
1.29 jmc 47:
1.79 lukem 48: getarch()
49: {
1.1 tv 50: # Translate a MACHINE into a default MACHINE_ARCH.
51: case $MACHINE in
1.55 thorpej 52: acorn26|acorn32|cats|netwinder|shark|*arm)
1.1 tv 53: MACHINE_ARCH=arm;;
54:
55: sun2)
56: MACHINE_ARCH=m68000;;
57:
58: amiga|atari|cesfic|hp300|sun3|*68k)
59: MACHINE_ARCH=m68k;;
60:
1.50 simonb 61: mipsco|newsmips|sbmips|sgimips)
1.1 tv 62: MACHINE_ARCH=mipseb;;
63:
1.51 simonb 64: algor|arc|cobalt|evbmips|hpcmips|playstation2|pmax)
1.1 tv 65: MACHINE_ARCH=mipsel;;
66:
67: pc532)
68: MACHINE_ARCH=ns32k;;
69:
1.76 scw 70: bebox|prep|sandpoint|*ppc)
1.1 tv 71: MACHINE_ARCH=powerpc;;
72:
1.22 msaitoh 73: evbsh3|mmeye)
1.1 tv 74: MACHINE_ARCH=sh3eb;;
75:
1.22 msaitoh 76: dreamcast|hpcsh)
1.1 tv 77: MACHINE_ARCH=sh3el;;
78:
1.62 fredette 79: hp700)
80: MACHINE_ARCH=hppa;;
81:
1.69 thorpej 82: evbsh5)
83: MACHINE_ARCH=sh5el;;
84:
1.5 bjh21 85: alpha|i386|sparc|sparc64|vax|x86_64)
1.4 tv 86: MACHINE_ARCH=$MACHINE;;
87:
88: *) bomb "unknown target MACHINE: $MACHINE";;
1.1 tv 89: esac
90: }
91:
1.79 lukem 92: validatearch()
93: {
1.47 tv 94: # Ensure that the MACHINE_ARCH exists (and is supported by build.sh).
95: case $MACHINE_ARCH in
1.69 thorpej 96: alpha|arm|armeb|hppa|i386|m68000|m68k|mipse[bl]|ns32k|powerpc|sh[35]e[bl]|sparc|sparc64|vax|x86_64)
1.47 tv 97: ;;
98:
99: *) bomb "unknown target MACHINE_ARCH: $MACHINE_ARCH";;
100: esac
101: }
102:
1.79 lukem 103: getmakevar()
104: {
1.82 ! lukem 105: [ -x $make ] || bomb "getmakevar $1: $make is not executable"
1.30 jmc 106: $make -m ${TOP}/share/mk -s -f- _x_ <<EOF
1.15 tv 107: _x_:
108: echo \${$1}
109: .include <bsd.prog.mk>
1.70 lukem 110: .include <bsd.kernobj.mk>
1.15 tv 111: EOF
112: }
113:
1.82 ! lukem 114: # getmakevar doesn't work properly if $make hasn't yet been built, which
! 115: # can happen when running with the "-n" option. safe_getmakevar deals
! 116: # with this by emitting a literal '$' followed by the variable name,
! 117: # instead of trying to find the variable's value.
! 118: safe_getmakevar()
! 119: {
! 120: if [ -x $make ]; then
! 121: getmakevar "$1"
! 122: else
! 123: echo "\$$1"
! 124: fi
! 125: }
! 126:
1.79 lukem 127: resolvepath()
128: {
1.10 tv 129: case $OPTARG in
130: /*) ;;
1.67 thorpej 131: *) OPTARG="$TOP/$OPTARG";;
1.10 tv 132: esac
133: }
134:
1.79 lukem 135: usage()
136: {
1.70 lukem 137: cat <<_usage_
1.81 lukem 138: Usage: $(basename $0) [-bdEnortUu] [-a arch] [-B buildid] [-D dest]
139: [-i instdir] [-j njob] [-k kernel] [-M obj] [-m mach]
140: [-O obj] [-R release] [-T tools] [-V var=[value]] [-w wrapper]
1.70 lukem 141:
142: -a arch set MACHINE_ARCH to arch (otherwise deduced from MACHINE)
143: -B buildid set BUILDID to buildid
144: -b build nbmake and nbmake wrapper script, if needed
145: -D dest set DESTDIR to dest
146: -d build a full distribution into DESTDIR (including etc files)
1.74 lukem 147: -E set "expert" mode; disables some DESTDIR checks
1.81 lukem 148: -i instdir installworld from DESTDIR to instdir (after build completes)
1.70 lukem 149: -j njob run up to njob jobs in parallel; see make(1)
150: -k kernel build a kernel using the named configuration file
151: -M obj set obj root directory to obj (sets MAKEOBJDIRPREFIX)
152: -m mach set MACHINE to mach (not required if NetBSD native)
153: -n show commands that would be executed, but do not execute them
154: -O obj set obj root directory to obj (sets a MAKEOBJDIR pattern)
155: -o set MKOBJDIRS=no (do not create objdirs at start of build)
156: -R release build a release (and set RELEASEDIR to release)
1.71 enami 157: -r remove contents of TOOLDIR and DESTDIR before building
1.70 lukem 158: -T tools set TOOLDIR to tools
159: -t build and install tools only (implies -b)
160: -U set UNPRIVED
161: -u set UPDATE
1.80 lukem 162: -V v=[val] set variable \`v' to \`val'
1.70 lukem 163: -w wrapper create nbmake script at wrapper
164: (default TOOLDIR/bin/nbmake-MACHINE)
165:
1.81 lukem 166: Notes:
167: * The last specified option with "build" functionality will be run.
168: * If -T is unset and TOOLDIR is not set in the environment,
169: nbmake will be [re]built unconditionally.
1.70 lukem 170: _usage_
1.1 tv 171: exit 1
172: }
173:
1.10 tv 174: # Set defaults.
1.18 tv 175: MAKEFLAGS=
1.12 tv 176: buildtarget=build
1.10 tv 177: do_buildsystem=true
1.72 lukem 178: do_buildkernel=false
179: do_buildtools=false
1.10 tv 180: do_rebuildmake=false
181: do_removedirs=false
1.74 lukem 182: expert_mode=false
1.18 tv 183: makeenv=
184: makewrapper=
1.77 lukem 185: installworlddir=
1.10 tv 186: opt_a=no
1.80 lukem 187: opts='a:B:bD:dEhi:j:k:M:m:nO:oR:rT:tUuV:w:'
1.18 tv 188: runcmd=
1.4 tv 189:
190: if type getopts >/dev/null 2>&1; then
191: # Use POSIX getopts.
192: getoptcmd='getopts $opts opt && opt=-$opt'
193: optargcmd=':'
194: else
1.79 lukem 195: type getopt >/dev/null 2>&1 ||
196: bomb "/bin/sh shell is too old; try ksh or bash"
1.2 tv 197:
1.4 tv 198: # Use old-style getopt(1) (doesn't handle whitespace in args).
1.79 lukem 199: args="$(getopt $opts $*)"
1.4 tv 200: [ $? = 0 ] || usage
201: set -- $args
1.1 tv 202:
1.4 tv 203: getoptcmd='[ $# -gt 0 ] && opt="$1" && shift'
204: optargcmd='OPTARG="$1"; shift'
205: fi
1.10 tv 206:
207: # Parse command line options.
1.79 lukem 208: while eval $getoptcmd; do
209: case $opt in
1.4 tv 210: -a) eval $optargcmd
211: MACHINE_ARCH=$OPTARG; opt_a=yes;;
1.1 tv 212:
1.52 thorpej 213: -B) eval $optargcmd
214: BUILDID=$OPTARG;;
215:
1.10 tv 216: -b) do_buildsystem=false;;
1.9 jmc 217:
1.73 lukem 218: -D) eval $optargcmd; resolvepath
219: DESTDIR="$OPTARG"; export DESTDIR
220: makeenv="$makeenv DESTDIR";;
221:
1.26 thorpej 222: -d) buildtarget=distribution;;
223:
1.74 lukem 224: -E) expert_mode=true;;
225:
1.77 lukem 226: -i) eval $optargcmd
227: installworlddir=$OPTARG;;
228:
1.4 tv 229: -j) eval $optargcmd
1.57 sommerfe 230: parallel="-j $OPTARG";;
1.1 tv 231:
1.72 lukem 232: -k) do_buildkernel=true; do_buildsystem=false
1.70 lukem 233: eval $optargcmd
1.72 lukem 234: kernconfname=$OPTARG;;
1.70 lukem 235:
1.73 lukem 236: -M) eval $optargcmd; resolvepath
237: MAKEOBJDIRPREFIX="$OPTARG"; export MAKEOBJDIRPREFIX
238: makeobjdir=$OPTARG
239: makeenv="$makeenv MAKEOBJDIRPREFIX";;
240:
1.4 tv 241: # -m overrides MACHINE_ARCH unless "-a" is specified
242: -m) eval $optargcmd
243: MACHINE=$OPTARG; [ "$opt_a" != "yes" ] && getarch;;
1.3 tv 244:
1.10 tv 245: -n) runcmd=echo;;
246:
1.73 lukem 247: -O) eval $optargcmd; resolvepath
248: MAKEOBJDIR="\${.CURDIR:C,^$TOP,$OPTARG,}"; export MAKEOBJDIR
249: makeobjdir=$OPTARG
250: makeenv="$makeenv MAKEOBJDIR";;
251:
1.12 tv 252: -o) MKOBJDIRS=no;;
253:
1.73 lukem 254: -R) eval $optargcmd; resolvepath
255: RELEASEDIR=$OPTARG; export RELEASEDIR
256: makeenv="$makeenv RELEASEDIR"
257: buildtarget=release;;
258:
1.10 tv 259: -r) do_removedirs=true; do_rebuildmake=true;;
1.1 tv 260:
1.73 lukem 261: -T) eval $optargcmd; resolvepath
262: TOOLDIR="$OPTARG"; export TOOLDIR;;
263:
1.72 lukem 264: -t) do_buildtools=true; do_buildsystem=false;;
1.16 thorpej 265:
1.44 lukem 266: -U) UNPRIVED=yes; export UNPRIVED
267: makeenv="$makeenv UNPRIVED";;
268:
1.18 tv 269: -u) UPDATE=yes; export UPDATE
270: makeenv="$makeenv UPDATE";;
1.15 tv 271:
1.80 lukem 272: -V) eval $optargcmd
273: case "${OPTARG}" in
274: # XXX: consider restricting which variables can be changed?
275: [a-zA-Z_][a-zA-Z_0-9]*=*)
276: var=${OPTARG%%=*}
277: value=${OPTARG#*=}
278: eval "${var}=\"${value}\"; export ${var}"
279: makeenv="$makeenv ${var}"
280: ;;
281: *)
282: echo "-V argument must be of the form 'var=[value]'"
283: usage;;
284: esac
285: ;;
286:
1.15 tv 287: -w) eval $optargcmd; resolvepath
288: makewrapper="$OPTARG";;
1.12 tv 289:
1.4 tv 290: --) break;;
291: -'?'|-h) usage;;
1.79 lukem 292: esac
293: done
1.1 tv 294:
1.15 tv 295: # Set up MACHINE*. On a NetBSD host, these are allowed to be unset.
296: if [ -z "$MACHINE" ]; then
1.77 lukem 297: if [ "${uname_s}" != "NetBSD" ]; then
1.15 tv 298: echo "MACHINE must be set, or -m must be used, for cross builds."
1.4 tv 299: echo ""; usage
300: fi
1.77 lukem 301: MACHINE=${uname_m}
1.15 tv 302: fi
1.10 tv 303: [ -n "$MACHINE_ARCH" ] || getarch
1.47 tv 304: validatearch
1.3 tv 305:
1.15 tv 306: # Set up default make(1) environment.
1.18 tv 307: makeenv="$makeenv TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS"
1.52 thorpej 308: if [ ! -z "$BUILDID" ]; then
309: makeenv="$makeenv BUILDID"
310: fi
1.67 thorpej 311: MAKEFLAGS="-m $TOP/share/mk $MAKEFLAGS MKOBJDIRS=${MKOBJDIRS-yes}"
1.18 tv 312: export MAKEFLAGS MACHINE MACHINE_ARCH
1.15 tv 313:
314: # Test make source file timestamps against installed nbmake binary,
315: # if TOOLDIR is pre-set.
1.46 tv 316: #
317: # Note that we do NOT try to grovel "mk.conf" here to find out if TOOLDIR
318: # is set there, because it can contain make variable expansions and other
319: # stuff only parseable *after* we have a working nbmake. So this logic
320: # can only work if the user has pre-set TOOLDIR in the environment or
321: # used the -T option to build.sh.
322: #
1.53 pk 323: make="${TOOLDIR-nonexistent}/bin/nbmake"
1.15 tv 324: if [ -x $make ]; then
1.1 tv 325: for f in usr.bin/make/*.[ch] usr.bin/make/lst.lib/*.[ch]; do
1.66 thorpej 326: if [ $f -nt $make ]; then
1.10 tv 327: do_rebuildmake=true; break
1.1 tv 328: fi
329: done
330: else
1.10 tv 331: do_rebuildmake=true
1.1 tv 332: fi
333:
1.15 tv 334: # Build bootstrap nbmake if needed.
1.10 tv 335: if $do_rebuildmake; then
1.18 tv 336: $runcmd echo "===> Bootstrapping nbmake"
1.53 pk 337: tmpdir="${TMPDIR-/tmp}/nbbuild$$"
1.4 tv 338:
1.53 pk 339: $runcmd mkdir "$tmpdir" || bomb "cannot mkdir: $tmpdir"
340: trap "cd /; rm -r -f \"$tmpdir\"" 0
341: $runcmd cd "$tmpdir"
1.1 tv 342:
1.72 lukem 343: $runcmd env CC="${HOST_CC-cc}" CPPFLAGS="${HOST_CPPFLAGS}" \
344: CFLAGS="${HOST_CFLAGS--O}" LDFLAGS="${HOST_LDFLAGS}" \
345: "$TOP/tools/make/configure" \
346: || bomb "configure of nbmake failed"
1.39 tv 347: $runcmd sh buildmake.sh || bomb "build of nbmake failed"
1.1 tv 348:
1.53 pk 349: make="$tmpdir/nbmake"
1.67 thorpej 350: $runcmd cd "$TOP"
1.15 tv 351: $runcmd rm -f usr.bin/make/*.o usr.bin/make/lst.lib/*.o
352: fi
353:
1.53 pk 354: if [ "$runcmd" = "echo" ]; then
1.68 thorpej 355: TOOLCHAIN_MISSING=no
1.82 ! lukem 356: EXTERNAL_TOOLCHAIN=""
1.53 pk 357: else
1.79 lukem 358: TOOLCHAIN_MISSING=$(getmakevar TOOLCHAIN_MISSING)
1.82 ! lukem 359: EXTERNAL_TOOLCHAIN=$(getmakevar EXTERNAL_TOOLCHAIN)
1.53 pk 360: fi
1.68 thorpej 361: if [ "${TOOLCHAIN_MISSING}" = "yes" -a \
362: "${EXTERNAL_TOOLCHAIN}" = "" ]; then
363: echo "ERROR: build.sh (in-tree cross-toolchain) is not yet available for"
1.30 jmc 364: echo
365: echo "MACHINE: ${MACHINE}"
366: echo "MACHINE_ARCH: ${MACHINE_ARCH}"
367: echo
368: echo "All builds for this platform should be done via a traditional make"
369: echo
1.68 thorpej 370: echo "If you wish to use an external cross-toolchain, set"
1.30 jmc 371: echo
1.68 thorpej 372: echo "EXTERNAL_TOOLCHAIN=<path to toolchain root>"
1.30 jmc 373: echo
374: echo "in either the environment or mk.conf and rerun"
375: echo
376: echo "$0 $*"
377: exit 1
378: fi
379:
1.15 tv 380: # If TOOLDIR isn't already set, make objdirs in "tools" in case the
381: # default setting from <bsd.own.mk> is used.
382: if [ -z "$TOOLDIR" ] && [ "$MKOBJDIRS" != "no" ]; then
1.18 tv 383: $runcmd cd tools
1.72 lukem 384: $runcmd $make -m ${TOP}/share/mk obj NOSUBDIR= \
385: || bomb "make obj failed in tools"
1.70 lukem 386: $runcmd cd "$TOP"
1.15 tv 387: fi
388:
1.27 jmc 389: #
1.58 lukem 390: # If setting -M or -O to root an obj dir make sure the base directory is made
1.27 jmc 391: # before continuing as bsd.own.mk will need this to pick up _SRC_TOP_OBJ_
392: #
393: if [ "$MKOBJDIRS" != "no" ] && [ ! -z "$makeobjdir" ]; then
1.53 pk 394: $runcmd mkdir -p "$makeobjdir"
1.27 jmc 395: fi
396:
1.15 tv 397: # Find DESTDIR and TOOLDIR.
1.82 ! lukem 398: DESTDIR=$(safe_getmakevar DESTDIR)
! 399: $runcmd echo "===> DESTDIR path: $DESTDIR"
! 400: TOOLDIR=$(safe_getmakevar TOOLDIR)
! 401: $runcmd echo "===> TOOLDIR path: $TOOLDIR"
! 402: export DESTDIR TOOLDIR
1.15 tv 403:
404: # Check validity of TOOLDIR and DESTDIR.
405: if [ -z "$TOOLDIR" ] || [ "$TOOLDIR" = "/" ]; then
406: bomb "TOOLDIR '$TOOLDIR' invalid"
407: fi
408: removedirs="$TOOLDIR"
409:
410: if [ -z "$DESTDIR" ] || [ "$DESTDIR" = "/" ]; then
1.73 lukem 411: if $do_buildsystem; then
412: if [ "$buildtarget" != "build" ] || \
1.77 lukem 413: [ "${uname_s}" != "NetBSD" ] || \
414: [ "${uname_m}" != "$MACHINE" ]; then
1.73 lukem 415: bomb "DESTDIR must be set to a non-root path for cross builds or -d or -R."
416: fi
1.74 lukem 417: if ! $expert_mode; then
418: bomb "DESTDIR must be set to a non-root path for non -E (expert) builds"
419: fi
420: $runcmd echo "===> WARNING: Building to /, in expert mode."
1.75 lukem 421: $runcmd echo "===> This may cause your system to break! Reasons include:"
1.74 lukem 422: $runcmd echo "===> - your kernel is not up to date"
423: $runcmd echo "===> - the libraries or toolchain have changed"
424: $runcmd echo "===> YOU HAVE BEEN WARNED!"
1.15 tv 425: fi
426: else
427: removedirs="$removedirs $DESTDIR"
428: fi
429:
1.77 lukem 430: if [ "$installworlddir" = "/" ]; then
431: if [ "${uname_s}" != "NetBSD" ] || \
432: [ "${uname_m}" != "$MACHINE" ]; then
433: bomb "-i installworlddir must be set to a non-root path for cross builds."
434: fi
435: fi
436:
1.15 tv 437: # Remove the target directories.
438: if $do_removedirs; then
439: for f in $removedirs; do
1.72 lukem 440: $runcmd echo "===> Removing $f"
1.15 tv 441: $runcmd rm -r -f $f
442: done
443: fi
444:
445: # Recreate $TOOLDIR.
1.53 pk 446: $runcmd mkdir -p "$TOOLDIR/bin" || bomb "mkdir of '$TOOLDIR/bin' failed"
1.15 tv 447:
448: # Install nbmake if it was built.
449: if $do_rebuildmake; then
1.53 pk 450: $runcmd rm -f "$TOOLDIR/bin/nbmake"
1.72 lukem 451: $runcmd cp $make "$TOOLDIR/bin/nbmake" \
452: || bomb "failed to install \$TOOLDIR/bin/nbmake"
453: make="$TOOLDIR/bin/nbmake"
1.53 pk 454: $runcmd rm -r -f "$tmpdir"
1.82 ! lukem 455: trap 0
1.1 tv 456: fi
457:
1.4 tv 458: # Build a nbmake wrapper script, usable by hand as well as by build.sh.
1.15 tv 459: if [ -z "$makewrapper" ]; then
1.53 pk 460: makewrapper="$TOOLDIR/bin/nbmake-$MACHINE"
1.52 thorpej 461: if [ ! -z "$BUILDID" ]; then
1.53 pk 462: makewrapper="$makewrapper-$BUILDID"
1.52 thorpej 463: fi
1.15 tv 464: fi
1.4 tv 465:
1.53 pk 466: $runcmd rm -f "$makewrapper"
1.21 jmc 467: if [ "$runcmd" = "echo" ]; then
468: echo 'cat <<EOF >'$makewrapper
469: makewrapout=
470: else
1.53 pk 471: makewrapout=">>\$makewrapper"
1.21 jmc 472: fi
1.18 tv 473:
1.21 jmc 474: eval cat <<EOF $makewrapout
1.4 tv 475: #! /bin/sh
476: # Set proper variables to allow easy "make" building of a NetBSD subtree.
1.82 ! lukem 477: # Generated from: \$NetBSD: build.sh,v 1.81 2003/01/04 14:55:44 lukem Exp $
1.4 tv 478: #
1.18 tv 479:
480: EOF
1.21 jmc 481: for f in $makeenv; do
1.79 lukem 482: eval echo "$f=\'\$$(echo $f)\'\;\ export\ $f" $makewrapout
1.21 jmc 483: done
484: eval echo "USETOOLS=yes\; export USETOOLS" $makewrapout
1.18 tv 485:
1.53 pk 486: eval cat <<'EOF' $makewrapout
1.18 tv 487:
1.53 pk 488: exec "$TOOLDIR/bin/nbmake" ${1+"$@"}
1.4 tv 489: EOF
1.21 jmc 490: [ "$runcmd" = "echo" ] && echo EOF
1.53 pk 491: $runcmd chmod +x "$makewrapper"
1.4 tv 492:
1.10 tv 493: if $do_buildsystem; then
1.72 lukem 494: # Build everything.
495: ${runcmd-exec} "$makewrapper" $parallel $buildtarget \
496: || bomb "failed to make $buildtarget"
1.70 lukem 497: else
1.72 lukem 498: # One or more of do_buildtools and do_buildkernel
1.70 lukem 499: # might be set. Do them in the appropriate order.
1.72 lukem 500: if $do_buildtools; then
1.70 lukem 501: if [ "$MKOBJDIRS" != "no" ]; then
1.72 lukem 502: $runcmd "$makewrapper" $parallel obj-tools \
503: || bomb "failed to make obj-tools"
1.70 lukem 504: fi
505: $runcmd cd tools
506: if [ "$UPDATE" = "" ]; then
1.72 lukem 507: $runcmd "$makewrapper" cleandir dependall install \
508: || bomb "failed to make tools"
1.70 lukem 509: else
1.72 lukem 510: $runcmd "$makewrapper" dependall install \
511: || bomb "failed to make tools"
1.70 lukem 512: fi
1.16 thorpej 513: fi
1.72 lukem 514: if $do_buildkernel; then
515: if ! $do_buildtools; then
516: # Building tools every time we build a kernel
517: # is clearly unnecessary. We could try to
518: # figure out whether rebuilding the tools is
519: # necessary this time, but it doesn't seem
520: # worth the trouble. Instead, we say it's the
521: # user's responsibility to rebuild the tools if
522: # necessary.
523: $runcmd echo "===> Building kernel" \
524: "without building new tools"
525: fi
526: $runcmd echo "===> Building kernel ${kernconfname}"
527: if [ "$MKOBJDIRS" != "no" ] && [ ! -z "$makeobjdir" ]; then
1.82 ! lukem 528: # The correct value of KERNOBJDIR might
! 529: # depend on a prior "make obj" in
! 530: # ${KERNSRCDIR}/${KERNARCHDIR}/compile.
! 531: KERNSRCDIR="$(safe_getmakevar KERNSRCDIR)"
! 532: KERNARCHDIR="$(safe_getmakevar KERNARCHDIR)"
! 533: $runcmd cd "${KERNSRCDIR}/${KERNARCHDIR}/compile"
1.72 lukem 534: $runcmd "$makewrapper" obj \
1.82 ! lukem 535: || bomb "failed to make obj in " \
! 536: "${KERNSRCDIR}/${KERNARCHDIR}/compile"
1.72 lukem 537: $runcmd cd "$TOP"
538: fi
1.82 ! lukem 539: KERNCONFDIR="$(safe_getmakevar KERNCONFDIR)"
! 540: KERNOBJDIR="$(safe_getmakevar KERNOBJDIR)"
1.72 lukem 541: case "${kernconfname}" in
1.70 lukem 542: */*)
1.72 lukem 543: kernconfpath="${kernconfname}"
1.82 ! lukem 544: kernconfbase="$(basename "${kernconfname}")"
1.70 lukem 545: ;;
546: *)
1.72 lukem 547: kernconfpath="${KERNCONFDIR}/${kernconfname}"
548: kernconfbase="${kernconfname}"
1.70 lukem 549: ;;
550: esac
1.72 lukem 551: kernbuilddir="${KERNOBJDIR}/${kernconfbase}"
552: $runcmd echo "===> Kernel build directory: ${kernbuilddir}"
553: $runcmd mkdir -p "${kernbuilddir}" \
554: || bomb "cannot mkdir: ${kernbuilddir}"
1.70 lukem 555: if [ "$UPDATE" = "" ]; then
1.72 lukem 556: $runcmd cd "${kernbuilddir}"
557: $runcmd "$makewrapper" cleandir \
558: || bomb "make cleandir failed in " \
559: "${kernbuilddir}"
1.70 lukem 560: $runcmd cd "$TOP"
561: fi
562: $runcmd "${TOOLDIR}/bin/nbconfig" \
1.72 lukem 563: -b "${kernbuilddir}" \
564: -s "${TOP}/sys" "${kernconfpath}" \
565: || bomb "nbconfig failed for ${kernconfname}"
566: $runcmd cd "${kernbuilddir}"
567: $runcmd "$makewrapper" depend \
568: || bomb "make depend failed in ${kernbuilddir}"
569: $runcmd "$makewrapper" $parallel all \
570: || bomb "make all failed in ${kernbuilddir}"
571: $runcmd echo "===> New kernel should be in ${kernbuilddir}"
1.31 jmc 572: fi
1.77 lukem 573: fi
574:
575: if [ -n "$installworlddir" ]; then
576: ${runcmd-exec} "$makewrapper" INSTALLWORLDDIR=${installworlddir} \
577: installworld || bomb "failed to make installworld"
1.9 jmc 578: fi
CVSweb <webmaster@jp.NetBSD.org>