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