obj = ksi.cmo lexer.cmo gontutil.cmo gontmodule.cmo parser.cmo \
      gontbind.cmo gonttypes.cmo gontcodegen.cmo gont.cmo \
      config.cmo main.cmo
opt_obj = ${obj:.cmo=.cmx}
target = gontc
OCAMLC = ocamlc -g
OCAMLC_OPT = ocamlopt

all: $(target) make-runtime

make-runtime:
	$(MAKE) -C runtime

netive: opt

opt: $(target).opt

$(target): $(obj)
	$(OCAMLC) -o $@ $(obj)

$(target).opt: $(opt_obj)
	$(OCAMLC_OPT) -o $@ $(opt_obj)

tags:
	otags *.ml *.mli

.SECONDARY: parser.ml lexer.ml parser.mli
.PHONY: t

t:
	$(MAKE) -C t

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

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

%.cmx: %.ml
	$(OCAMLC_OPT) -c $<

%.ml: %.mll
	ocamllex $<

%.ml %.mli: %.mly
	ocamlyacc -v $<

config.ml:
	make -C runtime
	( echo "(* Autogenerated. Location of the runtime. *)"; \
	  echo 'let prefix = "$(PWD)/runtime";;') > config.ml

deps:
	ocamldep *.ml *.mli > .deps
	
.deps: parser.ml lexer.ml
	ocamldep *.ml *.mli > .deps

include .deps

# Kluge... 

gontutil.cmx: lexer.cmi

clean:
	rm -f *.cmo *.cmi *.o *.cmx core $(target) $(target).opt
	$(MAKE) -C runtime clean

nuke: clean
	rm -f parser.ml parser.mli lexer.ml parser.output config.ml .deps

count:
	wc `ls *.ml *.mli *.mly *.mll | egrep -v '(parser|lexer)\.(ml|mli)$$'`
