If you really have to, then fake, nop dependencies are easy to introduce between modules:
let () = Sys.opaque_identity (fun () -> let module D = Yourdep in ()) ()
Alternatively that seem easy to control via simple include directories.
In fact since that other discussion made me look again into it, that was the model I was using in b0caml
: directories with modules therein (and the actual linking business done in a data-driven like manner like omod
does).