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