boot-strap revision 321964
10Sduke: 212485Shseigel# NAME: 30Sduke# boot-strap 40Sduke# 50Sduke# SYNOPSIS: 60Sduke# boot-strap ["options"] 70Sduke# boot-strap --prefix=/opt --install 80Sduke# boot-strap --prefix=$HOME --install-host-target -DWITH_PROG_VERSION 90Sduke# boot-strap ["options"] op=build 100Sduke# boot-strap ["options"] op=install 110Sduke# 120Sduke# DESCRIPTION: 130Sduke# This script is used to configure/build bmake it builds for 140Sduke# each host-target in a different subdir to keep the src clean. 150Sduke# There is no requirement for an existing make(1). 160Sduke# 170Sduke# On successful completion if no '--install' flag is given, 180Sduke# it echos a command to do installation. 191472Strims# 201472Strims# The variable "op" defaults to 'all', and is affected by 211472Strims# '--install' flag as above. 220Sduke# Other values include: 230Sduke# 240Sduke# configure 251879Sstefank# Just run 'configure' 261879Sstefank# 271879Sstefank# build 281879Sstefank# If 'configure' has not been done, do it, then 291879Sstefank# run the build script, and finally 'test'. 302062Scoleenp# 311879Sstefank# install 321879Sstefank# If 'build' has not been done, do it, 'test' then 330Sduke# install. 340Sduke# 353557Skamg# clean 363557Skamg# attempt to clean up 373557Skamg# 380Sduke# test 390Sduke# run the unit-tests. Done automatically after 'build' 400Sduke# and before 'install'. 410Sduke# 420Sduke# The above are leveraged by a trivial makefile for the benefit 430Sduke# of those that have './configure; make; make install' baked 440Sduke# into them. 450Sduke# 460Sduke# Options: 470Sduke# 480Sduke# -c "rc" 490Sduke# Pick up settings from "rc". 500Sduke# We look for '.bmake-boot-strap.rc' before processing 510Sduke# options (unless SKIP_RC is set in environment). 520Sduke# 530Sduke# --share "share_dir" 540Sduke# Where to put man pages and mk files. 550Sduke# If $prefix ends in $HOST_TARGET, and $prefix/../share 560Sduke# exits, the default will be that rather than $prefix/share. 570Sduke# 580Sduke# --mksrc "mksrc" 590Sduke# Indicate where the mk files can be found. 600Sduke# Default is $Mydir/mk 610Sduke# 620Sduke# --install 630Sduke# If build and test work, run bmake install. 640Sduke# BINDIR=$prefix/bin 650Sduke# SHAREDIR=$prefix/share 660Sduke# 670Sduke# --install-host-target 680Sduke# As for '--install' but BINDIR=$prefix/$HOST_TARGET/bin 690Sduke# This is useful when $prefix/ is shared by multiple 700Sduke# machines. 710Sduke# 720Sduke# Flags relevant when installing: 730Sduke# 740Sduke# -DWITHOUT_INSTALL_MK 750Sduke# Skip installing mk files. 760Sduke# By default they will be installed to $prefix/share/mk 779860Scoleenp# 782062Scoleenp# -DWITH_PROG_VERSION 790Sduke# Install 'bmake' as 'bmake-$MAKE_VERSION' 800Sduke# A symlink will be made as 'bmake' unless 810Sduke# -DWITHOUT_PROG_LINK is set. 820Sduke# 830Sduke# Possibly useful configure_args: 840Sduke# 850Sduke# --without-meta 860Sduke# disable use of meta mode. 870Sduke# 880Sduke# --without-filemon 890Sduke# disable use of filemon(9) which is currently only 900Sduke# available for NetBSD and FreeBSD. 910Sduke# 920Sduke# --with-filemon="path/to/filemon.h" 930Sduke# enables use of filemon(9) by meta mode. 940Sduke# 950Sduke# --with-machine="machine" 960Sduke# set "machine" to override that determined by 970Sduke# machine.sh 980Sduke# 990Sduke# --with-force-machine="machine" 1000Sduke# force "machine" even if uname(3) provides a value. 1010Sduke# 1020Sduke# --with-machine_arch="machine_arch" 1030Sduke# set "machine_arch" to override that determined by 1040Sduke# machine.sh 1052062Scoleenp# 1062062Scoleenp# --with-default-sys-path="syspath" 1072062Scoleenp# set an explicit default "syspath" which is where bmake 1082062Scoleenp# will look for sys.mk and friends. 1092062Scoleenp# 1102062Scoleenp# AUTHOR: 1112062Scoleenp# Simon J. Gerraty <sjg@crufty.net> 1122062Scoleenp 1130Sduke# RCSid: 1140Sduke# $Id: boot-strap,v 1.49 2016/05/29 00:09:14 sjg Exp $ 1150Sduke# 1160Sduke# @(#) Copyright (c) 2001 Simon J. Gerraty 1170Sduke# 1180Sduke# This file is provided in the hope that it will 1190Sduke# be of use. There is absolutely NO WARRANTY. 1200Sduke# Permission to copy, redistribute or otherwise 1210Sduke# use this file is hereby granted provided that 1220Sduke# the above copyright notice and this notice are 1230Sduke# left intact. 1240Sduke# 1250Sduke# Please send copies of changes and bug-fixes to: 1260Sduke# sjg@crufty.net 1270Sduke# 1280Sduke 1290SdukeMydir=`dirname $0` 1300Sduke. "$Mydir/os.sh" 1310Sdukecase "$Mydir" in 1320Sduke/*) ;; 1330Sduke*) Mydir=`cd "$Mydir" && 'pwd'`;; 1340Sdukeesac 1350Sduke 1360SdukeUsage() { 1370Sduke [ "$1" ] && echo "ERROR: $@" >&2 1380Sduke echo "Usage:" >&2 1390Sduke echo "$0 [--<configure_arg> ...][<prefix>][--install]" >&2 1400Sduke exit 1 1410Sduke} 1420Sduke 1430SdukeError() { 1440Sduke echo "ERROR: $@" >&2 1453557Skamg exit 1 1463557Skamg} 1473557Skamg 1480Sdukesource_rc() { 1493557Skamg rc="$1"; shift 1503557Skamg for d in ${*:-""} 1517207Shseigel do 1523557Skamg r="${d:+$d/}$rc" 1530Sduke [ -f "$r" -a -s "$r" ] || continue 1540Sduke echo "NOTE: reading $r" 1553557Skamg . "$r" 1560Sduke break 1570Sduke done 1582319Skamg} 15912485Shseigel 1603557Skamgcmd_args="$@" 1613557Skamg 1623557Skamg# clear some things from the environment that we care about 1633557Skamgunset MAKEOBJDIR MAKEOBJDIRPREFIX 1643557Skamg 1653557Skamg# --install[-host-target] will set this 1663557SkamgINSTALL_PREFIX= 1673557Skamg# other things we pass to install step 1680SdukeINSTALL_ARGS= 1690SdukeCONFIGURE_ARGS= 1700SdukeMAKESYSPATH= 1710Sduke# pick a useful default prefix (for me at least ;-) 1720Sdukefor prefix in /opt/$HOST_TARGET "$HOME/$HOST_TARGET" /usr/pkg /usr/local "" 1733557Skamgdo 1743557Skamg [ -d "${prefix:-.}" ] || continue 1753557Skamg case "$prefix" in 1763557Skamg */$HOST_TARGET) 1773557Skamg p=`dirname $prefix` 1783557Skamg if [ -d $p/share ]; then 1793557Skamg INSTALL_BIN=$HOST_TARGET/bin 1803557Skamg prefix=$p 1813557Skamg fi 1823557Skamg ;; 1833557Skamg esac 1843557Skamg echo "NOTE: default prefix=$prefix ${INSTALL_BIN:+INSTALL_BIN=$INSTALL_BIN}" 1853557Skamg break 1863557Skamgdone 1873557Skamgsrcdir=$Mydir 1883557Skamgmksrc=$Mydir/mk 1893557Skamgobjdir= 19012485Shseigelquiet=: 1913557Skamg 1923557Skamg${SKIP_RC:+:} source_rc .bmake-boot-strap.rc . "$Mydir/.." "$HOME" 1933557Skamg 1943557Skamgget_optarg() { 1953557Skamg expr "x$1" : "x[^=]*=\\(.*\\)" 1963557Skamg} 1970Sduke 1980Sdukehere=`'pwd'` 1990Sdukeif [ $here = $Mydir ]; then 2000Sduke # avoid pollution 2013557Skamg OBJROOT=../ 2023557Skamgfi 2033557Skamg 2040Sdukeop=all 2050SdukeBMAKE= 2060Sduke 2070Sdukewhile : 2087207Shseigeldo 2090Sduke case "$1" in 2103557Skamg --) shift; break;; 2113557Skamg --help) sed -n -e "1d;/RCSid/,\$d" -e '/^#\.[a-z]/d' -e '/^#/s,^# *,,p' $0; exit 0;; 2123557Skamg --prefix) prefix="$2"; shift;; 2133557Skamg --prefix=*) prefix=`get_optarg "$1"`;; 2140Sduke --src=*) srcdir=`get_optarg "$1"`;; 2150Sduke --with-mksrc=*|--mksrc=*) mksrc=`get_optarg "$1"`;; 2160Sduke --share=*) share_dir=`get_optarg "$1"`;; 2170Sduke --share) share_dir="$2"; shift;; 2180Sduke --with-default-sys-path=*) 2190Sduke CONFIGURE_ARGS="$1";; 2200Sduke --with-default-sys-path) 2210Sduke CONFIGURE_ARGS="$1 $2";; 2223557Skamg --install) INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix};; 2233557Skamg --install-host-target) 2243557Skamg INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix} 2250Sduke INSTALL_BIN=$HOST_TARGET/bin;; 2260Sduke --install-destdir=*) INSTALL_DESTDIR=`get_optarg "$1"`;; 2270Sduke --install-prefix=*) INSTALL_PREFIX=`get_optarg "$1"`;; 2287207Shseigel -DWITH*) INSTALL_ARGS="$INSTALL_ARGS $1";; 2290Sduke -s|--src) srcdir="$2"; shift;; 2303557Skamg -m|--mksrc) mksrc="$2"; shift;; 2313557Skamg -o|--objdir) objdir="$2"; shift;; 2323557Skamg -q) quiet=;; 2333557Skamg -c) source_rc "$2"; shift;; 2343557Skamg --*) CONFIGURE_ARGS="$CONFIGURE_ARGS $1";; 2350Sduke *=*) eval "$1"; export `expr "x$1" : "x\\(.[^=]*\\)=.*"`;; 2360Sduke *) break;; 2370Sduke esac 2380Sduke shift 2390Sdukedone 2400Sduke 2410SdukeAddConfigure() { 2420Sduke case " $CONFIGURE_ARGS " in 2430Sduke *" $1"*) ;; 2440Sduke *) CONFIGURE_ARGS="$CONFIGURE_ARGS $1$2";; 2450Sduke esac 2463557Skamg} 2473557Skamg 2483557SkamgGetDir() { 2490Sduke match="$1" 2500Sduke shift 2517207Shseigel fmatch="$1" 2523557Skamg shift 2533557Skamg for dir in $* 2543557Skamg do 2553557Skamg [ -d "$dir" ] || continue 2563557Skamg case "/$dir/" in 2573557Skamg *$match*) ;; 2587207Shseigel *) continue;; 2593557Skamg esac 2603557Skamg case "$fmatch" in 2613557Skamg .) ;; 2623557Skamg *) [ -s $dir/$fmatch ] || continue;; 2633557Skamg esac 2643557Skamg case "$dir/" in 2653557Skamg *./*) cd "$dir" && 'pwd';; 2663557Skamg /*) echo $dir;; 2673557Skamg *) cd "$dir" && 'pwd';; 2680Sduke esac 2690Sduke break 2700Sduke done 2710Sduke} 2720Sduke 2730SdukeFindHereOrAbove() { 2743557Skamg ( 2753557Skamg _t=-s 2763557Skamg while : 2770Sduke do 2780Sduke case "$1" in 2790Sduke -C) cd "$2"; shift; shift;; 2800Sduke -?) _t=$1; shift;; 2810Sduke *) break;; 2820Sduke esac 2830Sduke done 2840Sduke case "$1" in 2850Sduke /*) # we shouldn't be here 2860Sduke [ $_t "$1" ] && echo "$1" 2870Sduke return 2880Sduke ;; 2890Sduke .../*) want=`echo "$1" | sed 's,^.../*,,'`;; 2900Sduke *) want="$1";; 2910Sduke esac 2920Sduke here=`'pwd'` 2930Sduke while : 2940Sduke do 2950Sduke if [ $_t "./$want" ]; then 2960Sduke echo "$here/$want" 2970Sduke return 2980Sduke fi 2990Sduke cd .. 3000Sduke here=`'pwd'` 3010Sduke case "$here" in 3020Sduke /) return;; 3030Sduke esac 3040Sduke done 3050Sduke ) 3063557Skamg} 3073557Skamg 3083557Skamg# is $1 missing from $2 (or PATH) ? 3090Sdukeno_path() { 3100Sduke eval "__p=\$${2:-PATH}" 3110Sduke case ":$__p:" in *:"$1":*) return 1;; *) return 0;; esac 3120Sduke} 3130Sduke 3140Sduke# if $1 exists and is not in path, append it 3150Sdukeadd_path () { 3160Sduke case "$1" in 3170Sduke -?) t=$1; shift;; 3180Sduke *) t=-d;; 3190Sduke esac 3200Sduke case "$2,$1" in 3210Sduke MAKESYSPATH,.../*) ;; 3220Sduke *) [ $t ${1:-.} ] || return;; 3230Sduke esac 3240Sduke no_path $* && eval ${2:-PATH}="$__p${__p:+:}$1" 3250Sduke} 3260Sduke 3270Sduke 3280Sdukesrcdir=`GetDir /bmake make-bootstrap.sh.in "$srcdir" "$2" "$Mydir" ./bmake* "$Mydir"/../bmake*` 3290Sduke[ -d "${srcdir:-/dev/null}" ] || Usage 3300Sdukecase "$mksrc" in 3310Sdukenone|-) # we ignore this now 3320Sduke mksrc=$Mydir/mk 3330Sduke ;; 3343557Skamg.../*) # find here or above 3353557Skamg mksrc=`FindHereOrAbove -C "$Mydir" -s "$mksrc/sys.mk"` 3360Sduke # that found a file 3370Sduke mksrc=`dirname $mksrc` 3383557Skamg ;; 3393557Skamg*) # guess we want mksrc... 3403557Skamg mksrc=`GetDir /mk sys.mk "$mksrc" "$3" ./mk* "$srcdir"/mk* "$srcdir"/../mk*` 3413557Skamg [ -d "${mksrc:-/dev/null}" ] || Usage "Use '-m none' to build without mksrc" 3423557Skamg ;; 3433557Skamgesac 3443557Skamg 3453557Skamg# Ok, get to work... 3463557Skamgobjdir="${objdir:-$OBJROOT$HOST_TARGET}" 3473557Skamg[ -d "$objdir" ] || mkdir -p "$objdir" 3483557Skamg[ -d "$objdir" ] || mkdir "$objdir" 3493557Skamgcd "$objdir" || exit 1 3503557Skamg# make it absolute 3513557Skamgobjdir=`'pwd'` 3523557Skamg 3533557SkamgShareDir() { 3543557Skamg case "/$1" in 3553557Skamg /) [ -d /share ] || return;; 3563557Skamg */$HOST_TARGET) 3573557Skamg if [ -d "$1/../share" ]; then 3583557Skamg echo `dirname "$1"`/share 3593557Skamg return 3603557Skamg fi 361 ;; 362 esac 363 echo $1/share 364} 365 366# make it easy to force prefix to use $HOST_TARGET 367: looking at "$prefix" 368case "$prefix" in 369*/host?target) prefix=`echo "$prefix" | sed "s,host.target,${HOST_TARGET},"`;; 370esac 371 372share_dir="${share_dir:-`ShareDir $prefix`}" 373 374AddConfigure --prefix= "$prefix" 375case "$CONFIGURE_ARGS" in 376*--with-*-sys-path*) ;; # skip 377*) [ "$share_dir" ] && AddConfigure --with-default-sys-path= "$share_dir/mk";; 378esac 379if [ "$mksrc" ]; then 380 AddConfigure --with-mksrc= "$mksrc" 381 # not all cc's support this 382 CFLAGS_MF= CFLAGS_MD= 383 export CFLAGS_MF CFLAGS_MD 384fi 385 386# this makes it easy to run the bmake we just built 387# the :tA dance is needed because 'pwd' and even /bin/pwd 388# may not give the same result as realpath(). 389Bmake() { 390 ( 391 cd $Mydir && 392 MAKESYSPATH=$mksrc SRCTOP=$Mydir OBJTOP=$objdir \ 393 MAKEOBJDIR='${.CURDIR:S,${SRCTOP:tA},${OBJTOP:tA},}' \ 394 ${BMAKE:-$objdir/bmake} -f $Mydir/Makefile "$@" 395 ) 396} 397 398# there is actually a shell where type is not a builtin 399# if type is missing, which(1) had better exists! 400if (type cat) > /dev/null 2>&1; then 401which() { 402 type "$@" | sed 's,[()],,g;s,^[^/][^/]*,,;q' 403} 404fi 405# make sure test below uses the same diff that configure did 406TOOL_DIFF=`which diff` 407export TOOL_DIFF 408 409op_configure() { 410 $srcdir/configure $CONFIGURE_ARGS || exit 1 411} 412 413op_build() { 414 [ -s make-bootstrap.sh ] || op_configure 415 chmod 755 make-bootstrap.sh || exit 1 416 ./make-bootstrap.sh || exit 1 417 case "$op" in 418 build) op_test;; 419 esac 420} 421 422op_test() { 423 [ -x bmake ] || op_build 424 Bmake test || exit 1 425} 426 427op_clean() { 428 if [ -x bmake ]; then 429 ln bmake bmake$$ 430 BMAKE=$objdir/bmake$$ Bmake clean 431 rm -f bmake$$ 432 elif [ $objdir != $srcdir ]; then 433 rm -rf * 434 fi 435} 436 437op_install() { 438 op_test 439 case "$INSTALL_PREFIX,$INSTALL_BIN,$prefix" in 440 ,$HOST_TARGET/bin,*/$HOST_TARGET) 441 INSTALL_PREFIX=`dirname $prefix` 442 ;; 443 esac 444 INSTALL_PREFIX=${INSTALL_PREFIX:-$prefix} 445 Bmake install prefix=$INSTALL_PREFIX BINDIR=$INSTALL_PREFIX/${INSTALL_BIN:-bin} ${INSTALL_DESTDIR:+DESTDIR=$INSTALL_DESTDIR} $INSTALL_ARGS || exit 1 446} 447 448op_all() { 449 rm -f make-bootstrap.sh bmake *.o 450 if [ -n "$INSTALL_PREFIX" ]; then 451 op_install 452 else 453 op_test 454 MAKE_VERSION=`sed -n '/^_MAKE_VERSION/ { s,.*= *,,;p; }' $srcdir/Makefile` 455 echo You can install by running: 456 echo 457 echo $0 $cmd_args op=install 458 echo 459 echo "Use --install-prefix=/something to install somewhere other than $prefix" 460 echo "Use --install-destdir=/somewhere to set DESTDIR during install" 461 echo "Use --install-host-target to use INSTALL_BIN=$HOST_TARGET/bin" 462 echo "Use -DWITH_PROG_VERSION to install as bmake-$MAKE_VERSION" 463 echo "Use -DWITHOUT_PROG_LINK to suppress bmake -> bmake-$MAKE_VERSION symlink" 464 echo "Use -DWITHOUT_INSTALL_MK to skip installing files to $prefix/share/mk" 465 fi 466} 467 468op_$op 469exit 0 470