]> Git — Sourcephile - ocaml/libocaml_make.git/blob - GNUmakefile
Ajout : GNUmakefile.
[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 override OCAMLDEP_FLAGS:=-ml-synonym .cmo -ml-synonym .cmx -ml-synonym .ml
11 ocamllex?=ocamllex
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 curdir:=$(notdir $(abspath .))
21 .SUFFIXES:
22 MAKEFLAGS += -r
23
24 # -----
25 # clean
26 # -----
27 rmw=$(call if_args,rm,$(wildcard $1))
28 c clean: $(patsubst %,%/clean,$(basename $(deps)))
29 $(call rmw,Makefile.deps)
30 %/clean: %/Makefile
31 $(MAKE) -C $* -R clean
32 $(call rmw,$*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.a $*.cma $*.cmxa $*.byte $*.native)
33 %/clean: %.c
34 $(call rmw,$*.o)
35 %/clean: %.mll
36 $(call rmw,$*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.ml $*.byte $*.native)
37 %/clean: %.ml
38 $(call rmw,$*.cmi $*.cmo $*.cmx $*.cmxs $*.o $*.byte $*.native)
39
40 # ----------
41 # ocaml pack
42 # ----------
43 cm=$(filter %.cm,$(deps))
44 ifndef pack
45 pack:=$(curdir)
46 b byte: ../$(pack).cmo
47 n native: ../$(pack).cmx
48 endif
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___))
57 pack_cm?=$(cm)
58 ../$(pack).cmo ../$(pack).cmi: $(pack_cm:=o)
59 ocamlfind ocamlc -pack -o ../$(pack).cmo $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAMLC_PACK_FLAGS) $(filter %.cmo,$^)
60 touch .
61 ../$(pack).cmx ../$(pack).o: $(pack_cm:=x)
62 ocamlfind ocamlopt -pack -o ../$(pack).cmx $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAMLOPT_PACK_FLAGS) $(filter %.cmx,$^)
63 touch .
64 #../%:
65 # $(MAKE) -C .. -R $*
66
67 # ------------
68 # ocaml object
69 # ------------
70 o=$(filter %.o,$(deps))
71 %.o: %.c
72 ocamlfind ocamlc -c $(OCAML_FLAGS) $(OCAMLCC_FLAGS) $<
73
74 # ------------
75 # ocaml module
76 # ------------
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))
79 %.cmo: %.o
80 %.cmx: %.o
81 %.cmo %.cmi: %.ml
82 ocamlfind ocamlc -c $(OCAML_FLAGS) $(OCAMLC_FLAGS) $<
83 %.cmx %cmi %.o: %.ml
84 ocamlfind ocamlopt -c $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $<
85 %.cmxs %.cmx %cmi %.o: %.ml
86 ocamlfind ocamlopt -shared -o $*.cmxs $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $<
87 %.cmo %.cmi: %/byte
88 %.cmo %.cmi: %
89
90 %.cmxs %.cmx %.cmi %.o: %/native
91 %.cmxs %.cmx %.cmi %.o: %
92
93 %/byte:
94 $(MAKE) -C $(@D) -R $(DEBUG) byte
95 %/native:
96 $(MAKE) -C $(@D) -R $(DEBUG) native
97
98 # -----------
99 # ocaml lexer
100 # -----------
101 %.ml: %.mll
102 $(ocamllex) $<
103
104 # --------------
105 # object archive
106 # --------------
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))
109 %.a:
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')
113 dll%.so: lib%.a
114 $(CC) -o $@ -shared $(filter %.o,$(shell ar t $<))
115
116 # -------------
117 # ocaml archive
118 # -------------
119 ca=$(filter %.ca,$(deps))
120 ca_x_a=$(patsubst %.ca,%.cma,$(1)) $(patsubst %.ca,%.cmxa,$(1))
121 %.cma:
122 ocamlfind ocamlc -a -o $@ $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAML_ARCH_FLAGS) $(OCAMLC_ARCH_FLAGS) $(filter %.cmo,$^)
123 %.cmxa:
124 ocamlfind ocamlopt -a -o $@ $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAML_ARCH_FLAGS) $(OCAMLOPT_ARCH_FLAGS) $(filter %.cmx,$^)
125
126 # ------------
127 # ocaml binary
128 # ------------
129 cb_bn=$(patsubst %.cb,%.byte,$(1)) $(patsubst %.cb,%.native,$(1))
130 %.byte:
131 ocamlfind ocamlc -o $@ -linkpkg $(OCAML_FLAGS) $(OCAMLC_FLAGS) $(OCAML_BIN_FLAGS) $(OCAMLC_BIN_FLAGS) $(filter %.cmo,$^)
132 %.native:
133 ocamlfind ocamlopt -o $@ -linkpkg $(OCAML_FLAGS) $(OCAMLOPT_FLAGS) $(OCAML_BIN_FLAGS) $(OCAMLOPT_BIN_FLAGS) $(filter %.cmx,$^)
134
135 # -------------------
136 # binary capabilities
137 # -------------------
138 %.caps: setcap=$(shell PATH="$$PATH:/sbin"; which setcap)
139 %.caps: %
140 $(if $(caps),[ ! -x "$(setcap)" ] || $(setcap) "$(caps)" $*)
141
142 # ------------------
143 # ocaml dependencies
144 # ------------------
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 ocamlfind ocamldep $(OCAMLDEP_FLAGS) $(^:.mll=.ml) | sed >$@ -e 's/^[^ ]*\.cmx/&s &/' || { rm $@ $(ml_of_dir) $(ml_of_mll); false; }
151 $(call if_args,rm,$(ml_of_dir))
152 $(call if_args,rm,$(ml_of_mll))
153 for dir in $(wildcard $(cm:.cm=)); do printf >>$@ '%s.cmo: %s/byte %s\n%s.cmx: %s/native %s\n' "$$dir" "$$dir" "$$dir" "$$dir" "$$dir" "$$dir"; done
154 ifeq ($(NO_MAKEFILE_DEPS)$(findstring c,$(MAKECMDGOALS))$(findstring clean,$(MAKECMDGOALS)),)
155 include Makefile.deps
156 endif
157
158 # ---------------
159 # ocaml debugging
160 # ---------------
161 export DEBUG
162 debug: $(filter-out debug,$(MAKECMDGOALS))
163 debug: override OCAML_FLAGS+=-verbose
164 debug: override OCAMLC_FLAGS+=-g
165 debug: override OCAMLCC_FLAGS+=-ccopt --ggdb3
166 debug: override OCAMLDEP_FLAGS+=-verbose
167 debug: override OCAMLOPT_FLAGS+=-ccopt --ggdb3
168 debug: override OCAMLRUNPARAM+=b
169 debug: override DEBUG:=debug
170 debug:
171