6 # boot-strap ["options"]
7 # boot-strap --prefix=/opt --install
8 # boot-strap --prefix=$HOME --install-host-target -DWITH_PROG_VERSION
9 # boot-strap ["options"] op=build
10 # boot-strap ["options"] op=install
13 # This script is used to configure/build bmake it builds for
14 # each host-target in a different subdir to keep the src clean.
15 # There is no requirement for an existing make(1).
17 # On successful completion if no '--install' flag is given,
18 # it echos a command to do installation.
20 # The variable "op" defaults to 'all', and is affected by
21 # '--install' flag as above.
22 # Other values include:
25 # Just run 'configure'
28 # If 'configure' has not been done, do it, then
29 # run the build script, and finally 'test'.
32 # If 'build' has not been done, do it, 'test' then
39 # run the unit-tests. Done automatically after 'build'
40 # and before 'install'.
42 # The above are leveraged by a trivial makefile for the benefit
43 # of those that have './configure; make; make install' baked
49 # Pick up settings from "rc".
50 # We look for '.bmake-boot-strap.rc' before processing
51 # options (unless SKIP_RC is set in environment).
54 # Where to put man pages and mk files.
55 # If $prefix ends in $HOST_TARGET, and $prefix/../share
56 # exits, the default will be that rather than $prefix/share.
59 # Indicate where the mk files can be found.
60 # Default is $Mydir/mk
63 # If build and test work, run bmake install.
65 # SHAREDIR=$prefix/share
67 # --install-host-target
68 # As for '--install' but BINDIR=$prefix/$HOST_TARGET/bin
69 # This is useful when $prefix/ is shared by multiple
72 # Flags relevant when installing:
74 # -DWITHOUT_INSTALL_MK
75 # Skip installing mk files.
76 # By default they will be installed to $prefix/share/mk
79 # Install 'bmake' as 'bmake-$MAKE_VERSION'
80 # A symlink will be made as 'bmake' unless
81 # -DWITHOUT_PROG_LINK is set.
83 # Possibly useful configure_args:
86 # disable use of meta mode.
89 # disable use of filemon(9) which is currently only
90 # available for NetBSD and FreeBSD.
92 # --with-filemon=ktrace
93 # on NetBSD or others with fktrace(2), use ktrace
96 # --with-filemon="path/to/filemon.h"
97 # enables use of filemon(9) by meta mode.
99 # --with-machine="machine"
100 # set "machine" to override that determined by
103 # --with-force-machine="machine"
104 # force "machine" even if uname(3) provides a value.
106 # --with-machine_arch="machine_arch"
107 # set "machine_arch" to override that determined by
110 # --with-force_machine_arch="machine_arch"
111 # force "machine_arch" to override that determined by
114 # --with-default-sys-path="syspath"
115 # set an explicit default "syspath" which is where bmake
116 # will look for sys.mk and friends.
119 # Simon J. Gerraty <sjg@crufty.net>
122 # $Id: boot-strap,v 1.54 2020/11/13 21:47:25 sjg Exp $
124 # @(#) Copyright (c) 2001 Simon J. Gerraty
126 # This file is provided in the hope that it will
127 # be of use. There is absolutely NO WARRANTY.
128 # Permission to copy, redistribute or otherwise
129 # use this file is hereby granted provided that
130 # the above copyright notice and this notice are
133 # Please send copies of changes and bug-fixes to:
141 *) Mydir=`cd "$Mydir" && 'pwd'`;;
145 [ "$1" ] && echo "ERROR: $@" >&2
147 echo "$0 [--<configure_arg> ...][<prefix>][--install]" >&2
161 [ -f "$r" -a -s "$r" ] || continue
162 echo "NOTE: reading $r"
170 # clear some things from the environment that we care about
171 unset MAKEOBJDIR MAKEOBJDIRPREFIX
172 # or that might be incompatible
175 # --install[-host-target] will set this
177 # other things we pass to install step
181 # pick a useful default prefix (for me at least ;-)
182 for prefix in /opt/$HOST_TARGET "$HOME/$HOST_TARGET" /usr/pkg /usr/local ""
184 [ -d "${prefix:-.}" ] || continue
188 if [ -d $p/share ]; then
189 INSTALL_BIN=$HOST_TARGET/bin
194 echo "NOTE: default prefix=$prefix ${INSTALL_BIN:+INSTALL_BIN=$INSTALL_BIN}"
202 ${SKIP_RC:+:} source_rc .bmake-boot-strap.rc . "$Mydir/.." "$HOME"
205 expr "x$1" : "x[^=]*=\\(.*\\)"
209 if [ $here = $Mydir ]; then
221 --help) sed -n -e "1d;/RCSid/,\$d" -e '/^#\.[a-z]/d' -e '/^#/s,^# *,,p' $0; exit 0;;
222 --prefix) prefix="$2"; shift;;
223 --prefix=*) prefix=`get_optarg "$1"`;;
224 --src=*) srcdir=`get_optarg "$1"`;;
225 --with-mksrc=*|--mksrc=*) mksrc=`get_optarg "$1"`;;
226 --share=*) share_dir=`get_optarg "$1"`;;
227 --share) share_dir="$2"; shift;;
228 --with-default-sys-path=*)
229 CONFIGURE_ARGS="$1";;
230 --with-default-sys-path)
231 CONFIGURE_ARGS="$1 $2";;
232 --install) INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix};;
233 --install-host-target)
234 INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix}
235 INSTALL_BIN=$HOST_TARGET/bin;;
236 --install-destdir=*) INSTALL_DESTDIR=`get_optarg "$1"`;;
237 --install-prefix=*) INSTALL_PREFIX=`get_optarg "$1"`;;
238 -DWITH*) INSTALL_ARGS="$INSTALL_ARGS $1";;
239 -s|--src) srcdir="$2"; shift;;
240 -m|--mksrc) mksrc="$2"; shift;;
241 -o|--objdir) objdir="$2"; shift;;
243 -c) source_rc "$2"; shift;;
244 --*) CONFIGURE_ARGS="$CONFIGURE_ARGS $1";;
245 *=*) eval "$1"; export `expr "x$1" : "x\\(.[^=]*\\)=.*"`;;
252 case " $CONFIGURE_ARGS " in
254 *) CONFIGURE_ARGS="$CONFIGURE_ARGS $1$2";;
265 [ -d "$dir" ] || continue
272 *) [ -s $dir/$fmatch ] || continue;;
275 *./*) cd "$dir" && 'pwd';;
277 *) cd "$dir" && 'pwd';;
289 -C) cd "$2"; shift; shift;;
295 /*) # we shouldn't be here
296 [ $_t "$1" ] && echo "$1"
299 .../*) want=`echo "$1" | sed 's,^.../*,,'`;;
305 if [ $_t "./$want" ]; then
318 # is $1 missing from $2 (or PATH) ?
320 eval "__p=\$${2:-PATH}"
321 case ":$__p:" in *:"$1":*) return 1;; *) return 0;; esac
324 # if $1 exists and is not in path, append it
331 MAKESYSPATH,.../*) ;;
332 *) [ $t ${1:-.} ] || return;;
334 no_path $* && eval ${2:-PATH}="$__p${__p:+:}$1"
338 srcdir=`GetDir /bmake make-bootstrap.sh.in "$srcdir" "$2" "$Mydir" ./bmake* "$Mydir"/../bmake*`
339 [ -d "${srcdir:-/dev/null}" ] || Usage
341 none|-) # we ignore this now
344 .../*) # find here or above
345 mksrc=`FindHereOrAbove -C "$Mydir" -s "$mksrc/sys.mk"`
347 mksrc=`dirname $mksrc`
349 *) # guess we want mksrc...
350 mksrc=`GetDir /mk sys.mk "$mksrc" "$3" ./mk* "$srcdir"/mk* "$srcdir"/../mk*`
351 [ -d "${mksrc:-/dev/null}" ] || Usage "Use '-m none' to build without mksrc"
356 objdir="${objdir:-$OBJROOT$HOST_TARGET}"
357 [ -d "$objdir" ] || mkdir -p "$objdir"
358 [ -d "$objdir" ] || mkdir "$objdir"
359 cd "$objdir" || exit 1
365 /) [ -d /share ] || return;;
367 if [ -d "$1/../share" ]; then
368 echo `dirname "$1"`/share
376 # make it easy to force prefix to use $HOST_TARGET
377 : looking at "$prefix"
379 */host?target) prefix=`echo "$prefix" | sed "s,host.target,${HOST_TARGET},"`;;
382 share_dir="${share_dir:-`ShareDir $prefix`}"
384 AddConfigure --prefix= "$prefix"
385 case "$CONFIGURE_ARGS" in
386 *--with-*-sys-path*) ;; # skip
387 *) [ "$share_dir" ] && AddConfigure --with-default-sys-path= "$share_dir/mk";;
389 if [ "$mksrc" ]; then
390 AddConfigure --with-mksrc= "$mksrc"
391 # not all cc's support this
392 CFLAGS_MF= CFLAGS_MD=
393 export CFLAGS_MF CFLAGS_MD
396 # this makes it easy to run the bmake we just built
397 # the :tA dance is needed because 'pwd' and even /bin/pwd
398 # may not give the same result as realpath().
402 MAKESYSPATH=$mksrc SRCTOP=$Mydir OBJTOP=$objdir \
403 MAKEOBJDIR='${.CURDIR:S,${SRCTOP:tA},${OBJTOP:tA},}' \
404 ${BMAKE:-$objdir/bmake} -f $Mydir/Makefile "$@"
408 # there is actually a shell where type is not a builtin
409 # if type is missing, which(1) had better exists!
410 if (type cat) > /dev/null 2>&1; then
412 type "$@" | sed 's,[()],,g;s,^[^/][^/]*,,;q'
415 # make sure test below uses the same diff that configure did
416 TOOL_DIFF=`which diff`
420 $srcdir/configure $CONFIGURE_ARGS || exit 1
424 [ -s make-bootstrap.sh ] || op_configure
425 chmod 755 make-bootstrap.sh || exit 1
426 ./make-bootstrap.sh || exit 1
433 [ -x bmake ] || op_build
438 if [ -x bmake ]; then
440 BMAKE=$objdir/bmake$$ Bmake clean
442 elif [ $objdir != $srcdir ]; then
449 case "$INSTALL_PREFIX,$INSTALL_BIN,$prefix" in
450 ,$HOST_TARGET/bin,*/$HOST_TARGET)
451 INSTALL_PREFIX=`dirname $prefix`
454 INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix}
455 Bmake install prefix=$INSTALL_PREFIX BINDIR=$INSTALL_PREFIX/${INSTALL_BIN:-bin} ${INSTALL_DESTDIR:+DESTDIR=$INSTALL_DESTDIR} $INSTALL_ARGS || exit 1
459 rm -f make-bootstrap.sh bmake *.o
460 if [ -n "$INSTALL_PREFIX" ]; then
464 MAKE_VERSION=`sed -n '/^_MAKE_VERSION/ { s,.*= *,,;p; }' $srcdir/Makefile`
466 You can install by running:
468 $0 $cmd_args op=install
470 Use --install-prefix=/something to install somewhere other than $prefix
471 Use --install-destdir=/somewhere to set DESTDIR during install
472 Use --install-host-target to use INSTALL_BIN=$HOST_TARGET/bin
473 Use -DWITH_PROG_VERSION to install as bmake-$MAKE_VERSION
474 Use -DWITHOUT_PROG_LINK to suppress bmake -> bmake-$MAKE_VERSION symlink
475 Use -DWITHOUT_INSTALL_MK to skip installing files to $prefix/share/mk
480 Note: bmake.cat1 contains ANSI escape sequences.
481 You may need the -r or -R option to more/less to view it correctly.