What's the purpose of _tags file with OCaml, and how to interpret the contents?

ocaml, ocamlbuild

Solution

A `_tags` file in addition to `myocamlbuild.ml` forms the root of the `ocamlbuild` compilation system.

`ocamlbuild` is a very generic tool, that can compile anything. It is driven by a solver, that according to the target, set by a user, finds a solution that can satisfy the target. The solution is a chain of rules that are applied to files. Files can be tagged by tags. Tags can alter rules. For example, it can add flags, like enabling profiling or linking to a library.

A `_tags` file provides a mechanism to assign tags to files and it has a simple grammar:

 pattern ":" tag "," {tag}.

What is to the left of `:` is actually a pattern or regular expression. Each file that matches the expression will be assigned with all tags that occur to the right of `:`.

`<**/*>` means for all files in this folder, and all subfolders, there is a shortcut for this: `true`. `<*>` means for all files on this folder (without descending into subfolders). Other examples are `<*.ml>`, `<*.cmx>` or `<**/*.cma>` (btw `or` can also be used to build a pattern).

OCamlbuild is documented in OCaml Manual, also there is a dump of old wiki, with lots of information.

But the fun part is that usually you do not need to know this in order to use OCaml. There is an `OASIS` tool that will automate all tasks, and create `_tags` file for you from a simple and high-level definition.

Problem

From Building OCaml code that uses list comprehension post, I can use `_tags` file to execute `ocamlbuild` with less build options. ``` $ cat _tags <**/*> : package(camlp4),syntax(camlp4o),package(pa_comprehension) ``` From the Batteries introduction, I also need to have _tags file to use Batteries package. ``` <*>: package(batteries) ``` Why the first example uses `<**/*>` when the second example uses `<*>`? In general, what's the purpose of _tags file in ocamlbuild? Do you have some good tutorials on it?

Original source