]> Git — Sourcephile - ocaml/libocaml_make.git/blob - GNUmakefile
Modification : Makefile.deps -> %.d.
[ocaml/libocaml_make.git] / GNUmakefile
1 # vim: ft=make
2
3 all: byte native
4
5 # ---------
6 # ocaml env
7 # ---------
8 OCAML_FLAGS?=-w @a-4-6-7-9-26-27-29
9 OCAMLCC_FLAGS?=-ccopt -Werror -ccopt -Wall -ccopt -Wextra
10 OCAMLCC_D_FLAGS?=-ccopt -Wno-error
11 override OCAMLDEP_FLAGS:=-ml-synonym .cmo -ml-synonym .cmx -ml-synonym .ml -ml-synonym .mll
12 export OCAMLFIND_IGNORE_DUPS_IN:=..
13 export OCAMLRUNPARAM
14
15 # --------
16 # make env
17 # --------
18 if_args=$(if $2,$1 $2)
19 map=$(foreach x,$2,$(call $1,$x))
20 ,:=,
21 .SUFFIXES:
22 MAKEFLAGS += -r
23
24 # -----
25 # clean
26 # -----
27 rmw=$(call if_args,rm,$(wildcard $1))
28 cleaning=$(findstring c,$(MAKECMDGOALS))$(findstring clean,$(MAKECMDGOALS))$(findstring cleaner,$(MAKECMDGOALS))
29 LIBOCAML_MAKE_NO_DEPS+=$(cleaning)
30 c clean: $(patsubst %,%/clean,$(basename $(deps)))
31 %/clean: %/Makefile
32 $(MAKE) -C $* -R clean$(CLEANER)
33 $(call rmw,$*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.a $*.cma $*.cmxa $*.byte $*.native)
34 %/clean: %.c
35 $(call rmw,$*.s $*.o $(if $(CLEANER),$*.d))
36 %/clean: %.mll
37 $(call rmw,$*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.ml $*.byte $*.native $(if $(CLEANER),$*.d))
38 %/clean: %.ml
39 $(call rmw,$*.s $*.startup.s $*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.byte $*.native $(if $(CLEANER),$*.d))
40 cc cleaner: CLEANER=er
41 cc cleaner: clean
42
43 # ----------
44 # ocaml deps
45 # ----------
46 ml_of_dir=$(addsuffix .ml,$(wildcard $(cm:.cm=)))
47 ml_of_mll=$(patsubst %.mll,%.ml,$(wildcard $(cm:.cm=.mll)))
48 .PRECIOUS: %.ml
49 %.d: %.ml
50 $(call if_args,touch,$(ml_of_dir))
51 errnos=`{ { ocamlfind ocamldep $(OCAMLDEP_FLAGS) $< || echo >&3 0:$$?; } | \
52 { sed >$@ -e 's/^[^ ]*\.cmx/&s &/' || echo >&3 1:$$?; } \
53 } 3>&1` && [ -z "$$errnos" ] || { rm $@ && false; }
54 $(call if_args,rm,$(ml_of_dir))
55 %.d: %/Makefile
56 printf >$@ '%s.cmo: %s/byte %s\n%s.cmxs %s.cmx: %s/native %s\n' \
57 "$*" "$*" "$*" "$*" "$*" "$*" "$*"
58
59 # ------------
60 # ocaml object
61 # ------------
62 o=$(filter %.o,$(deps))
63 ifeq ($(LIBOCAML_MAKE_NO_DEPS),)
64 include $(o:.o=.d)
65 endif
66 %.o: %.c
67 ocamlfind ocamlc -c $(OCAML_FLAGS) $(OCAMLCC_FLAGS) $(if $(DEBUG),-ccopt -Wa$(,)-aln=$*.s) $<
68 %.d: %.c
69 ocamlfind ocamlc -c -nostdlib -ccopt -MM -ccopt -MT"$@\\ $(@:d=o)" -ccopt -MF$@ $(OCAML_FLAGS) $(OCAMLCC_FLAGS) $(OCAMLCC_D_FLAGS) $<
70
71 # -----------
72 # ocaml lexer
73 # -----------
74 %.ml: %.mll
75 ocamllex $<
76
77 # ------------
78 # ocaml module
79 # ------------
80 cm=$(filter %.cm,$(deps))
81 ifeq ($(LIBOCAML_MAKE_NO_DEPS),)
82 include $(cm:.cm=.d)
83 endif
84 cm_ox=$(patsubst %.cm,%.cmo,$(1)) $(patsubst %.cm,%.cmx,$(1))
85 cm_oxs=$(patsubst %.cm,%.cmo,$(1)) $(patsubst %.cm,%.cmxs,$(1)) $(patsubst %.cm,%.cmx,$(1))
86 %.cmo: %.o
87 %.cmx: %.o
88 %.cmo %.cmi: %.ml
89 ocamlfind ocamlc -c $(OCAML_FLAGS) $(OCAMLC_FLAGS) $<
90 %.cmx %cmi %.o: %.ml
91 ocamlfind ocamlopt -c $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $<
92 %.cmxs %.cmx %cmi %.o: %.ml
93 ocamlfind ocamlopt -shared -o $*.cmxs $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $<
94 %.cmo %.cmi: %/byte
95 %.cmo %.cmi: %
96
97 %.cmxs %.cmx %.cmi %.o: %/native
98 %.cmxs %.cmx %.cmi %.o: %
99
100 %/byte:
101 $(MAKE) -C $(@D) -R $(DEBUG) byte
102 %/native:
103 $(MAKE) -C $(@D) -R $(DEBUG) native
104
105 # ----------
106 # ocaml pack
107 # ----------
108 camlcase=$(shell pack=$(1); printf %c $${pack} | tr '[a-z]' '[A-Z]'; printf %s $${pack\#?})
109 Pack=$(call camlcase,$(notdir $(abspath $1)))
110 ifdef pack
111 b byte: ../$(pack).cmo
112 n native: ../$(pack).cmx
113 pack_cm?=$(cm)
114 ../$(pack).cmo ../$(pack).cmi: $(pack_cm:=o)
115 ocamlfind ocamlc -pack -o ../$(pack).cmo $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAMLC_PACK_FLAGS) $(filter %.cmo,$^)
116 touch .
117 ../$(pack).cmx ../$(pack).o: $(pack_cm:=x)
118 ocamlfind ocamlopt -pack -o ../$(pack).cmx $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAMLOPT_PACK_FLAGS) $(filter %.cmx,$^)
119 touch .
120 endif
121
122 # --------------
123 # object archive
124 # --------------
125 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))))
126 a=$(filter %.a,$(deps))
127 %.a:
128 ar cSru$(AR_FLAGS) $@ $(call map,o_of_a,$(filter %.a,$^)) $(filter %.o,$^)
129 ranlib $(RANLIB_FLAGS) $@
130 dll%.so: CC=$(shell ocamlfind ocamlc -config | sed -ne 's/^native_c_compiler: *//p')
131 dll%.so: lib%.a
132 $(CC) -o $@ -shared $(filter %.o,$(shell ar t $<))
133
134 # -------------
135 # ocaml archive
136 # -------------
137 ca=$(filter %.ca,$(deps))
138 ca_x_a=$(patsubst %.ca,%.cma,$(1)) $(patsubst %.ca,%.cmxa,$(1))
139 %.cma:
140 ocamlfind ocamlc -a -o $@ $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAML_ARCH_FLAGS) $(OCAMLC_ARCH_FLAGS) $(filter %.cmo,$^)
141 %.cmxa:
142 ocamlfind ocamlopt -a -o $@ $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAML_ARCH_FLAGS) $(OCAMLOPT_ARCH_FLAGS) $(filter %.cmx,$^)
143
144 # ------------
145 # ocaml binary
146 # ------------
147 cb_bn=$(patsubst %.cb,%.byte,$(1)) $(patsubst %.cb,%.native,$(1))
148 %.byte:
149 ocamlfind ocamlc -o $@ -linkpkg $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAML_BIN_FLAGS) $(OCAMLC_BIN_FLAGS) $(filter %.cmo,$^)
150 %.native:
151 ocamlfind ocamlopt -o $@ -linkpkg $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAML_BIN_FLAGS) $(OCAMLOPT_BIN_FLAGS) $(filter %.cmx,$^)
152
153 # -----------------
154 # binary capability
155 # -----------------
156 %.caps: setcap=$(shell PATH="$$PATH:/sbin"; which setcap)
157 %.caps: %
158 $(if $(caps),[ ! -x "$(setcap)" ] || $(setcap) "$(caps)" $*)
159
160 # ---------------
161 # ocaml debugging
162 # ---------------
163 export DEBUG
164 debug: $(filter-out debug,$(MAKECMDGOALS))
165 debug: override OCAML_FLAGS+=-verbose
166 debug: override OCAMLC_FLAGS+=-g
167 debug: override OCAMLCC_FLAGS+=-ccopt -ggdb3
168 debug: override OCAMLDEP_FLAGS+=-verbose
169 debug: override OCAMLOPT_FLAGS+=-ccopt -ggdb3
170 debug: override OCAMLRUNPARAM+=b
171 debug: override DEBUG:=debug
172 debug:
173