
# external tools
OCAMLC   := ocamlc.opt
OCAMLOPT := ocamlopt.opt
CAMLP4O  := camlp5o

OCAML_FLAGS := -w Ae-52
OCAMLBYTE_FLAGS := -g

#first: test
#first: all
#first: test_cmo
#first: elsa_type_descr_testrun
#first: elsa_type_descr.cmo
#first: test_generate_type_descr

all: memcheck.cmx memcheck.cmo generate_type_descr.cmo

# HASHTBL_CMX=myhashtbl.cmx
# HASHTBL_CMO=myhashtbl.cmo


TOCLEAN =

TOCLEAN += generate_type_descr.cmo
generate_type_descr.cmo: generate_type_descr.ml
	$(OCAMLC) -pp '$(CAMLP4O) q_MLast.cmo' $(OCAMLBYTE_FLAGS) $(OCAML_FLAGS) \
		-I $$(ocamlfind query camlp5) -c $<

TESTINPUT=

.PHONY: test_generate_type_descr
test_generate_type_descr: generate_type_descr.cmo
	$(CAMLP4O) ./generate_type_descr.cmo $(TESTINPUT)

.PHONY: test
test: test_check_run

.PHONY: test-olmar
test-olmar: elsa_type_descr_testrun

.PHONY: test_cmo
test_cmo: elsa_type_descr_testrun_byte test_check_run_byte


TOCLEAN += test/test_check
test/test_check: memcheck.cmx test/test_check.cmx
	$(OCAMLOPT) $(OCAML_FLAGS) -o $@ unix.cmxa $(HASHTBL_CMX) $^

TOCLEAN += test/test_check_byte
test/test_check_byte: memcheck.cmo test/test_check.cmo
	$(OCAMLC) $(OCAMLBYTE_FLAGS) $(OCAML_FLAGS) -o $@ \
		unix.cma $(HASHTBL_CMO) $^

TOCLEAN += test/strange_type_descr.ml
test/strange_type_descr.ml: test/strange_t.ml generate_type_descr.cmo
	echo "open Memcheck;;" > test/strange_type_descr.ml
	$(CAMLP4O) ./generate_type_descr.cmo test/strange_t.ml >> test/strange_type_descr.ml 


test/strange_test.cmx: test/strange_test.ml test/strange_t.cmx test/strange_type_descr.cmx
	$(OCAMLOPT) $(OCAML_FLAGS) -I test -c $<

TOCLEAN += test/strange
test/strange: memcheck.cmx test/strange_t.cmx test/strange_type_descr.cmx test/strange_test.cmx
	$(OCAMLOPT) $(OCAML_FLAGS) -o test/strange unix.cmxa $^

.PHONY: test_check_run
test_check_run: test/test_check test/strange
	test/test_check
	test/strange

.PHONY: test_check_run_byte
test_check_run_byte: test/test_check_byte
	test/test_check_byte


ELSATYPEDEF=\
	/usr/local/lib/ocaml/hashtbl.ml \
	/home/tews/src/elsa/elsa/cc_ml_types.ml \
	/home/tews/src/elsa/elsa/ml_ctype.ml \
	/home/tews/src/elsa/elsa/ast_annotation.ml \
	/home/tews/src/elsa/elsa/cc_ast_gen_type.ml

TOCLEAN += elsa_type_descr.ml
elsa_type_descr.ml: elsa_type_descr_header.ml generate_type_descr.cmo\
		$(ELSATYPEDEF)
	cat elsa_type_descr_header.ml > $@
	for f in $(ELSATYPEDEF) ; do \
		$(CAMLP4O) ./generate_type_descr.cmo $$f >> $@; \
	done

TOCLEAN += elsa_type_descr_test
elsa_type_descr_test: memcheck.cmx elsa_type_descr.cmx
	$(OCAMLOPT) $(OCAML_FLAGS) -o $@ unix.cmxa $(HASHTBL_CMX) $^

TOCLEAN += elsa_type_descr_test_byte
elsa_type_descr_test_byte: memcheck.cmo elsa_type_descr.cmo
	$(OCAMLC) $(OCAMLBYTE_FLAGS) $(OCAML_FLAGS) -o $@ \
		unix.cma $(HASHTBL_CMO) $^

TOCLEAN += elsa_type_descr_testrun
elsa_type_descr_testrun: elsa_type_descr_test
	./elsa_type_descr_test

TOCLEAN += elsa_type_descr_testrun_byte
elsa_type_descr_testrun_byte: elsa_type_descr_test_byte
	./elsa_type_descr_test_byte

DOCFILES=\
	index.html \
	memcheck-comparison-small.ps \
	memcheck-comparison.ps


.PHONY: install-doc
install-doc:
	ssh lilo mkdir -p web-docs/memcheck
	for f in $(DOCFILES) ; do \
		scp doc/$$f lilo:web-docs/memcheck; \
	done

TOCLEAN += *.cmo *.cmi *.cmx test/*.cmo test/*.cmi test/*.cmx
%.cmo: %.ml
	$(OCAMLC) $(OCAMLBYTE_FLAGS) $(OCAML_FLAGS) -c $<

TOCLEAN += *.cmx *.o test/*.cmx test/*.o
%.cmx: %.ml
	$(OCAMLOPT) $(OCAML_FLAGS) -c $<

TOCLEAN += *.cmi test/.cmi
%.cmi: %.mli
	$(OCAMLC) $(OCAMLBYTE_FLAGS) $(OCAML_FLAGS) -c $<


.PHONY: clean
clean:
	rm -f $(TOCLEAN)

-include mldeps.mk

MLSOURCES=elsa_type_descr.ml memcheck.ml test/test_check.ml 

#	myhashtbl.ml myhashtbl.mli

MLAST_SOURCES=generate_type_descr.ml

.PHONY: mldeps
depend: mldeps
mldeps:
	ocamldep $(MLSOURCES) > mldeps.mk
	ocamldep -pp 'camlp4o q_MLast.cmo' $(MLAST_SOURCES) >> mldeps.mk
