.SUFFIXES:
.SUFFIXES: .o .s .c .mi .md .

VERSION    = 9304
BEGVERSION = 1.72

##########################################################################
# directories

MOCKADIR     = $(shell echo $$PWD)
BINDIR	     = /usr/bin
MANDIR	     = /usr/man/man1
SRCDIR       = $(MOCKADIR)/src
SYSDIR       = $(MOCKADIR)/sys
EXAMPLEDIR   = $(MOCKADIR)/example
DOCDIR	     = $(MOCKADIR)/doc
LIBDIR       = $(MOCKADIR)/lib
BEGDIR	     = $(MOCKADIR)/../beg

DIRS = $(sort $(SRCDIR) $(SYSDIR) $(BINDIR) $(EXAMPLEDIR) $(DOCDIR) $(MANDIR) \
              $(LIBDIR) $(BEGDIR))


##########################################################################
# files

# sourcefiles for the library
LIBSRC := Arguments.md Arguments.mi BasicIO.md BasicIO.mi ByteIO.md ByteIO.mi \
	Clock.md Clock.mi ErrNumbers.md ErrNumbers.mi \
	InOut.md InOut.mi LREAL.s LREAL.md MathLib.md MathLib.mi MemPools.md \
	MemPools.mi NumConv.md NumConv.mi RealConv.md RealConv.mi Signals.md \
	Signals.mi Storage.md Storage.mi Strings.md Strings.mi Strings1.md \
	Strings1.mi SysLib.md SysLib.mi \
	TextIO.md TextIO.mi Unix.md Unix.mi tst.mi


# sourcefiles for the compiler
FRONTEND_SRC= DfFiles.md DfFiles.mi DfScopes.md DfScopes.mi DfTable.md \
	DfTable.mi Mc.mi McArgs.md McArgs.mi McBind.md McBind.mi McComp.md \
	McComp.mi McMake.md McMake.mi McShell.md McShell.mi PaBodies.md \
	PaBodies.mi PaDecls.md PaDecls.mi PaSymSets.md PaSymSets.mi SuAlloc.md \
	SuAlloc.mi SuAlloc2.md SuAlloc2.mi SuBase.md \
	SuBase.mi SuErrors.md SuErrors.mi SuTokens.md SuTokens.mi SuTree.md \
	SuTree.mi SuValues.md SuValues.mi TrBase.md TrBase.mi TrCompat.md \
	TrCompat.mi TrDesig.md TrDesig.mi TrExpr.md TrExpr.mi TrParam.md \
	TrParam.mi TrSets.md TrSets.mi TrStProc.md TrStProc.mi TrStmts.md \
	TrStmts.mi

GEN_BACKEND_SRC= IR.md IR.mi GcgTab.md GcgTab.mi \
	CgMobil.md CgMobil.mi RegAlloc.md RegAlloc.mi Emit.md Emit.mi 

BACKEND_i386_SRC= $(GEN_BACKEND_SRC) \
	CgAssOut.md CgAssOut.mi CgBase.md GcgStorage.md GcgStorage.mi \
	CgBase.mi CgTypeMap.md CgTypeMap.mi CgUtilities.md CgUtilities.mi \
	Prints.md Prints.mi CgDebug.md CgDebug.mi i386.cgd

COMPILER_SRC = $(FRONTEND_SRC) $(BACKEND_i386_SRC)


# other files
SYSFILES1 = asm edit link list merge M2RTS.s M2RTS.o

SYSFILES2 = Mc asm edit list merge-template M2RTS.s M2RTS.o \
	Lister Lister.mi Unlister Unlister.mi

SYSFILES  = $(addprefix $(SYSDIR)/,$(SYSFILES1))

DOCFILES = README README-MOCKA-DEBUGGING ChangeLog MockaManual.ps

EXAMPLES = bench1.mi bench2.mi transfer.mi


##########################################################################
# options

# options used to compile the library
LIBOPTS := -noindex -norange -noS -nog -nogc

# options used for the mc script (standard options)
MCOPTS := -index -range -noS -g -gc

# options used for compiling the compiler
MCBOOTOPTS := -noindex -norange -noS -g -gc

# print error messages or call vi with merged error messages
#LISTSCRIPT = list
LISTSCRIPT = merge


##########################################################################

all: install

REALCLEAN :
	rm -rf  $(MOCKADIR) $(BINDIR)/mc $(MANDIR)/mc.1 \
		$(BEGDIR) $(BINDIR)/beg $(MANDIR)/beg.1


##########################################################################

# Generated Backend src
$(addprefix $(SRCDIR)/,$(GEN_BACKEND_SRC)) : $(SRCDIR)/Stat
	# NOP

$(SRCDIR)/Stat : $(SRCDIR)/i386.cgd
	cd $(SRCDIR); touch Stat; $(BINDIR)/beg i386.cgd


