V10/cmd/sml/src/makeml

#!/bin/sh
#
#set -x

IMAGE=""
MACHINE=""
OPSYS="BSD"
MODULEKIND="Int"
TARGET=""
SHARE="TRUE"
DEFS=""
CLEAN="TRUE"
MKRUN="TRUE"
RUNTIME="runtime"
NOBOOT=""
ASMBLR="as"
COMMAND=""
IONLY=""
CFL=""

#
# gc params
HEAP=2048
RATIO=20
SOFTLIMIT=4096

#
# try to guess the machine type
#
if [ -f /bin/arch ]; then
    case `/bin/arch` in
	sun3)
	    set - -sun3 $*
	;;
	sun4)
	    set - -sun4 $*
	;;
    esac
fi

#
# process options
#
while test "$#" != "0"
do
    case $1 in
	-m68|-sun3)
	    MACHINE=M68
	;;
	-sparc|-sun4)
	    MACHINE=SPARC
	;;
	-next)
	    MACHINE=M68
	    OPSYS=NEXT
	;;
	-encore)
	    MACHINE=NS32
	    OPSYS=BSD
	    ASMBLR="as -j"
	;;
	-vax)
	    MACHINE=VAX
	;;
	-bsd)
	    OPSYS=BSD
	;;
	-mach)
	    OPSYS=MACH
	;;
	-sunos)
	    OPSYS=SUNOS
	;;
	-v9)
	    OPSYS=V9
	;;
	-ultrix)
	    OPSYS=ULTRIX
	;;
	-batch)
	    MODULEKIND=Comp
	;;
	-noshare)
	    SHARE=""
	;;
	-run)
	    MKRUN="TRUE"
	    NOBOOT="TRUE"
	;;
	-norun)
	    MKRUN=""
	    CLEAN=""
	;;
	-noclean)
	    CLEAN=""
	;;
	-target)
	    shift
	    if test "$#" = "0"
	    then
		echo "makeml: must supply machine for -target option"
		exit 1
	    fi
	    TARGET=$1
	    MODULEKIND=Comp
	;;
	-i)
	    COMMAND="System.Control.interp := true;"
	    ;;
	-ionly)
	    COMMAND="System.Control.interp := true;"
	    IONLY="TRUE"
	;;
	-o)
	    shift
	    if test "$#" = "0"
	    then
		echo "makeml: must supply image name for -o option"
		exit 1
	    fi
	    IMAGE=$1
	;;
	-runtime)
	    shift
	    if test "$#" = "0"
	    then
		echo "makeml: must supply runtime directory for -runtime option"
		exit 1
	    fi
	    RUNTIME=$1
	;;
	-mo)
	    shift
	    if test "$#" = "0"
	    then
		echo "makeml: must supply mo directory for -mo option"
		exit 1
	    elif test ! \( -d "$1" \)
	    then
		echo "makeml: mo directory $1 not found"
		exit 1
	    fi
	    MO=$1
	;;
	-h)
	    shift
	    if test "$#" = "0"
	    then
		echo "makeml: must supply argument for -h option"
		exit 1
	    fi
	    HEAP=$1
	;;
	-r)
	    shift
	    if test "$#" = "0"
	    then
		echo "makeml: must supply argument for -r option"
		exit 1
	    fi
	    RATIO=$1
	;;
	-m)
	    shift
	    if test "$#" = "0"
	    then
		echo "makeml: must supply argument for -m option"
		exit 1
	    fi
	    SOFTLIMIT=$1
	;;
	-D*)
	    DEFS="$DEFS $1"
	;;
	*)
	    echo "makeml: unrecognized option $1"
	    exit 1
	;;
    esac
    shift
done

if test -z "$IMAGE"
then
    if test "$MODULEKIND" = Int
    then
	if test -n "$IONLY"
	then
	    IMAGE=smli
	else
	    IMAGE=sml
	fi
    else
	IMAGE=smlc
    fi
fi

case $MACHINE in
    M68)
	case $OPSYS in
	MACH)
	    OPSYS=BSD
# drt: added -Dsun3 option to make Mach header files perform correctly
	    DEFS="$DEFS -Dsun3 -DSUN3"
	    CFL="-f68881"
	;;
	SUNOS)
	    OPSYS=BSD
