# 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)
OPTCOMPFLAGS=$(INCLUDES)
OPTLINKFLAGS=$(INCLUDES)

TARGETDIR=build

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

all: talc popcorn scheme regalloc runtime

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 util/stringchan.cmo util/binout.cmo \
     util/bitmatrix.cmo

OPTUTIL=util/utilities.cmx util/splay.cmx util/dict.cmx util/set.cmx \
        util/xarray.cmx util/stringchan.cmx util/binout.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 talx86/talout.cmo

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

#################### Talcomp.cma

TALCOMPLIB=talx86/talparser.cmo talx86/tallex.cmo talx86/talcon.cmo \
           talx86/talverify.cmo talx86/tallinkchk.cmo \
           talx86/objfile.cmo talx86/talasmx86.cmo talx86/talasm.cmo \
           talx86/coff.cmo talx86/elf.cmo talx86/talbe.cmo

$(TARGETDIR)/talcomp.cma: $(TALCOMPLIB)
	$(OCAMLC) $(LINKFLAGS) -a -o $@ $^

#################### Cfg.cma

CFG=cfg/talutil.cmo cfg/cfg.cmo cfg/cfginstr.cmo cfg/cfgliveness.cmo \
    cfg/cfgopt.cmo

$(TARGETDIR)/cfg.cma: $(CFG)
	$(OCAMLC) $(LINKFLAGS) -a -o $@ $^

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

REGALLOC=regalloc/regifg.cmo regalloc/regrewrite.cmo regalloc/regalloc.cmo

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

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

#################### 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

OPTTAL=talx86/tal.cmx talx86/talparser.cmx talx86/tallex.cmx \
       talx86/talctxt.cmx talx86/talpp.cmx talx86/talcon.cmx \
       talx86/talverify.cmx talx86/tallinkchk.cmx \
       talx86/objfile.cmx talx86/talasmx86.cmx talx86/talasm.cmx \
       talx86/coff.cmx talx86/elf.cmx talx86/talout.cmx talx86/talbe.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 $(TARGETDIR)/talcomp.cma \
         toplevel/gcd.cmo

talc: $(TARGETDIR)/talc.exe

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

TALCOPTOBJS=$(OPTUTIL) $(OPTCOMPUTIL) $(OPTTAL) toplevel/gcd.cmx

talcopt: $(TARGETDIR)/talcopt.exe

$(TARGETDIR)/talcopt.exe: $(TALCOPTOBJS) toplevel/talc.cmx
	$(OCAMLOPT) $(OPTLINKFLAGS) -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/popcompilereg.cmo \
	toplevel/gcd.cmo

popcorn: $(TARGETDIR)/popcorn.exe

$(TARGETDIR)/popcorn.exe: $(REGOBJS) $(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 toplevel/gcd.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 $(OPTCOMPFLAGS) $<

%.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 cfg -I regalloc -I scheme \
	 -I popcorn

DIRS=util computil mil talx86 cogen runtime toplevel popcorn scheme cfg 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 \
        cfg/*.ml cfg/*.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
	for i in .depend README INSTALL popcorn/README popcorn/CHANGES.txt; do\
	  ./stripm $i \
	done

# EOF: Makefile
