opam 2.0 preview release!
We are pleased to announce a preview release for opam
2.0, with over 700
patches since 1.2.2. Version
2.0~alpha4 has just been
released, and is ready to be more widely tested.
This version brings many new features and changes, the most notable one being
that OCaml compiler packages are no longer special entities, and are replaced
by standard package definition files. This in turn means that opam
users have
more flexibility in how switches are managed, including for managing non-OCaml
environments such as Coq using the same familiar tools.
A few highlights
This is just a sample, see the full changelog for more:
-
Sandboxed builds: Command wrappers can be configured to, for example, restrict permissions of the build and install processes using Linux namespaces, or run the builds within Docker containers.
-
Compilers as packages: This brings many advantages for
opam
workflows, such as being able to upgrade the compiler in a given switch, better tooling for local compilers, and the possibility to definecoq
as a compiler or even useopam
as a generic shell scripting engine with dependency tracking. -
Local switches: Create switches within your projects for easier management. Simply run
opam switch create <directory> <compiler>
to get started. -
Inplace build: Use
opam
to build directly from your source directory. Ensure the package is pinned locally then runopam install --inplace-build
. -
Automatic file tracking::
opam
now tracks the files installed by packages and is able to cleanly remove them when no existing files were modified. Theremove:
field is now optional as a result. -
Configuration file: This can be used to direct choices at
opam init
automatically (e.g. specific repositories, wrappers, variables, fetch commands, or the external solver). This can be used to override all ofopam
's OCaml-related settings. -
Simpler library: the OCaml API is completely rewritten and should make it much easier to write external tools and plugins. Existing tools will need to be ported.
-
Better error mitigation: Through clever ordering of the shell actions and separation of
build
andinstall
, most build failures can keep your current installation intact, not resulting in removed packages anymore.
Roll out
You are very welcome to try out the alpha, and report any issues. The repository
at opam.ocaml.org
will remain in 1.2 format (with a 2.0 mirror at
opam.ocaml.org/2.0~dev
in sync) until after the release is out, which means
the extensions can not be used there yet, but you are welcome to test on local
or custom repositories, or package pinnings. The reverse translation (2.0 to
1.2) is planned, to keep supporting 1.2 installations after that date.
The documentation for the new version is available at http://opam.ocaml.org/doc/2.0/. This is still work in progress, so please do ask if anything is unclear.
Interface changes
Commands opam switch
and opam list
have been rehauled for more consistency
and flexibility: the former won't implicitly create new switches unless called
with the create
subcommand, and opam list
now allows to combine filters and
finely specify the output format. They may not be fully backwards compatible, so
please check your scripts.
Most other commands have also seen fixes or improvements. For example, opam
doesn't forget about your set of installed packages on the first error, and the
new opam install --restore
can be used to reinstall your selection after a
failed upgrade.
Repository changes
While users of opam
1.2 should feel at home with the changes, the 2.0 repository
and package formats are not compatible. Indeed, the move of the compilers to
standard packages implies some conversions, and updates to the relationships
between packages and their compiler. For example, package constraints like
available: [ ocaml-version >= "4.02" ]
are now written as normal package dependencies:
depends: [ "ocaml" {>= "4.02"} ]
To make the transition easier,
- upgrade of a custom repository is simply a matter of running
opam-admin upgrade-format
at its root; - the official repository at
opam.ocaml.org
already has a 2.0 mirror, to which you will be automatically redirected; - packages definition are automatically converted when you pin a package.
Note that the ocaml
package on the official repository is actually a wrapper
that depends on one of ocaml-base-compiler
, ocaml-system
or
ocaml-variants
, which contain the different flavours of the actual compiler.
It is expected that it may only get picked up when requested by package
dependencies.
Package format changes
The opam
package definition format is very similar to before, but there are
quite a few extensions and some changes:
- it is now mandatory to separate the
build:
andinstall:
steps (this allows tracking of installed files, better error recovery, and some optional security features); - the url and description can now optionally be included in the
opam
file using the sectionurl {}
and fieldssynopsis:
anddescription:
; - it is now possible to have dependencies toggled by globally-defined
opam
variables (e.g. for a dependency needed on some OS only), or even rely on the package information (e.g. have a dependency at the same version); - the new
setenv:
field allows packages to export updates to environment variables; - custom fields
x-foo:
can be used for extensions and external tools; - allow
"""
delimiters around unescaped strings &
is now parsed with higher priority than|
- field
ocaml-version:
can no longer be used - the
remove:
field should not be used anymore for simple cases (just removing files)
Let's go then -- how to try it ?
First, be aware that you'll be prompted to update your ~/.opam
to 2.0 format
before anything else, so if you value it, make a backup. Or just export
OPAMROOT
to test the alpha on a temporary opam root.
Packages for opam 2.0 are already in the opam repository, so if you have a working opam installation of opam (at least 1.2.1), you can bootstrap as easily as:
opam install opam-devel
This doesn't install the new opam to your PATH within the current opam root for obvious reasons, so you can manually install it as e.g. "opam2" using:
sudo cp $(opam config var "opam-devel:lib")/opam /usr/local/bin/opam2
You can otherwise install as usual:
-
Using pre-built binaries (available for OSX and Linux x86, x86_64, armhf) and our install script:
wget https://raw.github.com/ocaml/opam/2.0-alpha4-devel/shell/opam_installer.sh -O - | sh -s /usr/local/bin
Equivalently, pick your version and download it to your PATH;
-
Building from our inclusive source tarball: download here and build using
./configure && make lib-ext && make && make install
if you have OCaml >= 4.01 already available,make cold && make install
otherwise; -
Or from source, following the included instructions from 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 -fdx
).
About OCamlPro:
OCamlPro is a R&D lab founded in 2011, with the mission to help industrial users benefit from experts with a state-of-the-art knowledge of programming languages theory and practice.
- We provide audit, support, custom developer tools and training for both the most modern languages, such as Rust, Wasm and OCaml, and for legacy languages, such as COBOL or even home-made domain-specific languages;
- We design, create and implement software with great added-value for our clients. High complexity is not a problem for our PhD-level experts. For example, we helped the French Income Tax Administration re-adapt and improve their internally kept M language, we designed a DSL to model and express revenue streams in the Cinema Industry, codename Niagara, and we also developed the prototype of the Tezos proof-of-stake blockchain from 2014 to 2018.
- We have a long history of creating open-source projects, such as the Opam package manager, the LearnOCaml web platform, and contributing to other ones, such as the Flambda optimizing compiler, or the GnuCOBOL compiler.
- We are also experts of Formal Methods, developing tools such as our SMT Solver Alt-Ergo (check our Alt-Ergo Users' Club) and using them to prove safety or security properties of programs.
Please reach out, we'll be delighted to discuss your challenges: contact@ocamlpro.com or book a quick discussion.
Most Recent Articles
2024
- opam 2.3.0 release!
- Optimisation de Geneweb, 1er logiciel français de Généalogie depuis près de 30 ans
- Alt-Ergo 2.6 is Out!
- Flambda2 Ep. 3: Speculative Inlining
- opam 2.2.0 release!
- Flambda2 Ep. 2: Loopifying Tail-Recursive Functions
- Fixing and Optimizing the GnuCOBOL Preprocessor
- OCaml Backtraces on Uncaught Exceptions
- Opam 102: Pinning Packages
- Flambda2 Ep. 1: Foundational Design Decisions
- Behind the Scenes of the OCaml Optimising Compiler Flambda2: Introduction and Roadmap
- Lean 4: When Sound Programs become a Choice
- Opam 101: The First Steps
2023
- Maturing Learn-OCaml to version 1.0: Gateway to the OCaml World
- The latest release of Alt-Ergo version 2.5.1 is out, with improved SMT-LIB and bitvector support!
- 2022 at OCamlPro
- Autofonce, GNU Autotests Revisited
- Sub-single-instruction Peano to machine integer conversion
- Statically guaranteeing security properties on Java bytecode: Paper presentation at VMCAI 23
- Release of ocplib-simplex, version 0.5