I’ve installed opam 2.0, but can’t seem to figure out how to install a specific version of OCaml. I see that they’re supposed to be their own packages now, but I haven’t been able to figure out the right incantation.
I’m now at the point where opam sees my system ocaml, and fails because of a version mismatch.
$ opam install ocaml
The following actions will be performed:
- install ocaml 4.04.1
=-=- Gathering sources =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
=-=- Processing actions -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[ERROR] The compilation of ocaml failed at "ocaml unix.cma gen_ocaml_config.ml".
#=== ERROR while compiling ocaml.4.04.1 =======================================#
# command ocaml unix.cma gen_ocaml_config.ml
# path /src/_opam/.opam-switch/build/ocaml.4.04.1
# exit-code 1
# env-file /home/opam/.opam/log/ocaml-34-05296d.env
# output-file /home/opam/.opam/log/ocaml-34-05296d.out
### output ###
# OCaml version mismatch: 4.01.0, expected 4.04.1
=-=- Error report -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+- The following actions failed
| - build ocaml 4.04.1
+-
- No changes have been performed
That seems quite different from opam switch install -A 4.04.1 my-switch
I didn’t find this documentation on any of the release notes. Is it opam switch create <switch-name> <ocaml-package>? And is there a public listing outside of opam of all of the valid inputs for ocaml-package (though opam switch list-available 4.05.0 seems nice too)?
The confusing part, here, — apologies for it — is that the ocaml package is actually a virtual one, that serves as a transition layer between the usual packages (that should just state depends: "ocaml"), and the various implementation ocaml-base-compiler, ocaml-system, ocaml-variants. It will refuse to install, as it did above, if the actual implementation found doesn’t match its version.
It’s indeed opam switch create <switch-name> <ocaml-package>, but with some magic allowed (when the name and package are the same, and if you specify a non-ambiguous version instead of a package name, it will still work). The alternative is opam switch create <name> --empty, which doesn’t set any base packages and lets you free to deal with the compiler as with other packages. (side note: using --empty may lead to poor to terrible performance with aspcud, on the current release, but is much better with the new built-in solver on recent master)