OCAMLOPT(1)
π NAME π
okay so bestie, this is OCAMLOPT(1), the manual page for ocamlopt β The OCaml native-code compiler. β¨
πΈ SYNOPSIS πΈ
ocamlopt [options] filename...
ocamlopt.opt [options] filename...
π¦ DESCRIPTION π¦
okay so the OCaml high-performance native-code compiler ocamlopt(1) compiles OCaml source files to native code object files and links those object files to produce standalone executables. π
The ocamlopt(1) command has a command-line interface very close to that of ocamlc(1). It accepts the same types of arguments and processes them sequentially, after all options have been processed:
- Arguments ending in
.mliare taken to be source files for compilation unit interfaces. Interfaces specify the names exported by compilation units: they declare value names with their types, define public data types, declare abstract data types, and so on. From the filex.mli, theocamlopt(1)compiler produces a compiled interface in the filex.cmi. The interface produced is identical to that produced by the bytecode compilerocamlc(1). - Arguments ending in
.mlare taken to be source files for compilation unit implementations. Implementations provide definitions for the names exported by the unit, and also contain expressions to be evaluated for their side-effects. From the filex.ml, theocamlopt(1)compiler produces two files:x.o, containing native object code, andx.cmx, containing extra information for linking and optimization of the clients of the unit. The compiled implementation should always be referred to under the namex.cmx(when given a.ofile,ocamlopt(1)assumes that it contains code compiled from C, not from OCaml).
The implementation is checked against the interface file x.mli (if it exists) as described in the manual for ocamlc(1).
- Arguments ending in
.cmxare taken to be compiled object code. These files are linked together, along with the object files obtained by compiling.mlarguments (if any), and the OCaml standard library, to produce a native-code executable program. The order in which.cmxand.mlarguments are presented on the command line is relevant: compilation units are initialized in that order at run-time, and it is a link-time error to use a component of a unit before having initialized it. Hence, a givenx.cmxfile must come before all.cmxfiles that refer to the unitx. - Arguments ending in
.cmxaare taken to be libraries of object code. Such a library packs in two fileslib.cmxaandlib.aa set of object files (.cmx/.ofiles). Libraries are build withocamlopt -a(see the description of the-aoption below). The object files contained in the library are linked as regular.cmxfiles (see above), in the order specified when the library was built. The only difference is that if an object file contained in a library is not referenced anywhere in the program, then it is not linked in. - Arguments ending in
.care passed to the C compiler, which generates a.oobject file. This object file is linked with the program. - Arguments ending in
.oor.aare assumed to be C object files and libraries. They are linked with the program.
The output of the linking phase is a regular Unix executable file. It does not need ocamlrun(1) to run. π
Two versions of the native-code compiler exist: ocamlopt.byte is a bytecode executable (i.e. compiled with ocamlc(1)), while ocamlopt.opt is a native executable (i.e. compiled with ocamlopt(1) itself). ocamlopt.opt may not be available in all installations of OCaml. ocamlopt is an alias for the fastest of the two, i.e. for ocamlopt.opt if it is available, otherwise for ocamlopt.byte.
β¨ OPTIONS β¨
The following command-line options are recognized by ocamlopt(1). π
-aβ Build a library (.cmxa/.afile) with the object files (.cmx/.ofiles) given on the command line, instead of linking them into an executable file. The name of the library must be set with the-ooption.
If -cclib or -ccopt options are passed on the command line, these options are stored in the resulting .cmxa library. Then, linking with this library automatically adds back the -cclib and -ccopt options as if they had been provided on the command line, unless the -noautolink option is given. Additionally, a substring $CAMLORIGIN inside a -ccopt options will be replaced by the full path to the .cma library, excluding the filename.
-absnameβ Show absolute filenames in error messages. π-no-absnameβ Do not try to show absolute filenames in error messages.-annotβ Deprecated since OCaml 4.11. Please use-bin-annotinstead. π«Ά-bin-annotβ Dump detailed information about the compilation (types, bindings, tail-calls, etc) in binary format. The information for filesrc.mlis put into filesrc.cmt. In case of a type error, dump all the information inferred by the type-checker before the error. The annotation files produced by-bin-annotcontain more information and are much more compact than the files produced by-annot.-cβ Compile only. Suppress the linking phase of the compilation. Source code files are turned into compiled files, but no executable file is produced. This option is useful to compile modules separately.-cc ccompβ Useccompas the C linker called to build the final executable and as the C compiler for compiling.csource files.-cclib -llibnameβ Pass the-llibnameoption to the linker. This causes the given C library to be linked with the program.-ccopt optionβ Pass the given option to the C compiler and linker. For instance,-ccopt -Ldircauses the C linker to search for C libraries in directorydir.-color modeβ Enable or disable colors in compiler messages (especially warnings and errors). The following modes are supported:autoβ use heuristics to enable colors only if the output supports them (an ANSI-compatible tty terminal);alwaysβ enable colors unconditionally;neverβ disable color output.
The environment variable OCAML_COLOR is considered if -color is not provided. Its values are auto/always/never as above.
If -color is not provided, OCAML_COLOR is not set and the environment variable NO_COLOR is set, then color output is disabled. Otherwise, the default setting is auto, and the current heuristic checks that the TERM environment variable exists and is not empty or dumb, and that isatty(stderr) holds. π
-error-style modeβ Control the way error messages and warnings are printed. The following modes are supported:shortβ only print the error and its location;contextualβ likeshort, but also display the source code snippet corresponding to the location of the error.
The default setting is contextual.
The environment variable OCAML_ERROR_STYLE is considered if -error-style is not provided. Its values are short/contextual as above.
-compactβ Optimize the produced code for space rather than for time. This results in smaller but slightly slower programs. The default is to optimize for speed. π’-configβ Print the version number ofocamlopt(1)and a detailed summary of its configuration, then exit.-config-varβ Print the value of a specific configuration variable from the-configoutput, then exit. If the variable does not exist, the exit code is non-zero.-depend ocamldep-argsβ Compute dependencies, asocamldepwould do.-for-pack module-pathβ Generate an object file (.cmxand.ofiles) that can later be included as a sub-module (with the given access path) of a compilation unit constructed with-pack. For instance,ocamlopt -for-pack P -c A.mlwill generatea.cmxanda.ofiles that can later be used withocamlopt -pack -o P.cmx a.cmx. π¦-gβ Add debugging information while compiling and linking. This option is required in order to produce stack backtraces when the program terminates on an uncaught exception (seeocamlrun(1)).-no-gβ Do not record debugging information (default).-iβ Cause the compiler to print all defined names (with their inferred types or their definitions) when compiling an implementation (.mlfile). No compiled files (.cmoand.cmifiles) are produced. This can be useful to check the types inferred by the compiler. Also, since the output follows the syntax of interfaces, it can help in writing an explicit interface (.mlifile) for a file: just redirect the standard output of the compiler to a.mlifile, and edit that file to remove all declarations of unexported names. π-i-varianceβ Cause the compiler to print the computed variance of type parameters for every type declaration. Without this option, variance is printed only for private types or types without a manifest (e.g., abstract types).-cmi-file filenameβ Type-check the source implementation to be compiled against the specified interface file (bypasses the normal lookup for.mliand.cmifiles).-I directoryβ Add the given directory to the list of directories searched for compiled interface files (.cmi), compiled object code files (.cmx), and libraries (.cmxa). By default, the current directory is searched first, then the standard library directory. Directories added with-Iare searched after the current directory, in the order in which they were given on the command line, but before the standard library directory. See also option-nostdlib.
If the given directory starts with +, it is taken relative to the standard library directory. For instance, -I +compiler-libs adds the subdirectory compiler-libs of the standard library to the search path. π¦
-impl filenameβ Compile the file filename as an implementation file, even if its extension is not.ml.-inline nβ sets how aggressive the inliner gets, where n is a positive integer π.-inline 0= no function gets inlined unless its body is literally smaller than the call site, so inlining causes no expansion in code size, zero, nada. The default is-inline 1, which lets slightly larger functions in and gives you a slight expansion in code size. Higher values make bigger and bigger functions candidates for inlining β adorable in theory β but ngl they can cause a serious increase in code size π.-insn-schedβ turns on the instruction scheduling pass in the compiler backend β¨.-intffilename β compiles filename as an interface file, even if its extension isn't.mliπ.-intf-suffixstring β treat file names ending in string as interface files (instead of the default.mli) π .-keep-docsβ keeps documentation strings in the generated.cmifiles π«Ά.-keep-locsβ keeps locations in the generated.cmifiles π.-labelsβ labels are not ignored in types, labels can be used in applications, and labelled parameters can be given in any order πΈ. This is the default, bestie.-linkallβ forces all modules contained in libraries to be linked in π₯. Without this flag, unreferenced modules just don't get linked in. It's got two whole moods:- When building a library (the
-aflag), setting-linkallforces all subsequent links of programs involving that library to link all the modules contained in the library. - When compiling a module (option
-c), setting-linkallensures that this module will always be linked if it's put in a library and that library gets linked.
- When building a library (the
-linscanβ use linear scan register allocation β‘. Compiling with this allocator is faster than with the usual graph coloring allocator β sometimes quite drastically so for long functions and modules. Downside? The generated code can be a bit slower π.-match-context-rowsβ sets the number of rows of context used during pattern matching compilation. Lower values = faster compilation but less optimized code πββοΈ. The default value is32.-no-alias-depsβ do not record dependencies for module aliases π«.-no-app-functβ deactivates the applicative behaviour of functors. With this option, each functor application generates new types in its result, and applying the same functor twice to the same argument yields two incompatible structures π.-noassertβ do not compile assertion checks. Note that the special formassert falseis always compiled, because it's typed specially π. This flag has no effect when linking already-compiled files.-noautolinkβ when linking.cmxalibraries, ignore-ccliband-ccoptoptions potentially contained in the libraries (if these options were given when building the libraries). This is useful if a library contains incorrect specifications of C libraries or C options β in that case, during linking, set-noautolinkand pass the correct C libraries and options on the command line π οΈ.-nodynlinkβ allows the compiler to use some optimizations that are valid only for code that is never dynlinked β¨.-no-insn-schedβ disables the instruction scheduling pass in the compiler backend π ββοΈ.-nostdlibβ do not automatically add the standard library directory to the list of directories searched for compiled interface files (.cmi), compiled object code files (.cmx), and libraries (.cmxa) π«. See also option-I.-nolabelsβ ignore non-optional labels in types. Labels cannot be used in applications, and parameter order becomes strict π€.- **
-o*filename* β sets the name of the final output file, whether that's an executable, a compiled object (-coption), a library (-aoption), a packed object (-packoption), a dynlinkable plugin (-sharedoption), or a C source or object file (-output-objand-output-complete-obj` options) π―.
The default output name for an executable depends on the platform: it's a.out on Unix, camlprog.exe on Windows πͺ.
You can also use this when compiling but not linking an interface or implementation file (-c option), in which case it sets both the name of the cmi or cmx file and the name of the compilation unit to the filename up to the first dot π
.
-opaqueβ when compiling a.mliinterface file, this has the same effect as the-opaqueoption of the bytecode compiler π. When compiling a.mlimplementation file, it produces a.cmxfile without cross-module optimization information, which reduces recompilation when a module changes π.-openmodule β opens the given module before processing the interface or implementation files π. If you give several-openoptions, they're processed in order, just as if these statements:
open! module1;;
...
open! moduleN;;
were added at the top of each file β¨.
-output-objβ causes the linker to produce a C object file instead of an executable file π§. Super useful to wrap OCaml code as a C library, callable from any C program. The name of the output object file must be set with the-ooption. This option can also be used to produce a compiled shared/dynamic library (.soextension) π.-output-complete-objβ same as-output-objexcept the object file produced also includes the runtime and autolink libraries π.-packβ build an object file (.cmxand.ofiles) and its associated compiled interface (.cmi) that combines the.cmxobject files given on the command line, making them appear as sub-modules of the output.cmxfile π¦. The name of the output.cmxfile must be given with the-ooption. For instance,
ocamlopt -pack -o P.cmx A.cmx B.cmx C.cmx
generates compiled files P.cmx, P.o and P.cmi describing a compilation unit having three sub-modules A, B and C, corresponding to the contents of the object files A.cmx, B.cmx and C.cmx π₯. These contents can be referenced as P.A, P.B and P.C in the remainder of the program π«Ά.
The .cmx object files being combined must have been compiled with the appropriate -for-pack option β οΈ. In the example above, A.cmx, B.cmx and C.cmx must have been compiled with
ocamlopt -for-pack P
Multiple levels of packing can be achieved by combining -pack with -for-pack πͺ. See The OCaml user's manual, chapter "Native-code compilation" for more details.
-ppcommand β causes the compiler to call the given command as a preprocessor for each source file π§ͺ. The output of command is redirected to an intermediate file, which is compiled. If there are no compilation errors, the intermediate file is deleted afterwards ποΈ.-ppxcommand β after parsing, pipes the abstract syntax tree through the preprocessor command π. The moduleAst_mapper(3)implements the external interface of a preprocessor.-principalβ checks information path during type-checking, making sure all types are derived in a principal way π. All programs accepted in-principalmode are also accepted in default mode with equivalent types, but different binary signatures β so like, same vibes, different blueprint π .-no-principalβ do not check principality of type inference. This is the default π ββοΈ.-rectypesβ allows arbitrary recursive types during type-checking π. By default, only recursive types where the recursion goes through an object type are supported. Note that once you've created an interface using this flag, you must use it again for all dependencies β οΈ.-no-rectypesβ do not allow arbitrary recursive types during type-checking. This is the default π«.-runtime-variantsuffix β adds suffix to the name of the runtime library that will be used by the program π. If OCaml was configured with option-with-debug-runtime, then thedsuffix is supported and gives a debug version of the runtime π.-Sβ keeps the assembly code produced during compilation πΎ. The assembly code for the source filex.mlis saved in the filex.s.-safe-stringβ enforces the separation between typesstringandbytes, thereby making strings read-only π. This is the default.-safer-matchingβ do not use type information to optimize pattern-matching π΅οΈββοΈ. This allows you to detect match failures even if a pattern-matching was wrongly assumed to be exhaustive. This only impacts GADT and polymorphic variant compilation.-save-ir-afterpass β save the intermediate representation after the given compilation pass πΎ. The currently supported passes are:scheduling.-set-runtime-defaultsetting=value β when linking an executable, override the default value for a runtime setting ποΈ. The only currently supported setting is:standard_library_defaultβ specifies the default location used by the executable to locate the Standard Library. By default, this is the absolute path to the Standard Library the compiler itself was configured with.
-sharedβ build a plugin (usually.cmxs) that can be dynamically loaded with theDynlinkmodule π. The name of the plugin must be set with the-ooption. A plugin can include a number of OCaml modules and libraries, and extra native objects (.o,.afiles). Building native plugins is only supported for some operating systems β under some systems (currently, only Linux AMD 64), all the OCaml code linked in a plugin must have been compiled without the-nodynlinkflag β οΈ. Some constraints might also apply to the way the extra native objects have been compiled (under Linux AMD 64, they must contain only position-independent code).-short-pathsβ when a type is visible under several module-paths, use the shortest one when printing the type's name in inferred interfaces and error and warning messages βοΈ.-stop-afterpass β stop compilation after the given compilation pass β. The currently supported passes are:parsing,typing,scheduling,emit.-strict-sequenceβ the left-hand part of a sequence must have typeunitπ€.-no-strict-sequenceβ the left-hand part of a sequence doesn't have to have typeunit. This is literally the default, bestie, so you're probably already living this life β¨-unboxed-typesβ when a type is unboxable (i.e. a record with a single argument, or a concrete datatype with a single constructor of one argument) it gets unboxed unless it's annotated with[@@ocaml.boxed]π-no-unboxed-typesβ when a type is unboxable it gets boxed unless it's annotated with[@@ocaml.unboxed]. This is the default π-unsafeβ turns bound checking off for array and string accesses (thev.(i)ands.[i]constructs). Programs compiled with-unsafeare therefore faster, but unsafe: anything can happen if the program accesses an array or string outside of its bounds π Additionally, it turns off the check for zero divisor in integer division and modulus operations. With-unsafe, an integer division (or modulus) by zero can halt the program or continue with an unspecified result instead of raising aDivision_by_zeroexception π
fr fr, -unsafe is giving "living on the edge" β great vibes, zero safety net π
-unsafe-stringβ identifies the typesstringandbytes, thereby making strings writable. This is intended for compatibility with old source code and should not be used with new software π-vβ print the version number of the compiler and the location of the standard library directory, then exit π-verboseβ print all external commands before they're executed, in particular invocations of the assembler, C compiler, and linker. Very "tell me everything" energy π«Ά-versionor-vnumβ print the version number of the compiler in short form (e.g."3.11.0"), then exit β-wwarning-list β enable, disable, or mark as fatal the warnings specified by the argument warning-list. Seeocamlc(1)for the complete documentation of that flag, in particular the list of supported warnings π-warn-errorwarning-list β mark as fatal the warnings specified in the argument warning-list. The compiler will stop with an error when one of these warnings is emitted. The warning-list has the same meaning as for the-woption: a+sign (or an uppercase letter) marks the corresponding warnings as fatal, a-sign (or a lowercase letter) turns them back into non-fatal warnings, and a@sign both enables and marks as fatal the corresponding warnings π₯
Note: it is not recommended to use the -warn-error option in production code, because it will almost certainly prevent compiling your program with later versions of OCaml when they add new warnings or modify existing warnings π¬
The default setting is -warn-error -a (no warning is fatal) π
-warn-helpβ show the description of all available warning numbers. It's giving "warning lore drop" π-whereβ print the location of the standard library, then exit πΊοΈ-with-runtimeβ include the runtime system in the generated program. This is the default π§-without-runtimeβ the compiler does not include the runtime system (nor a reference to it) in the generated program; it must be supplied separately π- *
-*file β process file as a file name, even if it starts with a dash (-) character π― -helpor--helpβ display a short usage summary and exit π
β¨ OPTIONS FOR THE FLAMBDA MIDDLE-END β¨
When the Flambda code generator has been enabled at configuration time, its behavior may be tuned up with the following additional options π¦
-O2β perform more optimisation than usual. Compilation times may be lengthened β³-O3β perform even more optimisation than usual, possibly including unrolling of recursive functions. Compilation times may be significantly lengthened π-Oclassicβ makes inlining decisions at the point of definition of a function rather than at the call site(s). This mirrors the behaviour of OCaml compilers not using Flambda. Compared to compilation using the new Flambda inlining heuristics (for example at-O2) it produces smaller.cmxfiles, shorter compilation times and code that probably runs rather slower π-inlining-reportβ emit.inliningfiles (one per round of optimisation) showing all of the inliner's decisions π
β¨ OPTIONS FOR THE AMD64 ARCHITECTURE β¨
The AMD64 code generator (64-bit versions of Intel Pentium and AMD Athlon) supports the following additional options π»
-fPICβ generate position-independent machine code. This is the default πΈ-fno-PICβ generate position-dependent machine code π―
π SEE ALSO π
ocamlc(1).- The OCaml user's manual, chapter "Native-code compilation" π
okay bestie that's a wrap on OCAMLOPT(1) π
this whole page is footer'd with the source/version and date line down at the bottom β very "the end, periodt" energy π go compile something iconic π¦π
π¦ where this page comes from
- arch rolling: ocaml 5.5.0-1 Β· LGPL2.1 AND custom: QPL-1.0
- nixpkgs unstable: ocaml 5.5.1
- nixpkgs unstable: ocaml-solo5 1.3.5
- Copyright 1996 Institut National de Recherche en Informatique et
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms