PREVIOUS_FILES = $(foreach dir,$(PREVIOUS_DIRS),$(addprefix $(dir)/,$(shell sed -n -e 's/^ML *= *\(.*\)/\1/p' $(dir)/Makefile))) PREVIOUS_MLIS = $(foreach mli,$(PREVIOUS_FILES:.ml=.mli),$(filter $(mli),$(foreach dir,$(PREVIOUS_DIRS),$(wildcard $(dir)/*.mli)))) LIBDIR += $(foreach dir,$(PREVIOUS_DIRS), -I $(dir)) LIBSOPT = $(patsubst %.cmo,%.cmx,$(LIBS:.cma=.cmxa)) I_PREVIOUS_DIRS = $(foreach dir,$(PREVIOUS_DIRS), -I $(dir)) LOCAL_ML := $(ML) LOCAL_MLI = $(foreach mli,$(ML:.ml=.mli),$(filter $(mli),$(wildcard *.mli))) $(DYP:%.dyp=%.mli) LOCAL_CMO := $(ML:%.ml=%.cmo) LOCAL_CMX := $(ML:%.ml=%.cmx) MLI = $(foreach mli,$(ML:.ml=.mli),$(filter $(mli),$(wildcard *.mli))) ML := $(PREVIOUS_FILES) $(ML) MLI := $(PREVIOUS_MLIS) $(MLI) CMO = $(ML:.ml=.cmo) CMI = $(ML:.ml=.cmi) CMX = $(ML:.ml=.cmx) .PHONY : all byte opt clean $(PRELIMINARY) superclean .PRECIOUS : $(DYP:%.dyp=%.ml %.mli) $(CAMLLEX:%.mll=%.ml) PP = $(OCAMLPP) EXE = $(EXE_SOURCES:%.ml=%) EXEOPT = $(EXE_SOURCES:%.ml=%.opt) CAMLLEX_ML=$(CAMLLEX:%.mll=%.ml) DYP_ML=$(DYP:%.dyp=%.ml) DYP_MLI=$(DYP:%.dyp=%.mli) # generic rules : ################# # Makes byte the default goal byte : $(PRELIMINARY) $(LOCAL_CMO) $(EXE) byte_mli : $(PRELIMINARY) $(LOCAL_MLI:%.mli=%.cmi) opt : $(PRELIMINARY) $(LOCAL_CMX) $(EXEOPT) ifdef EXE_SOURCES $(EXE) : $(CMO) @OCAMLC@ -o $@ $(LIBDIR) $(LIBS) $(BYTEFLAGS) $^ endif ifdef EXE_SOURCES $(EXEOPT) : $(CMX) @OCAMLCOPT@ -o $@ $(LIBDIR) $(LIBSOPT) $(OPTFLAGS) $^ endif ../%.cmi : ../%.mli $(foreach dir,$(PREVIOUS_DIRS),$(MAKE) -r -S -C $(dir) byte_mli;) %.cmi : %.mli @OCAMLC@ $(PP) -c $(LIBDIR) $(LIBS) $(BYTEFLAGS) $< ../%.cmo : ../%.ml $(foreach dir,$(PREVIOUS_DIRS),$(MAKE) -r -S -C $(dir) byte;) # $(MAKE) -r -S -C $(@D) $(@F) ../%.cmx : ../%.ml $(foreach dir,$(PREVIOUS_DIRS),$(MAKE) -r -S -C $(dir) opt;) # $(MAKE) $(PP) -r -S -C $(@D) $(@F) %.cmo : %.ml $(PREVIOUS_FILES:.ml=.cmo) $(PREVIOUS_MLIS) @OCAMLC@ $(PP) -c $(LIBDIR) $(BYTEFLAGS) $< %.cmx : %.ml $(PREVIOUS_FILES:.ml=.cmx) $(PREVIOUS_MLIS) @OCAMLCOPT@ $(PROFILEOPT) $(PP) -c $(LIBDIR) $(OPTFLAGS) $< #DYPGEN_EXE = @DYPGEN@ #DYPGEN_EXE = $(DYPPATH)/dypgen/dypgen --ocamlc "$(LIBDIR) $(I_PREVIOUS_DIRS)" DYPGEN_EXE = @DYPGEN@ --no-pp --no-obj-type --ocamlc "$(LIBDIR) $(I_PREVIOUS_DIRS)" %.mli : %.dyp $(DYPGEN_EXE) --noemit-token-type $< %.ml : %.dyp $(DYPGEN_EXE) --noemit-token-type $< %.ml : %.mll @OCAMLLEX@ $< # Dependancy graphs and types ################## dep : depend.ps types : types.ps depend.ps : DEP_FLAG = -dot-reduce types.ps : DEP_FLAG = -dot-types depend.ps : depend.dot dot -Tps -o $@ $< %.dot : $(CMO) # @OCAMLDOC@ $(PP) $(LIBDIR) -o $@ -dot $(DEP_FLAG) $(ML) @OCAMLDOC@ $(PP) $(LIBDIR) -o $@ -dot $(DEP_FLAG) $(ML) # clean and depend ################## clean: ifdef EXE @rm -f $(EXE) $(EXEOPT) endif # echo $(CAMLLEX_ML) $(DYP_ML) $(DYP_MLI) @rm -f *.cm[ioax]* *.o *.a *~ *.annot depend .targets $(CAMLLEX_ML) $(DYP_ML) $(DYP_MLI) $(DYP:%.dyp=%.extract_type) $(DYP:%.dyp=%.ml.temp) @rm -f *.dot *.ps *.log @rm -rf doc @find . -name "*#[0-9]*" -exec printf "\n\nWARNING: I did not erase the file %s. It probably is a file automatically generated by so6 because of a conflict. Please check if the conflict was resolved, and manually erase it\n\n" {} \; @find . -name "#*" -exec printf "\n\nWARNING: I did not erase the file %s. It probably is a file automatically generated by (X)Emacs as backup. Please check if it can be erased\n\n" {} \; superclean: clean @rm -i *#[0-9]* @rm -i #* depend: $(filter-out $(DYP_ML) $(DYP_MLI),$(LOCAL_MLI) $(LOCAL_ML) $(EXE_SOURCES)) rm -f depend @(@OCAMLDEP@ $(PP) $(I_PREVIOUS_DIRS) $^ > depend)||(printf "\n\n****** WARNING: DEPEND FILE NOT GENERATED *******\n\n\n" ;rm depend) ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),superclean) ifneq ($(MAKECMDGOALS),depend) ifneq ($(MAKECMDGOALS),config) -include depend endif endif endif endif # documentation rules ##################### doc : $(CMO) $(MLI) $(ML) mkdir -p doc @OCAMLDOC@ $(PP) $(OCAMLDOC_FLAGS) $(LIBDIR) -d $@ $(filter %.mli,$^) $(filter %.ml,$^) # @OCAMLDOC@ $(PP) $(OCAMLDOC_FLAGS) $(LIBDIR) -d $@ $(filter %.mli,$^) .targets: -rm -f $@ @($(foreach exe,$(EXE),echo $(exe) : $(exe:%=%.cmo)>>$@;)) @($(foreach exe,$(EXE),echo $(exe:%=%.opt) : $(exe:%=%.cmx)>>$@;)) ifneq ($(MAKECMDGOALS),clean) ifneq ($(MAKECMDGOALS),superclean) ifneq ($(MAKECMDGOALS),config) ifdef EXE_SOURCES include .targets endif endif endif endif