1 ##
===- tools
/ml
/Makefile
-----------------------------------*- Makefile
-*-===##
3 # The LLVM Compiler Infrastructure
5 # This file is distributed under the University
of Illinois Open Source
6 #
License. See
LICENSE.TXT
for details
.
8 ##
===----------------------------------------------------------------------===##
10 # An ocaml library is a unique project
type in the context
of LLVM
, so rules are
11 # here rather than
in Makefile.rules
.
13 # Reference materials on installing ocaml libraries
:
15 # https
://fedoraproject
.org
/wiki
/Packaging
/OCaml
16 # http
://pkg
-ocaml
-maint
.alioth
.debian
.org
/ocaml_packaging_policy
.txt
18 ##
===----------------------------------------------------------------------===##
20 include $
(LEVEL
)/Makefile.config
22 # CFLAGS needs
to be set before
Makefile.rules is included
.
23 CXX.Flags
+= -I
"$(shell $(OCAMLC) -where)"
24 C.Flags
+= -I
"$(shell $(OCAMLC) -where)"
26 include $
(LEVEL
)/Makefile.common
28 # Intentionally ignore PROJ_prefix here
. We want the ocaml stdlib
. However
, the
29 # user can override this
with OCAML_LIBDIR
or configure
--with-ocaml
-libdir
=.
30 PROJ_libocamldir
:= $
(DESTDIR
)$
(OCAML_LIBDIR
)
31 OcamlDir
:= $
(LibDir
)/ocaml
33 # Info from llvm
-config
and similar
34 ifndef IS_CLEANING_TARGET
36 UsedLibs
= $
(shell $
(LLVM_CONFIG
) --libs $
(UsedComponents
))
37 UsedLibNames
= $
(shell $
(LLVM_CONFIG
) --libnames $
(UsedComponents
))
42 OCAMLCFLAGS
+= -I $
(ObjDir
) -I $
(OcamlDir
)
43 ifndef IS_CLEANING_TARGET
45 OCAMLAFLAGS
+= $
(patsubst
%,-cclib
%, \
46 $
(filter
-out
-L$
(LibDir
),-l$
(LIBRARYNAME
) \
47 $
(shell $
(LLVM_CONFIG
) --ldflags
)) \
50 OCAMLAFLAGS
+= $
(patsubst
%,-cclib
%, \
51 $
(filter
-out
-L$
(LibDir
),$
(shell $
(LLVM_CONFIG
) --ldflags
)) \
56 #
-g was introduced
in 3.10.0.
57 #ifneq
($
(ENABLE_OPTIMIZED
),1)
58 # OCAMLDEBUGFLAG
:= -g
61 Compile.CMI
:= $
(strip $
(OCAMLC
) -c $
(OCAMLCFLAGS
) $
(OCAMLDEBUGFLAG
) -o
)
62 Compile.CMO
:= $
(strip $
(OCAMLC
) -c $
(OCAMLCFLAGS
) $
(OCAMLDEBUGFLAG
) -o
)
63 Archive.CMA
:= $
(strip $
(OCAMLC
) -a
-custom $
(OCAMLAFLAGS
) $
(OCAMLDEBUGFLAG
) \
66 Compile.CMX
:= $
(strip $
(OCAMLOPT
) -c $
(OCAMLCFLAGS
) $
(OCAMLDEBUGFLAG
) -o
)
67 Archive.CMXA
:= $
(strip $
(OCAMLOPT
) -a $
(OCAMLAFLAGS
) $
(OCAMLDEBUGFLAG
) -o
)
70 Archive.EXE
:= $
(strip $
(OCAMLOPT
) -cc $
(CXX
) $
(OCAMLCFLAGS
) $
(UsedOcamLibs
:%=%.cmxa
) $
(OCAMLDEBUGFLAG
) -o
)
72 Archive.EXE
:= $
(strip $
(OCAMLC
) -cc $
(CXX
) $
(OCAMLCFLAGS
) $
(OCAMLDEBUGFLAG
:%=%.cma
) -o
)
76 OcamlSources1
:= $
(sort $
(wildcard $
(PROJ_SRC_DIR
)/*.ml
))
77 OcamlHeaders1
:= $
(sort $
(wildcard $
(PROJ_SRC_DIR
)/*.mli
))
79 OcamlSources2
:= $
(filter
-out $
(ExcludeSources
),$
(OcamlSources1
))
80 OcamlHeaders2
:= $
(filter
-out $
(ExcludeHeaders
),$
(OcamlHeaders1
))
82 OcamlSources
:= $
(OcamlSources2
:$
(PROJ_SRC_DIR
)/%=$
(ObjDir
)/%)
83 OcamlHeaders
:= $
(OcamlHeaders2
:$
(PROJ_SRC_DIR
)/%=$
(ObjDir
)/%)
86 ObjectsCMI
:= $
(OcamlSources
:%.ml
=%.cmi
)
87 ObjectsCMO
:= $
(OcamlSources
:%.ml
=%.cmo
)
88 ObjectsCMX
:= $
(OcamlSources
:%.ml
=%.cmx
)
91 LibraryCMA
:= $
(ObjDir
)/$
(LIBRARYNAME
).cma
92 LibraryCMXA
:= $
(ObjDir
)/$
(LIBRARYNAME
).cmxa
96 ToolEXE
:= $
(ObjDir
)/$
(TOOLNAME
)$
(EXEEXT
)
100 # The
.cmo files are the only intermediates
; all others are
to be installed
.
101 OutputsCMI
:= $
(ObjectsCMI
:$
(ObjDir
)/%.cmi
=$
(OcamlDir
)/%.cmi
)
102 OutputsCMX
:= $
(ObjectsCMX
:$
(ObjDir
)/%.cmx
=$
(OcamlDir
)/%.cmx
)
103 OutputLibs
:= $
(UsedLibNames
:%=$
(OcamlDir
)/%)
106 LibraryA
:= $
(OcamlDir
)/lib$
(LIBRARYNAME
).a
107 OutputCMA
:= $
(LibraryCMA
:$
(ObjDir
)/%.cma
=$
(OcamlDir
)/%.cma
)
108 OutputCMXA
:= $
(LibraryCMXA
:$
(ObjDir
)/%.cmxa
=$
(OcamlDir
)/%.cmxa
)
113 OutputEXE
:= $
(ExmplDir
)/$
(strip $
(TOOLNAME
))$
(EXEEXT
)
115 OutputEXE
:= $
(ToolDir
)/$
(strip $
(TOOLNAME
))$
(EXEEXT
)
119 # Installation targets
120 DestLibs
:= $
(UsedLibNames
:%=$
(PROJ_libocamldir
)/%)
123 DestA
:= $
(PROJ_libocamldir
)/lib$
(LIBRARYNAME
).a
124 DestCMA
:= $
(PROJ_libocamldir
)/$
(LIBRARYNAME
).cma
125 DestCMXA
:= $
(PROJ_libocamldir
)/$
(LIBRARYNAME
).cmxa
128 ##
===- Dependencies
-------------------------------------------------------===##
129 # Copy the sources into the intermediate directory because older ocamlc doesn't
130 # support
-o except
when linking
(outputs are placed next
to inputs
).
132 $
(ObjDir
)/%.mli
: $
(PROJ_SRC_DIR
)/%.mli $
(ObjDir
)/.dir
133 $
(Verb
) $
(CP
) -f $
< $
@
135 $
(ObjDir
)/%.ml
: $
(PROJ_SRC_DIR
)/%.ml $
(ObjDir
)/.dir
136 $
(Verb
) $
(CP
) -f $
< $
@
138 $
(ObjectsCMI
): $
(UsedOcamlInterfaces
:%=$
(OcamlDir
)/%.cmi
)
141 $
(ObjDir
)/$
(LIBRARYNAME
).ocamldep
: $
(OcamlSources
) $
(OcamlHeaders
) \
142 $
(OcamlDir
)/.dir $
(ObjDir
)/.dir
143 $
(Verb
) $
(OCAMLDEP
) $
(OCAMLCFLAGS
) $
(OcamlSources
) $
(OcamlHeaders
) > $
@
145 -include $
(ObjDir
)/$
(LIBRARYNAME
).ocamldep
149 $
(ObjDir
)/$
(TOOLNAME
).ocamldep
: $
(OcamlSources
) $
(OcamlHeaders
) \
150 $
(OcamlDir
)/.dir $
(ObjDir
)/.dir
151 $
(Verb
) $
(OCAMLDEP
) $
(OCAMLCFLAGS
) $
(OcamlSources
) $
(OcamlHeaders
) > $
@
153 -include $
(ObjDir
)/$
(TOOLNAME
).ocamldep
156 ##
===- Build static library from C sources
--------------------------------===##
159 all
-local
:: $
(LibraryA
)
160 clean
-local
:: clean
-a
161 install
-local
:: install
-a
162 uninstall
-local
:: uninstall
-a
164 $
(LibraryA
): $
(ObjectsO
) $
(OcamlDir
)/.dir
165 $
(Echo
) "Building $(BuildMode) $(notdir $@)"
167 $
(Verb
) $
(Archive
) $
@ $
(ObjectsO
)
171 -$
(Verb
) $
(RM
) -f $
(LibraryA
)
173 install
-a
:: $
(LibraryA
)
174 $
(Echo
) "Installing $(BuildMode) $(DestA)"
175 $
(Verb
) $
(MKDIR
) $
(PROJ_libocamldir
)
176 $
(Verb
) $
(INSTALL
) $
(LibraryA
) $
(DestA
)
180 $
(Echo
) "Uninstalling $(DestA)"
181 -$
(Verb
) $
(RM
) -f $
(DestA
)
185 ##
===- Deposit dependent libraries adjacent
to Ocaml libs
-----------------===##
187 all
-local
:: build
-deplibs
188 clean
-local
:: clean
-deplibs
189 install
-local
:: install
-deplibs
190 uninstall
-local
:: uninstall
-deplibs
192 build
-deplibs
: $
(OutputLibs
)
194 $
(OcamlDir
)/%.a
: $
(LibDir
)/%.a
197 $
(OcamlDir
)/%.o
: $
(LibDir
)/%.o
201 $
(Verb
) $
(RM
) -f $
(OutputLibs
)
204 $
(Verb
) $
(MKDIR
) $
(PROJ_libocamldir
)
205 $
(Verb
) for i
in $
(DestLibs
:$
(PROJ_libocamldir
)/%=%); do \
206 ln
-sf
"$(PROJ_libdir)/$$i" "$(PROJ_libocamldir)/$$i"; \
210 $
(Verb
) $
(RM
) -f $
(DestLibs
)
213 ##
===- Build ocaml interfaces
(.mli's
-> .cmi's
) --------------------------===##
215 ifneq
($
(OcamlHeaders
),)
216 all
-local
:: build
-cmis
217 clean
-local
:: clean
-cmis
218 install
-local
:: install
-cmis
219 uninstall
-local
:: uninstall
-cmis
221 build
-cmis
: $
(OutputsCMI
)
223 $
(OcamlDir
)/%.cmi
: $
(ObjDir
)/%.cmi $
(OcamlDir
)/.dir
224 $
(Verb
) $
(CP
) -f $
< $
@
226 $
(ObjDir
)/%.cmi
: $
(ObjDir
)/%.mli $
(ObjDir
)/.dir
227 $
(Echo
) "Compiling $(notdir $<) for $(BuildMode) build"
228 $
(Verb
) $
(Compile.CMI
) $
@ $
<
231 -$
(Verb
) $
(RM
) -f $
(OutputsCMI
)
233 # Also install the
.mli's
(headers
) as documentation
.
234 install
-cmis
: $
(OutputsCMI
) $
(OcamlHeaders
)
235 $
(Verb
) $
(MKDIR
) $
(PROJ_libocamldir
)
236 $
(Verb
) for i
in $
(OutputsCMI
:$
(OcamlDir
)/%=%); do \
237 $
(EchoCmd
) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \
238 $
(DataInstall
) $
(OcamlDir
)/$$i
"$(PROJ_libocamldir)/$$i"; \
240 $
(Verb
) for i
in $
(OcamlHeaders
:$
(ObjDir
)/%=%); do \
241 $
(EchoCmd
) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \
242 $
(DataInstall
) $
(ObjDir
)/$$i
"$(PROJ_libocamldir)/$$i"; \
246 $
(Verb
) for i
in $
(OutputsCMI
:$
(OcamlDir
)/%=%); do \
247 $
(EchoCmd
) "Uninstalling $(PROJ_libocamldir)/$$i"; \
248 $
(RM
) -f
"$(PROJ_libocamldir)/$$i"; \
250 $
(Verb
) for i
in $
(OcamlHeaders
:$
(ObjDir
)/%=%); do \
251 $
(EchoCmd
) "Uninstalling $(PROJ_libocamldir)/$$i"; \
252 $
(RM
) -f
"$(PROJ_libocamldir)/$$i"; \
257 ##
===- Build ocaml bytecode archive
(.ml's
-> .cmo's
-> .cma
) -------------===##
259 $
(ObjDir
)/%.cmo
: $
(ObjDir
)/%.ml
260 $
(Echo
) "Compiling $(notdir $<) for $(BuildMode) build"
261 $
(Verb
) $
(Compile.CMO
) $
@ $
<
264 all
-local
:: $
(OutputCMA
)
265 clean
-local
:: clean
-cma
266 install
-local
:: install
-cma
267 uninstall
-local
:: uninstall
-cma
269 $
(OutputCMA
): $
(LibraryCMA
) $
(OcamlDir
)/.dir
270 $
(Verb
) $
(CP
) -f $
< $
@
272 $
(LibraryCMA
): $
(ObjectsCMO
) $
(OcamlDir
)/.dir
273 $
(Echo
) "Archiving $(notdir $@) for $(BuildMode) build"
274 $
(Verb
) $
(Archive.CMA
) $
@ $
(ObjectsCMO
)
277 $
(Verb
) $
(RM
) -f $
(OutputCMA
) $
(UsedLibNames
:%=$
(OcamlDir
)/%)
279 install
-cma
:: $
(OutputCMA
)
280 $
(Echo
) "Installing $(BuildMode) $(DestCMA)"
281 $
(Verb
) $
(MKDIR
) $
(PROJ_libocamldir
)
282 $
(Verb
) $
(DataInstall
) $
(OutputCMA
) "$(DestCMA)"
285 $
(Echo
) "Uninstalling $(DestCMA)"
286 -$
(Verb
) $
(RM
) -f $
(DestCMA
)
289 ##
===- Build optimized ocaml archive
(.ml's
-> .cmx's
-> .cmxa
, .a
) -------===##
291 # The ocamlopt compiler is supported on a set
of targets disjoint from LLVM's
.
292 # If unavailable
, 'configure' will not define OCAMLOPT
in Makefile.config
.
295 $
(OcamlDir
)/%.cmx
: $
(ObjDir
)/%.cmx
296 $
(Verb
) $
(CP
) -f $
< $
@
298 $
(ObjDir
)/%.cmx
: $
(ObjDir
)/%.ml
299 $
(Echo
) "Compiling optimized $(notdir $<) for $(BuildMode) build"
300 $
(Verb
) $
(Compile.CMX
) $
@ $
<
303 all
-local
:: $
(OutputCMXA
) $
(OutputsCMX
)
304 clean
-local
:: clean
-cmxa
305 install
-local
:: install
-cmxa
306 uninstall
-local
:: uninstall
-cmxa
308 $
(OutputCMXA
): $
(LibraryCMXA
)
309 $
(Verb
) $
(CP
) -f $
< $
@
310 $
(Verb
) $
(CP
) -f $
(<:.cmxa
=.a
) $
(@:.cmxa
=.a
)
312 $
(LibraryCMXA
): $
(ObjectsCMX
)
313 $
(Echo
) "Archiving $(notdir $@) for $(BuildMode) build"
314 $
(Verb
) $
(Archive.CMXA
) $
@ $
(ObjectsCMX
)
315 $
(Verb
) $
(RM
) -f $
(@:.cmxa
=.o
)
318 $
(Verb
) $
(RM
) -f $
(OutputCMXA
) $
(OutputCMXA
:.cmxa
=.a
) $
(OutputsCMX
)
320 install
-cmxa
:: $
(OutputCMXA
) $
(OutputsCMX
)
321 $
(Verb
) $
(MKDIR
) $
(PROJ_libocamldir
)
322 $
(Echo
) "Installing $(BuildMode) $(DestCMXA)"
323 $
(Verb
) $
(DataInstall
) $
(OutputCMXA
) $
(DestCMXA
)
324 $
(Echo
) "Installing $(BuildMode) $(DestCMXA:.cmxa=.a)"
325 $
(Verb
) $
(DataInstall
) $
(OutputCMXA
:.cmxa
=.a
) $
(DestCMXA
:.cmxa
=.a
)
326 $
(Verb
) for i
in $
(OutputsCMX
:$
(OcamlDir
)/%=%); do \
327 $
(EchoCmd
) "Installing $(BuildMode) $(PROJ_libocamldir)/$$i"; \
328 $
(DataInstall
) $
(OcamlDir
)/$$i
"$(PROJ_libocamldir)/$$i"; \
332 $
(Echo
) "Uninstalling $(DestCMXA)"
333 $
(Verb
) $
(RM
) -f $
(DestCMXA
)
334 $
(Echo
) "Uninstalling $(DestCMXA:.cmxa=.a)"
335 $
(Verb
) $
(RM
) -f $
(DestCMXA
:.cmxa
=.a
)
336 $
(Verb
) for i
in $
(OutputsCMX
:$
(OcamlDir
)/%=%); do \
337 $
(EchoCmd
) "Uninstalling $(PROJ_libocamldir)/$$i"; \
338 $
(RM
) -f $
(PROJ_libocamldir
)/$$i
; \
343 ##
===- Build executables
--------------------------------------------------===##
346 all
-local
:: $
(OutputEXE
)
347 clean
-local
:: clean
-exe
349 $
(OutputEXE
): $
(ToolEXE
) $
(OcamlDir
)/.dir
350 $
(Verb
) $
(CP
) -f $
< $
@
353 $
(ToolEXE
): $
(ObjectsCMO
) $
(OcamlDir
)/.dir
354 $
(Echo
) "Archiving $(notdir $@) for $(BuildMode) build"
355 $
(Verb
) $
(Archive.EXE
) $
@ $
<
357 $
(ToolEXE
): $
(ObjectsCMX
) $
(OcamlDir
)/.dir
358 $
(Echo
) "Archiving $(notdir $@) for $(BuildMode) build"
359 $
(Verb
) $
(Archive.EXE
) $
@ $
<
363 ##
===- Generate documentation
---------------------------------------------===##
365 $
(ObjDir
)/$
(LIBRARYNAME
).odoc
: $
(ObjectsCMI
)
366 $
(Echo
) "Documenting $(notdir $@)"
367 $
(Verb
) $
(OCAMLDOC
) -I $
(ObjDir
) -I $
(OcamlDir
) -dump $
@ $
(OcamlHeaders
)
369 ocamldoc
: $
(ObjDir
)/$
(LIBRARYNAME
).odoc
371 ##
===- Debugging gunk
-----------------------------------------------------===##
372 printvars
:: printcamlvars
375 $
(Echo
) "LLVM_CONFIG : " '$
(LLVM_CONFIG
)'
376 $
(Echo
) "OCAMLCFLAGS : " '$
(OCAMLCFLAGS
)'
377 $
(Echo
) "OCAMLAFLAGS : " '$
(OCAMLAFLAGS
)'
378 $
(Echo
) "OCAMLC : " '$
(OCAMLC
)'
379 $
(Echo
) "OCAMLOPT : " '$
(OCAMLOPT
)'
380 $
(Echo
) "OCAMLDEP : " '$
(OCAMLDEP
)'
381 $
(Echo
) "Compile.CMI : " '$
(Compile.CMI
)'
382 $
(Echo
) "Compile.CMO : " '$
(Compile.CMO
)'
383 $
(Echo
) "Archive.CMA : " '$
(Archive.CMA
)'
384 $
(Echo
) "Compile.CMX : " '$
(Compile.CMX
)'
385 $
(Echo
) "Archive.CMXA : " '$
(Archive.CMXA
)'
386 $
(Echo
) "CAML_LIBDIR : " '$
(CAML_LIBDIR
)'
387 $
(Echo
) "LibraryCMA : " '$
(LibraryCMA
)'
388 $
(Echo
) "LibraryCMXA : " '$
(LibraryCMXA
)'
389 $
(Echo
) "OcamlSources1: " '$
(OcamlSources1
)'
390 $
(Echo
) "OcamlSources2: " '$
(OcamlSources2
)'
391 $
(Echo
) "OcamlSources : " '$
(OcamlSources
)'
392 $
(Echo
) "OcamlHeaders1: " '$
(OcamlHeaders1
)'
393 $
(Echo
) "OcamlHeaders2: " '$
(OcamlHeaders2
)'
394 $
(Echo
) "OcamlHeaders : " '$
(OcamlHeaders
)'
395 $
(Echo
) "ObjectsCMI : " '$
(ObjectsCMI
)'
396 $
(Echo
) "ObjectsCMO : " '$
(ObjectsCMO
)'
397 $
(Echo
) "ObjectsCMX : " '$
(ObjectsCMX
)'
398 $
(Echo
) "OCAML_LIBDIR : " '$
(OCAML_LIBDIR
)'
399 $
(Echo
) "DestA : " '$
(DestA
)'
400 $
(Echo
) "DestCMA : " '$
(DestCMA
)'
401 $
(Echo
) "DestCMXA : " '$
(DestCMXA
)'
402 $
(Echo
) "UsedLibs : " '$
(UsedLibs
)'
403 $
(Echo
) "UsedLibNames : " '$
(UsedLibNames
)'
405 .PHONY
: printcamlvars build
-cmis \
406 clean
-a clean
-cmis clean
-cma clean
-cmxa \
407 install
-a install
-cmis install
-cma install
-cmxa \
409 uninstall
-a uninstall
-cmis uninstall
-cma uninstall
-cmxa \