!include ..\config\Makefile.nt

CAMLC=..\boot\ocamlrun ..\ocamlc
CAMLOPT=..\boot\ocamlrun ..\ocamlopt
COMPFLAGS=-I ..\stdlib -I KB -I Lex
OPTFLAGS=-S
CAMLYACC=..\yacc\ocamlyacc
CAMLLEX=..\boot\ocamlrun ..\lex\ocamllex
CAMLDEP=..\boot\ocamlrun ..\tools\ocamldep
CAMLRUN=..\byterun\ocamlrun
CODERUNPARAMS=CAMLRUNPARAM='o=100'

BYTE_EXE=fib.byt takc.byt taku.byt sieve.byt quicksort.byt quicksort.fast.byt \
  fft.byt fft.fast.byt soli.byt soli.fast.byt boyer.byt kb.byt \
  nucleic.byt genlex.byt bdd.byt

CODE_EXE=$(BYTE_EXE:.byt=.exe)

all: $(BYTE_EXE) $(CODE_EXE)

# Nucleic

nucleic.exe: nucleic.ml
!if "$(ARCH)" == "i386"
	sed -e "/<HAND_CSE>/,/<\/HAND_CSE>/d" -e "/NO_CSE>/d" nucleic.ml > nucleic.mlt
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) -o nucleic.exe nucleic.mlt
	rm -f nucleic.mlt
!else
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) -o nucleic.exe nucleic.ml
!endif

# KB

BYTE_KB=KB\terms.cmo KB\equations.cmo KB\kb.cmo KB\orderings.cmo KB\kbmain.cmo
CODE_KB=$(BYTE_KB:.cmo=.cmx)

kb.byt: $(BYTE_KB)
	$(CAMLC) $(COMPFLAGS) $(BYTE_KB) -o kb.byt
kb.exe: $(CODE_KB)
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) $(CODE_KB) -o kb.exe

clean::
	rm -f KB/*.cm* KB/*.obj KB/*.asm

# Genlex

BYTE_GENLEX=Lex\syntax.cmo Lex\scan_aux.cmo Lex\scanner.cmo Lex\gram_aux.cmo \
  Lex\grammar.cmo Lex\lexgen.cmo Lex\output.cmo Lex\main.cmo
CODE_GENLEX=$(BYTE_GENLEX:.cmo=.cmx)

genlex.byt: $(BYTE_GENLEX)
	$(CAMLC) $(COMPFLAGS) -I Lex $(BYTE_GENLEX) -o genlex.byt
genlex.exe: $(CODE_GENLEX)
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) -I Lex $(CODE_GENLEX) -o genlex.exe

clean::
	rm -f Lex/*.cm* Lex/*.obj Lex/*.asm

Lex\grammar.ml Lex\grammar.mli: Lex\grammar.mly ..\yacc\ocamlyacc.exe
	$(CAMLYACC) $(YACCFLAGS) Lex\grammar.mly

clean::
	rm -f Lex\grammar.ml Lex\grammar.mli
beforedepend:: Lex\grammar.ml Lex\grammar.mli

Lex\scanner.ml: Lex\scanner.mll ..\lex\ocamllex
	$(CAMLLEX) Lex\scanner.mll

clean::
	rm -f Lex\scanner.ml
beforedepend:: Lex\scanner.ml

# "Fast" stuff

quicksort.fast.byt: quicksort.ml
	cp quicksort.ml quicksort.fast.ml
	$(CAMLC) $(COMPFLAGS) -unsafe -o quicksort.fast.byt quicksort.fast.ml
	rm -f quicksort.fast.ml

soli.fast.byt: soli.ml
	cp soli.ml soli.fast.ml
	$(CAMLC) $(COMPFLAGS) -unsafe -o soli.fast.byt soli.fast.ml
	rm -f soli.fast.ml

fft.fast.byt: fft.ml
	cp fft.ml fft.fast.ml
	$(CAMLC) $(COMPFLAGS) -unsafe -o fft.fast.byt fft.fast.ml
	rm -f fft.fast.ml

quicksort.fast.exe: quicksort.ml
	cp quicksort.ml quicksort.fast.ml
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) -unsafe -o quicksort.fast.exe quicksort.fast.ml
	rm -f quicksort.fast.ml

soli.fast.exe: soli.ml
	cp soli.ml soli.fast.ml
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) -unsafe -o soli.fast.exe soli.fast.ml
	rm -f soli.fast.ml

fft.fast.exe: fft.ml
	cp fft.ml fft.fast.ml
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) -unsafe -o fft.fast.exe fft.fast.ml
	rm -f fft.fast.ml

# Common rules

.SUFFIXES:
.SUFFIXES: .mli .ml .cmi .cmo .cmx .byt .exe

.ml.byt:
	$(CAMLC) $(COMPFLAGS) -o $*.byt $<

.ml.exe:
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) -o $*.exe $<

.mli.cmi:
	$(CAMLC) $(COMPFLAGS) -c $<

.ml.cmo:
	$(CAMLC) $(COMPFLAGS) -c $<

.ml.cmx:
	$(CAMLOPT) $(COMPFLAGS) $(OPTFLAGS) -c $<

$(BYTE_EXE) $(BYTE_KB) $(BYTE_GENLEX): ..\ocamlc
$(BYTE_EXE): ..\stdlib\stdlib.cma
$(CODE_EXE) $(CODE_KB) $(CODE_GENLEX): ..\ocamlopt
$(CODE_EXE): ..\stdlib\stdlib.cmxa ..\stdlib\libasmrun.lib

clean::
	rm -f *.byt *.exe
	rm -f *.cm* *.obj *.asm

# Regression test

.SUFFIXES: .btst .etst

.byt.btst:
	$(CAMLRUN) $*.byt > %temp%\test.out
	cmp %temp%\test.out Results\$*.out
.exe.etst:
	$*.exe > %temp%\test.out
	cmp %temp%\test.out Results\$*.out

clean::
	rm -f %temp%\test.out

genlex.btst:
	$(CAMLRUN) genlex.byt Lex/testscanner.mll
genlex.etst:
	genlex.exe Lex/testscanner.mll

FFT_TEST=gawk "$$2 >= 1e-9 { exit 2; }"
fft.btst:
	$(CAMLRUN) fft.byt | $(FFT_TEST)
fft.fast.btst:
	$(CAMLRUN) fft.fast.byt | $(FFT_TEST)
fft.etst:
	fft.exe | $(FFT_TEST)
fft.fast.etst:
	fft.fast.exe | $(FFT_TEST)

test: codetest
bytetest: $(BYTE_EXE:.byt=.btst)
codetest: $(CODE_EXE:.exe=.etst)

clean::
	rm -f Lex\testscanner.ml

# Dependencies

depend: beforedepend
	$(CAMLDEP) -I KB -I Lex *.mli *.ml KB/*.mli KB/*.ml Lex/*.mli Lex/*.ml > .depend

!include .depend

