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