1OCAMLOPT(1)                 General Commands Manual                OCAMLOPT(1)
2
3
4

NAME

6       ocamlopt - The OCaml native-code compiler
7
8

SYNOPSIS

10       ocamlopt [ options ] filename ...
11
12       ocamlopt.opt (same options)
13
14

DESCRIPTION

16       The  OCaml  high-performance  native-code compiler ocamlopt(1) compiles
17       OCaml source files to native code object files and  link  these  object
18       files to produce standalone executables.
19
20       The ocamlopt(1) command has a command-line interface very close to that
21       of ocamlc(1).  It accepts the same types  of  arguments  and  processes
22       them sequentially, after all options have been processed:
23
24       Arguments  ending  in .mli are taken to be source files for compilation
25       unit interfaces. Interfaces specify the names exported  by  compilation
26       units:  they  declare  value names with their types, define public data
27       types, declare abstract data types, and so on. From the file x.mli, the
28       ocamlopt(1)  compiler  produces a compiled interface in the file x.cmi.
29       The interface produced is identical to that produced  by  the  bytecode
30       compiler ocamlc(1).
31
32       Arguments  ending  in  .ml are taken to be source files for compilation
33       unit implementations. Implementations provide definitions for the names
34       exported  by the unit, and also contain expressions to be evaluated for
35       their side-effects.  From the file x.ml, the ocamlopt(1) compiler  pro‐
36       duces  two  files:  x.o, containing native object code, and x.cmx, con‐
37       taining extra information for linking and optimization of  the  clients
38       of  the  unit. The compiled implementation should always be referred to
39       under the name x.cmx (when given a .o file, ocamlopt(1) assumes that it
40       contains code compiled from C, not from OCaml).
41
42       The  implementation  is checked against the interface file x.mli (if it
43       exists) as described in the manual for ocamlc(1).
44
45       Arguments ending in .cmx are taken to be compiled object  code.   These
46       files are linked together, along with the object files obtained by com‐
47       piling .ml arguments (if any), and the OCaml standard library, to  pro‐
48       duce  a native-code executable program. The order in which .cmx and .ml
49       arguments are presented on the command line  is  relevant:  compilation
50       units  are initialized in that order at run-time, and it is a link-time
51       error to use a component of a unit before having initialized it. Hence,
52       a  given  x.cmx  file must come before all .cmx files that refer to the
53       unit x.
54
55       Arguments ending in .cmxa are taken to be  libraries  of  object  code.
56       Such  a  library  packs in two files lib.cmxa and lib.a a set of object
57       files (.cmx/.o files). Libraries are build with ocamlopt  -a  (see  the
58       description  of the -a option below). The object files contained in the
59       library are linked as regular .cmx files  (see  above),  in  the  order
60       specified when the library was built. The only difference is that if an
61       object file contained in a library is not referenced  anywhere  in  the
62       program, then it is not linked in.
63
64       Arguments  ending in .c are passed to the C compiler, which generates a
65       .o object file. This object file is linked with the program.
66
67       Arguments ending in .o or .a are assumed  to  be  C  object  files  and
68       libraries. They are linked with the program.
69
70       The  output  of the linking phase is a regular Unix executable file. It
71       does not need ocamlrun(1) to run.
72
73       ocamlopt.opt is the same compiler as ocamlopt, but compiled with itself
74       instead  of  with  the  bytecode  compiler ocamlc(1).  Thus, it behaves
75       exactly like ocamlopt, but compiles faster.  ocamlopt.opt is not avail‐
76       able in all installations of OCaml.
77
78

OPTIONS

