Ocamlbuild plugin: turns directory foo.mld into a module Foo.
The contents of module Foo are the modules that can be "found" in directory foo.mld and recursively in its subdirectories,
down to other directories of the form bar.mld:
Bar will be a submodule of Foo, and the recursive search for Foo's modules stops there.
The contents of bar.mld will then be used to determine the submodules of Foo.Bar.
Hence, the following source tree
-src/
|-foo.mld/
|-a/
| |-bar.mld/
| | |-b.ml
| |
| |-c/
| |-d.ml
|
|-e.ml
will turn into the following module structure
-Foo
|-Bar
| |-B
|
|-D
|-E
In the background:
an mlpack is automatically generated for each directory *.mld, and the -for-pack options are automatically generated.
All directories scanned for Foo's contents (i.e. src/foo.mld, src/foo.mld/a, src/foo.mld/a/c) can see each other, as if they were flattened.
So D and E can refer to each other (in a non-circular way).
On the other hand they cannot see the contents of bar.mld: module B will be unknown to them, but they can instead refer to Bar.B.
In the other direction,
the default behaviour is that directory bar.mld inherits the visibility of the upper group,
so that B can see its uncles and aunts, i.e. refer to D and E (if it refers to Bar, a circularity would be detected).
Likewise, all of the directories inherit the visibility of src,
so that all of the modules mentioned here can refer to the brothers of Foo available in directory src.
This default behaviour can be changed (e.g. if we had a file d.ml in directory bar.mld, which would create an ambiguity),
by the use of a new Ocamlbuild tag:
<target_dir.mld> : blind
in Ocamlbuild's _tags file would prevent the contents of target_dir.mld to inherit the visibility of the directory where target_dir.mld sits.
Here, <src/foo.mld/a/bar.mld> : blind in the _tags file would prevent B from referring to its uncles and aunts D and E.
The plugin offers two new tags to be used in ocamlbuild:
visible(directory_path) and invisible(directory_path).
For instance in ocamlbuild's _tags file one can write
<target_dir> : visible(directory_path)
whose effect is that target_dir can see the contents of directory_path,
i.e. any target in directory target_dir has the include flag -I directory_path.
Similarly,
<target_dir> : invisible(directory_path)
removes directory_path from the directories visible by target_dir.
(Note that these rules are applied before the 'visibility inheritance' mechanism for mld directories,
which could make directory_path visible again by target_dir).
Finally, the plugin introduces a phony target called 'silent': writing
<silent> : tag1, tag2, tag3
in the _tags file
makes Ocamlbuild's unused tag detection mechanism for tag1, tag2, and tag3, finally shut up.
No more warnings of this kind when you know what you are doing.
This is a standard oasis-managed library:
oasis setup
ocaml setup.ml -configure
ocaml setup.ml -build
ocaml setup.ml -install
will install the library with findlib
You can also install the versions registered with the opam package manager, directly typing
opam install mld
The dispatch function Mld.dispatch should be called by myocamlbuild.ml with a line like
let () = Ocamlbuild_plugin.dispatch Mld.dispatch
or if you already have another dispatch function (provided by e.g. oasis)
let () = Ocamlbuild_plugin.dispatch
(MyOCamlbuildBase.dispatch_combine
[ other_dispatch ; Mld.dispatch ])
Then when calling ocamlbuild, you need to indicate that Findlib's package mld should be used, e.g.
ocamlbuild -use-ocamlfind -plugin-tags 'package(mld)' ...
With oasis, you need something like
BuildTools: ocamlbuild
OCamlVersion: >= 4.03
AlphaFeatures: ocamlbuild_more_args
XOCamlbuildPluginTags: package(mld)
This package is distributed under the terms of the CeCILL-C License.