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