1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357
|
executable
----------
The ``executable`` stanza must be used to describe an executable. The format of
executable stanzas is as follows:
.. code:: dune
(executable
(name <name>)
<optional-fields>)
``<name>`` is a module name that contains the executable's main entry point.
There can be additional modules in the current directory; you only need to
specify the entry point. Given an ``executable`` stanza with ``(name <name>)``,
Dune will know how to build ``<name>.exe``. If requested, it will also know how
to build ``<name>.bc``, ``<name>.bc.js`` and ``<name>.bc.wasm.js`` (Dune 2.0
and up also needs specific configuration (see the ``modes`` optional field
below)).
``<name>.exe`` is a native code executable, ``<name>.bc`` is a bytecode
executable which requires ``ocamlrun`` to run, ``<name>.bc.js`` is a
JavaScript generated using ``js_of_ocaml``, and ``<name>.bc.wasm.js`` is a
Wasm loader script generated using ``wasm_of_ocaml`` (the Wasm modules are included in
directory ``<name>.bc.wasm.assets``).
Please note: in case native compilation is not available, ``<name>.exe`` will be
a custom bytecode executable, in the sense of ``ocamlc -custom``. This means
it's a native executable that embeds the ``ocamlrun`` virtual machine as well as
the bytecode, so you can always rely on ``<name>.exe`` being available.
Moreover, it is usually preferable to use ``<name>.exe`` in custom rules or when
calling the executable by hand because running a bytecode executable often
requires loading shared libraries that are locally built. This requires
additional setup, such as setting specific environment variables, which Dune
doesn't do at the moment.
Native compilation isn't available when there is no ``ocamlopt`` binary at the
same place as ``ocamlc`` was found.
Executables can also be linked as object or shared object files. See `linking
modes`_ for more information.
Starting from Dune 3.0, it's possible to automatically generate empty interface
files for executables. See
:doc:`/reference/dune-project/executables_implicit_empty_intf`.
``<optional-fields>`` are:
- ``(public_name <public-name>)`` specifies that the executable should be
installed under this name. It's the same as adding the following stanza to
your ``dune`` file:
.. code:: dune
(install
(section bin)
(files (<name>.exe as <public-name>)))
As a special case, ``(public_name -)`` is the same as if the field was
absent.
.. _shared-exe-fields:
- ``(package <package>)`` if there is a ``(public_name ...)`` field, this
specifies the package the executables are part of it.
- ``(libraries <library-dependencies>)`` specifies the library dependencies. See
:doc:`/reference/library-dependencies` for more details.
- ``(link_flags <flags>)`` specifies additional flags to pass to the linker.
This field supports ``(:include ...)`` forms.
- ``(link_deps (<deps-conf list>))`` specifies the dependencies used only by the
linker, i.e., when using a version script. See
:doc:`/concepts/dependency-spec` for more details.
- ``(modules <modules>)`` specifies which modules in the current directory Dune
should consider when building this executable. Modules not listed here will be
ignored and cannot be used inside the executable described by the current
stanza. It is interpreted in the same way as the ``(modules ...)`` field of
:doc:`library`.
- ``(root_module <module>)`` specifies a ``root_module`` that collects all
listed dependencies in ``libraries``. See the documentation for
``root_module`` in the library stanza.
- ``(modes (<modes>))`` sets the `linking modes`_. The default is ``(exe)``.
Before Dune 2.0, it formerly was ``(byte exe)``.
- ``(preprocess <preprocess-spec>)`` is the same as the ``(preprocess ...)``
field of :doc:`library`.
- ``(preprocessor_deps (<deps-conf list>))`` is the same as the ``(preprocessor_deps ...)`` field of :doc:`library`.
- ``js_of_ocaml``: See the section about :ref:`jsoo-field`
- ``wasm_of_ocaml``: See the section about :ref:`wasmoo-field`
- ``flags``, ``ocamlc_flags``, and ``ocamlopt_flags``: See
:doc:`/concepts/ocaml-flags`.
- ``(modules_without_implementation <modules>)`` is the same as the
corresponding field of :doc:`library`.
- ``(allow_overlapping_dependencies)`` is the same as the corresponding field of
:doc:`library`.
- ``(optional)`` is the same as the corresponding field of :doc:`library`.
- ``(enabled_if <blang expression>)`` is the same as the corresponding field of
:doc:`library`.
- ``(promote <options>)`` allows promoting the linked executables to the source
tree. The options are the same as for the :ref:`rule promote mode <promote>`.
Adding ``(promote (until-clean))`` to an ``executable`` stanza will cause Dune
to copy the ``.exe`` files to the source tree and use ``dune clean`` to delete
them.
- ``(foreign_stubs <foreign-stubs-spec>)`` specifies foreign source files, e.g.,
C or C++ stubs, to be linked into the executable. See
:doc:`/reference/foreign-stubs` for more details.
- ``(foreign_archives <foreign-archives-list>)`` specifies archives of foreign
object files to be linked into the executable. See the section
:doc:`/reference/foreign-archives` for more details.
- ``(forbidden_libraries <libraries>)`` ensures that the given libraries are not
linked in the resulting executable. If they end up being pulled in, either
through a direct or transitive dependency, Dune fails with an error message
explaining how the library was pulled in. This field has been available since
Dune 2.0.
- ``(embed_in_plugin_libraries <library-list>)`` specifies a list of libraries
to link statically when using the ``plugin`` linking mode. By default, no
libraries are linked in. Note that you may need to also use the ``-linkall``
flag if some of the libraries listed here are not referenced from any of the
plugin modules.
- ``(ctypes <ctypes field>)`` instructs Dune to use ctypes stubgen to process
your type and function descriptions for binding system libraries, vendored
libraries, or other foreign code. See :ref:`ctypes-stubgen` for a full
reference. This field is available since the 3.0 version of the Dune language.
- ``(empty_module_interface_if_absent)`` causes the generation of empty
interfaces for every module that does not have an interface file already.
Useful when modules are used solely for their side-effects. This field is
available since the 3.0 version of the Dune language.
Linking Modes
~~~~~~~~~~~~~
The ``modes`` field allows selecting which linking modes will be used to link
executables. Each mode is a pair ``(<compilation-mode> <binary-kind>)``, where
``<compilation-mode>`` describes whether the bytecode or native code backend of
the OCaml compiler should be used and ``<binary-kind>`` describes what kind of
file should be produced.
``<compilation-mode>`` must be ``byte``, ``native``, or ``best``, where ``best``
is ``native`` with a fallback to bytecode when native compilation isn't
available.
``<binary-kind>`` is one of:
- ``c`` for producing OCaml bytecode embedded in a C file
- ``exe`` for normal executables
- ``object`` for producing static object files that can be manually linked into
C applications
- ``shared_object`` for producing object files that can be dynamically loaded
into an application. This mode can be used to write a plugin in OCaml for a
non-OCaml application.
- ``js`` for producing JavaScript from bytecode executables, see
:doc:`/reference/dune-project/explicit_js_mode`.
- ``wasm`` for producing JavaScript from bytecode executables.
- ``plugin`` for producing a plugin (``.cmxs`` if native or ``.cma`` if
bytecode).
For instance the following ``executables`` stanza will produce bytecode
executables and native shared objects:
.. code:: dune
(executables
(names a b c)
(modes (byte exe) (native shared_object)))
Additionally, you can use the following shorthands:
- ``c`` for ``(byte c)``
- ``exe`` for ``(best exe)``
- ``object`` for ``(best object)``
- ``shared_object`` for ``(best shared_object)``
- ``byte`` for ``(byte exe)``
- ``native`` for ``(native exe)``
- ``js`` for ``(byte js)``
- ``wasm`` for ``(byte wasm)``
- ``plugin`` for ``(best plugin)``
For instance, the following ``modes`` fields are all equivalent:
.. code:: dune
(modes (exe object shared_object))
(modes ((best exe)
(best object)
(best shared_object)))
Lastly, use the special mode ``byte_complete`` for building a bytecode
executable as a native self-contained executable, i.e., an executable that
doesn't require the ``ocamlrun`` program to run and doesn't require the C stubs
to be installed as shared object files.
The extensions for the various linking modes are chosen as follows:
.. =========================== =================
.. linking mode extensions
.. --------------------------- -----------------
.. byte .bc
.. native/best .exe
.. byte_complete .bc.exe
.. (byte object) .bc%{ext_obj}
.. (native/best object) .exe%{ext_obj}
.. (byte shared_object) .bc%{ext_dll}
.. (native/best shared_object) %{ext_dll}
.. c .bc.c
.. js .bc.js
.. wasm .bc.wasm.js
.. (best plugin) %{ext_plugin}
.. (byte plugin) .cma
.. (native plugin) .cmxs
.. =========================== =================
``%{ext_obj}`` and ``%{ext_dll}`` are the extensions for object and shared
object files. Their value depends on the OS. For instance, on Unix
``%{ext_obj}`` is usually ``.o`` and ``%{ext_dll}`` is usually ``.so``, while on
Windows ``%{ext_obj}`` is ``.obj`` and ``%{ext_dll}`` is ``.dll``.
Up to version 3.0 of the Dune language, when ``byte`` is specified but none of
``native``, ``exe``, or ``byte_complete`` are specified, Dune implicitly adds a
linking mode that's the same as ``byte_complete``, but it uses the extension
``.exe``. ``.bc`` files require additional files at runtime that aren't
currently tracked by Dune, so they don't run ``.bc`` files during the build. Run
the ``.bc.exe`` or ``.exe`` ones instead, as these are self-contained.
Lastly, note that ``.bc`` executables cannot contain C stubs. If your executable
contains C stubs you may want to use ``(modes exe)``.
.. _jsoo-field:
js_of_ocaml
~~~~~~~~~~~
In ``library`` and ``executable`` stanzas, you can specify ``js_of_ocaml``
options using ``(js_of_ocaml (<js_of_ocaml-options>))``.
``<js_of_ocaml-options>`` are all optional:
- ``(flags <flags>)`` to specify flags passed to ``js_of_ocaml compile``. This
field supports ``(:include ...)`` forms
- ``(build_runtime_flags <flags>)`` to specify flags passed to ``js_of_ocaml
build-runtime``. This field supports ``(:include ...)`` forms
- ``(link_flags <flags>)`` to specify flags passed to ``js_of_ocaml link``. This
field supports ``(:include ...)`` forms
- ``(javascript_files (<files-list>))`` to specify ``js_of_ocaml`` JavaScript
runtime files.
- ``(compilation_mode <mode>)`` where ``<mode>>`` is either ``whole_program`` or ``separate``.
This is only available inside ``executable`` stanzas.
- ``(sourcemap <config>)`` where ``<config>>`` is one of ``no``, ``file`` or ``inline``.
This is only available inside ``executable`` stanzas.
- ``(enabled_if <blang expression>)`` to specify whether the ``js`` mode is enabled. It is enabled by default.
This is only available inside ``executable`` stanzas.
``<flags>`` is specified in the :doc:`/reference/ordered-set-language`.
``<blang expression>`` is specified using the :doc:`/reference/boolean-language`,
The default values for ``flags``, ``compilation_mode`` and ``sourcemap`` depend on the selected build profile. The
build profile ``dev`` (the default) will enable inline sourcemap, separate compilation and pretty
JavaScript output.
See :ref:`jsoo` for more information.
.. _wasmoo-field:
wasm_of_ocaml
~~~~~~~~~~~~~
In ``library`` and ``executable`` stanzas, you can specify ``wasm_of_ocaml``
options using ``(wasm_of_ocaml (<wasm_of_ocaml-options>))``.
``<wasm_of_ocaml-options>`` are all optional. They are the same as the ``<js_of_ocaml-options>`` above plus:
- ``(wasm_files (<files-list>))`` to specify ``wasm_of_ocaml``
Wasm runtime files.
For the ``(sourcemap <config>)`` option, ``<config>`` must be one of ``no`` or ``inline``. Source maps are put within the ``.bc.wasm.assets`` directory.
The default values for ``flags``, ``compilation_mode`` and ``sourcemap`` depend on the selected build profile. The
build profile ``dev`` (the default) will enable sourcemaps, separate compilation and pretty Wasm output.
See :ref:`wasmoo` for more information.
executables
-----------
There is a very subtle difference in the naming of these stanzas. One is
``executables``, plural, and the other is ``executable``, singular. The
``executables`` stanza is very similar as the ``executable`` stanza but can be
used to to describe several executables sharing the same configuration, so the
plural ``executables`` stanza is used to describe more than one executable.
It shares the same fields as the ``executable`` stanza, except that instead of
``(name ...)`` and ``(public_name ...)`` you must use the plural versions as
well:
- ``(names <names>)`` where ``<names>`` is a list of entry point names. Compare
with ``executable``, where you only need to specify the modules containing the
entry point of each executable.
- ``(public_names <names>)`` describes under what name to install each
executable. The list of names must be of the same length as the list in the
``(names ...)`` field. Moreover, you can use ``-`` for executables that
shouldn't be installed.
However, using ``executables`` the executables defined in the stanza are
allowed to share modules.
Given modules ``Foo``, ``Bar`` and ``Baz`` the usage of ``executables`` can
simplify the code:
.. code:: dune
(executables
(names foo bar))
Instead of the more complex
.. code:: dune
(library
(name baz)
(modules baz))
(executable
(name foo)
(modules foo)
(libraries baz))
(executable
(name bar)
(modules bar)
(libraries baz))
|