H=@ DIRECTORIES = $(shell cat Make) INCLUDES = $(DIRECTORIES:%=-I %) OCAMLDEP = ocamlfind ocamldep -native $(INCLUDES) OCAMLOPT = ocamlfind opt -linkpkg -package "$(REQUIRES)" $(INCLUDES) OCAMLLEX = ocamllex.opt OCAMLYACC = ocamlyacc -v TAR = tar -czf $(MAIN:%=%.tgz) GZIP = gzip define DIR_TEMPLATE MODULES += $$(addprefix $(1)/,$$(shell cat $(1)/Make)) endef define MOD_TEMPLATE SOURCES += $$(if $$(wildcard $(1).ml[yi]),$(1).mli $(1).ml,$(1).ml) CMXS += $(1).cmx CLEAN += $(1).cmi $(1).cmx $(1).o CLEAN += $$(if $$(wildcard $(1).ml[ly]),$(1).ml,) CLEAN += $$(if $$(wildcard $(1).mly),$(1).mli $(1).output,) KEEP += $$(if $$(wildcard $(1).mly),$(1).mly,\ $$(if $$(wildcard $(1).mll),$(1).mll,\ $$(if $$(wildcard $(1).mli),$(1).mli $(1).ml,$(1).ml)\ )\ ) endef $(foreach DIR,$(DIRECTORIES),$(eval $(call DIR_TEMPLATE, $(DIR)))) $(foreach MOD,$(MODULES),$(eval $(call MOD_TEMPLATE, $(MOD)))) OBJECTS = $(patsubst %.ml,%.cmx,$(SOURCES:%.mli=%.cmi)) CLEAN += $(MAIN).opt all opt: .depend.opt @$(MAKE) --no-print-directory $(MAIN).opt $(MAIN).opt: $(OBJECTS) @echo " OCAMLOPT -o $(MAIN).opt" $(H)$(OCAMLOPT) -o $(MAIN).opt $(CMXS) .depend.opt: $(SOURCES) @echo " OCAMLDEP -native" $(H)$(OCAMLDEP) $^ > .depend.opt clean: @echo " CLEAN . $(DIRECTORIES)" $(H)find -name "*~" | xargs $(RM) $(CLEAN) tgz: clean @echo " TAR -czf $(MAIN:%=%.tgz) . $(DIRECTORIES)" $(H)find -name "Make*" | xargs $(TAR) $(KEEP) %.ml %.mli: %.mly @echo " OCAMLYACC $<" $(H)$(OCAMLYACC) $< %.ml: %.mll @echo " OCAMLLEX $<" $(H)$(OCAMLLEX) $< %.cmi: %.mli @echo " OCAMLOPT $<" $(H)$(OCAMLOPT) -c $< %.cmx: %.ml @echo " OCAMLOPT $<" $(H)$(OCAMLOPT) -c $< ifeq ($(MAKECMDGOALS), $(MAIN).opt) include .depend.opt endif