##########################################################################
# The testcompiler

$(SRCDIR)/Mc : $(addprefix $(SRCDIR)/,$(COMPILER_SRC))
	cd $(SRCDIR); echo "p Mc" | $(BINDIR)/mc $(MCBOOTOPTS)

Mc: $(SRCDIR)/Mc


##########################################################################
# The library

#$(LIBDIR)/LREAL.o : $(LIBDIR)/LREAL.s
#	as -o $(LIBDIR)/LREAL.o $(LIBDIR)/LREAL.s

$(LIBDIR)/tst : $(LIBDIR) $(SYSFILES) $(BINDIR)/mc \
	  $(addprefix $(LIBDIR)/,$(LIBSRC) LREAL.o)
	cd $(LIBDIR); echo "p tst" | $(BINDIR)/mc $(LIBOPTS)
	test -x $(LIBDIR)/tst

lib: $(LIBDIR)/tst

newlib:
	rm -f $(LIBDIR)/*.[dor] tst
	$(MAKE) $(LIBDIR)/tst


##########################################################################
# Rules to make the used directories.

dirs : $(DIRS)

$(DIRS): ; -mkdir -p $@


##########################################################################
# Rules to produce the scripts

$(BINDIR)/mc :
	-mkdir $(BINDIR)
	echo '#!/bin/sh' > $(BINDIR)/mc
	echo >> $(BINDIR)/mc
	echo '$(SYSDIR)/Mc	\' > $(BINDIR)/mc
	echo '  -link $(SYSDIR)/link	\' >> $(BINDIR)/mc
	echo '  -edit $(SYSDIR)/edit	\' >> $(BINDIR)/mc
	echo '  -list $(SYSDIR)/$(LISTSCRIPT)	\' >> $(BINDIR)/mc
	echo '  -asm  $(SYSDIR)/asm	\' >> $(BINDIR)/mc
	echo '  -syslib $(LIBDIR)	\' >> $(BINDIR)/mc
	echo '  $(MCOPTS) $$*' >> $(BINDIR)/mc
	chmod +x $(BINDIR)/mc

$(SYSDIR)/link :
	-mkdir $(SYSDIR)
	echo '#!/bin/sh' > $(SYSDIR)/link
	echo >> $(SYSDIR)/link
	echo 'case $$1 in' > $(SYSDIR)/link
	echo "'-g' ) OPTIONS=-lc ; shift ;;" >> $(SYSDIR)/link
	echo "*    ) OPTIONS=-lc ;;" >> $(SYSDIR)/link
	echo 'esac;' >> $(SYSDIR)/link
	echo >> $(SYSDIR)/link
	echo 'program=$$1 ; shift ; modules="$$*"' >> $(SYSDIR)/link
	echo >> $(SYSDIR)/link
	echo '/usr/bin/ld	\' >> $(SYSDIR)/link
	echo '  -o $$program	\' >> $(SYSDIR)/link
	echo '  /usr/lib/crt0.o	\' >> $(SYSDIR)/link
	echo '  $(SYSDIR)/M2RTS.o $$modules $$OPTIONS' >> $(SYSDIR)/link
	chmod +x $(SYSDIR)/link

$(SYSDIR)/merge : $(SYSDIR)/merge-template
	echo '#!/bin/sh' > $(SYSDIR)/merge
	echo >> $(SYSDIR)/merge
	echo 'SYSDIR=$(SYSDIR)' >> $(SYSDIR)/merge 
	cat $(SYSDIR)/merge-template >> $(SYSDIR)/merge
	chmod +x $(SYSDIR)/merge

scripts : $(BINDIR)/mc $(SYSDIR)/link

sysfiles : scripts $(SYSDIR)/M2RTS.o $(SYSDIR)/Lister


##########################################################################
# Rules for the lister utility

$(SYSDIR)/Lister : $(SYSDIR)/Lister.mi $(SYSDIR)/Unlister.mi
	cd $(SYSDIR); \
	echo "p Lister" | $(BINDIR)/mc ; test -x Lister ; \
	echo "p Unlister" | $(BINDIR)/mc ; test -x Unlister ; \
	rm -f Lister.[dors] Unlister.[dors] _M2ROOT.s

Lister: $(SYSDIR)/Lister


##########################################################################
# Rules for beg

$(BINDIR)/beg : 
	cd $(BEGDIR); $(MAKE)

newbeg :
	rm -f $(BINDIR)/beg
	$(MAKE) $(BINDIR)/beg


##########################################################################
# The manual page

$(MANDIR)/mc.1: $(DOCDIR)/mc.1 $(MANDIR)
	-ln -s $< $@


##########################################################################
# Installation

install: $(MANDIR)/mc.1 sysfiles lib


