# CoCaml makefile
#
# targets are:
#
# all -- rebuild the project (default)
# clean -- remove all objects and executables

export SHELL = /bin/bash
#export PATH = $$PATH:/bin:/usr/local/bin

SOURCES = util.ml ast.ml Types/ast_types.ml \
  Parser/parser.mli Parser/lexer.ml Parser/parser.ml \
  environment.ml printing.ml \
  Corec/corecursive.ml Corec/equality.ml \
  Corec/constructor.ml Corec/iterator.ml Corec/gaussian.ml \
  Corec/appears.ml Corec/separate.ml \
  eval.ml \
  Types/equations_types.ml Types/inference_types.ml \
  Types/typedef.ml \
  natives.ml repl.ml 

TESTS = fv list padic plusone probability stream ai udunit udgaussian udseparate void grammar

#.PHONY: all
all: cocaml.exe

#.PHONY: clean
clean:
	rm -f cocaml.exe cocaml.cma
	rm -f Parser/parser.ml Parser/parser.mli Parser/lexer.ml
	for X in . Parser Types Corec; do \
      for Y in cmo cmi output; do \
        rm -f $$X/*.$$Y; \
      done; \
    done

# the option str.cma is only needed for OCaml <= 3.12, not >= 4.00
cocaml.exe: $(SOURCES)
	ocamlc -a -o cocaml.cma -g -I Parser -I Types -I Corec $(SOURCES)
	ocamlc -o cocaml.exe str.cma cocaml.cma cocaml.ml

Parser/parser.mli Parser/parser.ml: Parser/parser.mly
	ocamlyacc -v Parser/parser.mly

Parser/lexer.ml: Parser/lexer.mll Parser/parser.ml
	ocamllex Parser/lexer.mll

test:
	for X in $(TESTS); do \
	  ./cocaml.exe Examples/$$X.ml | diff Examples/$$X.out -; \
	done; \
	echo '--- OK if nothing was printed ---'

test_regenerate:
	for X in $(TESTS); do \
	  ./cocaml.exe Examples/$$X.ml > Examples/$$X.out; \
	done; \
