The basic idea is to use opam switches to setup per-OCaml-version shared tools (merlin, ocp-index/ocp-browser, ocp-indent) with project-local builds for everything else.
For example, a user would have a 4.04.1+flambda
switch available with its own merlin
, ocp-indent
and other project-generic tooling.
Then a user would clone or create the project (let's call it Project A (PA)) they are working on. This project would use jbuilder
as its build system and include appropriate *.opam
files specifying dependencies.
A jbuilder init
or jbuilder init-deps
command could be available which would pull down the source code for all of PA's transitive dependencies, unpacking them under a local directory _vendor
(or some other appropriate name). This _vendor
directory could live within a switch-specific context. opam
could/would be used to determine the appropriate dependencies to pull down. All of the depedencies would either use jbuilder
as their build system or have appropriate jbuild
configurations in their source tree to enable this approach.
jbuilder
would know to include _vendor
in the directories it crawls while looking for things to build.
If I understand how jbuilder
works correctly, this should allow each project to have their own local, unique set of dependent libraries available without having to duplicate compilers and build tools per-project.