Annotation of src/build.sh, Revision 1.22
1.1 tv 1: #! /bin/sh
1.22 ! msaitoh 2: # $NetBSD: build.sh,v 1.21 2001/11/11 01:34:30 jmc 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
7: # with a strange /bin/sh, "ksh" may be an ample alternative.
8: #
9:
10: bomb () {
11: echo ""
12: echo "ERROR: $@"
13: echo "*** BUILD ABORTED ***"
14: exit 1
15: }
1.15 tv 16: [ -d usr.bin/make ] || bomb "build.sh must be run from the top source level"
1.1 tv 17:
18: getarch () {
19: # Translate a MACHINE into a default MACHINE_ARCH.
20: case $MACHINE in
1.13 reinoud 21: arm26|dnard|evbarm|hpcarm|netwinder)
1.1 tv 22: MACHINE_ARCH=arm;;
23:
1.13 reinoud 24: acorn32|arm32|cats)
1.5 bjh21 25: MACHINE_ARCH=arm32;;
26:
1.1 tv 27: sun2)
28: MACHINE_ARCH=m68000;;
29:
30: amiga|atari|cesfic|hp300|sun3|*68k)
31: MACHINE_ARCH=m68k;;
32:
33: mipsco|newsmips|sgimips)
34: MACHINE_ARCH=mipseb;;
35:
36: algor|arc|cobalt|hpcmips|playstation2|pmax)
37: MACHINE_ARCH=mipsel;;
38:
39: pc532)
40: MACHINE_ARCH=ns32k;;
41:
42: bebox|prep|sandpoint|walnut|*ppc)
43: MACHINE_ARCH=powerpc;;
44:
1.22 ! msaitoh 45: evbsh3|mmeye)
1.1 tv 46: MACHINE_ARCH=sh3eb;;
47:
1.22 ! msaitoh 48: dreamcast|hpcsh)
1.1 tv 49: MACHINE_ARCH=sh3el;;
50:
1.5 bjh21 51: alpha|i386|sparc|sparc64|vax|x86_64)
1.4 tv 52: MACHINE_ARCH=$MACHINE;;
53:
54: *) bomb "unknown target MACHINE: $MACHINE";;
1.1 tv 55: esac
56: }
57:
1.15 tv 58: getmakevar () {
1.18 tv 59: cat <<EOF | $make -s -f- _x_
1.15 tv 60: _x_:
61: echo \${$1}
62: .include <bsd.prog.mk>
63: EOF
64: }
65:
1.4 tv 66: # Emulate "mkdir -p" for systems that have an Old "mkdir".
67: mkdirp () {
68: IFS=/; set -- $@; unset IFS
69: _d=
1.15 tv 70: if [ -z "$1" ]; then _d=/; shift; fi
1.4 tv 71:
72: for _f in "$@"; do
1.15 tv 73: if [ -n "$_f" ]; then
1.10 tv 74: [ -d "$_d$_f" ] || $runcmd mkdir "$_d$_f" || return 1
1.4 tv 75: _d="$_d$_f/"
76: fi
77: done
78: }
79:
1.10 tv 80: resolvepath () {
81: case $OPTARG in
82: /*) ;;
83: *) OPTARG="$cwd/$OPTARG";;
84: esac
85: }
86:
1.1 tv 87: usage () {
88: echo "Usage:"
1.15 tv 89: echo "$0 [-boru] [-a arch] [-j njob] -m mach [-w wrapper]"
1.12 tv 90: echo " [-D dest] [-O obj] [-R release] [-T tools]"
1.4 tv 91: echo ""
1.15 tv 92: echo " -a: set MACHINE_ARCH to arch (otherwise deduced from MACHINE)"
93: echo " -b: build nbmake and nbmake wrapper script, if needed"
1.3 tv 94: echo " -j: set NBUILDJOBS to njob"
1.15 tv 95: echo " -m: set MACHINE to mach (not required if NetBSD native)"
1.12 tv 96: echo " -n: show commands that would be executed, but do not execute them"
1.15 tv 97: echo " -o: set MKOBJDIRS=no (do not create objdirs at start of build)"
98: echo " -r: remove contents of TOOLDIR and DESTDIR before building"
1.16 thorpej 99: echo " -t: build and install tools only (implies -b)"
1.18 tv 100: echo " -u: set UPDATE"
1.15 tv 101: echo " -w: create nbmake script at wrapper (default TOOLDIR/bin/nbmake-MACHINE)"
1.18 tv 102: echo " -D: set DESTDIR to dest"
1.12 tv 103: echo " -O: set obj root directory to obj (sets a MAKEOBJDIR pattern)"
1.15 tv 104: echo " -R: build a release (and set RELEASEDIR to release)"
1.18 tv 105: echo " -T: set TOOLDIR to tools"
1.15 tv 106: echo ""
107: echo "Note: if -T is unset and TOOLDIR is not set in the environment,"
108: echo " nbmake will be [re]built unconditionally."
1.1 tv 109: exit 1
110: }
111:
1.10 tv 112: # Set defaults.
1.18 tv 113: MAKEFLAGS=
1.12 tv 114: buildtarget=build
1.10 tv 115: cwd=`pwd`
116: do_buildsystem=true
1.16 thorpej 117: do_buildonlytools=false
1.10 tv 118: do_rebuildmake=false
119: do_removedirs=false
1.18 tv 120: makeenv=
121: makewrapper=
1.10 tv 122: opt_a=no
1.16 thorpej 123: opts='a:bhj:m:nortuw:D:O:R:T:'
1.18 tv 124: runcmd=
1.4 tv 125:
126: if type getopts >/dev/null 2>&1; then
127: # Use POSIX getopts.
128: getoptcmd='getopts $opts opt && opt=-$opt'
129: optargcmd=':'
130: else
131: type getopt >/dev/null 2>&1 || bomb "/bin/sh shell is too old; try ksh"
1.2 tv 132:
1.4 tv 133: # Use old-style getopt(1) (doesn't handle whitespace in args).
134: args="`getopt $opts $*`"
135: [ $? = 0 ] || usage
136: set -- $args
1.1 tv 137:
1.4 tv 138: getoptcmd='[ $# -gt 0 ] && opt="$1" && shift'
139: optargcmd='OPTARG="$1"; shift'
140: fi
1.10 tv 141:
142: # Parse command line options.
1.4 tv 143: while eval $getoptcmd; do case $opt in
144: -a) eval $optargcmd
145: MACHINE_ARCH=$OPTARG; opt_a=yes;;
1.1 tv 146:
1.10 tv 147: -b) do_buildsystem=false;;
1.9 jmc 148:
1.4 tv 149: -j) eval $optargcmd
1.18 tv 150: MAKEFLAGS="$MAKEFLAGS NBUILDJOBS=$OPTARG"; export MAKEFLAGS;;
1.1 tv 151:
1.4 tv 152: # -m overrides MACHINE_ARCH unless "-a" is specified
153: -m) eval $optargcmd
154: MACHINE=$OPTARG; [ "$opt_a" != "yes" ] && getarch;;
1.3 tv 155:
1.10 tv 156: -n) runcmd=echo;;
157:
1.12 tv 158: -o) MKOBJDIRS=no;;
159:
1.10 tv 160: -r) do_removedirs=true; do_rebuildmake=true;;
1.1 tv 161:
1.16 thorpej 162: -t) do_buildonlytools=true; do_buildsystem=false;;
163:
1.18 tv 164: -u) UPDATE=yes; export UPDATE
165: makeenv="$makeenv UPDATE";;
1.15 tv 166:
167: -w) eval $optargcmd; resolvepath
168: makewrapper="$OPTARG";;
1.12 tv 169:
1.10 tv 170: -D) eval $optargcmd; resolvepath
1.19 dillo 171: DESTDIR="$OPTARG"; export DESTDIR
1.18 tv 172: makeenv="$makeenv DESTDIR";;
1.4 tv 173:
1.12 tv 174: -O) eval $optargcmd; resolvepath
1.15 tv 175: MAKEOBJDIR="\${.CURDIR:C,^$cwd,$OPTARG,}"; export MAKEOBJDIR
1.18 tv 176: makeenv="$makeenv MAKEOBJDIR";;
1.12 tv 177:
1.10 tv 178: -R) eval $optargcmd; resolvepath
1.18 tv 179: RELEASEDIR=$OPTARG; export RELEASEDIR
180: makeenv="$makeenv RELEASEDIR"
1.15 tv 181: buildtarget=release;;
1.4 tv 182:
1.10 tv 183: -T) eval $optargcmd; resolvepath
1.18 tv 184: TOOLDIR="$OPTARG"; export TOOLDIR;;
1.4 tv 185:
186: --) break;;
187: -'?'|-h) usage;;
1.1 tv 188: esac; done
189:
1.15 tv 190: # Set up MACHINE*. On a NetBSD host, these are allowed to be unset.
191: if [ -z "$MACHINE" ]; then
192: if [ "`uname -s 2>/dev/null`" != "NetBSD" ]; then
193: echo "MACHINE must be set, or -m must be used, for cross builds."
1.4 tv 194: echo ""; usage
195: fi
1.15 tv 196: MACHINE=`uname -m`
197: fi
1.10 tv 198: [ -n "$MACHINE_ARCH" ] || getarch
1.3 tv 199:
1.15 tv 200: # Set up default make(1) environment.
1.18 tv 201: makeenv="$makeenv TOOLDIR MACHINE MACHINE_ARCH MAKEFLAGS"
202: MAKEFLAGS="-m $cwd/share/mk $MAKEFLAGS MKOBJDIRS=${MKOBJDIRS-yes}"
203: export MAKEFLAGS MACHINE MACHINE_ARCH
1.15 tv 204:
205: # Test make source file timestamps against installed nbmake binary,
206: # if TOOLDIR is pre-set.
207: make=${TOOLDIR-nonexistent}/bin/nbmake
208: if [ -x $make ]; then
1.1 tv 209: for f in usr.bin/make/*.[ch] usr.bin/make/lst.lib/*.[ch]; do
1.15 tv 210: if [ $f -nt $make ]; then
1.10 tv 211: do_rebuildmake=true; break
1.1 tv 212: fi
213: done
214: else
1.10 tv 215: do_rebuildmake=true
1.1 tv 216: fi
217:
1.15 tv 218: # Build bootstrap nbmake if needed.
1.10 tv 219: if $do_rebuildmake; then
1.18 tv 220: $runcmd echo "===> Bootstrapping nbmake"
1.4 tv 221: tmpdir=${TMPDIR-/tmp}/nbbuild$$
222:
1.10 tv 223: $runcmd mkdir $tmpdir || bomb "cannot mkdir: $tmpdir"
1.4 tv 224: trap "rm -r -f $tmpdir" 0
225: trap "exit 1" 1 2 3 15
1.10 tv 226: $runcmd cd $tmpdir
1.1 tv 227:
1.12 tv 228: $runcmd ${HOST_CC-cc} ${HOST_CFLAGS} -DMAKE_BOOTSTRAP \
1.15 tv 229: -o nbmake -I$cwd/usr.bin/make \
1.12 tv 230: $cwd/usr.bin/make/*.c $cwd/usr.bin/make/lst.lib/*.c \
1.4 tv 231: || bomb "build of nbmake failed"
1.1 tv 232:
1.15 tv 233: make=$tmpdir/nbmake
1.10 tv 234: $runcmd cd $cwd
1.15 tv 235: $runcmd rm -f usr.bin/make/*.o usr.bin/make/lst.lib/*.o
236: fi
237:
238: # If TOOLDIR isn't already set, make objdirs in "tools" in case the
239: # default setting from <bsd.own.mk> is used.
240: if [ -z "$TOOLDIR" ] && [ "$MKOBJDIRS" != "no" ]; then
1.18 tv 241: $runcmd cd tools
242: $runcmd $make obj NOSUBDIR= || exit 1
243: $runcmd cd ..
1.15 tv 244: fi
245:
246: # Find DESTDIR and TOOLDIR.
247: if [ "$runcmd" = "echo" ]; then
1.20 thorpej 248: DESTDIR="$DESTDIR"
249: TOOLDIR="$TOOLDIR"
1.15 tv 250: else
251: DESTDIR=`getmakevar DESTDIR`; echo "===> DESTDIR path: $DESTDIR"
252: TOOLDIR=`getmakevar TOOLDIR`; echo "===> TOOLDIR path: $TOOLDIR"
1.18 tv 253: export DESTDIR TOOLDIR
1.15 tv 254: fi
255:
256: # Check validity of TOOLDIR and DESTDIR.
257: if [ -z "$TOOLDIR" ] || [ "$TOOLDIR" = "/" ]; then
258: bomb "TOOLDIR '$TOOLDIR' invalid"
259: fi
260: removedirs="$TOOLDIR"
261:
262: if [ -z "$DESTDIR" ] || [ "$DESTDIR" = "/" ]; then
1.16 thorpej 263: if $do_buildsystem && \
264: ([ "$buildtarget" = "release" ] || \
265: [ "`uname -s 2>/dev/null`" != "NetBSD" ] || \
266: [ "`uname -m`" != "$MACHINE" ]); then
1.15 tv 267: bomb "DESTDIR must be set to a non-root path for cross builds or -R."
1.16 thorpej 268: elif $do_buildsystem; then
269: echo "===> WARNING: Building to /."
270: echo "===> If your kernel is not up to date, this may cause the system to break!"
1.15 tv 271: fi
272: else
273: removedirs="$removedirs $DESTDIR"
274: fi
275:
276: # Remove the target directories.
277: if $do_removedirs; then
278: for f in $removedirs; do
279: echo "===> Removing $f"
280: $runcmd rm -r -f $f
281: done
282: fi
283:
284: # Recreate $TOOLDIR.
285: mkdirp $TOOLDIR/bin || bomb "mkdir of $TOOLDIR/bin failed"
286:
287: # Install nbmake if it was built.
288: if $do_rebuildmake; then
289: $runcmd rm -f $TOOLDIR/bin/nbmake
290: $runcmd cp $make $TOOLDIR/bin/nbmake
1.10 tv 291: $runcmd rm -r -f $tmpdir
1.4 tv 292: trap 0 1 2 3 15
1.1 tv 293: fi
294:
1.4 tv 295: # Build a nbmake wrapper script, usable by hand as well as by build.sh.
1.15 tv 296: if [ -z "$makewrapper" ]; then
297: makewrapper=$TOOLDIR/bin/nbmake-$MACHINE
298: fi
1.4 tv 299:
1.21 jmc 300: $runcmd rm -f $makewrapper
301: if [ "$runcmd" = "echo" ]; then
302: echo 'cat <<EOF >'$makewrapper
303: makewrapout=
304: else
305: makewrapout=">>$makewrapper"
306: fi
1.18 tv 307:
1.21 jmc 308: eval cat <<EOF $makewrapout
1.4 tv 309: #! /bin/sh
310: # Set proper variables to allow easy "make" building of a NetBSD subtree.
1.22 ! msaitoh 311: # Generated from: \$NetBSD: build.sh,v 1.21 2001/11/11 01:34:30 jmc Exp $
1.4 tv 312: #
1.18 tv 313:
314: EOF
1.21 jmc 315: for f in $makeenv; do
316: eval echo "$f=\'\$`echo $f`\'\;\ export\ $f" $makewrapout
317: done
318: eval echo "USETOOLS=yes\; export USETOOLS" $makewrapout
1.18 tv 319:
1.21 jmc 320: eval cat <<EOF $makewrapout
1.18 tv 321:
322: exec \$TOOLDIR/bin/nbmake \${1+"\$@"}
1.4 tv 323: EOF
1.21 jmc 324: [ "$runcmd" = "echo" ] && echo EOF
325: $runcmd chmod +x $makewrapper
1.4 tv 326:
1.10 tv 327: if $do_buildsystem; then
1.15 tv 328: ${runcmd-exec} $makewrapper $buildtarget
1.16 thorpej 329: elif $do_buildonlytools; then
330: if [ "$MKOBJDIRS" != "no" ]; then
1.20 thorpej 331: $runcmd $makewrapper obj-tools || exit 1
1.16 thorpej 332: fi
1.18 tv 333: $runcmd cd tools
334: ${runcmd-exec} $makewrapper MKTOOLS=always build
1.9 jmc 335: fi
CVSweb <webmaster@jp.NetBSD.org>