80       The following command-line options are recognized by ocamlopt(1).
81
82       -a     Build  a  library (.cmxa/.a file) with the object files (.cmx/.o
83              files) given on the command line, instead of linking  them  into
84              an executable file. The name of the library must be set with the
85              -o option.
86
87              If -cclib or -ccopt options are  passed  on  the  command  line,
88              these  options are stored in the resulting .cmxa library.  Then,
89              linking  with  this  library   automatically   adds   back   the
90              -cclib and -ccopt  options  as  if they had been provided on the
91              command line, unless the -noautolink option is given.  Addition‐
92              ally,  a  substring $CAMLORIGIN inside a  -ccopt options will be
93              replaced by the full path to the  .cma  library,  excluding  the
94              filename.
95
96       -absname
97              Show absolute filenames in error messages.
98
99       -annot Dump  detailed  information  about the compilation (types, bind‐
100              ings, tail-calls, etc).  The information for file src.ml is  put
101              into  file  src.annot.   In  case  of a type error, dump all the
102              information inferred by the type-checker before the  error.  The
103              src.annot  file  can  be  used  with the emacs commands given in
104              emacs/caml-types.el  to  display  types  and  other  annotations
105              interactively.
106
107       -bin-annot
108              Dump  detailed  information  about the compilation (types, bind‐
109              ings, tail-calls, etc) in binary  format.  The  information  for
110              file  src.ml is put into file src.cmt.  In case of a type error,
111              dump all the information inferred by the type-checker before the
112              error.  The annotation files produced by -bin-annot contain more
113              information and are much more compact than the files produced by
114              -annot.
115
116       -c     Compile  only.  Suppress  the  linking phase of the compilation.
117              Source code files are turned into compiled files,  but  no  exe‐
118              cutable  file is produced. This option is useful to compile mod‐
119              ules separately.
120
121       -cc ccomp
122              Use ccomp as the C linker called to build the  final  executable
123              and as the C compiler for compiling .c source files.
124
125       -cclib -llibname
126              Pass the -llibname option to the linker. This causes the given C
127              library to be linked with the program.
128
129       -ccopt option
130              Pass the  given  option  to  the  C  compiler  and  linker.  For
131              instance,  -ccopt -Ldir  causes  the  C  linker  to search for C
132              libraries in directory dir.
133
134       -color mode
135              Enable or disable colors in compiler messages (especially  warn‐
136              ings and errors).  The following modes are supported:
137
138              auto use heuristics to enable colors only if the output supports
139              them (an ANSI-compatible tty terminal);
140
141              always enable colors unconditionally;
142
143              never disable color output.
144
145              The default setting is auto, and the  current  heuristic  checks
146              that  the "TERM" environment variable exists and is not empty or
147              "dumb", and that isatty(stderr) holds.
148
149              The environment variable "OCAML_COLOR" is considered  if  -color
150              is not provided. Its values are auto/always/never as above.
151
152
153       -compact
154              Optimize  the produced code for space rather than for time. This
155              results in smaller but slightly slower programs. The default  is
156              to optimize for speed.
157
158       -config
159              Print  the  version number of ocamlopt(1) and a detailed summary
160              of its configuration, then exit.
161
162       -depend ocamldep-args
163              Compute dependencies, as ocamldep would do.
164
165       -for-pack module-path
166              Generate an object file (.cmx and .o files) that  can  later  be
167              included  as a sub-module (with the given access path) of a com‐
168              pilation unit  constructed  with  -pack.   For  instance,  ocam‐
169              lopt -for-pack P -c A.ml  will generate a.cmx and a.o files that
170              can later be used with ocamlopt -pack -o P.cmx a.cmx.
171
172       -g     Add debugging information  while  compiling  and  linking.  This
173              option is required in order to produce stack backtraces when the
174              program terminates on an uncaught exception (see ocamlrun(1)).
175
176       -i     Cause the compiler  to  print  all  defined  names  (with  their
177              inferred types or their definitions) when compiling an implemen‐
178              tation (.ml file). No compiled files (.cmo and .cmi  files)  are
179              produced.  This can be useful to check the types inferred by the
180              compiler. Also, since the output follows the  syntax  of  inter‐
181              faces,  it can help in writing an explicit interface (.mli file)
182              for a file: just redirect the standard output of the compiler to
183              a  .mli  file,  and edit that file to remove all declarations of
184              unexported names.
185
186       -I directory
187              Add the given directory to the list of directories searched  for
188              compiled  interface  files  (.cmi),  compiled  object code files
189              (.cmx), and libraries (.cmxa). By default, the current directory
190              is searched first, then the standard library directory. Directo‐
191              ries added with -I are searched after the current directory,  in
192              the  order  in  which  they  were given on the command line, but
193              before the standard library directory. See  also  option  -nost‐
194              dlib.
195
196              If  the  given  directory starts with +, it is taken relative to
197              the standard library directory. For instance,  -I +compiler-libs
198              adds  the  subdirectory compiler-libs of the standard library to
199              the search path.
200
201       -impl filename
202              Compile the file filename as an implementation file, even if its
203              extension is not .ml.
204
205       -inline n
206              Set aggressiveness of inlining to n, where n is a positive inte‐
207              ger. Specifying -inline 0  prevents  all  functions  from  being
208              inlined,  except those whose body is smaller than the call site.
209              Thus, inlining causes no expansion in  code  size.  The  default
210              aggressiveness,  -inline 1,  allows slightly larger functions to
211              be inlined, resulting in a slight expansion in code size. Higher
212              values  for the -inline option cause larger and larger functions
213              to become candidate for inlining, but can result  in  a  serious
214              increase in code size.
215
216       -intf filename
217              Compile  the  file  filename  as  an interface file, even if its
218              extension is not .mli.
219
220       -intf-suffix string
221              Recognize file names  ending  with  string  as  interface  files
222              (instead of the default .mli).
223
224       -keep-docs
225              Keep documentation strings in generated .cmi files.
226
227       -keep-locs
228              Keep locations in generated .cmi files.
229
230       -labels
231              Labels  are not ignored in types, labels may be used in applica‐
232              tions, and labelled parameters can be given in any order.   This
233              is the default.
234
235       -linkall
236              Force  all  modules  contained  in libraries to be linked in. If
237              this flag is not given, unreferenced modules are not linked  in.
238              When  building  a  library  (-a flag), setting the -linkall flag
239              forces all subsequent links of programs involving  that  library
240              to  link all the modules contained in the library.  When compil‐
241              ing a module (option -c), setting the  -linkall  option  ensures
242              that this module will always be linked if it is put in a library
243              and this library is linked.
244
245       -linscan
246              Use linear scan register allocation.  Compiling with this  allo‐
247              cator  is  faster  than with the usual graph coloring allocator,
248              sometimes quite drastically so for long functions  and  modules.
249              On the other hand, the generated code can be a bit slower.
250
251       -no-alias-deps
252              Do not record dependencies for module aliases.
253
254       -no-app-funct
255              Deactivates  the  applicative  behaviour  of functors. With this
256              option, each functor application  generates  new  types  in  its
257              result  and applying the same functor twice to the same argument
258              yields two incompatible structures.
259
260       -noassert
261              Do not compile assertion checks.  Note  that  the  special  form
262              assert false  is  always compiled because it is typed specially.
263              This flag has no effect when linking already-compiled files.
264
265       -noautolink
266              When linking .cmxa libraries, ignore  -cclib and -ccopt  options
267              potentially  contained  in  the libraries (if these options were
268              given when building the libraries).  This can  be  useful  if  a
269              library  contains  incorrect  specifications of C libraries or C
270              options; in this case, during linking, set -noautolink and  pass
271              the correct C libraries and options on the command line.
272
273       -nodynlink
274              Allow the compiler to use some optimizations that are valid only
275              for code that is never dynlinked.
276
277       -nostdlib
278              Do not automatically add the standard library directory the list
279              of  directories  searched  for  compiled interface files (.cmi),
280              compiled object code files (.cmx), and  libraries  (.cmxa).  See
281              also option -I.
282
283       -nolabels
284              Ignore  non-optional  labels  in types. Labels cannot be used in
285              applications, and parameter order becomes strict.
286
287       -o exec-file
288              Specify the name of the output file produced by the linker.  The
289              default  output  name  is a.out, in keeping with the Unix tradi‐
290              tion. If the -a option is given, specify the name of the library
291              produced.  If the -pack option is given, specify the name of the
292              packed object file  produced.   If  the  -output-obj  option  is
293              given,  specify  the  name  of  the output file produced. If the
294              -shared option is given, specify the name of  plugin  file  pro‐
295              duced.   This  can  also  be used when compiling an interface or
296              implementation file, without linking, in which case it sets  the
297              name  of  the  cmi or cmo file, and also sets the module name to
298              the file name up to the first dot.
299
300       -opaque
301              When compiling a .mli interface file, this has the  same  effect
302              as the -opaque option of the bytecode compiler. When compiling a
303              .ml implementation file,  this  produces  a  .cmx  file  without
304              cross-module  optimization information, which reduces recompila‐
305              tion on module change.
306
307       -open module
308              Opens the given module before processing the interface or imple‐
309              mentation  files.  If  several -open options are given, they are
310              processed in order, just as if the  statements  open!  module1;;
311              ... open! moduleN;; were added at the top of each file.
312
313       -output-obj
314              Cause  the  linker to produce a C object file instead of an exe‐
315              cutable file. This is useful to wrap OCaml code as a C  library,
316              callable  from any C program. The name of the output object file
317              must be set with the -o option.  This option can also be used to
318              produce a compiled shared/dynamic library (.so extension).
319
320       -p     Generate  extra  code to write profile information when the pro‐
321              gram is executed.  The profile information can then be  examined
322              with the analysis program gprof(1).  The -p option must be given
323              both at compile-time and at link-time.  Linking object files not
324              compiled  with  -p is possible, but results in less precise pro‐
325              filing.
326
327              See the gprof(1) man page for more information  about  the  pro‐
328              files.
329
330              Full  support  for  gprof(1) is only available for certain plat‐
331              forms (currently: Intel x86/Linux and Alpha/Digital  Unix).   On
332              other  platforms,  the  -p  option will result in a less precise
333              profile (no call graph information, only a time profile).
334
335       -pack  Build an object file (.cmx and .o files) and its associated com‐
336              piled interface (.cmi) that combines the .cmx object files given
337              on the command line, making them appear as  sub-modules  of  the
338              output  .cmx  file.   The  name  of the output .cmx file must be
339              given   with   the   -o    option.     For    instance,    ocam‐
340              lopt -pack -o P.cmx A.cmx B.cmx C.cmx  generates  compiled files
341              P.cmx, P.o and P.cmi describing a compilation unit having  three
342              sub-modules  A,  B  and  C, corresponding to the contents of the
343              object files A.cmx, B.cmx and C.cmx.  These contents can be ref‐
344              erenced as P.A, P.B and P.C in the remainder of the program.
345
346              The  .cmx  object  files  being combined must have been compiled
347              with the appropriate -for-pack option.  In  the  example  above,
348              A.cmx,  B.cmx  and  C.cmx  must  have  been  compiled with ocam‐
349              lopt -for-pack P.
350
351              Multiple levels of packing can be achieved  by  combining  -pack
352              with  -for-pack.   See The OCaml user's manual, chapter "Native-
353              code compilation" for more details.
354
355       -plugin plugin
356              Dynamically load the code of the given plugin (a .cmo,  .cma  or
357              .cmxs  file)  in the compiler. The plugin must exist in the same
358              kind of code as the compiler (ocamlopt.byte must  load  bytecode
359              plugins,  while ocamlopt.opt must load native code plugins), and
360              extension adaptation is done automatically for  .cma  files  (to
361              .cmxs files if the compiler is compiled in native code).
362
363       -pp command
364              Cause  the  compiler to call the given command as a preprocessor
365              for each source file. The output of command is redirected to  an
366              intermediate  file,  which is compiled. If there are no compila‐
367              tion errors, the intermediate file is deleted afterwards.
368
369       -ppx command
370              After parsing, pipe the abstract syntax tree  through  the  pre‐
371              processor  command.   The  module  Ast_mapper(3)  implements the
372              external interface of a preprocessor.
373
374       -principal
375              Check information path during type-checking, to make  sure  that
376              all  types are derived in a principal way. All programs accepted
377              in -principal mode are also accepted in default mode with equiv‐
378              alent types, but different binary signatures.
379
380       -rectypes
381              Allow   arbitrary  recursive  types  during  type-checking.   By
382              default, only recursive types where the recursion  goes  through
383              an object type are supported. Note that once you have created an
384              interface using this flag, you must use it again for all  depen‐
385              dencies.
386
387       -runtime-variant suffix
388              Add  suffix to the name of the runtime library that will be used
389              by  the  program.   If  OCaml   was   configured   with   option
390              -with-debug-runtime,  then the d suffix is supported and gives a
391              debug version of the runtime.
392
393       -S     Keep the assembly code  produced  during  the  compilation.  The
394              assembly code for the source file x.ml is saved in the file x.s.
395
396       -safe-string
397              Enforce  the  separation between types string and bytes, thereby
398              making strings read-only. This is the default.
399
400       -shared
401              Build a plugin (usually .cmxs) that can  be  dynamically  loaded
402              with the Dynlink module. The name of the plugin must be set with
403              the -o option. A plugin can include a number  of  OCaml  modules
404              and  libraries, and extra native objects (.o, .a files).  Build‐
405              ing native plugins is only supported for some operating  system.
406              Under some systems (currently, only Linux AMD 64), all the OCaml
407              code linked in a plugin must  have  been  compiled  without  the
408              -nodynlink  flag.  Some  constraints might also apply to the way
409              the extra native objects have been compiled (under Linux AMD 64,
410              they must contain only position-independent code).
411
412       -short-paths
413              When  a  type  is  visible  under  several module-paths, use the
414              shortest one when printing the type's name  in  inferred  inter‐
415              faces and error and warning messages.
416
417       -strict-sequence
418              The left-hand part of a sequence must have type unit.
419
420       -unboxed-types
421              When  a  type is unboxable (i.e. a record with a single argument
422              or a concrete datatype with a single constructor  of  one  argu‐
423              ment) it will be unboxed unless annotated with [@@ocaml.boxed].
424
425       -no-unboxed-types
426              When a type is unboxable  it will be boxed unless annotated with
427              [@@ocaml.unboxed].  This is the default.
428
429       -unsafe
430              Turn bound checking off  for  array  and  string  accesses  (the
431              v.(i)ands.[i]  constructs).  Programs  compiled with -unsafe are
432              therefore faster, but unsafe: anything can happen if the program
433              accesses an array or string outside of its bounds. Additionally,
434              turn off the check for zero divisor in integer division and mod‐
435              ulus operations.  With -unsafe, an integer division (or modulus)
436              by zero can halt the program or  continue  with  an  unspecified
437              result instead of raising a Division_by_zero exception.
438
439       -unsafe-string
440              Identify  the  types  string and bytes,  thereby  making strings
441              writable.  This is intended for compatibility  with  old  source
442              code and should not be used with new software.
443
444       -v     Print the version number of the compiler and the location of the
445              standard library directory, then exit.
446
447       -verbose
448              Print all external commands before they are executed, in partic‐
449              ular invocations of the assembler, C compiler, and linker.
450
451       -version or -vnum
452              Print  the  version  number  of the compiler in short form (e.g.
453              "3.11.0"), then exit.
454
455       -w warning-list
456              Enable, disable, or mark as fatal the warnings specified by  the
457              argument warning-list.  See ocamlc(1) for the syntax of warning-
458              list.
459
460       -warn-error warning-list
461              Mark as fatal the  warnings  specified  in  the  argument  warn‐
462              ing-list.   The  compiler  will  stop  with an error when one of
463              these warnings is emitted.  The warning-list has the same  mean‐
464              ing  as  for  the  -w  option: a + sign (or an uppercase letter)
465              marks the corresponding warnings as fatal, a - sign (or a lower‐
466              case  letter)  turns  them back into non-fatal warnings, and a @
467              sign both enables and marks as fatal the corresponding warnings.
468
469              Note: it is not recommended to use  the  -warn-error  option  in
470              production  code,  because it will almost certainly prevent com‐
471              piling your program with later versions of OCaml when  they  add
472              new warnings or modify existing warnings.
473
474              The  default  setting  is  -warn-error -a+31 (only warning 31 is
475              fatal).
476
477       -warn-help
478              Show the description of all available warning numbers.
479
480       -where Print the location of the standard library, then exit.
481
482       - file Process file as a file name, even if it starts with a  dash  (-)
483              character.
484
485       -help or --help
486              Display a short usage summary and exit.
487
488

