8 OCAML_FLAGS?=-w @a-4-6-7-9-26-27-29
9 OCAMLCC_FLAGS?=-ccopt -Werror -ccopt -Wall -ccopt -Wextra
10 override OCAMLDEP_FLAGS:=-ml-synonym .cmo -ml-synonym .cmx -ml-synonym .ml
12 export OCAMLFIND_IGNORE_DUPS_IN:=..
18 if_args=$(if $2,$1 $2)
19 map=$(foreach x,$2,$(call $1,$x))
20 curdir:=$(notdir $(abspath .))
27 rmw=$(call if_args,rm,$(wildcard $1))
28 c clean: $(patsubst %,%/clean,$(basename $(deps)))
29 $(call rmw,Makefile.deps)
31 $(MAKE) -C $* -R clean
32 $(call rmw,$*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.a $*.cma $*.cmxa $*.byte $*.native)
36 $(call rmw,$*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.ml $*.byte $*.native)
38 $(call rmw,$*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.byte $*.native)
43 cm=$(filter %.cm,$(deps))
46 b byte: ../$(pack).cmo
47 n native: ../$(pack).cmx
49 pack_ ?=$(notdir $(abspath ..))
50 pack__ ?=$(notdir $(abspath ../..))
51 pack___?=$(notdir $(abspath ../../..))
52 camlcase=$(shell pack=$(1); printf %c $${pack} | tr '[a-z]' '[A-Z]'; printf %s $${pack\#?})
53 Pack =$(call camlcase,$(pack))
54 Pack_ =$(call camlcase,$(pack_))
55 Pack__ =$(call camlcase,$(pack__))
56 Pack___=$(call camlcase,$(pack___))
58 ../$(pack).cmo ../$(pack).cmi: $(pack_cm:=o)
59 ocamlfind ocamlc -pack -o ../$(pack).cmo $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAMLC_PACK_FLAGS) $(filter %.cmo,$^)
61 ../$(pack).cmx ../$(pack).o: $(pack_cm:=x)
62 ocamlfind ocamlopt -pack -o ../$(pack).cmx $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAMLOPT_PACK_FLAGS) $(filter %.cmx,$^)
70 o=$(filter %.o,$(deps))
72 ocamlfind ocamlc -c $(OCAML_FLAGS) $(OCAMLCC_FLAGS) $<
77 cm_ox=$(patsubst %.cm,%.cmo,$(1)) $(patsubst %.cm,%.cmx,$(1))
78 cm_oxs=$(patsubst %.cm,%.cmo,$(1)) $(patsubst %.cm,%.cmxs,$(1)) $(patsubst %.cm,%.cmx,$(1))
82 ocamlfind ocamlc -c $(OCAML_FLAGS) $(OCAMLC_FLAGS) $<
84 ocamlfind ocamlopt -c $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $<
85 %.cmxs %.cmx %cmi %.o: %.ml
86 ocamlfind ocamlopt -shared -o $*.cmxs $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $<
90 %.cmxs %.cmx %.cmi %.o: %/native
91 %.cmxs %.cmx %.cmi %.o: %
94 $(MAKE) -C $(@D) -R $(DEBUG) byte
96 $(MAKE) -C $(@D) -R $(DEBUG) native
107 o_of_a=$(patsubst %,$(1:.a=)/%,$(filter %.o,$(shell ar t $1))) $(call map,o_of_a,$(patsubst %,$(1:.a=)/%,$(filter %.a,$(shell ar t $1))))
108 a=$(filter %.a,$(deps))
110 ar cSru$(AR_FLAGS) $@ $(call map,o_of_a,$(filter %.a,$^)) $(filter %.o,$^)
111 ranlib $(RANLIB_FLAGS) $@
112 dll%.so: CC=$(shell ocamlfind ocamlc -config | sed -ne 's/^native_c_compiler: *//p')
114 $(CC) -o $@ -shared $(filter %.o,$(shell ar t $<))
119 ca=$(filter %.ca,$(deps))
120 ca_x_a=$(patsubst %.ca,%.cma,$(1)) $(patsubst %.ca,%.cmxa,$(1))
122 ocamlfind ocamlc -a -o $@ $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAML_ARCH_FLAGS) $(OCAMLC_ARCH_FLAGS) $(filter %.cmo,$^)
124 ocamlfind ocamlopt -a -o $@ $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAML_ARCH_FLAGS) $(OCAMLOPT_ARCH_FLAGS) $(filter %.cmx,$^)
129 cb_bn=$(patsubst %.cb,%.byte,$(1)) $(patsubst %.cb,%.native,$(1))
131 ocamlfind ocamlc -o $@ -linkpkg $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAML_BIN_FLAGS) $(OCAMLC_BIN_FLAGS) $(filter %.cmo,$^)
133 ocamlfind ocamlopt -o $@ -linkpkg $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAML_BIN_FLAGS) $(OCAMLOPT_BIN_FLAGS) $(filter %.cmx,$^)
135 # -------------------
136 # binary capabilities
137 # -------------------
138 %.caps: setcap=$(shell PATH="$$PATH:/sbin"; which setcap)
140 $(if $(caps),[ ! -x "$(setcap)" ] || $(setcap) "$(caps)" $*)
145 ml_of_mll=$(patsubst %.mll,%.ml,$(wildcard $(cm:.cm=.mll)))
146 ml_of_dir=$(addsuffix .ml,$(wildcard $(cm:.cm=)))
147 Makefile.deps: $(wildcard $(cm:.cm=.ml) $(cm:.cm=.mll))
148 $(call if_args,touch,$(ml_of_dir))
149 for mll in $(filter %.mll,$^); do $(ocamllex) $$mll; done
150 deps="$$(ocamlfind ocamldep $(OCAMLDEP_FLAGS) $(^:.mll=.ml))"; \
152 then printf "%s\n" "$$deps" | sed >$@ -e 's/^[^ ]*\.cmx/&s &/'; \
153 else rm -f $(ml_of_dir) $(ml_of_mll); false; fi
154 $(call if_args,rm,$(ml_of_dir))
155 $(call if_args,rm,$(ml_of_mll))
156 for dir in $(wildcard $(cm:.cm=)); do printf >>$@ '%s.cmo: %s/byte %s\n%s.cmxs %s.cmx: %s/native %s\n' "$$dir" "$$dir" "$$dir" "$$dir" "$$dir" "$$dir" "$$dir"; done
157 ifeq ($(NO_MAKEFILE_DEPS)$(findstring c,$(MAKECMDGOALS))$(findstring clean,$(MAKECMDGOALS)),)
158 include Makefile.deps
165 debug: $(filter-out debug,$(MAKECMDGOALS))
166 debug: override OCAML_FLAGS+=-verbose
167 debug: override OCAMLC_FLAGS+=-g
168 debug: override OCAMLCC_FLAGS+=-ccopt -ggdb3
169 debug: override OCAMLDEP_FLAGS+=-verbose
170 debug: override OCAMLOPT_FLAGS+=-ccopt -ggdb3
171 debug: override OCAMLRUNPARAM+=b
172 debug: override DEBUG:=debug