Ocamlbuild knows of two ways to build .cmxs files: - from a .cmxa file, repackaged for dynamic loading - from a .mldylib, listing the modules to be included (like .mllib for .cm{x,}a) (See "ocamlbuild -documentation | grep cmxs" to check this) Your build uses the first approach, and this results in d *and its dependencies* being packaged in d.cmxa and then d.cmxs. (See the log, or use -classic-display to see the commands). The behavior you expect requires the second approach. You can obtain it by adding d.mldylib: D On Thu, Nov 8, 2018 at 11:06 AM Frédéric Fort wrote: > Hello, > > I have an existing program and would like to allow to extend it's > functionalities with plugins. > If I simplify my code structure it looks as follows: > - a.ml : "main module" of the program > - b.ml : additional definitions used in a.ml > - c.ml : interface for plugins (a collection of function refs) > - d.ml : plugin I would like to load > > Now, d.ml uses values defined in b.ml. Some of them are of type string ref > and it seems that the code of b.ml is reevaluated when I call > Dynlink.loadfile "/path/to/d.cmxs" which resets them to the empty string. > > Is there a way to prevent this from happening ? > Using allow_only and prohibit is not an option, since multiple plugins > would each reevaluate C > and undo each others modifications. > > Yours sincerely, > Frédéric Fort > > P.S.: Here follows a minimal working example. > I compiled it with > ocamlbuild -use-ocamlfind -lib dynlink a.native > ocamlbuild -use-ocamlfind d.cmxs > > a.ml: > open Format > > let _ = > B.str := "abc"; > printf "%s\n" !B.str; > begin > try > Dynlink.loadfile "./_build/d.cmxs" > with Dynlink.Error err -> > failwith (Dynlink.error_message err) end; > printf "%s\n" !B.str; > match !C.f with > | Some(f) -> printf "%s\n" (f 0) > | None -> () > > b.ml: > let str = ref "" > > c.ml: > let f : (int -> string) option ref = ref None > > d.ml: > let _ = > C.f := Some((fun x -> !B.str^(string_of_int x))) > > -- > Caml-list mailing list. Subscription management and archives: > https://sympa.inria.fr/sympa/arc/caml-list > https://inbox.ocaml.org/caml-list > Forum: https://discuss.ocaml.org/ > Bug reports: http://caml.inria.fr/bin/caml-bugs -- Caml-list mailing list. Subscription management and archives: https://sympa.inria.fr/sympa/arc/caml-list https://inbox.ocaml.org/caml-list Forum: https://discuss.ocaml.org/ Bug reports: http://caml.inria.fr/bin/caml-bugs