OPTIONS FOR THE IA32 ARCHITECTURE

490       The  IA32  code generator (Intel Pentium, AMD Athlon) supports the fol‐
491       lowing additional option:
492
493       -ffast-math
494              Use the IA32 instructions to compute trigonometric and  exponen‐
495              tial  functions,  instead  of  calling the corresponding library
496              routines.  The functions affected are: atan,  atan2,  cos,  log,
497              log10,  sin,  sqrt and tan.  The resulting code runs faster, but
498              the range of supported arguments and the precision of the result
499              can  be  reduced.   In particular, trigonometric operations cos,
500              sin, tan have their range reduced to [-2^64, 2^64].
501
502

OPTIONS FOR THE AMD64 ARCHITECTURE

504       The AMD64 code generator (64-bit versions  of  Intel  Pentium  and  AMD
505       Athlon) supports the following additional options:
506
507       -fPIC  Generate   position-independent   machine  code.   This  is  the
508              default.
509
510       -fno-PIC
511              Generate position-dependent machine code.
512
513

OPTIONS FOR THE ARM ARCHITECTURE

515       The ARM code generator supports the following additional options:
516
517       -farch=armv4|armv5|armv5te|armv6|armv6t2|armv7
518              Select the ARM target architecture
519
520       -ffpu=soft|vfpv2|vfpv3-d16|vfpv3
521              Select the floating-point hardware
522
523       -fPIC  Generate position-independent machine code.
524
525       -fno-PIC
526              Generate position-dependent machine code.  This is the default.
527
528       -fthumb
529              Enable Thumb/Thumb-2 code generation
530
531       -fno-thumb
532              Disable Thumb/Thumb-2 code generation
533
534       The default values for target architecture, floating-point hardware and
535       thumb  usage  were  selected  at  configure-time when building ocamlopt
536       itself. This configuration can  be  inspected  using  ocamlopt -config.
537       Target  architecture  depends  on  the "model" setting, while floating-
538       point hardware and thumb support are determined from the ABI setting in
539       "system" ( linux_eabiorlinux_eabihf).
540
541

SEE ALSO

543       ocamlc(1).
544       The OCaml user's manual, chapter "Native-code compilation".
545
546
547
548                                                                   OCAMLOPT(1)
Impressum