Commit | Line | Data |
---|---|---|
34e49164 C |
1 | ########################################################################### |
2 | # OCamlMakefile | |
3 | # Copyright (C) 1999-2007 Markus Mottl | |
4 | # | |
5 | # For updates see: | |
6 | # http://www.ocaml.info/home/ocaml_sources.html | |
7 | # | |
8 | ########################################################################### | |
9 | ||
10 | # Modified by damien for .glade.ml compilation | |
11 | ||
12 | # Set these variables to the names of the sources to be processed and | |
13 | # the result variable. Order matters during linkage! | |
14 | ||
15 | ifndef SOURCES | |
16 | SOURCES := foo.ml | |
17 | endif | |
18 | export SOURCES | |
19 | ||
20 | ifndef RES_CLIB_SUF | |
21 | RES_CLIB_SUF := _stubs | |
22 | endif | |
23 | export RES_CLIB_SUF | |
24 | ||
25 | ifndef RESULT | |
26 | RESULT := foo | |
27 | endif | |
28 | export RESULT := $(strip $(RESULT)) | |
29 | ||
30 | export LIB_PACK_NAME | |
31 | ||
32 | ifndef DOC_FILES | |
33 | DOC_FILES := $(filter %.mli, $(SOURCES)) | |
34 | endif | |
35 | export DOC_FILES | |
36 | FIRST_DOC_FILE := $(firstword $(DOC_FILES)) | |
37 | ||
38 | export BCSUFFIX | |
39 | export NCSUFFIX | |
40 | ||
41 | ifndef TOPSUFFIX | |
42 | TOPSUFFIX := .top | |
43 | endif | |
44 | export TOPSUFFIX | |
45 | ||
46 | # Eventually set include- and library-paths, libraries to link, | |
47 | # additional compilation-, link- and ocamlyacc-flags | |
48 | # Path- and library information needs not be written with "-I" and such... | |
49 | # Define THREADS if you need it, otherwise leave it unset (same for | |
50 | # USE_CAMLP4)! | |
51 | ||
52 | export THREADS | |
53 | export VMTHREADS | |
54 | export ANNOTATE | |
55 | export USE_CAMLP4 | |
56 | ||
57 | export INCDIRS | |
58 | export LIBDIRS | |
59 | export EXTLIBDIRS | |
60 | export RESULTDEPS | |
61 | export OCAML_DEFAULT_DIRS | |
62 | ||
63 | export LIBS | |
64 | export CLIBS | |
65 | export CFRAMEWORKS | |
66 | ||
67 | export OCAMLFLAGS | |
68 | export OCAMLNCFLAGS | |
69 | export OCAMLBCFLAGS | |
70 | ||
71 | export OCAMLLDFLAGS | |
72 | export OCAMLNLDFLAGS | |
73 | export OCAMLBLDFLAGS | |
74 | ||
75 | export OCAMLMKLIB_FLAGS | |
76 | ||
77 | ifndef OCAMLCPFLAGS | |
78 | OCAMLCPFLAGS := a | |
79 | endif | |
80 | export OCAMLCPFLAGS | |
81 | ||
82 | ifndef DOC_DIR | |
83 | DOC_DIR := doc | |
84 | endif | |
85 | export DOC_DIR | |
86 | ||
87 | export PPFLAGS | |
88 | ||
89 | export LFLAGS | |
90 | export YFLAGS | |
91 | export IDLFLAGS | |
92 | ||
93 | export OCAMLDOCFLAGS | |
94 | ||
95 | export OCAMLFIND_INSTFLAGS | |
96 | ||
97 | export DVIPSFLAGS | |
98 | ||
99 | export STATIC | |
100 | ||
101 | # Add a list of optional trash files that should be deleted by "make clean" | |
102 | export TRASH | |
103 | ||
104 | ECHO := echo | |
105 | ||
106 | ifdef REALLY_QUIET | |
107 | export REALLY_QUIET | |
108 | ECHO := true | |
109 | LFLAGS := $(LFLAGS) -q | |
110 | YFLAGS := $(YFLAGS) -q | |
111 | endif | |
112 | ||
113 | #################### variables depending on your OCaml-installation | |
114 | ||
115 | ifdef MINGW | |
116 | export MINGW | |
117 | WIN32 := 1 | |
118 | CFLAGS_WIN32 := -mno-cygwin | |
119 | endif | |
120 | ifdef MSVC | |
121 | export MSVC | |
122 | WIN32 := 1 | |
123 | ifndef STATIC | |
124 | CPPFLAGS_WIN32 := -DCAML_DLL | |
125 | endif | |
126 | CFLAGS_WIN32 += -nologo | |
127 | EXT_OBJ := obj | |
128 | EXT_LIB := lib | |
129 | ifeq ($(CC),gcc) | |
130 | # work around GNU Make default value | |
131 | ifdef THREADS | |
132 | CC := cl -MT | |
133 | else | |
134 | CC := cl | |
135 | endif | |
136 | endif | |
137 | ifeq ($(CXX),g++) | |
138 | # work around GNU Make default value | |
139 | CXX := $(CC) | |
140 | endif | |
141 | CFLAG_O := -Fo | |
142 | endif | |
143 | ifdef WIN32 | |
144 | EXT_CXX := cpp | |
145 | EXE := .exe | |
146 | endif | |
147 | ||
148 | ifndef EXT_OBJ | |
149 | EXT_OBJ := o | |
150 | endif | |
151 | ifndef EXT_LIB | |
152 | EXT_LIB := a | |
153 | endif | |
154 | ifndef EXT_CXX | |
155 | EXT_CXX := cc | |
156 | endif | |
157 | ifndef EXE | |
158 | EXE := # empty | |
159 | endif | |
160 | ifndef CFLAG_O | |
161 | CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! | |
162 | endif | |
163 | ||
164 | export CC | |
165 | export CXX | |
166 | export CFLAGS | |
167 | export CXXFLAGS | |
168 | export LDFLAGS | |
169 | export CPPFLAGS | |
170 | ||
171 | ifndef RPATH_FLAG | |
172 | ifdef ELF_RPATH_FLAG | |
173 | RPATH_FLAG := $(ELF_RPATH_FLAG) | |
174 | else | |
175 | RPATH_FLAG := -R | |
176 | endif | |
177 | endif | |
178 | export RPATH_FLAG | |
179 | ||
180 | ifndef MSVC | |
181 | ifndef PIC_CFLAGS | |
182 | PIC_CFLAGS := -fPIC | |
183 | endif | |
184 | ifndef PIC_CPPFLAGS | |
185 | PIC_CPPFLAGS := -DPIC | |
186 | endif | |
187 | endif | |
188 | ||
189 | export PIC_CFLAGS | |
190 | export PIC_CPPFLAGS | |
191 | ||
192 | BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) | |
193 | NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) | |
194 | TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) | |
195 | ||
196 | ifndef OCAMLFIND | |
197 | OCAMLFIND := ocamlfind | |
198 | endif | |
199 | export OCAMLFIND | |
200 | ||
201 | ifndef OCAMLC | |
202 | OCAMLC := ocamlc | |
203 | endif | |
204 | export OCAMLC | |
205 | ||
206 | ifndef OCAMLOPT | |
207 | OCAMLOPT := ocamlopt | |
208 | endif | |
209 | export OCAMLOPT | |
210 | ||
211 | ifndef OCAMLMKTOP | |
212 | OCAMLMKTOP := ocamlmktop | |
213 | endif | |
214 | export OCAMLMKTOP | |
215 | ||
216 | ifndef OCAMLCP | |
217 | OCAMLCP := ocamlcp | |
218 | endif | |
219 | export OCAMLCP | |
220 | ||
221 | ifndef OCAMLDEP | |
222 | OCAMLDEP := ocamldep | |
223 | endif | |
224 | export OCAMLDEP | |
225 | ||
226 | ifndef OCAMLLEX | |
227 | OCAMLLEX := ocamllex | |
228 | endif | |
229 | export OCAMLLEX | |
230 | ||
231 | ifndef OCAMLYACC | |
232 | OCAMLYACC := ocamlyacc | |
233 | endif | |
234 | export OCAMLYACC | |
235 | ||
236 | ifndef OCAMLMKLIB | |
237 | OCAMLMKLIB := ocamlmklib | |
238 | endif | |
239 | export OCAMLMKLIB | |
240 | ||
241 | ifndef OCAML_GLADECC | |
242 | OCAML_GLADECC := lablgladecc2 | |
243 | endif | |
244 | export OCAML_GLADECC | |
245 | ||
246 | ifndef OCAML_GLADECC_FLAGS | |
247 | OCAML_GLADECC_FLAGS := | |
248 | endif | |
249 | export OCAML_GLADECC_FLAGS | |
250 | ||
251 | ifndef CAMELEON_REPORT | |
252 | CAMELEON_REPORT := report | |
253 | endif | |
254 | export CAMELEON_REPORT | |
255 | ||
256 | ifndef CAMELEON_REPORT_FLAGS | |
257 | CAMELEON_REPORT_FLAGS := | |
258 | endif | |
259 | export CAMELEON_REPORT_FLAGS | |
260 | ||
261 | ifndef CAMELEON_ZOGGY | |
262 | CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo | |
263 | endif | |
264 | export CAMELEON_ZOGGY | |
265 | ||
266 | ifndef CAMELEON_ZOGGY_FLAGS | |
267 | CAMELEON_ZOGGY_FLAGS := | |
268 | endif | |
269 | export CAMELEON_ZOGGY_FLAGS | |
270 | ||
271 | ifndef OXRIDL | |
272 | OXRIDL := oxridl | |
273 | endif | |
274 | export OXRIDL | |
275 | ||
276 | ifndef CAMLIDL | |
277 | CAMLIDL := camlidl | |
278 | endif | |
279 | export CAMLIDL | |
280 | ||
281 | ifndef CAMLIDLDLL | |
282 | CAMLIDLDLL := camlidldll | |
283 | endif | |
284 | export CAMLIDLDLL | |
285 | ||
286 | ifndef NOIDLHEADER | |
287 | MAYBE_IDL_HEADER := -header | |
288 | endif | |
289 | export NOIDLHEADER | |
290 | ||
291 | export NO_CUSTOM | |
292 | ||
293 | ifndef CAMLP4 | |
294 | CAMLP4 := camlp4 | |
295 | endif | |
296 | export CAMLP4 | |
297 | ||
298 | ifndef REAL_OCAMLFIND | |
299 | ifdef PACKS | |
300 | ifndef CREATE_LIB | |
301 | ifdef THREADS | |
302 | PACKS += threads | |
303 | endif | |
304 | endif | |
305 | empty := | |
306 | space := $(empty) $(empty) | |
307 | comma := , | |
308 | ifdef PREDS | |
309 | PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) | |
310 | PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) | |
311 | OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) | |
312 | # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) | |
313 | OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) | |
314 | OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) | |
315 | else | |
316 | OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) | |
317 | OCAML_DEP_PACKAGES := | |
318 | endif | |
319 | OCAML_FIND_LINKPKG := -linkpkg | |
320 | REAL_OCAMLFIND := $(OCAMLFIND) | |
321 | endif | |
322 | endif | |
323 | ||
324 | export OCAML_FIND_PACKAGES | |
325 | export OCAML_DEP_PACKAGES | |
326 | export OCAML_FIND_LINKPKG | |
327 | export REAL_OCAMLFIND | |
328 | ||
329 | ifndef OCAMLDOC | |
330 | OCAMLDOC := ocamldoc | |
331 | endif | |
332 | export OCAMLDOC | |
333 | ||
334 | ifndef LATEX | |
335 | LATEX := latex | |
336 | endif | |
337 | export LATEX | |
338 | ||
339 | ifndef DVIPS | |
340 | DVIPS := dvips | |
341 | endif | |
342 | export DVIPS | |
343 | ||
344 | ifndef PS2PDF | |
345 | PS2PDF := ps2pdf | |
346 | endif | |
347 | export PS2PDF | |
348 | ||
349 | ifndef OCAMLMAKEFILE | |
350 | OCAMLMAKEFILE := OCamlMakefile | |
351 | endif | |
352 | export OCAMLMAKEFILE | |
353 | ||
354 | ifndef OCAMLLIBPATH | |
355 | OCAMLLIBPATH := \ | |
356 | $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/local/lib/ocaml) | |
357 | endif | |
358 | export OCAMLLIBPATH | |
359 | ||
360 | ifndef OCAML_LIB_INSTALL | |
361 | OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib | |
362 | endif | |
363 | export OCAML_LIB_INSTALL | |
364 | ||
365 | ########################################################################### | |
366 | ||
367 | #################### change following sections only if | |
368 | #################### you know what you are doing! | |
369 | ||
370 | # delete target files when a build command fails | |
371 | .PHONY: .DELETE_ON_ERROR | |
372 | .DELETE_ON_ERROR: | |
373 | ||
374 | # for pedants using "--warn-undefined-variables" | |
375 | export MAYBE_IDL | |
376 | export REAL_RESULT | |
377 | export CAMLIDLFLAGS | |
378 | export THREAD_FLAG | |
379 | export RES_CLIB | |
380 | export MAKEDLL | |
381 | export ANNOT_FLAG | |
382 | export C_OXRIDL | |
383 | export SUBPROJS | |
384 | export CFLAGS_WIN32 | |
385 | export CPPFLAGS_WIN32 | |
386 | ||
387 | INCFLAGS := | |
388 | ||
389 | SHELL := /bin/sh | |
390 | ||
391 | MLDEPDIR := ._d | |
392 | BCDIDIR := ._bcdi | |
393 | NCDIDIR := ._ncdi | |
394 | ||
395 | FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.m %.$(EXT_CXX) %.rep %.zog %.glade | |
396 | ||
397 | FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) | |
398 | SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) | |
399 | ||
400 | FILTERED_REP := $(filter %.rep, $(FILTERED)) | |
401 | DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) | |
402 | AUTO_REP := $(FILTERED_REP:.rep=.ml) | |
403 | ||
404 | FILTERED_ZOG := $(filter %.zog, $(FILTERED)) | |
405 | DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) | |
406 | AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) | |
407 | ||
408 | FILTERED_GLADE := $(filter %.glade, $(FILTERED)) | |
409 | DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) | |
410 | AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) | |
411 | ||
412 | FILTERED_ML := $(filter %.ml, $(FILTERED)) | |
413 | DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) | |
414 | ||
415 | FILTERED_MLI := $(filter %.mli, $(FILTERED)) | |
416 | DEP_MLI := $(FILTERED_MLI:.mli=.di) | |
417 | ||
418 | FILTERED_MLL := $(filter %.mll, $(FILTERED)) | |
419 | DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) | |
420 | AUTO_MLL := $(FILTERED_MLL:.mll=.ml) | |
421 | ||
422 | FILTERED_MLY := $(filter %.mly, $(FILTERED)) | |
423 | DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) | |
424 | AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) | |
425 | ||
426 | FILTERED_IDL := $(filter %.idl, $(FILTERED)) | |
427 | DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) | |
428 | C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) | |
429 | ifndef NOIDLHEADER | |
430 | C_IDL += $(FILTERED_IDL:.idl=.h) | |
431 | endif | |
432 | OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) | |
433 | AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) | |
434 | ||
435 | FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) | |
436 | DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) | |
437 | AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) | |
438 | ||
439 | FILTERED_C_CXX := $(filter %.c %.m %.$(EXT_CXX), $(FILTERED)) | |
440 | OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) | |
441 | OBJ_C_CXX := $(OBJ_C_CXX:.m=.$(EXT_OBJ)) | |
442 | OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) | |
443 | ||
444 | PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) | |
445 | ||
446 | ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) | |
447 | ||
448 | MLDEPS := $(filter %.d, $(ALL_DEPS)) | |
449 | MLIDEPS := $(filter %.di, $(ALL_DEPS)) | |
450 | BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) | |
451 | NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) | |
452 | ||
453 | ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) | |
454 | ||
455 | IMPLO_INTF := $(ALLML:%.mli=%.mli.__) | |
456 | IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ | |
457 | $(basename $(file)).cmi $(basename $(file)).cmo) | |
458 | IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) | |
459 | IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) | |
460 | ||
461 | IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) | |
462 | ||
463 | INTF := $(filter %.cmi, $(IMPLO_INTF)) | |
464 | IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) | |
465 | IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) | |
466 | IMPL_ASM := $(IMPL_CMO:.cmo=.asm) | |
467 | IMPL_S := $(IMPL_CMO:.cmo=.s) | |
468 | ||
469 | OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) | |
470 | OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) | |
471 | ||
472 | EXECS := $(addsuffix $(EXE), \ | |
473 | $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) | |
474 | ifdef WIN32 | |
475 | EXECS += $(BCRESULT).dll $(NCRESULT).dll | |
476 | endif | |
477 | ||
478 | CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) | |
479 | ifneq ($(strip $(OBJ_LINK)),) | |
480 | RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) | |
481 | endif | |
482 | ||
483 | ifdef WIN32 | |
484 | DLLSONAME := $(CLIB_BASE).dll | |
485 | else | |
486 | DLLSONAME := dll$(CLIB_BASE).so | |
487 | endif | |
488 | ||
489 | NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ | |
490 | $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ | |
491 | $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ | |
492 | $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ | |
493 | $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ | |
494 | $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o | |
495 | ||
496 | ifndef STATIC | |
497 | NONEXECS += $(DLLSONAME) | |
498 | endif | |
499 | ||
500 | ifndef LIBINSTALL_FILES | |
501 | LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ | |
502 | $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) | |
503 | ifndef STATIC | |
504 | ifneq ($(strip $(OBJ_LINK)),) | |
505 | LIBINSTALL_FILES += $(DLLSONAME) | |
506 | endif | |
507 | endif | |
508 | endif | |
509 | ||
510 | export LIBINSTALL_FILES | |
511 | ||
512 | ifdef WIN32 | |
513 | # some extra stuff is created while linking DLLs | |
514 | NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib | |
515 | endif | |
516 | ||
517 | TARGETS := $(EXECS) $(NONEXECS) | |
518 | ||
519 | # If there are IDL-files | |
520 | ifneq ($(strip $(FILTERED_IDL)),) | |
521 | MAYBE_IDL := -cclib -lcamlidl | |
522 | endif | |
523 | ||
524 | ifdef USE_CAMLP4 | |
525 | CAMLP4PATH := \ | |
526 | $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/local/lib/camlp4) | |
527 | INCFLAGS := -I $(CAMLP4PATH) | |
528 | CINCFLAGS := -I$(CAMLP4PATH) | |
529 | endif | |
530 | ||
531 | DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) | |
532 | INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) | |
533 | CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) | |
534 | ||
535 | ifndef MSVC | |
536 | CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ | |
537 | $(EXTLIBDIRS:%=-L%) $(OCAML_DEFAULT_DIRS:%=-L%) | |
538 | ||
539 | ifeq ($(ELF_RPATH), yes) | |
540 | CLIBFLAGS += $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) | |
541 | endif | |
542 | endif | |
543 | ||
544 | ifndef PROFILING | |
545 | INTF_OCAMLC := $(OCAMLC) | |
546 | else | |
547 | ifndef THREADS | |
548 | INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) | |
549 | else | |
550 | # OCaml does not support profiling byte code | |
551 | # with threads (yet), therefore we force an error. | |
552 | ifndef REAL_OCAMLC | |
553 | $(error Profiling of multithreaded byte code not yet supported by OCaml) | |
554 | endif | |
555 | INTF_OCAMLC := $(OCAMLC) | |
556 | endif | |
557 | endif | |
558 | ||
559 | ifndef MSVC | |
560 | COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ | |
561 | $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ | |
562 | $(EXTLIBDIRS:%=-ccopt -Wl $(OCAML_DEFAULT_DIRS:%=-ccopt -L%)) | |
563 | ||
564 | ifeq ($(ELF_RPATH),yes) | |
565 | COMMON_LDFLAGS += $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) | |
566 | endif | |
567 | else | |
568 | COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ | |
569 | $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ | |
570 | $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " | |
571 | endif | |
572 | ||
573 | CLIBS_OPTS := $(CLIBS:%=-cclib -l%) $(CFRAMEWORKS:%=-cclib '-framework %') | |
574 | ifdef MSVC | |
575 | ifndef STATIC | |
576 | # MSVC libraries do not have 'lib' prefix | |
577 | CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) | |
578 | endif | |
579 | endif | |
580 | ||
581 | ifneq ($(strip $(OBJ_LINK)),) | |
582 | ifdef CREATE_LIB | |
583 | OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) | |
584 | else | |
585 | OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) | |
586 | endif | |
587 | else | |
588 | OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) | |
589 | endif | |
590 | ||
591 | # If we have to make byte-code | |
592 | ifndef REAL_OCAMLC | |
593 | BYTE_OCAML := y | |
594 | ||
595 | # EXTRADEPS is added dependencies we have to insert for all | |
596 | # executable files we generate. Ideally it should be all of the | |
597 | # libraries we use, but it's hard to find the ones that get searched on | |
598 | # the path since I don't know the paths built into the compiler, so | |
599 | # just include the ones with slashes in their names. | |
600 | EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) | |
601 | SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) | |
602 | ||
603 | REAL_OCAMLC := $(INTF_OCAMLC) | |
604 | ||
605 | REAL_IMPL := $(IMPL_CMO) | |
606 | REAL_IMPL_INTF := $(IMPLO_INTF) | |
607 | IMPL_SUF := .cmo | |
608 | ||
609 | DEPFLAGS := | |
610 | MAKE_DEPS := $(MLDEPS) $(BCDEPIS) | |
611 | ||
612 | ifdef CREATE_LIB | |
613 | override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) | |
614 | override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) | |
615 | ifndef STATIC | |
616 | ifneq ($(strip $(OBJ_LINK)),) | |
617 | MAKEDLL := $(DLLSONAME) | |
618 | ALL_LDFLAGS := -dllib $(DLLSONAME) | |
619 | endif | |
620 | endif | |
621 | endif | |
622 | ||
623 | ifndef NO_CUSTOM | |
624 | ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS) $(CFRAMEWORKS))" "" | |
625 | ALL_LDFLAGS += -custom | |
626 | endif | |
627 | endif | |
628 | ||
629 | ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ | |
630 | $(COMMON_LDFLAGS) $(LIBS:%=%.cma) | |
631 | CAMLIDLDLLFLAGS := | |
632 | ||
633 | ifdef THREADS | |
634 | ifdef VMTHREADS | |
635 | THREAD_FLAG := -vmthread | |
636 | else | |
637 | THREAD_FLAG := -thread | |
638 | endif | |
639 | ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) | |
640 | ifndef CREATE_LIB | |
641 | ifndef REAL_OCAMLFIND | |
642 | ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) | |
643 | endif | |
644 | endif | |
645 | endif | |
646 | ||
647 | # we have to make native-code | |
648 | else | |
649 | EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) | |
650 | ifndef PROFILING | |
651 | SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) | |
652 | PLDFLAGS := | |
653 | else | |
654 | SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) | |
655 | PLDFLAGS := -p | |
656 | endif | |
657 | ||
658 | REAL_IMPL := $(IMPL_CMX) | |
659 | REAL_IMPL_INTF := $(IMPLX_INTF) | |
660 | IMPL_SUF := .cmx | |
661 | ||
662 | override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) | |
663 | ||
664 | DEPFLAGS := -native | |
665 | MAKE_DEPS := $(MLDEPS) $(NCDEPIS) | |
666 | ||
667 | ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ | |
668 | $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) | |
669 | CAMLIDLDLLFLAGS := -opt | |
670 | ||
671 | ifndef CREATE_LIB | |
672 | ALL_LDFLAGS += $(LIBS:%=%.cmxa) | |
673 | else | |
674 | override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) | |
675 | override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) | |
676 | endif | |
677 | ||
678 | ifdef THREADS | |
679 | THREAD_FLAG := -thread | |
680 | ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) | |
681 | ifndef CREATE_LIB | |
682 | ifndef REAL_OCAMLFIND | |
683 | ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) | |
684 | endif | |
685 | endif | |
686 | endif | |
687 | endif | |
688 | ||
689 | export MAKE_DEPS | |
690 | ||
691 | ifdef ANNOTATE | |
692 | ANNOT_FLAG := -dtypes | |
693 | else | |
694 | endif | |
695 | ||
696 | ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ | |
697 | $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) | |
698 | ||
699 | ifdef make_deps | |
700 | -include $(MAKE_DEPS) | |
701 | PRE_TARGETS := | |
702 | endif | |
703 | ||
704 | ########################################################################### | |
705 | # USER RULES | |
706 | ||
707 | # Call "OCamlMakefile QUIET=" to get rid of all of the @'s. | |
708 | QUIET=@ | |
709 | ||
710 | # generates byte-code (default) | |
711 | byte-code: $(PRE_TARGETS) | |
712 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ | |
713 | REAL_RESULT="$(BCRESULT)" make_deps=yes | |
714 | bc: byte-code | |
715 | ||
716 | byte-code-nolink: $(PRE_TARGETS) | |
717 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ | |
718 | REAL_RESULT="$(BCRESULT)" make_deps=yes | |
719 | bcnl: byte-code-nolink | |
720 | ||
721 | top: $(PRE_TARGETS) | |
722 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ | |
723 | REAL_RESULT="$(BCRESULT)" make_deps=yes | |
724 | ||
725 | # generates native-code | |
726 | ||
727 | native-code: $(PRE_TARGETS) | |
728 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ | |
729 | REAL_RESULT="$(NCRESULT)" \ | |
730 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
731 | make_deps=yes | |
732 | nc: native-code | |
733 | ||
734 | native-code-nolink: $(PRE_TARGETS) | |
735 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ | |
736 | REAL_RESULT="$(NCRESULT)" \ | |
737 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
738 | make_deps=yes | |
739 | ncnl: native-code-nolink | |
740 | ||
741 | # generates byte-code libraries | |
742 | byte-code-library: $(PRE_TARGETS) | |
743 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
744 | $(RES_CLIB) $(BCRESULT).cma \ | |
745 | REAL_RESULT="$(BCRESULT)" \ | |
746 | CREATE_LIB=yes \ | |
747 | make_deps=yes | |
748 | bcl: byte-code-library | |
749 | ||
750 | # generates native-code libraries | |
751 | native-code-library: $(PRE_TARGETS) | |
752 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
753 | $(RES_CLIB) $(NCRESULT).cmxa \ | |
754 | REAL_RESULT="$(NCRESULT)" \ | |
755 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
756 | CREATE_LIB=yes \ | |
757 | make_deps=yes | |
758 | ncl: native-code-library | |
759 | ||
760 | ifdef WIN32 | |
761 | # generates byte-code dll | |
762 | byte-code-dll: $(PRE_TARGETS) | |
763 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
764 | $(RES_CLIB) $(BCRESULT).dll \ | |
765 | REAL_RESULT="$(BCRESULT)" \ | |
766 | make_deps=yes | |
767 | bcd: byte-code-dll | |
768 | ||
769 | # generates native-code dll | |
770 | native-code-dll: $(PRE_TARGETS) | |
771 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
772 | $(RES_CLIB) $(NCRESULT).dll \ | |
773 | REAL_RESULT="$(NCRESULT)" \ | |
774 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
775 | make_deps=yes | |
776 | ncd: native-code-dll | |
777 | endif | |
778 | ||
779 | # generates byte-code with debugging information | |
780 | debug-code: $(PRE_TARGETS) | |
781 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ | |
782 | REAL_RESULT="$(BCRESULT)" make_deps=yes \ | |
783 | OCAMLFLAGS="-g $(OCAMLFLAGS)" \ | |
784 | OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" | |
785 | dc: debug-code | |
786 | ||
787 | debug-code-nolink: $(PRE_TARGETS) | |
788 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ | |
789 | REAL_RESULT="$(BCRESULT)" make_deps=yes \ | |
790 | OCAMLFLAGS="-g $(OCAMLFLAGS)" \ | |
791 | OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" | |
792 | dcnl: debug-code-nolink | |
793 | ||
794 | # generates byte-code with debugging information (native code) | |
795 | debug-native-code: $(PRE_TARGETS) | |
796 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ | |
797 | REAL_RESULT="$(NCRESULT)" make_deps=yes \ | |
798 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
799 | OCAMLFLAGS="-g $(OCAMLFLAGS)" \ | |
800 | OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" | |
801 | dnc: debug-native-code | |
802 | ||
803 | debug-native-code-nolink: $(PRE_TARGETS) | |
804 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ | |
805 | REAL_RESULT="$(NCRESULT)" make_deps=yes \ | |
806 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
807 | OCAMLFLAGS="-g $(OCAMLFLAGS)" \ | |
808 | OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" | |
809 | dncnl: debug-native-code-nolink | |
810 | ||
811 | # generates byte-code libraries with debugging information | |
812 | debug-code-library: $(PRE_TARGETS) | |
813 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
814 | $(RES_CLIB) $(BCRESULT).cma \ | |
815 | REAL_RESULT="$(BCRESULT)" make_deps=yes \ | |
816 | CREATE_LIB=yes \ | |
817 | OCAMLFLAGS="-g $(OCAMLFLAGS)" \ | |
818 | OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" | |
819 | dcl: debug-code-library | |
820 | ||
821 | # generates byte-code libraries with debugging information (native code) | |
822 | debug-native-code-library: $(PRE_TARGETS) | |
823 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
824 | $(RES_CLIB) $(NCRESULT).cma \ | |
825 | REAL_RESULT="$(NCRESULT)" make_deps=yes \ | |
826 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
827 | CREATE_LIB=yes \ | |
828 | OCAMLFLAGS="-g $(OCAMLFLAGS)" \ | |
829 | OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" | |
830 | dncl: debug-native-code-library | |
831 | ||
832 | # generates byte-code for profiling | |
833 | profiling-byte-code: $(PRE_TARGETS) | |
834 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ | |
835 | REAL_RESULT="$(BCRESULT)" PROFILING="y" \ | |
836 | make_deps=yes | |
837 | pbc: profiling-byte-code | |
838 | ||
839 | # generates native-code | |
840 | ||
841 | profiling-native-code: $(PRE_TARGETS) | |
842 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ | |
843 | REAL_RESULT="$(NCRESULT)" \ | |
844 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
845 | PROFILING="y" \ | |
846 | make_deps=yes | |
847 | pnc: profiling-native-code | |
848 | ||
849 | # generates byte-code libraries | |
850 | profiling-byte-code-library: $(PRE_TARGETS) | |
851 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
852 | $(RES_CLIB) $(BCRESULT).cma \ | |
853 | REAL_RESULT="$(BCRESULT)" PROFILING="y" \ | |
854 | CREATE_LIB=yes \ | |
855 | make_deps=yes | |
856 | pbcl: profiling-byte-code-library | |
857 | ||
858 | # generates native-code libraries | |
859 | profiling-native-code-library: $(PRE_TARGETS) | |
860 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
861 | $(RES_CLIB) $(NCRESULT).cmxa \ | |
862 | REAL_RESULT="$(NCRESULT)" PROFILING="y" \ | |
863 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
864 | CREATE_LIB=yes \ | |
865 | make_deps=yes | |
866 | pncl: profiling-native-code-library | |
867 | ||
868 | # packs byte-code objects | |
869 | pack-byte-code: $(PRE_TARGETS) | |
870 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ | |
871 | REAL_RESULT="$(BCRESULT)" \ | |
872 | PACK_LIB=yes make_deps=yes | |
873 | pabc: pack-byte-code | |
874 | ||
875 | # packs native-code objects | |
876 | pack-native-code: $(PRE_TARGETS) | |
877 | $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ | |
878 | $(NCRESULT).cmx $(NCRESULT).o \ | |
879 | REAL_RESULT="$(NCRESULT)" \ | |
880 | REAL_OCAMLC="$(OCAMLOPT)" \ | |
881 | PACK_LIB=yes make_deps=yes | |
882 | panc: pack-native-code | |
883 | ||
884 | # generates HTML-documentation | |
885 | htdoc: $(DOC_DIR)/$(RESULT)/html/index.html | |
886 | ||
887 | # generates Latex-documentation | |
888 | ladoc: $(DOC_DIR)/$(RESULT)/latex/doc.tex | |
889 | ||
890 | # generates PostScript-documentation | |
891 | psdoc: $(DOC_DIR)/$(RESULT)/latex/doc.ps | |
892 | ||
893 | # generates PDF-documentation | |
894 | pdfdoc: $(DOC_DIR)/$(RESULT)/latex/doc.pdf | |
895 | ||
896 | # generates all supported forms of documentation | |
897 | doc: htdoc ladoc psdoc pdfdoc | |
898 | ||
899 | ########################################################################### | |
900 | # LOW LEVEL RULES | |
901 | ||
902 | $(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) | |
903 | $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ | |
904 | $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ | |
905 | $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ | |
906 | $(REAL_IMPL) | |
907 | ||
908 | nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) | |
909 | ||
910 | ifdef WIN32 | |
911 | $(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) | |
912 | $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ | |
913 | -o $@ $(REAL_IMPL) | |
914 | endif | |
915 | ||
916 | %$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) | |
917 | $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ | |
918 | $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ | |
919 | $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ | |
920 | $(REAL_IMPL) | |
921 | ||
922 | .SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ | |
923 | .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .m .$(EXT_CXX) .h .so \ | |
924 | .rep .zog .glade | |
925 | ||
926 | ifndef STATIC | |
927 | ifdef MINGW | |
928 | $(DLLSONAME): $(OBJ_LINK) | |
929 | $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ | |
930 | -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ | |
931 | $(OCAMLLIBPATH)/ocamlrun.a \ | |
932 | -Wl,--export-all-symbols \ | |
933 | -Wl,--no-whole-archive | |
934 | else | |
935 | ifdef MSVC | |
936 | $(DLLSONAME): $(OBJ_LINK) | |
937 | link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ | |
938 | $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ | |
939 | $(OCAMLLIBPATH)/ocamlrun.lib | |
940 | ||
941 | else | |
942 | $(DLLSONAME): $(OBJ_LINK) | |
943 | $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ | |
944 | -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) $(CFRAMEWORKS:%=-framework %) \ | |
945 | $(OCAMLMKLIB_FLAGS) | |
946 | endif | |
947 | endif | |
948 | endif | |
949 | ||
950 | ifndef LIB_PACK_NAME | |
951 | $(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) | |
952 | $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(REAL_IMPL) | |
953 | ||
954 | $(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) | |
955 | $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(REAL_IMPL) | |
956 | else | |
957 | ifdef BYTE_OCAML | |
958 | $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) | |
959 | $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(OCAMLLDFLAGS) $(REAL_IMPL) | |
960 | else | |
961 | $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) | |
962 | $(REAL_OCAMLFIND) $(OCAMLOPT) -pack -o $(LIB_PACK_NAME).cmx $(OCAMLLDFLAGS) $(REAL_IMPL) | |
963 | endif | |
964 | ||
965 | $(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) | |
966 | $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@ $(LIB_PACK_NAME).cmo | |
967 | ||
968 | $(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) | |
969 | $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(filter-out -custom, $(ALL_LDFLAGS)) $(OBJS_LIBS) -o $@ $(LIB_PACK_NAME).cmx | |
970 | endif | |
971 | ||
972 | $(RES_CLIB): $(OBJ_LINK) | |
973 | ifndef MSVC | |
974 | ifneq ($(strip $(OBJ_LINK)),) | |
975 | $(AR) rcs $@ $(OBJ_LINK) | |
976 | endif | |
977 | else | |
978 | ifneq ($(strip $(OBJ_LINK)),) | |
979 | lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) | |
980 | endif | |
981 | endif | |
982 | ||
983 | .mli.cmi: $(EXTRADEPS) | |
984 | $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ | |
985 | if [ -z "$$pp" ]; then \ | |
986 | $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ | |
987 | -c $(THREAD_FLAG) $(ANNOT_FLAG) \ | |
988 | $(OCAMLFLAGS) $(INCFLAGS) $<; \ | |
989 | $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ | |
990 | -c $(THREAD_FLAG) $(ANNOT_FLAG) \ | |
991 | $(OCAMLFLAGS) $(INCFLAGS) $<; \ | |
992 | else \ | |
993 | $(ECHO) $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ | |
994 | -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ | |
995 | $(OCAMLFLAGS) $(INCFLAGS) $<; \ | |
996 | $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ | |
997 | -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ | |
998 | $(OCAMLFLAGS) $(INCFLAGS) $<; \ | |
999 | fi | |
1000 | ||
1001 | .ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) | |
1002 | $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ | |
1003 | if [ -z "$$pp" ]; then \ | |
1004 | $(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ | |
1005 | -c $(ALL_OCAMLCFLAGS) $<; \ | |
1006 | $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ | |
1007 | -c $(ALL_OCAMLCFLAGS) $<; \ | |
1008 | else \ | |
1009 | $(ECHO) $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ | |
1010 | -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ | |
1011 | $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ | |
1012 | -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ | |
1013 | fi | |
1014 | ||
1015 | ifdef PACK_LIB | |
1016 | $(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) | |
1017 | $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ | |
1018 | $(OBJS_LIBS) -o $@ $(REAL_IMPL) | |
1019 | endif | |
1020 | ||
1021 | .PRECIOUS: %.ml | |
1022 | %.ml: %.mll | |
1023 | $(OCAMLLEX) $(LFLAGS) $< | |
1024 | ||
1025 | .PRECIOUS: %.ml %.mli | |
1026 | %.ml %.mli: %.mly | |
1027 | $(OCAMLYACC) $(YFLAGS) $< | |
1028 | $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \ | |
1029 | if [ ! -z "$$pp" ]; then \ | |
1030 | mv $*.ml $*.ml.temporary; \ | |
1031 | echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \ | |
1032 | cat $*.ml.temporary >> $*.ml; \ | |
1033 | rm $*.ml.temporary; \ | |
1034 | mv $*.mli $*.mli.temporary; \ | |
1035 | echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \ | |
1036 | cat $*.mli.temporary >> $*.mli; \ | |
1037 | rm $*.mli.temporary; \ | |
1038 | fi | |
1039 | ||
1040 | ||
1041 | .PRECIOUS: %.ml | |
1042 | %.ml: %.rep | |
1043 | $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< | |
1044 | ||
1045 | .PRECIOUS: %.ml | |
1046 | %.ml: %.zog | |
1047 | $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ | |
1048 | ||
1049 | .PRECIOUS: %.ml | |
1050 | %.ml: %.glade | |
1051 | $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ | |
1052 | ||
1053 | .PRECIOUS: %.ml %.mli | |
1054 | %.ml %.mli: %.oxridl | |
1055 | $(OXRIDL) $< | |
1056 | ||
1057 | .PRECIOUS: %.ml %.mli %_stubs.c %.h | |
1058 | %.ml %.mli %_stubs.c %.h: %.idl | |
1059 | $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ | |
1060 | $(CAMLIDLFLAGS) $< | |
1061 | $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi | |
1062 | ||
1063 | .c.$(EXT_OBJ): | |
1064 | $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ | |
1065 | $(CPPFLAGS) $(CPPFLAGS_WIN32) \ | |
1066 | $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< | |
1067 | ||
1068 | .m.$(EXT_OBJ): | |
1069 | $(CC) -c $(CFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ | |
1070 | -I'$(OCAMLLIBPATH)' \ | |
1071 | $< $(CFLAG_O)$@ | |
1072 | ||
1073 | .$(EXT_CXX).$(EXT_OBJ): | |
1074 | $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ | |
1075 | -I'$(OCAMLLIBPATH)' \ | |
1076 | $< $(CFLAG_O)$@ | |
1077 | ||
1078 | $(MLDEPDIR)/%.d: %.ml | |
1079 | $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi | |
1080 | $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ | |
1081 | if [ -z "$$pp" ]; then \ | |
1082 | $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ | |
1083 | $(DINCFLAGS) $< \> $@; \ | |
1084 | $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ | |
1085 | $(DINCFLAGS) $< > $@; \ | |
1086 | else \ | |
1087 | $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ | |
1088 | -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ | |
1089 | $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ | |
1090 | -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ | |
1091 | fi | |
1092 | ||
1093 | $(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli | |
1094 | $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi | |
1095 | $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ | |
1096 | if [ -z "$$pp" ]; then \ | |
1097 | $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \ | |
1098 | $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ | |
1099 | else \ | |
1100 | $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ | |
1101 | -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ | |
1102 | $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ | |
1103 | -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ | |
1104 | fi | |
1105 | ||
1106 | $(DOC_DIR)/$(RESULT)/html: | |
1107 | mkdir -p $@ | |
1108 | ||
1109 | $(DOC_DIR)/$(RESULT)/html/index.html: $(DOC_DIR)/$(RESULT)/html $(DOC_FILES) | |
1110 | rm -rf $</* | |
1111 | $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $(FIRST_DOC_FILE)`; \ | |
1112 | if [ -z "$$pp" ]; then \ | |
1113 | $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -html -d $< $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ | |
1114 | $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -html -d $< $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ | |
1115 | else \ | |
1116 | $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp \"$$pp $(PPFLAGS)\" -html -d $< $(OCAMLDOCFLAGS) \ | |
1117 | $(INCFLAGS) $(DOC_FILES); \ | |
1118 | $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp "$$pp $(PPFLAGS)" -html -d $< $(OCAMLDOCFLAGS) \ | |
1119 | $(INCFLAGS) $(DOC_FILES); \ | |
1120 | fi | |
1121 | ||
1122 | $(DOC_DIR)/$(RESULT)/latex: | |
1123 | mkdir -p $@ | |
1124 | ||
1125 | $(DOC_DIR)/$(RESULT)/latex/doc.tex: $(DOC_DIR)/$(RESULT)/latex $(DOC_FILES) | |
1126 | rm -rf $</* | |
1127 | $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $(FIRST_DOC_FILE)`; \ | |
1128 | if [ -z "$$pp" ]; then \ | |
1129 | $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \ | |
1130 | $(DOC_FILES) -o $@; \ | |
1131 | $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \ | |
1132 | -o $@; \ | |
1133 | else \ | |
1134 | $(ECHO) $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \ | |
1135 | $(INCFLAGS) $(DOC_FILES) -o $@; \ | |
1136 | $(REAL_OCAMLFIND) $(OCAMLDOC) $(OCAML_FIND_PACKAGES) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \ | |
1137 | $(INCFLAGS) $(DOC_FILES) -o $@; \ | |
1138 | fi | |
1139 | ||
1140 | $(DOC_DIR)/$(RESULT)/latex/doc.ps: $(DOC_DIR)/$(RESULT)/latex/doc.tex | |
1141 | cd $(DOC_DIR)/$(RESULT)/latex && \ | |
1142 | $(LATEX) doc.tex && \ | |
1143 | $(LATEX) doc.tex && \ | |
1144 | $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F) | |
1145 | ||
1146 | $(DOC_DIR)/$(RESULT)/latex/doc.pdf: $(DOC_DIR)/$(RESULT)/latex/doc.ps | |
1147 | cd $(DOC_DIR)/$(RESULT)/latex && $(PS2PDF) $(<F) | |
1148 | ||
1149 | define make_subproj | |
1150 | .PHONY: | |
1151 | subproj_$(1): | |
1152 | $$(eval $$(call PROJ_$(1))) | |
1153 | $(QUIET)if [ "$(SUBTARGET)" != "all" ]; then \ | |
1154 | $(MAKE) -f $(OCAMLMAKEFILE) $(SUBTARGET); \ | |
1155 | fi | |
1156 | endef | |
1157 | ||
1158 | $(foreach subproj,$(SUBPROJS),$(eval $(call make_subproj,$(subproj)))) | |
1159 | ||
1160 | .PHONY: | |
1161 | subprojs: $(SUBPROJS:%=subproj_%) | |
1162 | ||
1163 | ########################################################################### | |
1164 | # (UN)INSTALL RULES FOR LIBRARIES | |
1165 | ||
1166 | .PHONY: libinstall | |
1167 | libinstall: all | |
1168 | $(QUIET)printf "\nInstalling library with ocamlfind\n" | |
1169 | $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META $(LIBINSTALL_FILES) | |
1170 | $(QUIET)printf "\nInstallation successful.\n" | |
1171 | ||
1172 | .PHONY: libinstall-byte-code | |
1173 | libinstall-byte-code: all | |
1174 | $(QUIET)printf "\nInstalling byte-code library with ocamlfind\n" | |
1175 | $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META \ | |
1176 | $(filter-out $(RESULT).$(EXT_LIB) $(RESULT).cmxa, $(LIBINSTALL_FILES)) | |
1177 | $(QUIET)printf "\nInstallation successful.\n" | |
1178 | ||
1179 | .PHONY: libinstall-native-code | |
1180 | libinstall-native-code: all | |
1181 | $(QUIET)printf "\nInstalling native-code library with ocamlfind\n" | |
1182 | $(OCAMLFIND) install $(OCAMLFIND_INSTFLAGS) $(RESULT) META \ | |
1183 | $(filter-out $(DLLSONAME) $(RESULT).cma, $(LIBINSTALL_FILES)) | |
1184 | $(QUIET)printf "\nInstallation successful.\n" | |
1185 | ||
1186 | .PHONY: libuninstall | |
1187 | libuninstall: | |
1188 | $(QUIET)printf "\nUninstalling library with ocamlfind\n" | |
1189 | $(OCAMLFIND) remove $(OCAMLFIND_INSTFLAGS) $(RESULT) | |
1190 | $(QUIET)printf "\nUninstallation successful.\n" | |
1191 | ||
1192 | .PHONY: rawinstall | |
1193 | rawinstall: all | |
1194 | $(QUIET)printf "\nInstalling library to: $(OCAML_LIB_INSTALL)\n" | |
1195 | -install -d $(OCAML_LIB_INSTALL) | |
1196 | for i in $(LIBINSTALL_FILES); do \ | |
1197 | if [ -f $$i ]; then \ | |
1198 | install -c -m 0644 $$i $(OCAML_LIB_INSTALL); \ | |
1199 | fi; \ | |
1200 | done | |
1201 | $(QUIET)printf "\nInstallation successful.\n" | |
1202 | ||
1203 | .PHONY: rawuninstall | |
1204 | rawuninstall: | |
1205 | $(QUIET)printf "\nUninstalling library from: $(OCAML_LIB_INSTALL)\n" | |
1206 | cd $(OCAML_LIB_INSTALL) && rm $(notdir $(LIBINSTALL_FILES)) | |
1207 | $(QUIET)printf "\nUninstallation successful.\n" | |
1208 | ||
1209 | ########################################################################### | |
1210 | # MAINTENANCE RULES | |
1211 | ||
1212 | .PHONY: clean | |
1213 | clean:: | |
1214 | rm -f $(TARGETS) $(TRASH) | |
1215 | rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR) | |
1216 | ||
1217 | .PHONY: cleanup | |
1218 | cleanup:: | |
1219 | rm -f $(NONEXECS) $(TRASH) | |
1220 | rm -rf $(BCDIDIR) $(NCDIDIR) $(MLDEPDIR) | |
1221 | ||
1222 | .PHONY: clean-doc | |
1223 | clean-doc:: | |
1224 | rm -rf $(DOC_DIR)/$(RESULT) | |
1225 | ||
1226 | .PHONY: clean-all | |
1227 | clean-all:: clean clean-doc | |
1228 | ||
1229 | .PHONY: nobackup | |
1230 | nobackup: | |
1231 | rm -f *.bak *~ *.dup |