OCAMLC = ocamlc
OCAMLOPT = ocamlopt
OCAMLDEP = ocamldep
OCAMLLEX = ocamllex
OCAMLYACC = ocamlyacc

OCAMLFLAGS = -g
OCAMLOPTFLAGS = 

PROG = imp
OBJS = ast.cmo pprint.cmo lexer.cmo imp.cmo interpretation.cmo parser.cmo main.cmo
GEN = imp.ml imp.mli lexer.ml

$(PROG): $(OBJS)
	$(OCAMLC) -o $(PROG) $(OCAMLFLAGS) $(OBJS)

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

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

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

.ml.cmx:
	$(OCAMLOPT) $(OCAMLOPTFLAGS) -c $<

lexer.ml: lexer.mll
	$(OCAMLLEX) lexer.mll

imp.ml: imp.mly
	$(OCAMLYACC) imp.mly

imp.mli: imp.ml
	touch imp.mli

clean:
	-rm -f $(PROG) *.cm[iox] $(GEN)

imp.cmi: imp.mli
imp.cmo: imp.ml
lexer.cmo: lexer.ml
ast.cmo: ast.cmi 
ast.cmx: ast.cmi 
imp.cmo: ast.cmi imp.cmi 
imp.cmx: ast.cmx imp.cmi 
interpretation.cmo: ast.cmi interpretation.cmi 
interpretation.cmx: ast.cmx interpretation.cmi 
lexer.cmo: imp.cmi 
lexer.cmx: imp.cmx 
main.cmo: ast.cmi interpretation.cmi parser.cmi pprint.cmi main.cmi 
main.cmx: ast.cmx interpretation.cmx parser.cmx pprint.cmx main.cmi 
parser.cmo: imp.cmi lexer.cmo parser.cmi 
parser.cmx: imp.cmx lexer.cmx parser.cmi 
pprint.cmo: ast.cmi pprint.cmi 
pprint.cmx: ast.cmx pprint.cmi 
imp.cmi: ast.cmi 
interpretation.cmi: ast.cmi 
parser.cmi: ast.cmi 
pprint.cmi: ast.cmi 
