Subversion Repositories SmartDukaan

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
30 ashish 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