UPDATE (2017-02-14): A beta2 is online, which fixes issues and performance of
the opam build
command. Get the new
binaries, or
recompile the opam-devel package
and replace the previous binary.
We are pleased to announce that the beta release of opam 2.0 is now live! You
can try it already, bootstrapping from a working 1.2 opam installation, with:
opam update; opam install opam-devel
With about a thousand patches since the last stable release, we took the time to
gather feedback after our last announcement and
implemented a couple of additional, most-wanted features:
- An
opam build
command that, from the root of a source tree containing one
or more package definitions, can automatically handle initialisation and
building of the sources in a local switch.
- Support for
repository signing
through the external Conex tool, being
developed in parallel.
There are many more features, like the new opam clean
and opam admin
commands, a new archive caching system, etc., but we'll let you check the full
changelog.
We also improved still on the
already announced features, including
compilers as packages, local switches, per-switch repository configuration,
package file tracking, etc.
The updated documentation is at https://opam.ocaml.org/doc/2.0/. If you are
developing in opam-related tools, you may also want to browse the
new APIs.
Try it out
Please try out the beta, and report any issues or missing features. You can:
- Build it from source in opam, as shown above (
opam install opam-devel
)
- Use the pre-built binaries.
- Building from the source tarball:
download here
and build using
./configure && make lib-ext && make
if you have OCaml >=
4.01 already available; make cold
otherwise
- Or directly from the
git tree, following the
instructions included in the README. Some files have been moved around, so if
your build fails after you updated an existing git clone, try to clean it up
(
git clean -dx
).
Some users have been using the alpha for the past months without problems, but
you may want to keep your opam 1.2 installation intact until the release is out.
An easy way to do this is with an alias:
alias opam2="OPAMROOT=~/.opam2 path/to/opam-2-binary"
Changes to be aware of
Command-line interface
opam switch create
is now needed to create new switches, and opam switch
is now much more expressive
opam list
is also much more expressive, but be aware that the output may
have changed if you used it in scripts
- new commands:
opam build
: setup and build a local source tree
opam clean
: various cleanup operations (wiping caches, etc.)
opam admin
: manage software repositories, including upgrading them to
opam 2.0 format (replaces the opam-admin
tool)
opam env
, opam exec
, opam var
: shortcuts for the opam config
subcommands
opam repository add
will now setup the new repository for the current switch
only, unless you specify --all
- Some flags, like
--test
, now apply to the packages listed on the
command-line only. For example, opam install lwt --test
will build and
install lwt and all its dependencies, but only build/run the tests of the
lwt
package. Test-dependencies of its dependencies are also ignored
- The new
opam install --soft-request
is useful for batch runs, it will
maximise the installed packages among the requested ones, but won't fail if
all can't be installed
As before, opam is self-documenting, so be sure to check opam COMMAND --help
first when in doubt. The bash completion scripts have also been thoroughly
improved, and may help navigating the new options.
Metadata
There are both a few changes (extensions, mostly) to the package description
format, and more drastic changes to the repository format, mainly related to
translating the old compiler definitions into packages.
- opam will automatically update, internally, definitions of pinned packages as
well as repositories in the 1.2 format
- however, it is faster to use repositories in the 2.0 format directly. To that
end, please use the
opam admin upgrade
command on your repositories. The
--mirror
option will create a 2.0 mirror and put in place proper
redirections, allowing your original repository to retain the old format
The official opam repository at https://opam.ocaml.org remains in 1.2 format for
now, but has a live-updated 2.0 mirror to which you should be automatically
redirected. It cannot yet accept package definitions in 2.0 format.
Package format
- Any
available:
constraints based on the OCaml compiler version should be
rewritten into dependencies to the ocaml
package
- Separate
build:
and install:
instructions are now required
- It is now preferred to include the old
url
and descr
files (containing the
archive URL and package description) in the opam
file itself: (see the new
synopsis:
and
description:
fields, and the
url {} file
section)
- Building tests and documentation should now be part of the main
build:
instructions, using the {test}
and {doc}
filters. The build-test:
and
build-doc:
fields are still supported.
- It is now possible to use opam variables within dependencies, for example
depends: [ "foo" {= version} ]
, for a dependency to package foo
at the
same version as the package being defined, or depends: [ "bar" {os = "linux"} ]
for a dependency that only applies on Linux.
- The new
conflict-class:
field allows mutual conflicts among a set of
packages to be declared. Useful, for example, when there are many concurrent,
incompatible implementations.
- The
ocaml-version:
field has been deprecated for a long time and is no
longer accepted. This should now be a dependency on the ocaml
package
- Three types of checksums are now accepted: you should use
md5=<hex-value>
,
sha256=<hex-value>
or sha512=<hex-value>
. We'll be gradually deprecating
md5 in favour of the more secure algorithms; multiple checksums are allowed
- Patches supplied in the
patches:
field must apply with patch -p1
- The new
setenv:
field allows packages to export updates to environment
variables;
- Custom fields
x-foo:
can be used for extensions and external tools
"""
delimiters allow unescaped strings
&
has now the customary higher precedence than |
in formulas
- Installed files are now automatically tracked meaning that the
remove:
field is usually no longer required.
The full, up-to-date specification of the format can be browsed in the
manual.
Repository format
In the official, default repository, and also when migrating repositories from
older format versions, there are:
- A virtual
ocaml
package, that depends on any implementation of the OCaml
compiler. This is what packages should depend on, and the version is the
corresponding base OCaml version (e.g. 4.04.0
for the 4.04.0+fp
compiler).
It also defines various configuration variables, see opam config list ocaml
.
- Three mutually-exclusive packages providing actual implementations of the
OCaml toolchain:
ocaml-base-compiler
is the official releases
ocaml-variants.<base-version>+<variant-name>
contains all the other
variants
ocaml-system-compiler
maps to a compiler installed on the system
outside of opam
The layout is otherwise the same, apart from:
- The
compilers/
directory is ignored
- A
repo
file should be present, containing at least the line opam-version: "2.0"
- The indexes for serving over HTTP have been simplified, and
urls.txt
is no
longer needed. See opam admin index --help
- The
archives/
directory is no longer used. The cache now uses a different
format and is configured through the repo
file, defaulting to cache/
on
the same server. See opam admin cache --help
Feedback
Thanks for trying out the beta! Please let us have feedback, preferably to the
opam tracker; other options include the
opam-devel list and #opam IRC channel on
Freenode.