[ocaml-platform] How to inform OPAM's "system" switch about OCaml libraries installed by RPMs?
louis.gesbert at ocamlpro.com
louis.gesbert at ocamlpro.com
Fri Apr 13 10:26:27 BST 2018
On jeudi 12 avril 2018 15:16:48 CEST Evgeny Roubinchtein wrote:
> Dear OCaml platform users and developers,
> I am working in an environment where OCaml (but not OPAM) is installed
> system-wide via RPMs, along with a few OCaml libraries. All of the
> libraries have corresponding OPAM packages. I would like to create an
> OPAM switch that is an alias of the "system" switch, but to also inform
> OPAM about the packages already installed system-wide. Simply creating a
> switch a as an alias of "system" seems to "not notice" any of the libraries
> installed via RPMs. Do you have any suggestions?
> The set of RPMs installed on the system changes at glacial speeds, so
> having a dumb script into which I hard-code some information about the
> packages installed by system-wide RPMs is perfectly acceptable in my case,
> if a more elegant solution does not exist (yet): I just would like to know
> what information I would need to hard-code, and I am hoping that asking
> here can save me a few hours of hunting through the OPAM source code.
> In case it matters, this is OPAM 2.0 pre-release.
> Thank you in advance!
This is unfortunately not supported at the moment, as it would be quite
difficult in general to map system packages (from all the OSes and ditributions
out there) to opam packages, including version numbers, fixes, etc.
If you really want to avoid recompilations, you could try a few workarounds,
- find the corresponding opam packages and their versions, pin them (with `-n`)
and pretend to install them with `--fake`. This will register them as
installed, but without any processing. It is pretty brittle, though, and be
careful that all fake-installed packages really are on the system.
- or, much cleaner, but also more work, define your own package repository
(it's pretty simple), get the definitions of the packages you are interested in
from the official opam-repository, and remove their `url` definitions, as well as
build, install and remove instructions to make them dummy packages. Then the
clients should use this repository on top on the official repository (`opam repo
add`) to get the dummy packages. Then, on the client side, make sure to use
`opam pin` to remain on the provided versions of the packages.
There may still be issues with `ocamlfind`, which needs to find the system
packages besides the opam ones (and here, we can't filter between what is
installed opam-wise or not). Using `setenv:` in the concerned packages might
Overall, I wouldn't recommend it: this requires quite some work, and there is
no guarantee that it will work reliably (package mapping is never 1-1). This
is the reason why the approach taken by opam is to rebuild all packages from
their source, using its own package definitions. We are experimenting with ways
to have binary caches of packages built by opam, though.
Louis Gesbert - OCamlPro
More information about the Platform