Building an Ad Hoc .cmxs

In the model exposed by Dune, a .cmxs target is created for each library. However, the .cmxs format itself is more flexible and is capable to containing arbitrary .cmxa and .cmx files.

For the specific cases where this extra flexibility is needed, one can use Variables for Artifacts to write explicit rules to build .cmxs files not associated to any library.

Below is an example where we build my.cmxs containing foo.cmxa and d.cmx. Note how we use a library stanza to set up the compilation of d.cmx.

(library
 (name foo)
 (modules a b c))

(library
 (name dummy)
 (modules d))

(rule
 (targets my.cmxs)
 (action (run %{ocamlopt} -shared -o %{targets} %{cmxa:foo} %{cmx:d})))