#
#	This is the Makefile for the Modula-2 and Pascal front ends
#

$INCLUDE "../Metafile.defines"
$INCLUDE "Metafile.defines"

$IF modula2 THEN
MODULA2 = TRUE
PASCAL  = FALSE
$ELSE
MODULA2 = FALSE
PASCAL  = TRUE
$END


$IF vax THEN
$ IF modula2 THEN
all:	mod2.0 mod2.0t descrip.mms
$ ELSE
all:	pas2.0 pas2.0t
$ END
$ELSIF mips THEN
all:	mod2.0
$ELSE
unknown
$END


.SUFFIXES:
.SUFFIXES: .o .mod .def .c

YACC = ../yacc/yacc

PG =
modflags = -O -a -g $(PG) -Dpascal=$(PASCAL) -Dmodula2=$(MODULA2) \
		-Dvax=$(VAX) -Dmips=$(MIPS) -B../lib
$IF mips THEN
MODFLAGS = -C -Olimit 2500 -G64 -fl-bestGnum $(modflags)
CFLAGS = $(PG) -O -Olimit 800
$ELSE
MODFLAGS = -C $(modflags)
CFLAGS = $(PG) -O
$END

MOD = ../mod/mod

.def.mod:
	touch $*.mod
.mod.o:
	$(MOD) -c $(MODFLAGS) $*.mod

# Objects common to Modula-2 and Pascal compilers
COMMONOBJS = \
	main.o Mod2.o Former.o Inline.o Tokens.o Strings.o Keywords.o\
	Alloc.o Globals.o Decls.o TypeInfo.o Compatible.o MemLib.o\
	TypeDefs.o Consts.o BuildExpr.o BuildStmt.o CheckStmt.o CheckExpr.o\
	InitBuiltin.o CheckBuiltin.o OptBuiltin.o Errors.o Scanner.o Symbols.o\
	IOLib.o Machine.o Optim.o OCount.o OTree.o iolibc.o memlibc.o

# Objects specific to Titan
TOBJS =	$(COMMONOBJS) \
	GenCodeT.o  GenT.o  Mahler.o SymbolDumpT.o  BuiltinT.o

# Objects specific to VAX
VOBJS =	$(COMMONOBJS) \
	GenCodePC.o GenPC.o PCode.o  SymbolDumpPC.o BuiltinPC.o PCodeOps.o

# Objects specific to MIPS u-code
UOBJS = $(COMMONOBJS) \
	GenCodeUC.o GenUC.o UCode.o SymbolDumpUC.o BuiltinUC.o PCodeOps.o \
	MipUco.o MipSym.o Mipudef.o stinfc.o Mipbwri.o Mipuini.o \
	symconst.o Runtime.o hackc.o hack.o stsupport.o
ULIBS = /usr/lib/cmplrs/cc/libu.a /usr/lib/cmplrs/cc/libp.a \
	/usr/lib/cmplrs/cc/libxmalloc.a

# Objects specific to Modula-2
MOBJS = mod2_gram.o Preprocess.o

TMOBJS = $(TOBJS) $(MOBJS)
VMOBJS = $(VOBJS) $(MOBJS)
UMOBJS = $(UOBJS) $(MOBJS)

# Objects specific to Pascal (VAX and Titan only)
TPOBJS = $(TOBJS) pas_gram.o
VPOBJS = $(VOBJS) pas_gram.o

$IF vax THEN

mod2.0:	$(VMOBJS)
	$(MOD) -o mod2.0 $(MODFLAGS) -m"$(MODFLAGS)" $(VMOBJS)

mod2:	$(VMOBJS)
	$(MOD) -o mod2 $(MODFLAGS) -m"$(MODFLAGS)" $(VMOBJS)

mod2t:	$(TMOBJS)
	$(MOD) -o mod2t $(MODFLAGS) -m"$(MODFLAGS)" $(TMOBJS)

omod2t:	$(TMOBJS)
	$(MOD) -o omod2t -R $(MODFLAGS) -m"$(MODFLAGS)" $(TMOBJS)

mod2.0t:$(TMOBJS)
	$(MOD) -o mod2.0t -R $(MODFLAGS) -m"$(MODFLAGS)" $(TMOBJS)

pas:	$(VOBJS) pas_gram.o
	$(MOD) -o pas $(MODFLAGS) -m"$(MODFLAGS)" $(VPOBJS)

pas2.0:	$(VOBJS) pas_gram.o
	$(MOD) -o pas2.0 $(MODFLAGS) -m"$(MODFLAGS)" $(VPOBJS)

past:	$(TOBJS) pas_gram.o
	$(MOD) -o past $(MODFLAGS) -m"$(MODFLAGS)" $(TPOBJS)

opast:	$(TOBJS) pas_gram.o
	$(MOD) -o opast -R $(MODFLAGS) -m"$(MODFLAGS)" $(TPOBJS)

pas2.0t:$(TOBJS) pas_gram.o
	$(MOD) -o pas2.0t -R $(MODFLAGS) -m"$(MODFLAGS)" $(TPOBJS)

