# Makefile for Bicicleta prototype
executables = call_bicicleta_lexer bicicleta_repl bicicleta_run_script
OCAMLC = ocamlc
OCAML = ocaml

.PHONY: all clean
all: $(executables)
clean:
	rm -f *.cmi *.cmo bicicleta_lexer.ml bicicleta_parser.ml \
		bicicleta_parser.mli minimal_lexer.ml minimal_useful_lexer.ml \
		bicicleta_parser.output $(executables)
bicicleta_syntax.cmo bicicleta_syntax.cmi: bicicleta_syntax.ml
	$(OCAMLC) -c $<
bicicleta_parser.mli bicicleta_parser.ml: bicicleta_parser.mly
	ocamlyacc $<
bicicleta_parser.cmi: bicicleta_parser.mli # ?? bicicleta_syntax.cmi
	$(OCAMLC) -c $< # that is, just bicicleta_parser.mli
bicicleta_parser.cmo: bicicleta_parser.ml bicicleta_syntax.cmi bicicleta_parser.cmi
	$(OCAMLC) -c $<
bicicleta_lexer.ml: bicicleta_lexer.mll
	ocamllex $<
bicicleta_lexer.cmo bicicleta_lexer.cmi: bicicleta_lexer.ml bicicleta_parser.cmo
	$(OCAMLC) -c $<
call_bicicleta_lexer: bicicleta_lexer.cmo call_bicicleta_lexer.ml
	$(OCAMLC) $^ -o call_bicicleta_lexer
BASEDEPS = bicicleta_syntax.cmo bicicleta_parser.cmo bicicleta_lexer.cmo
bicicleta.cmi bicicleta.cmo: bicicleta.ml $(BASEDEPS)
	$(OCAML) $(BASEDEPS) $<  # for regression tests
	$(OCAMLC) -c $<
LIBDEPS = $(BASEDEPS) bicicleta.cmo
bicicleta_lib.cmi bicicleta_lib.cmo: bicicleta_lib.ml $(LIBDEPS)
	$(OCAML) $(LIBDEPS) $<  # more regression tests
	$(OCAMLC) -c $<
REPLDEPS = $(LIBDEPS) bicicleta_lib.cmo
bicicleta_repl.cmo: bicicleta_repl.ml bicicleta.cmi bicicleta_lib.cmi
	$(OCAMLC) -c $<
bicicleta_repl: $(REPLDEPS) bicicleta_repl.cmo
	$(OCAMLC) $^ -o $@
bicicleta_run_script.cmo: bicicleta_run_script.ml bicicleta.cmi bicicleta_syntax.cmi \
		bicicleta_lib.cmi
	$(OCAMLC) -c $<
bicicleta_run_script: $(REPLDEPS) bicicleta_run_script.cmo
	$(OCAMLC) $^ -o $@