# awa: for gcc, -f68881 should be changed to -m68881 below.
	    DEFS="$DEFS -DSUN3"
	    CFL="-n -Bstatic -f68881"
	;;
	NEXT)
	    DEFS="$DEFS -DBSD"
	;;
	*)
		echo "For m68 don't use -bsd, use -mach or -next or -sunos"
		exit 1
	esac
	if test -z "$MO"
	then
	    MO="../mo.m68"
	fi
	MODULE="$MODULEKIND"M68
    ;;
    SPARC)
	case $OPSYS in
	MACH)
	    OPSYS=BSD
	    DEFS="$DEFS -Dsun4"
	;;
	SUNOS)
	    OPSYS=BSD
	    DEFS="$DEFS -Dsun4"
	    CFL="-n -Bstatic"
	;;
	*)
		echo "For sparc don't use -bsd, use -mach or -sunos"
		exit 1
	esac
	if test -z "$MO"
	then
	    MO="../mo.sparc"
	fi
	MODULE="$MODULEKIND"Sparc
    ;;
    VAX)
	if test "$OPSYS" = ULTRIX
	then
	    DEFS="$DEFS -DBSD"
	fi
	if test -z "$MO"
	then
	    MO="../mo.vax"
	fi
	MODULE="$MODULEKIND"Vax
    ;;
    NS32)
	if test -z "$MO"
	then
	    MO="../mo.ns32"
	fi
	MODULE="$MODULEKIND"NS32
    ;;
    *)
	echo "makeml: must specify machine type"
	exit 1
    ;;
esac

if test -n "$TARGET"
then
    case $TARGET in
	m68|M68|sun3|next)
	    TARGET=M68
	;;
	sparc|Sparc|SPARC|sun4)
	    TARGET=Sparc
	;;
	vax|Vax|VAX)
	    TARGET=Vax
	;;
	ns32|NS32|encore)
	    TARGET=NS32
	;;
	*)
	    echo "makeml: invalid argument to -target option"
	    exit 1
    esac
    MODULE="$MODULEKIND"$TARGET
fi

if test -n "$IONLY"
then
    if test -n "$TARGET"
    then
	echo "makeml: -target and -ionly options are incompatible"
	exit 1
    fi
    MODULE="IntNull"
fi

MOFILES="$MODULE.mos"
DEFS="$DEFS -D$OPSYS"


if test -n "$CLEAN"
then
    echo "(cd $RUNTIME; make clean)"
    (cd $RUNTIME; make clean)
fi

echo rm -f mo
rm -f mo

echo ln -s $MO mo
ln -s $MO mo

if test -n "$MKRUN"
then
    echo "(cd $RUNTIME; rm -f run allmo.o)"
    (cd $RUNTIME; rm -f run allmo.o)

    if test -n "$SHARE"
    then
	if test "$OPSYS" = NEXT
	then
	    echo "(cd $RUNTIME; make MACHINE=$MACHINE slinkdata)"
	    (cd $RUNTIME; make MACHINE=$MACHINE slinkdata)

	    echo "$RUNTIME/slinkdata [$RUNTIME/$MOFILES] > $RUNTIME/allmo.s"
	    $RUNTIME/slinkdata `cat $RUNTIME/$MOFILES` > $RUNTIME/allmo.s

	    echo "(cd runtime; cc -c allmo.s)"
	    (cd runtime; cc -c allmo.s)
	else

#
# drt: changed this to pass $DEFS value and machine name instead of
# just the machine name.
# 

	    ARG="MACHINE=$MACHINE 'DEFS=$DEFS' linkdata"
	    echo "(cd $RUNTIME; make $ARG)"
	    (cd $RUNTIME; eval make $ARG)

	    echo "$RUNTIME/linkdata [$RUNTIME/$MOFILES] > $RUNTIME/allmo.o"
	    $RUNTIME/linkdata `cat $RUNTIME/$MOFILES` > $RUNTIME/allmo.o
	fi
    fi

    ARG="MACHINE=$MACHINE 'DEFS=$DEFS' 'CFL=$CFL' 'ASMBLR=$ASMBLR'"
    echo "(cd $RUNTIME; make $ARG)"
    (cd $RUNTIME; eval make $ARG)
fi

if test -n "$NOBOOT"
then
    exit 0
fi

if test "$MODULEKIND" = Int
then
    STARTUP='('$COMMAND' exportML "'$IMAGE'"; output std_out System.version; output std_out (chr 10) (* newline *));'
    echo echo $STARTUP '|' $RUNTIME/run -m $SOFTLIMIT -r $RATIO -h $HEAP $MODULE
    echo $STARTUP | $RUNTIME/run -m $SOFTLIMIT -r $RATIO -h $HEAP $MODULE
else
    echo "$RUNTIME/run -m $SOFTLIMIT -r $RATIO -h $HEAP $MODULE"
    $RUNTIME/run -m $SOFTLIMIT -r $RATIO -h $HEAP $MODULE <<XXX
>$IMAGE
XXX
fi