On 03/03/2015 15:55, Gerd Stolpmann wrote: > Am Dienstag, den 03.03.2015, 14:15 +0100 schrieb François Bobot: >> Gerd, do you think that something that does that could be added to ocamlfind? One tricky thing is to >> know the library statically linked (ie. `Ocsigen_config.builtin_packages`), perhaps ocamlfind can >> during linking add this information. > > I think so. For toploops, there is already code that tracks libraries > already linked into the executable (i.e. if you ocamlmktop your > toploop). All was already in place indeed! It was easy to add. I kept caml-list in CC for discussing the big picture in order to get comments from people. Is mail still your preferred way of receiving patch? I kept it simple, no hack (no automatic: cmxa -> cmxs) because I prefer problems in library META to be found than to be paper over. The first patch adds: - A library `findlib.dynlink` that depends on `findlib` and `dynlink` - During linking (using `ocamlfind ocaml*`) if `-package findlib.dynlink` and `-linkpkg` are used then a module `Findlib_initl...` is linked after all packages and it stores the names of packages linked in `Findlib.linked_packages`. - In the main program `Fl_dynlink.load_packages ["yojson"]` can be used to dynlink packages The second patch forbids to run `Fl_dynlink.load_packages` during the initialization of packages (statically or dynamically linked), because `Findlib_initl...` is not yet run and because if you want to load a package that depend on a statically linked package not yet initialized, there is no sane semantic. Problems: - The package is named `findlib.dynlink`, the archive `findlib_dynlink.cm*` and the module `Fl_dynlink` ... - If you don't use `-linkall` static packages could only be partially linked, and you can't link the remaining part later. So perhaps `-linkall` must be automatically added if `findlib.dynlink` is used. - If you define `archive(native)` and not `archive(native,plugin)` the error is not nice (in Dynlink.Error). Perhaps I should add a `Package_not_dynamically_loadable of string` error, that should catch the loading of something else than `*.cmxs`. - Often you link your binary with your own library without using `-package` (the library is not yet installed), and plugins for your tools depend on your library. Currently you should do before any `Fl_dynlink.load_packages`: `Findlib.linked_packages := "mylib"::Findlib.linked_packages`. For simplicity, I don't know if I should add a function `Fl_dynlink.add_linked_packages`, or an option to ocamlfind `-additional-package-statically-linked `. - During the initialization of your own library (linked without -package) you should not use `Fl_dynlink.load_packages`, but the library doesn't protect you against this error. Choices: - If you don't link with `findlib.dynlink` or use `create_toploop`, the variables `Findlib.linked_packages` and `Findlib.linked_predicates` are empty because I don't wanted to add backward change by adding `Findlib_initl...` when `findlib` is linked. Remains to do: - Fix problems - Documentations (add `plugin` in the list of standard predicates, ...) Gerg, what do you think of this first version of the patch? Of the way to fix the problems? Thanks, Regards, -- François