$ELSIF mips THEN

mod2.0: $(UMOBJS)
	$(MOD) -o mod2.0 $(MODFLAGS) -m"$(MODFLAGS)" $(UMOBJS) $(ULIBS)

mod2: $(UMOBJS)
	$(MOD) -o mod2 $(MODFLAGS) -m"$(MODFLAGS)" $(UMOBJS) $(ULIBS)

$ELSE
unknown
$END


DOBJS = Tokens.o Strings.o DumpD.o MemLib.o memlibc.o

dumpd:	$(DOBJS)
	$(MOD) -o dumpd $(MODFLAGS) -m"$(MODFLAGS)" $(DOBJS)



Scanner.o:	Scanner.def Scanner.mod
	$(MOD) -c $(modflags) Scanner.mod

Makefile: Metafile Metafile.defines ../Metafile.defines
	mv Makefile Makefile.bak
	../prep/prep -Dvax=$(VAX) -Dmips=$(MIPS) <Metafile > Makefile

quickinstallmod2.0: ${DESTDIR}$(PASSESDIR)
	install -c -s mod2.0 ${DESTDIR}$(PASSESDIR)/mod2.0
quickinstallmod2.0t: ${DESTDIR}$(PASSESDIR)
	install -c -s mod2.0t ${DESTDIR}$(PASSESDIR)/mod2.0t
quickinstallpas2.0: ${DESTDIR}$(PASSESDIR)
	install -c -s pas2.0 ${DESTDIR}$(PASSESDIR)/pas2.0
quickinstallpas2.0t: ${DESTDIR}$(PASSESDIR)
	install -c -s pas2.0t ${DESTDIR}$(PASSESDIR)/pas2.0t

installmod2.0: 	${DESTDIR}$(PASSESDIR) ${DESTDIR}$(PASSESDIR)/mod2.0
installmod2.0t:	${DESTDIR}$(PASSESDIR) ${DESTDIR}$(PASSESDIR)/mod2.0t
installpas2.0:	${DESTDIR}$(PASSESDIR) ${DESTDIR}$(PASSESDIR)/pas2.0
installpas2.0t:	${DESTDIR}$(PASSESDIR) ${DESTDIR}$(PASSESDIR)/pas2.0t

${DESTDIR}$(PASSESDIR):
	-test -d $@ || $(MKDIR) $@

${DESTDIR}$(PASSESDIR)/mod2.0: mod2.0
	install -c -s mod2.0 ${DESTDIR}$(PASSESDIR)/mod2.0
${DESTDIR}$(PASSESDIR)/mod2.0t: mod2.0t
	install -c -s mod2.0t ${DESTDIR}$(PASSESDIR)/mod2.0t
${DESTDIR}$(PASSESDIR)/pas2.0: pas2.0
	install -c -s pas2.0 ${DESTDIR}$(PASSESDIR)/pas2.0
${DESTDIR}$(PASSESDIR)/pas2.0t: pas2.0t
	install -c -s pas2.0t ${DESTDIR}$(PASSESDIR)/pas2.0t

descrip.mms:	Metafile
	@echo Make sure descrip.mms is up to date with Metafile

vmscopy:
	dcp -v [A-Z]*.def [A-Z]*.mod *.gram *.h *.c Bugs descrip.mms \
	$(REMOTEDIR)

clear:
	-$(RM) *.[BTuUSGsOGP] *.{out,ST,OU,Os} core ${MODOBJ}

$IF modula2 THEN
clean:
	-$(RM) *.o y.output .,* mod2t
$ELSE
clean:
	-$(RM) *.o y.output .,* pas past pas2.0 pas2.0t
$END

checkin:
	ci -l -f -m"For 17 Feb 1992 release on gatekeeper" \
	-s"Release" [A-Z]*.def [A-Z]*.mod *.c Bugs \
	compiler.doc *.gram Makefile descrip.mms; \
	touch [A-Z]*.def iolibc.c [A-Z]*.mod descrip.mms


# @inline procedure depencies
BuiltinPC.o:	PCode.mod PCode.def
GenPC.o:	PCode.mod PCode.def
SymbolDumpPC.o:	PCode.mod PCode.def

BuiltinUC.o:	UCode.mod UCode.def 
GenUC.o:	UCode.mod UCode.def 
SymbolDumpUC.o:	UCode.mod UCode.def

iolibc.c:	IOLib.def
	@echo "Please change iolibc.c to match IOLib.def"

mod2_gram.c: mod2.gram
	@echo Should be 10 shift/reduce and 18 reduce/reduce conflicts
	$(YACC) -vd mod2.gram; mv y.tab.c mod2_gram.c; $(RM) y.tab.h

pas_gram.c: pas.gram
	@echo Should be 3 shift/reduce and no reduce/reduce conflicts
	$(YACC) -vd pas.gram; mv y.tab.c pas_gram.c; $(RM) y.tab.h

