Confusingly, these extensions are used in the example explaining dynamic dependencies. So one gets the impression that these are not supported by any builtin rules. At the least that example should end by saying "by the way this rule is already provided, we're just showing how you could implement it yourself". But that doesn't seem right either. The example specifically builds symlinks, which isn't what the builtin rule is supposed to do. So it's confusing; the example shouldn't reuse extensions that builtin rules do something different with.
$ cat a.ml
let () = Printf.printf "hello\n"
$ cat foo.itarget
a.byte
$ ocamlbuild foo.itarget
Finished, 0 targets (0 cached) in 00:00:00.
$ tree .
.
├── _build
│ ├── _digests
│ ├── _log
│ └── foo.itarget
├── a.ml
└── foo.itarget
1 directory, 5 files