H=@ ifeq ($(origin OCAMLPATH), undefined) OCAMLFIND = OCAMLPATH=$(HOME)/svn/claudio/components/METAS ocamlfind else OCAMLFIND = ocamlfind endif RELISE = $(MAIN:%=%_$(shell cat MakeVersion)) DOWNDIR = ../../www/lambdadelta/download DIRECTORIES = $(addprefix $(SRC)/,$(shell cat $(SRC)/Make)) INCLUDES = $(DIRECTORIES:%=-I %) CAMLP = -pp "camlp5o pa_macro.cmo $(CAMLPOPTIONS)" CAMLPOPTIONS = $(F:%=-D%) OCAMLDEP = $(OCAMLFIND) ocamldep $(CAMLP) $(INCLUDES) OCAMLOPT = $(OCAMLFIND) ocamlopt $(CAMLP) $(OCAMLOPTIONS) -linkpkg -package "$(REQUIRES)" $(INCLUDES) OCAMLC = $(OCAMLFIND) ocamlc $(CAMLP) $(OCAMLOPTIONS) -linkpkg -package "$(REQUIRES)" $(INCLUDES) OCAMLLEX = ocamllex.opt OCAMLYACC = ocamlyacc -v TAR = tar -czf etc/$(MAIN:%=%.tgz) CALLMAKE = $(MAKE) --no-print-directory 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 CMOS += $(1).cmo CLEAN += $(1).cmi $(1).cmx $(1).o $(1).cmo 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 define INCLUDE_O_TEMPLATE ifeq ($(MAKECMDGOALS), $(1)) %.cmi: %.mli @echo " OCAMLOPT $$<" $$(H)$(OCAMLOPT) -c $$< include .depend.opt endif endef define INCLUDE_B_TEMPLATE ifeq ($(MAKECMDGOALS), $(1)) %.cmi: %.mli @echo " OCAMLC $$<" $$(H)$(OCAMLC) -c $$< include .depend.byte endif endef $(foreach DIR, $(DIRECTORIES), $(eval $(call DIR_TEMPLATE, $(DIR)))) $(foreach MOD, $(MODULES), $(eval $(call MOD_TEMPLATE, $(MOD)))) O_OBJECTS = $(patsubst %.ml,%.cmx,$(SOURCES:%.mli=%.cmi)) B_OBJECTS = $(patsubst %.ml,%.cmo,$(SOURCES:%.mli=%.cmi)) CLEAN += $(MAIN).opt $(MAIN).opt: $(O_OBJECTS) @echo " OCAMLOPT -o $(MAIN).opt" $(H)$(OCAMLOPT) -o $(MAIN).opt $(CMXS) $(MAIN).byte: $(B_OBJECTS) @echo " OCAMC -o $(MAIN).byte" $(H)$(OCAMLC) -o $(MAIN).byte $(CMOS) .depend.opt: $(SOURCES) @echo " OCAMLDEP -native" $(H)$(OCAMLDEP) -native $^ > .depend.opt .depend.byte: $(SOURCES) @echo " OCAMLDEP -byte" $(H)$(OCAMLDEP) $^ > .depend.byte clean: @echo " CLEAN . $(SRC)" $(H)find -name "*~" | xargs $(RM) $(CLEAN) relise: clean @echo " RELISE $(RELISE)" $(H)mkdir -p $(RELISE) $(H)$(foreach FILE, $(shell cat Make), cp --parents $(FILE) $(RELISE);) $(H)tar -czf etc/$(RELISE).tar.gz $(RELISE) $(H)scp etc/$(RELISE).tar.gz $(DOWNDIR) tgz: clean @echo " TAR -czf $(MAIN:%=%.tgz) . $(DIRECTORIES)" $(H)find -name "Make*" | xargs $(TAR) $(KEEP) etc: @echo " MKDIR etc" $(H)mkdir etc %.ml %.mli: %.mly @echo " OCAMLYACC $<" $(H)$(OCAMLYACC) $< %.ml: %.mll @echo " OCAMLLEX $<" $(H)$(OCAMLLEX) $< %.cmx: %.ml @echo " OCAMLOPT $<" $(H)$(OCAMLOPT) -c $< %.cmo: %.ml @echo " OCAMLC $<" $(H)$(OCAMLC) -c $< O_TAGS += opt $(MAIN).opt B_TAGS += byte $(MAIN).byte $(foreach TAG, $(O_TAGS), $(eval $(call INCLUDE_O_TEMPLATE, $(TAG)))) $(foreach TAG, $(B_TAGS), $(eval $(call INCLUDE_B_TEMPLATE, $(TAG))))