Re-exporting modules correctly

Suppose I have a library with top level APIs, and some modules I’d like to export, this works neatly with I put everything into a same dune library. (Note that I had my own instead of dune generated wrapper, since I want to export only selected modules)

type t = ...
let my_function_1 = ...
module MyModule = MyModule
(** Some documentation *)
type t
val my_function_1 : ...
module MyModule = MyModule

This works fine if another library depends on mylib, I can use MyModule via MyLib.MyModule and everything works.

However, when I have put things in multiple dune libraries, for instance the public library mylib depends on the internal mylib.utils library (assuming dune generates the wrapper). The re-exporting module becomes module MyModule = Utils.MyModule.

When I access this re-exported MyModule in a different library via MyLib.MyModule, I get a compilation error saying MyLib.MyModule is an alias for Utils.MyModule which is missing.

I’ve tried to do the following things:

(1) Pass -linkall to library_flags, not working
(2) In, use module MyModule = struct include MyModule end,
and in mylib.mli, use module MyModule : sig include (module type of MyModule) end, but the abstract types are broken

Any idea how to re-export modules in a multi-library layout correctly?

(I can provide an example repo if that helps)

There’s a way to tell Dune that a dependency is “re-exported”: General concepts — dune documentation

Do you have (implicit_transitive_deps false) in either mylib or in the other library ? (Stanza reference — dune documentation)
If your other library doesn’t use Dune, I think you’ll need to explicitly depend on mylib.utils too.