Findlib Integration

Dune integrates with findlib so that it is possible to use a dependency built with Dune in a project that does not use Dune, or vice versa.

See also

The OCaml Ecosystem explains the role of findlib and its relation with Dune.

To do so, Dune both interprets and generates META files.

How Dune Interprets META files

META files use the concept of predicates, which can be used to change the interpretation of the directives the files contain. However, Dune does not expose this to the user.

Instead, Dune interprets META files assuming the following set of predicates:

  • mt: refers to a library that can be used with or without threads. Dune will force the threaded version.

  • mt_posix: forces the use of POSIX threads rather than VM threads. VM threads are deprecated and will soon be obsolete.

  • ppx_driver: when a library acts differently depending on whether it’s linked as part of a driver or meant to add a -ppx argument to the compiler, choose the former behavior.

The Special Case of the OCaml Compiler

Libraries installed by the compiler are a special case: when the OCaml compiler is older than version 5.0, it does not include META files. In that situation, Dune uses its own internal database.

How Dune Generates META Files

When Dune builds a library, it generates a corresponding META file automatically. Usually, there is nothing to do. However, for the rare cases where a specific META file is needed, or to ease the transition of a project to Dune, it is possible to write/generate a specific one.

If a META.<package>.template is found in the same directory as <package>.OPAM, the generated META.<package> file will be produced by starting from the contents of META.<package>.template and replacing lines of the form # DUNE_GEN with the contents of the META it would normally generate.

For instance, to add field = "..." to the generated META file of package pkg, you can create a file named META.pkg.template with the following contents:

# DUNE_GEN
blah = "..."