$ cat >dune-project < (lang dune 2.7) > (wrapped_executables false) > EOF "Hello" is an instrumentation backend that instruments by printing "Hello, Dune!" at the beginning of the module. $ cat >dune < (executable > (name main) > (modules main) > (libraries mylib) > (instrumentation (backend hello))) > (library > (name mylib) > (modules mylib) > (instrumentation (backend hello))) > EOF $ cat >mylib.ml < let f () = () > EOF $ cat >main.ml < let () = Mylib.f () > EOF As instrumentation is disabled, this should not print the instrumentation message. $ dune build $ _build/default/main.exe This should print the instrumentation message twice, once for "main" and once for "mylib": $ dune build --instrument-with hello $ _build/default/main.exe Hello from Mylib! Hello from Main! An empty file: $ cat >main.ml < EOF We build the empty file. $ dune build Nothing happens: $ _build/default/main.exe We rebuild with instrumentation via the CLI. $ dune build --instrument-with hello We get the message. $ _build/default/main.exe Hello from Main! We also check that we can pass arguments to the ppx. $ cat >dune < (executable > (name main) > (modules main) > (preprocess (pps trivial.ppx)) > (instrumentation (backend hello -place Spain))) > EOF $ dune build --instrument-with hello File "dune", line 5, characters 33-39: 5 | (instrumentation (backend hello -place Spain))) ^^^^^^ Error: The possibility to pass arguments to instrumentation backends is only available since version 2.8 of the dune language. Please update your dune-project file to have (lang dune 2.8). [1] $ cat >dune-project < (lang dune 2.8) > EOF $ dune build --instrument-with hello $ _build/default/main.exe Hello from Spain ()! Check that we do not pass the instrumentation flags when the instrumentation is disabled. If the flags were passed with the instrumentation disabled, the following command would fail (as the flags would be passed to the "trivial" ppx). $ dune build We also check that we can declare dependencies to the ppx. $ mkdir -p input $ cat >dune < (data_only_dirs input) > (subdir input (rule (with-stdout-to input (echo "really")))) > (executable > (name main) > (modules main) > (instrumentation (backend hello -place Spain -file input/input) (deps input/input))) > EOF $ dune build --instrument-with hello File "dune", line 6, characters 65-83: 6 | (instrumentation (backend hello -place Spain -file input/input) (deps input/input))) ^^^^^^^^^^^^^^^^^^ Error: 'deps' is only available since version 2.9 of the dune language. Please update your dune-project file to have (lang dune 2.9). [1] $ cat >dune-project < (lang dune 3.0) > EOF $ dune build --instrument-with hello $ _build/default/main.exe Hello from Spain (really)! Can also enable with an environment variable. $ DUNE_INSTRUMENT_WITH=hello dune build $ _build/default/main.exe Hello from Spain (really)! Instrumentation can also be controlled by using the dune-workspace file. $ cat >dune-workspace < (lang dune 2.7) > (instrument_with hello) > EOF $ dune build $ _build/default/main.exe Hello from Spain (really)! It can also be controlled on a per-context scope. $ cat >dune-workspace < (lang dune 2.7) > (context (default (name coverage) (instrument_with hello))) > EOF $ dune build $ _build/coverage/main.exe Hello from Spain (really)! Per-context setting takes precedence over per-workspace setting. $ cat >dune-workspace < (lang dune 2.7) > (instrument_with hello) > (context (default (name coverage) (instrument_with))) > EOF $ dune build $ _build/coverage/main.exe Next, we check the backend can be used when it is installed. $ dune build ppx/hello.install $ dune install hello --prefix _install $ grep instrumentation.backend _install/lib/hello/dune-package (instrumentation.backend hello.ppx)) $ mkdir -p installed $ cat >installed/dune-workspace < (lang dune 2.7) > (instrument_with hello) > EOF $ cat >installed/dune-project < (lang dune 2.7) > (wrapped_executables false) > EOF $ cat >installed/dune < (executable > (name main) > (instrumentation (backend hello))) > EOF $ cat >installed/main.ml < EOF $ OCAMLPATH=$PWD/_install/lib:$OCAMLPATH dune build --root installed Entering directory 'installed' Leaving directory 'installed' $ installed/_build/default/main.exe Hello from Main!