1ifdef V 2 ifeq ("$(origin V)", "command line") 3 BUILD_VERBOSE = $(V) 4 endif 5endif 6ifndef BUILD_VERBOSE 7 BUILD_VERBOSE = 0 8endif 9ifeq ($(BUILD_VERBOSE),1) 10 E = @true 11 Q = 12else 13 E = @echo 14 Q = @ 15endif 16 17.NOTPARALLEL: 18 19ALL_OCAML_OBJS ?= $(OBJS) 20 21%.cmo: %.ml 22 $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -c -o $@ $<,MLC,$@) 23 24%.cmi: %.mli 25 $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -c -o $@ $<,MLI,$@) 26 27%.cmx %.o: %.ml 28 $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -c -o $@ $<,MLOPT,$@) 29 30%.ml: %.mll 31 $(call quiet-command, $(OCAMLLEX) -q -o $@ $<,MLLEX,$@) 32 33%.ml: %.mly 34 $(call quiet-command, $(OCAMLYACC) -q $<,MLYACC,$@) 35 36%.o: %.c 37 $(call quiet-command, $(CC) $(CFLAGS) -c -o $@ $<,CC,$@) 38 39META: META.in 40 sed 's/@VERSION@/$(VERSION)/g' < $< $o 41 42ALL_OCAML_OBJ_SOURCES=$(addsuffix .ml, $(ALL_OCAML_OBJS)) 43 44.ocamldep.make: $(ALL_OCAML_OBJ_SOURCES) Makefile $(TOPLEVEL)/Makefile.rules 45 $(call quiet-command, $(OCAMLDEP) $(ALL_OCAML_OBJ_SOURCES) *.mli $o,MLDEP,) 46 47clean: $(CLEAN_HOOKS) 48 $(Q)rm -f .*.d *.o *.so *.a *.cmo *.cmi *.cma *.cmx *.cmxa *.annot *.spot *.spit $(LIBS) $(PROGRAMS) $(GENERATED_FILES) .ocamldep.make META 49 50distclean: clean 51 52quiet-command = $(if $(V),$1,@printf " %-8s %s\n" "$2" "$3" && $1) 53 54mk-caml-lib-native = $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -a -o $1 $2 $3,MLA,$1) 55mk-caml-lib-bytecode = $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -a -o $1 $2 $3,MLA,$1) 56 57mk-caml-stubs = $(call quiet-command, $(OCAMLMKLIB) -o `basename $1 .a` $2,MKLIB,$1) 58mk-caml-lib-stubs = \ 59 $(call quiet-command, $(AR) rcs $1 $2 && $(OCAMLMKLIB) -o `basename $1 .a | sed -e 's/^lib//'` $2,MKLIB,$1) 60 61# define a library target <name>.cmxa and <name>.cma 62define OCAML_LIBRARY_template 63 $(1).cmxa: lib$(1)_stubs.a $(foreach obj,$($(1)_OBJS),$(obj).cmx) 64 $(call mk-caml-lib-native,$$@, -cclib -l$(1)_stubs $(foreach lib,$(LIBS_$(1)),-cclib $(lib)), $(foreach obj,$($(1)_OBJS),$(obj).cmx)) 65 $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo) 66 $(call mk-caml-lib-bytecode,$$@, -dllib dll$(1)_stubs.so -cclib -l$(1)_stubs, $$+) 67 $(1)_stubs.a: $(foreach obj,$$($(1)_C_OBJS),$(obj).o) 68 $(call mk-caml-stubs,$$@, $$+) 69 lib$(1)_stubs.a: $(foreach obj,$($(1)_C_OBJS),$(obj).o) 70 $(call mk-caml-lib-stubs,$$@, $$+) 71endef 72 73define OCAML_NOC_LIBRARY_template 74 $(1).cmxa: $(foreach obj,$($(1)_OBJS),$(obj).cmx) 75 $(call mk-caml-lib-native,$$@, , $(foreach obj,$($(1)_OBJS),$(obj).cmx)) 76 $(1).cma: $(foreach obj,$($(1)_OBJS),$(obj).cmo) 77 $(call mk-caml-lib-bytecode,$$@, , $$+) 78endef 79 80define OCAML_PROGRAM_template 81 $(1): $(foreach obj,$($(1)_OBJS),$(obj).cmx) $($(1)_EXTRA_DEPS) 82 $(call quiet-command, $(OCAMLOPT) $(OCAMLOPTFLAGS) -o $$@ $($(1)_LIBS) $$+,MLBIN,$$@) 83 $(1).byte: $(foreach obj,$($(1)_OBJS),$(obj).cmo) 84 $(call quiet-command, $(OCAMLC) $(OCAMLCFLAGS) -o $$@ $($(1)_BYTE_LIBS) $$+,MLBIN,$$@) 85endef 86 87define C_PROGRAM_template 88 $(1): $(foreach obj,$($(1)_OBJS),$(obj).o) 89 $(call quiet-command, $(CC) $(LDFLAGS) -o $$@ $$+,BIN,$$@) 90endef 91 92-include .ocamldep.make 93 94$(foreach lib,$(OCAML_LIBRARY),$(eval $(call OCAML_LIBRARY_template,$(lib)))) 95$(foreach lib,$(OCAML_NOC_LIBRARY),$(eval $(call OCAML_NOC_LIBRARY_template,$(lib)))) 96$(foreach p,$(OCAML_PROGRAM),$(eval $(call OCAML_PROGRAM_template,$(p)))) 97$(foreach p,$(C_PROGRAM),$(eval $(call C_PROGRAM_template,$(p)))) 98 99buildmakevars2module = $(eval $(call buildmakevars2module-closure,$(1))) 100define buildmakevars2module-closure 101 $(1): .phony 102 rm -f $(1).tmp; \ 103 $(foreach var, $(BUILD_MAKE_VARS), \ 104 printf "let %s = \"%s\";;\n" \ 105 $(shell echo $(var) | tr '[:upper:]' '[:lower:]') \ 106 $($(var)) >>$(1).tmp;) \ 107 $(call move-if-changed,$(1).tmp,$(1)) 108endef 109