# Makefile for TALC
#
# This file is considerable cleaned up from initial versions written by Dave.
# Should old stuff in the initial makefile be needed, retrieve version 1.6.
#
# This file should work with both the standard Solaris make /usr/ccs/bin/make
# and with GNU make.
#
# NG 22 Dec 97

# Configuration
# N.B. Requires MASM 6.11 and Visual C++ to build the runtime

OCAMLC=ocamlc
OCAMLOPT=ocamlopt
OCAMLLEX=ocamllex
OCAMLYACC=ocamlyacc -v
ASM=ml /nologo /coff
CC=cl /nologo
EMACS=emacs
#EMACS=emacs-19   # Use this under CUCS unix

COMPFLAGS=-g $(INCLUDES)
LINKFLAGS=-g $(INCLUDES)
#COMPFLAGS=$(INCLUDES)
#LINKFLAGS=$(INCLUDES)

TARGETDIR=build

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

all: talc popcorn scheme

world: all runtime scheme_runtime talcopt regalloc doc/tal.elc

#################### Util.cma

UTIL=util/utilities.cmo util/splay.cmo util/dict.cmo util/set.cmo \
     util/xarray.cmo

OPTUTIL=util/utilities.cmx util/splay.cmx util/dict.cmx util/set.cmx

COMPUTIL=computil/identifier.cmo

OPTCOMPUTIL=computil/identifier.cmx

$(TARGETDIR)/util.cma: $(UTIL) $(COMPUTIL)
	$(OCAMLC) $(LINKFLAGS) -a -o $@ $^

#################### Tal.cma

TALLIB=talx86/tal.cmo talx86/talctxt.cmo talx86/talpp.cmo toplevel/talcomp.cmo

$(TARGETDIR)/tal.cma: $(TALLIB)
	$(OCAMLC) $(LINKFLAGS) -a -o $@ $^

#################### Regalloc.cma

REGALLOC= regalloc/cfg.cmo regalloc/instruction.cmo regalloc/liveness.cmo \
       regalloc/bitmatrix.cmo regalloc/ifg.cmo regalloc/rewrite.cmo \
       regalloc/regalloc.cmo

$(TARGETDIR)/regalloc.cma: $(REGALLOC)
	$(OCAMLC) $(LINKFLAGS) -a -o $@ $^

#################### Old stuff & talc.exe talcopt.exe

MIL=mil/ycon.cmo mil/yprim.cmo mil/ycalculus.cmo mil/ypp.cmo mil/yverify.cmo \
    mil/patcomp.cmo mil/process.cmo mil/initial.cmo \
    mil/yphase.cmo mil/yalpha.cmo mil/ycps.cmo \
    mil/yclosure.cmo mil/yanormal.cmo mil/click.cmo mil/yreduce.cmo \
    mil/yunbox.cmo

TAL=talx86/talparser.cmo talx86/tallex.cmo talx86/talcon.cmo \
    talx86/talverify.cmo talx86/tallinkchk.cmo

OPTTAL=talx86/tal.cmx talx86/talparser.cmx talx86/tallex.cmx \
    talx86/talctxt.cmx talx86/talpp.cmx talx86/talcon.cmx talx86/talverify.cmx

COGEN= cogen/runtimehack.cmo \
       cogen/cogen_analyze.cmo \
       cogen/cogen_error.cmo cogen/cogen_con.cmo cogen/cogen_util.cmo \
       cogen/cogen_val.cmo cogen/cogen_prim.cmo cogen/cogen.cmo \
       cogen/cogen_main.cmo

TALCOBJS=$(TARGETDIR)/util.cma $(TARGETDIR)/tal.cma $(TAL) \
	 toplevel/talutil.cmo toplevel/talicache.cmo 

talc: $(TARGETDIR)/talc.exe

$(TARGETDIR)/talc.exe: $(TALCOBJS) toplevel/talc.cmo
	$(OCAMLC) $(LINKFLAGS) -o $@ $^

TALCOPTOBJS=$(OPTUTIL) $(OPTCOMPUTIL) $(OPTTAL) \
	    toplevel/talcomp.cmx toplevel/talutil.cmx toplevel/talicache.cmx

talcopt: $(TARGETDIR)/talcopt.exe

$(TARGETDIR)/talcopt.exe: $(TALCOPTOBJS) toplevel/talc.cmx
	$(OCAMLOPT) $(LINKFLAGS) -o $@ $^

#################### Reg

REGOBJS=$(TARGETDIR)/util.cma $(TARGETDIR)/tal.cma talx86/talcon.cmo \
        talx86/talverify.cmo $(TARGETDIR)/regalloc.cma

reg: $(TARGETDIR)/reg.exe

