diff options
author | sjg <sjg@FreeBSD.org> | 2013-02-01 22:55:27 +0000 |
---|---|---|
committer | sjg <sjg@FreeBSD.org> | 2013-02-01 22:55:27 +0000 |
commit | f817112dff6d3bf2855772b5112bf05748266394 (patch) | |
tree | 203f81f05d53b13df9fb85ffa3d26ac6a5f93a55 /contrib/bmake/boot-strap | |
parent | 6a1efe1ad9984c8085ef28facb9d7f1cc2f01b6a (diff) | |
parent | 69db492ce55c9787def3ba14dca33e52909dd5ca (diff) | |
download | FreeBSD-src-f817112dff6d3bf2855772b5112bf05748266394.zip FreeBSD-src-f817112dff6d3bf2855772b5112bf05748266394.tar.gz |
Merge bmake-20130123
Approved by: marcel (mentor)
Diffstat (limited to 'contrib/bmake/boot-strap')
-rwxr-xr-x | contrib/bmake/boot-strap | 267 |
1 files changed, 170 insertions, 97 deletions
diff --git a/contrib/bmake/boot-strap b/contrib/bmake/boot-strap index 660b766..7eff5f6 100755 --- a/contrib/bmake/boot-strap +++ b/contrib/bmake/boot-strap @@ -3,23 +3,52 @@ # boot-strap # # SYNOPSIS: -# boot-strap [--"configure_arg" ... ][-s "srcdir"][-m "mksrc"]\\ -# ["prefix" ["bmakesrc" ["mksrc"]]] +# boot-strap ["options"] +# boot-strap --prefix=/opt --install +# boot-strap --prefix=$HOME --install-host-target -DWITH_PROG_VERSION +# boot-strap ["options"] op=build +# boot-strap ["options"] op=install # # DESCRIPTION: # This script is used to configure/build bmake it builds for -# each OS in a subdir to keep the src clean. -# On successful completion it echos commands to put the new -# bmake binary into the /configs tree (if it exists) -# (http://www.crufty.net/FreeWare/configs.html), $prefix/bin -# and a suitable ~/*bin directory. +# each host-target in a different subdir to keep the src clean. +# There is no requirement for an existing make(1). # +# On successful completion if no '--install' flag is given, +# it echos a command to do installation. +# +# The variable "op" defaults to 'all', and is affected by +# '--install' flag as above. +# Other values include: +# +# configure +# Just run 'configure' +# +# build +# If 'configure' has not been done, do it, then +# run the build script, and finally 'test'. +# +# install +# If 'build' has not been done, do it, 'test' then +# install. +# +# clean +# attempt to clean up +# +# test +# run the unit-tests. Done automatically after 'build' +# and before 'install'. +# +# The above are leveraged by a trivial makefile for the benefit +# of those that have './configure; make; make install' baked +# into them. +# # Options: # # -c "rc" # Pick up settings from "rc". # We look for '.bmake-boot-strap.rc' before processing -# options. +# options (unless SKIP_RC is set in environment). # # --share "share_dir" # Where to put man pages and mk files. @@ -28,9 +57,28 @@ # # --mksrc "mksrc" # Indicate where the mk files can be found. -# Default is ./mk or ../mk, set to 'none' to force -# building without "mksrc" but in that case a sys.mk -# needs to exist in the default syspath ($share_dir/mk) +# Default is $Mydir/mk +# +# --install +# If build and test work, run bmake install. +# BINDIR=$prefix/bin +# SHAREDIR=$prefix/share +# +# --install-host-target +# As for '--install' but BINDIR=$prefix/$HOST_TARGET/bin +# This is useful when $prefix/ is shared by multiple +# machines. +# +# Flags relevant when installing: +# +# -DWITHOUT_INSTALL_MK +# Skip installing mk files. +# By default they will be installed to $prefix/share/mk +# +# -DWITH_PROG_VERSION +# Install 'bmake' as 'bmake-$MAKE_VERSION' +# A symlink will be made as 'bmake' unless +# -DWITHOUT_PROG_LINK is set. # # Possibly useful configure_args: # @@ -63,7 +111,7 @@ # Simon J. Gerraty <sjg@crufty.net> # RCSid: -# $Id: boot-strap,v 1.39 2012/03/26 17:08:22 sjg Exp $ +# $Id: boot-strap,v 1.42 2013/01/25 20:20:33 sjg Exp $ # # @(#) Copyright (c) 2001 Simon J. Gerraty # @@ -85,11 +133,10 @@ case "$Mydir" in *) Mydir=`cd "$Mydir" && 'pwd'`;; esac - Usage() { [ "$1" ] && echo "ERROR: $@" >&2 echo "Usage:" >&2 - echo "$0 [--<configure_arg> ...][-s <srcdir>][-m <mksrc>][<prefix> [[<srcdir>] [<mksrc>]]]" >&2 + echo "$0 [--<configure_arg> ...][<prefix>][--install]" >&2 exit 1 } @@ -110,28 +157,55 @@ source_rc() { done } +cmd_args="$@" + +# --install[-host-target] will set this +INSTALL_PREFIX= +# other things we pass to install step +INSTALL_ARGS= CONFIGURE_ARGS= MAKESYSPATH= # pick a useful default prefix (for me at least ;-) for prefix in /opt/$HOST_TARGET "$HOME/$HOST_TARGET" /usr/pkg /usr/local "" do - [ -d "${prefix:-.}" ] && break + [ -d "${prefix:-.}" ] || continue + case "$prefix" in + */$HOST_TARGET) + p=`dirname $prefix` + if [ -d $p/share ]; then + INSTALL_BIN=$HOST_TARGET/bin + prefix=$p + fi + ;; + esac + echo "NOTE: default prefix=$prefix ${INSTALL_BIN:+INSTALL_BIN=$INSTALL_BIN}" + break done -srcdir= -mksrc= +srcdir=$Mydir +mksrc=$Mydir/mk objdir= quiet=: -source_rc .bmake-boot-strap.rc . "$Mydir/.." "$HOME" +${SKIP_RC:+:} source_rc .bmake-boot-strap.rc . "$Mydir/.." "$HOME" get_optarg() { expr "x$1" : "x[^=]*=\\(.*\\)" } +here=`'pwd'` +if [ $here = $Mydir ]; then + # avoid polution + OBJROOT=../ +fi + +op=all +BMAKE= + while : do case "$1" in --) shift; break;; + --help) sed -n -e "1d;/RCSid/,\$d" -e '/^#\.[a-z]/d' -e '/^#/s,^# *,,p' $0; exit 0;; --prefix) prefix="$2"; shift;; --prefix=*) prefix=`get_optarg "$1"`;; --src=*) srcdir=`get_optarg "$1"`;; @@ -144,6 +218,13 @@ do --with-default-sys-path) CONFIGURE_ARGS="$1 $2" MAKESYSPATH="$2"; shift;; + --install) INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix};; + --install-host-target) + INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix} + INSTALL_BIN=$HOST_TARGET/bin;; + --install-destdir=*) INSTALL_DESTDIR=`get_optarg "$1"`;; + --install-prefix=*) INSTALL_PREFIX=`get_optarg "$1"`;; + -DWITH*) INSTALL_ARGS="$INSTALL_ARGS $1";; -s|--src) srcdir="$2"; shift;; -m|--mksrc) mksrc="$2"; shift;; -o|--objdir) objdir="$2"; shift;; @@ -261,7 +342,7 @@ none|-) # we don't want it esac # Ok, get to work... -objdir="${objdir:-$OS}" +objdir="${objdir:-$OBJROOT$HOST_TARGET}" [ -d "$objdir" ] || mkdir -p "$objdir" [ -d "$objdir" ] || mkdir "$objdir" cd "$objdir" || exit 1 @@ -301,88 +382,80 @@ if [ "$mksrc" ]; then export CFLAGS_MF CFLAGS_MD fi -$srcdir/configure $CONFIGURE_ARGS || exit 1 -chmod 755 make-bootstrap.sh || exit 1 -./make-bootstrap.sh || exit 1 -if [ -z "$MAKESYSPATH" ]; then - add_path "${share_dir:-...}/mk" MAKESYSPATH - case "$HOST_TARGET" in - netbsd*) add_path /usr/share/mk MAKESYSPATH;; - esac -fi -if [ -s "${mksrc:-/dev/null}/install-mk" ]; then - sh "${mksrc}/install-mk" "$objdir/mk" - case "$MAKESYSPATH" in - .../mk*) ;; - *) MAKESYSPATH=".../mk:${MAKESYSPATH}";; - esac -fi +# this makes it easy to run the bmake we just built +# the :tA dance is needed because 'pwd' and even /bin/pwd +# may not give the same result as realpath(). +Bmake() { + ( + cd $Mydir && + MAKESYSPATH=$mksrc SRCTOP=$Mydir OBJTOP=$objdir \ + MAKEOBJDIR='${.CURDIR:S,${SRCTOP:tA},${OBJTOP:tA},}' \ + ${BMAKE:-$objdir/bmake} -f $Mydir/Makefile "$@" + ) +} + # make sure test below uses the same diff that configure did TOOL_DIFF=`type diff | sed 's,[()],,g;s,^[^/][^/]*,,;q'` -export MAKESYSPATH TOOL_DIFF -if [ "$mksrc" ]; then - $objdir/bmake test || exit 1 -else - # assume nothing - $objdir/bmake -r -m / test || exit 1 -fi -# If -q given, we don't want all the install instructions -$quiet exit 0 - -make_version=`./bmake -r -m / -f ./Makefile -V MAKE_VERSION | ( read one two; echo $one )` -bmake_version=bmake-$make_version - -if [ -s /usr/share/tmac/andoc.tmac ]; then - # this should be ok - man_subdir=man1 - man_src=$srcdir/bmake.1 -else - # guess not - man_subdir=cat1 - man_src=$srcdir/bmake.cat1 -fi +export TOOL_DIFF -install_prefix() { - ( - bin_dir= - share_dir= - man_dir= - mk_dir= - while : - do - case "$1" in - *=*) eval "$1"; shift;; - *) break;; - esac - done - bin_dir=${bin_dir:-$1/bin} - share_dir=${share_dir:-`ShareDir "$1"`} - man_dir=${man_dir:-$share_dir/man} - mk_dir=${mk_dir:-$share_dir/mk} - echo - echo Commands to install into $1/ - echo - echo mkdir -p $bin_dir - echo cp $objdir/bmake $bin_dir/$bmake_version - echo rm -f $bin_dir/bmake - echo ln -s $bmake_version $bin_dir/bmake - echo mkdir -p $man_dir/$man_subdir - echo cp $man_src $man_dir/$man_subdir/bmake.1 - if [ "$mksrc" ]; then - ev=`env | grep '_MK='` - echo $ev sh $mksrc/install-mk $mk_dir +op_configure() { + $srcdir/configure $CONFIGURE_ARGS || exit 1 +} + +op_build() { + [ -s make-bootstrap.sh ] || op_configure + chmod 755 make-bootstrap.sh || exit 1 + ./make-bootstrap.sh || exit 1 + case "$op" in + build) op_test;; + esac +} + +op_test() { + [ -x bmake ] || op_build + Bmake test || exit 1 +} + +op_clean() { + if [ -x bmake ]; then + ln bmake bmake$$ + BMAKE=$objdir/bmake$$ Bmake clean + rm -f bmake$$ + elif [ $objdir != $srcdir ]; then + rm -rf * fi - ) } -case "$prefix/" in -"$HOME"/*) ;; -*) CONFIGS=${CONFIGS:-/configs} - [ -d $CONFIGS ] && - install_prefix mksrc= "$CONFIGS/$OS/$OSMAJOR.X/$MACHINE_ARCH$prefix" - # I like to keep a copy here... - install_prefix share_dir="$HOME/share" "$HOME/$HOST_TARGET" - ;; -esac +op_install() { + op_test + case "$INSTALL_PREFIX,$INSTALL_BIN,$prefix" in + ,$HOST_TARGET/bin,*/$HOST_TARGET) + INSTALL_PREFIX=`dirname $prefix` + ;; + esac + INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix} + Bmake install prefix=$INSTALL_PREFIX BINDIR=$INSTALL_PREFIX/${INSTALL_BIN:-bin} ${INSTALL_DESTDIR:+DESTDIR=$INSTALL_DESTDIR} $INSTALL_ARGS || exit 1 +} + +op_all() { + rm -f make-bootstrap.sh bmake *.o + if [ -n "$INSTALL_PREFIX" ]; then + op_install + else + op_test + MAKE_VERSION=`sed -n '/^MAKE_VERSION/ { s,.*= *,,;p; }' $srcdir/Makefile` + echo You can install by running: + echo + echo $0 $cmd_args op=install + echo + echo "Use --install-prefix=/something to install somewhere other than $prefix" + echo "Use --install-destdir=/somewhere to set DESTDIR during install" + echo "Use --install-host-target to use INSTALL_BIN=$HOST_TARGET/bin" + echo "Use -DWITH_PROG_VERSION to install as bmake-$MAKE_VERSION" + echo "Use -DWITHOUT_PROG_LINK to supress bmake -> bmake-$MAKE_VERSION symlink" + echo "Use -DWITHOUT_INSTALL_MK to skip installing files to $prefix/share/mk" + fi +} -install_prefix "$prefix" +op_$op +exit 0 |