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

#
#	WARNING: This Makefile is derived from the corresponding Metafile.
#	Don't even try to edit this file.  Instead, edit the Metafile, then
#	do a ``make Makefile''.
#
#	If you alter Metafile.defines in the top-level Modula-2 directory,
#	then you should do a ``make Makefiles'' to rederive all Makefiles
#	in all directories.


########################## Common Definitions ###############################

# Defines for conditional processing

VAX         = TRUE
MIPS        = FALSE
ARCH        = vax


# Top-level directory for installation.  Define as /tmp/ to test installation.
# Note that if you define DESTDIR, it must have a trailing /.
DESTDIR     = 
# Directory for installing libmod.a
LIBDIR      = /usr/local/lib
# Directory for installing the passes of the compiler
PASSESDIR   = /usr/local/lib/mod
# Directory for installing the .def files we provide
DEFSDIR     = /usr/local/defs
# Directory for installing the man pages for mod and p2m2
MANDIR      = /usr/man/manl
# Directory for installing the binaries mod and p2m2
BINDIR      = /usr/local/bin

# Name of Modula-2 driver program
MODBINNAME  = mod
# Name of Pascal driver program
PCBINNAME   = wrlpc
# Name of Pascal to Modula-2 converter program
P2M2BINNAME = p2m2
# Name of Modula-2 statement-level profiler
MODPROFBINNAME = modprof
# Name of Modula-2 preprocessor
PREPBINNAME = prep

# Name of directory in which Modula-2 library, compiler passes reside
TESTLIBDIR  = /pandora_a1/m2/m2-$(ARCH)/lib

# Defines for VMS
REMOTENODE = ophion::


# Defines for various utilities.  You may not have all these flags if you
# aren't running a recent release.  So set them according to your system's
# capabilities before trying to install anything.


# rm -f forces removal without asking question or reporting file not found
RM          = rm -f

CP          = cp

MKDIR       = mkdir

RDIST       = rdist -c -h
LOCALHOST        = localhost:

########################## End of Definitions ###############################


MODULA2 = FALSE
PASCAL  = TRUE


all:	pas2.0 pas2.0t


.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
MODFLAGS = -C $(modflags)
CFLAGS = $(PG) -O

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


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)



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}

clean:
	-$(RM) *.o y.output .,* pas past pas2.0 pas2.0t

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