$(TARGETDIR)/reg.exe: $(REGOBJS) regalloc/test.cmo
	$(OCAMLC) $(LINKFLAGS) -o $@ $^

#################### Popcorn

POPOBJS=$(TARGETDIR)/util.cma $(TARGETDIR)/tal.cma \
	popcorn/poplocus.cmo popcorn/poperr.cmo popcorn/poperrhandle.cmo \
        popcorn/popsyntax.cmo popcorn/popparse.cmo popcorn/poplex.cmo \
        popcorn/poptype.cmo popcorn/popcompile.cmo 

popcorn: $(TARGETDIR)/popcorn.exe

$(TARGETDIR)/popcorn.exe: $(POPOBJS) popcorn/popcorn.cmo
	$(OCAMLC) $(LINKFLAGS) -o $@ $^

#################### Scheme

SCHEMEOBJS=$(TARGETDIR)/util.cma $(TARGETDIR)/tal.cma \
           scheme/sast.cmo scheme/sil.cmo \
	   scheme/sparse.cmo scheme/slex.cmo scheme/scomp.cmo

scheme: $(TARGETDIR)/scheme.exe

$(TARGETDIR)/scheme.exe: $(SCHEMEOBJS) scheme/scheme.cmo
	$(OCAMLC) $(LINKFLAGS) -o $@ $^

#################### Runtimes

RUNTIME=runtime/gc.lib runtime/tal_start.obj runtime/tal_util.obj \
	runtime/stdlib.obj runtime/pop_runtime.obj

runtime: $(RUNTIME)

SCHEME_RUNTIME = scheme/sclib.obj

scheme_runtime: $(SCHEME_RUNTIME)

######################################################################
# Templates

%.ml: %.mll
	$(OCAMLLEX) $<

%.ml %.mli: %.mly
	$(OCAMLYACC) $<

%.cmi: %.mli
	$(OCAMLC) -c $(COMPFLAGS) $<

%.cmo: %.ml
	$(OCAMLC) -c $(COMPFLAGS) $<

%.cmx: %.ml
	$(OCAMLOPT) -c $(COMPFLAGS) $<

%.obj: %.asm
	$(ASM) /Fo$@ /c $< 

%.obj: %.c
	$(CC) /Fo$@ /c $<

%.elc: %.el
	$(EMACS) -batch -f batch-byte-compile $<

######################################################################
# Administration

INCLUDES=-I util -I computil -I mil -I talx86 \
         -I cogen -I runtime -I toplevel -I popcorn -I scheme \
	 -I regalloc

DIRS=util computil mil talx86 cogen runtime toplevel popcorn scheme regalloc

SOURCES=util/*.mli util/*.ml computil/*.mli computil/*.ml \
        mil/*.ml mil/*.mli talx86/*.ml \
        talx86/*.mli cogen/*.ml cogen/*.mli runtime/*.ml runtime/*.mli \
        toplevel/*.ml toplevel/*.mli popcorn/*.ml popcorn/*.mli \
	scheme/*.ml scheme/*.mli \
	regalloc/*.ml regalloc/*.mli

GENERATINGFILES = talx86/tallex.mll talx86/talparser.mly popcorn/poplex.mll \
	          popcorn/popparse.mly scheme/slex.mll scheme/sparse.mly

GENFILES = talx86/tallex.ml talx86/talparser.ml talx86/talparser.mli \
	   popcorn/poplex.ml popcorn/popparse.ml popcorn/popparse.mli \
	   scheme/slex.ml scheme/sparse.ml scheme/sparse.mli

clean:
	for i in $(DIRS); do \
	  (cd $$i; rm -f *.cmo *.cmi *.cmx *.obj *~ *.output *.exe) \
	done
	cd $(TARGETDIR); rm -f *.exe *.cma
	rm -f $(GENFILES) *~
	cd popcorn/tests; rm -f *.tal *.tali *.obj *.lst *.exe *~
	cd scheme; rm -f *.obj *.lst *.exe
	cd doc; rm -f *.aux *.dvi *.log *.elc

depend: $(GENFILES)
	ocamldep $(INCLUDES) $(SOURCES) > .depend

include .depend

# This is stuff for stripping out the ^M from NT files shipped to UNIX.
# It is a brittle script (if 2 people use it at the same time then you
# could corrupt your data).  Use at your own risk.

strip:
	for i in $(SOURCES); do ./stripm $$i; done
	cd runtime; for i in *.inc *.c *.asm *.tali; do ../stripm $$i; done
	cd doc; for i in *.tex *.el; do ../stripm $$i; done
	cd popcorn/tests; for i in *.pop; do ../../stripm $$i; done
	cd scheme; for i in *.s; do ../stripm $$i; done
	for i in $(GENERATINGFILES); do ./stripm $$i; done
	./stripm .depend

# EOF: Makefile
