We're happy to announce the release of opam-publish
2.5.0!
See full changelog
- Add a new
--pre-release
argument adding the necessary flags and availibility formula for pre-releases [#164 @kit-ty-kate]
Read the latest releases and updates from the OCaml compiler, OCaml infrastructure and the OCaml Platform Tools.
We're happy to announce the release of opam-publish
2.5.0!
--pre-release
argument adding the necessary flags and availibility formula for pre-releases [#164 @kit-ty-kate]After almost a year of work, OCamlformat 0.27.0 is finally available with support for 5.3 syntax!
This release includes the new function syntax from OCaml 5.2, the effect
keyword from OCaml 5.3 and a large number of bug fixes and improvements.
An other notable change, is that comments are now formatted by default.
* Support OCaml 5.2 syntax (#2519, #2544, #2590, #2596, #2621, #2628, @Julow, @EmileTrotignon, @hhugo) This includes local open in types, raw identifiers, and the new representation for functions. This might change the formatting of some functions due to the formatting code being completely rewritten.
Support OCaml 5.3 syntax (#2609, #2610, #2611, #2622, #2623, #2562, #2624, #2625, #2627, @Julow, @Zeta611)
This adds support for effect patterns, short functor type arguments and utf8
identifiers.
To format code using the new effect
syntax, add this option to your
.ocamlformat
:
ocaml-version = 5.3
Documentation comments are now formatted by default (#2390, @Julow)
Use the option parse-docstrings = false
to restore the previous behavior.
* Consistent indentation of polymorphic variant arguments (#2427, @Julow) Increases the indentation by one to make the formatting consistent with normal variants. For example:
...
(* before *)
(`Msg
(foo bar))
(* after *)
(`Msg
(foo bar))
Build on OCaml 5.3 (#2603, @adamchol, @Julow)
Improve the emacs plugin (#2577, #2600, @gridbugs, @thibautbenjamin) Allow a custom command to be used to run ocamlformat and add compatibility with emacs ocaml tree-sitter modes.
Added option let-binding-deindent-fun
(#2521, @henrytill)
to control the indentation of the fun
in:
let f =
fun foo ->
bar
Added back the flag --disable-outside-detected-project
(#2439, @gpetiot)
It was removed in version 0.22.
Support newer Odoc syntax (#2631, #2632, #2633, @Julow)
* Consistent formatting of comments (#2371, #2550, @Julow) This is mostly an internal change but some comments might be formatted differently.
* Improve formatting of type constraints with type variables (#2437, @gpetiot) For example:
let f : type a b c.
a -> b -> c =
...
* Improve formatting of functor arguments (#2505, @Julow) This also reduce the indentation of functor arguments with long signatures.
Improvements to the Janestreet profile (#2445, #2314, #2460, #2593, #2612, @Julow, @tdelvecchio-jsc)
* Undo let-bindings and methods normalizations (#2523, #2529, @gpetiot) This remove the rewriting of some forms of let-bindings and methods:
let f x = (x : int)
is no longer rewritten into let f x : int = x
let f (type a) (type b) ...
is no longer rewritten into let f (type a b) ...
let f = fun x -> ...
is no longer rewritten into let f x = ...
* The break-colon
option is now taken into account for method type constraints (#2529, @gpetiot)
* Force a break around comments following an infix operator (fix non-stabilizing comments) (#2478, @gpetiot) This adds a line break:
a
||
(* this comment is now on its own line *)
b
open[@attr] M
as open M [@@attr]
.[@ocamlformat "disable"]
in some cases (#2242, #2525, @EmileTrotignon)
This caused a bug inside class type
constructs and when attached to a let ... in
a##b
instead of a ## b
and similarly for operators that start with # (#2580, @v-gb)break-separators=before
(#2598, @Julow)let%ext
(#2615, @Julow)One month after the release of the first beta for OCaml 5.3.0, we are releasing a second and hopefully last beta release for OCaml 5.3.0 .
The most notable changes for this second beta are probably a handful of type system bugfixes. In particular, those fixes revert a change of behaviour in the first beta when pattern matching GADTs with non-injective type parameters.
We also have a C++ header compatibility fix and the restoration of some configuration variable in Makefiles for the sake of backward compatibility.
Overall, the release is converging and we are expecting to have a first release candidate around the middle of December. The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.3.0 meta-issue.
Meanwhile, the second beta release of OCaml 5.3.0 is here to help you update your software and libraries ahead of the release (see below for the installation instructions).
The full release is expected before the end of December.
If you find any bugs, please report them on OCaml's issue tracker.
If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.3.0 is available on GitHub.
The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later:
opam update
opam switch create 5.3.0~beta2
The source code for the beta is also available at these addresses:
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update
opam switch create <switch_name> ocaml-variants.5.3.0~beta2+options <option_list>
where option_list
is a space separated list of ocaml-option-*
packages. For instance, for a flambda and no-flat-float-array switch:
opam switch create 5.3.0~beta2+flambda+nffa ocaml-variants.5.3.0~beta2+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
#13501: Regression on mutually recursive types caused by #12180. Resuscitate Typedecl.update_type. (Jacques Garrigue and Takafumi Saikawa, review by Florian Angeletti, Richard Eisenberg and Gabriel Scherer)
#13495, #13514: Fix typechecker crash while typing objects (Jacques Garrigue, report by Nicolás Ojeda Bär, review by Nicolas Ojeda Bär, Gabriel Scherer, Stephen Dolan, Florian Angeletti)
#13598: Falsely triggered warning 56 [unreachable-case] This was caused by unproper protection of the retyping function. (Jacques Garrigue, report by Tõivo Leedjärv, review by Florian Angeletti)
We're happy to announce the release of Dune 3.17.0.
Among the list of chances, this release enables the Dune cache by default for
known-safe operations, adds support for Wasm_of_ocaml
, adds support for the
-H
compiler flag introduced in OCaml 5.2 and allows specifying code hosting
services like Codeberg or Gitlab organizations.
Show the context name for errors happening in non-default contexts. (#10414, fixes #10378, @jchavarri)
Correctly declare dependencies of indexes so that they are rebuilt when needed. (#10623, @voodoos)
Don't depend on coq-stdlib being installed when expanding variables
of the coq.version
family (#10631, fixes #10629, @gares)
Error out if no files are found when using copy_files
. (#10649, @jchavarri)
Re_export dune-section private library in the dune-site library stanza, in order to avoid failure when generating and building sites modules with implicit_transitive_deps = false. (#10650, fixes #9661, @MA0100)
Expect test fixes: support multiple modes and fix dependencies when there is a custom runner (#10671, @vouillon)
In a (library)
stanza with (extra_objects)
and (foreign_stubs)
, avoid
double linking the extra object files in the final executable.
(#10783, fixes #10785, @nojb)
Map (re_export)
library dependencies to the exports
field in META
files,
and vice-versa. This field was proposed in to
https://discuss.ocaml.org/t/proposal-a-new-exports-field-in-findlib-meta-files/13947.
The field is included in Dune-generated META
files only when the Dune lang
version is >= 3.17.
(#10831, fixes #10830, @nojb)
Fix staged pps preprocessors on Windows (which were not working at all previously) (#10869, fixes #10867, @nojb)
Fix dune describe
when an executable is disabled with enabled_if
.
(#10881, fixes #10779, @moyodiallo)
Fix an issue where C stubs would be rebuilt whenever the stderr of Dune was redirected. (#10883, fixes #10882, @nojb)
Fix the URL opened by the command dune ocaml doc
. (#10897, @gridbugs)
Fix the file referred to in the error/warning message displayed due to the dune configuration version not supporting a particular configuration stanza in use. (#10923, @H-ANSEN)
Fix enabled_if
when it uses env
variable. (#10936, fixes #10905, @moyodiallo)
Fix exec -w for relative paths with --root argument (#10982, @gridbugs)
Do not ignore the (locks ..)
field in the test
and tests
stanza
(#11081, @rgrinberg)
Tolerate files without extension when generating merlin rules. (#11128, @anmonteiro)
Make Merlin/OCaml-LSP aware of "hidden" dependencies used by
(implicit_transitive_deps false)
via the -H
compiler flag. (#10535, @voodoos)
Add support for the -H flag (introduced in OCaml compiler 5.2) in dune
(requires lang versions 3.17). This adaptation gives
the correct semantics for (implicit_transitive_deps false)
.
(#10644, fixes #9333, ocsigen/tyxml#274, #2733, #4963, @MA0100)
Add support for specifying Gitlab organization repositories in source
stanzas (#10766, fixes #6723, @H-ANSEN)
New option to control jsoo sourcemap generation in env and executable stanza (#10777, fixes #10673, @hhugo)
One can now control jsoo compilation_mode inside an executable stanza (#10777, fixes #10673, @hhugo)
Add support for specifying default values of the authors
, maintainers
, and
license
stanzas of the dune-project
file via the dune config file. Default
values are set using the (project_defaults)
stanza (#10835, @H-ANSEN)
Add names to source tree events in performance traces (#10884, @jchavarri)
Add codeberg
as an option for defining project sources in dune-project
files. For example, (source (codeberg user/repo))
. (#10904, @nlordell)
dune runtest
can now run individual tests with dune runtest mytest.t
(#11041, @Alizter).
Wasm_of_ocaml support (#11093, @vouillon)
Add a coqdep_flags
field to the coq
field of the env
stanza, and to the
coq.theory
stanza, allowing to configure coqdep
flags. (#11094,
@rlepigre)
Remove all remnants of the experimental patch-back-source-tree
. (#10771,
@rgrinberg)
Change the preset value for author and maintainer fields in the
dune-project
file to encourage including emails. (#10848, @punchagan)
Tweak the preset value for tags in the dune-project
file to hint at topics
not having a special meaning. (#10849, @punchagan)
Change some colors to improve readability in light-mode terminals (#10890, @gridbugs)
Forward the linkall flag to jsoo in whole program compilation as well (#10935, @hhugo)
Configurator uses pkgconf
as pkg-config implementation when available
and forwards it the target
of ocamlc -config
. (#10937, @pirbo)
Enable Dune cache by default. Add a new Dune cache setting
enabled-except-user-rules
, which enables the Dune cache, but excludes
user-written rules from it. This is a conservative choice that can avoid
breaking rules whose dependencies are not correctly specified. This is the
current default. (#10944, #10710, @nojb, @ElectreAAS)
Do not add dune
dependency in dune-project
when creating projects with
dune init proj
. The Dune dependency is implicitely added when generating
opam files (#11129, @Leonidas-from-XIV)
We have the pleasure of announcing the release of OCaml 5.2.1, dedicated to the memory of Niels Bohr and Paul Éluard on the anniversary of their deaths.
OCaml 5.2.1 is a collection of safe but import runtime time bug fixes backported from the 5.3 branch of OCaml.
The full list of changes is available above for more details.
The base compiler can be installed as an opam switch with the following commands:
opam update
opam switch create 5.2.1
The source code for the release is also directly available on:
#13207: Be sure to reload the register caching the exception handler in
caml_c_call
and caml_c_call_stack_args
, as its value may have been changed
if the OCaml stack is expanded during a callback.
(Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and
Xavier Leroy)
#13252: Rework register assignment in the interpreter code on m68k on Linux, due to the %a5 register being used by GLIBC. (Miod Vallat, report by Stéphane Glondu, review by Gabriel Scherer and Xavier Leroy)
#13268: Fix a call to test in configure.ac
that was causing errors when
LDFLAGS contains several words.
(Stéphane Glondu, review by Miod Vallat)
#13234, #13267: Open runtime events file in read-write mode on ARMel (ARMv5) systems due to atomic operations limitations on that platform. (Stéphane Glondu, review by Miod Vallat and Vincent Laviron)
#13188: fix races in the FFI code coming from the use of Int_val(...)
on rooted values inside blocking questions / without the runtime lock.
(Calling Int_val(...)
on non-rooted immediates is fine, but any
access to rooted values must be done outside blocking sections /
with the runtime lock.)
(Etienne Millon, review by Gabriel Scherer, Jan Midtgaard, Olivier Nicole)
#13318: Fix regression in GC alarms, and fix them for Flambda. (Guillaume Munch-Maccagnoni, report by Benjamin Monate, review by Vincent Laviron and Gabriel Scherer)
#13140: POWER back-end: fix issue with call to caml_call_realloc_stack
from a DLL
(Xavier Leroy, review by Miod Vallat)
#13370: Fix a low-probability crash when calling Gc.counters
.
(Demi Marie Obenour, review by Gabriel Scherer)
#13402, #13512, #13549, #13553: Revise bytecode implementation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat)
#13502: Fix misindexing related to Gc.finalise_last
that could prevent
finalisers from being run.
(Nick Roberts, review by Mark Shinwell)
#13520: Fix compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by Sébastien Hinderer and Miod Vallat)
Discuss this post on Discuss!
Dune can install and run developer tools in the context of a project. This feature is available in the Dune Developer Preview and in the upcoming release of Dune 3.17. As with all of Dune's package management features, consider this feature to be unstable as its UI and semantics may change without notice.
The currently supported tools are ocamllsp
and ocamlformat
. Dune has a new
command dune tools exec <TOOL> -- [ARGS]...
which downloads and installs the
given tool, and then runs it with the given arguments (note the --
which
separates arguments to dune
from arguments to the tool). Tools are installed
locally to the project, in its _build
directory, which makes it easy to use
different versions of a tool in different projects. An unfortunate consequence
of installing tools into _build
is that for the time being all tools are
uninstalled whenever dune clean
is run.
Let's see it in action:
$ dune tools exec ocamlformat -- --version
Solution for dev-tools.locks/ocamlformat:
- ocamlformat.0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_64-unknown-linux-musl
Building ocamlformat.0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_64-unknown-linux-musl
Running 'ocamlformat --version'
0.26.2
Note that in the example above, Dune's package solver chose to install version 0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_64-unknown-linux-musl
of ocamlformat
. This packages comes from a new repository of binary packages
containing pre-built executables for a select few Opam packages. Dune will search this
repository in addition to the default repositories when solving packages for
tools only (if a project has ocamlformat
in its dependencies, the binary
repository won't be searched while solving the project's dependencies).
The goal of the binary repository is to reduce the time it takes to get started
working on a new project. Without it, Dune would need to build ocamlformat
from source along with all of its dependencies, which can take several minutes.
For now only a small number of package versions are contained in the binary
repository. To demonstrate, here's what happens if we run dune tools exec ocamlformat
in a project
with version=0.26.1
in its .ocamlformat
file:
$ dune tools exec ocamlformat -- --version
Solution for dev-tools.locks/ocamlformat:
- astring.0.8.5
- base.v0.17.1
- base-bytes.base
- base-unix.base
- camlp-streams.5.0.1
- cmdliner.1.3.0
...
- ocamlformat.0.26.1
...
Building base-unix.base
Building ocaml-base-compiler.5.1.1
Building ocaml-config.3
Building ocaml.5.1.1
Building seq.base
Building cmdliner.1.3.0
...
Building ocamlformat.0.26.1
Running 'ocamlformat --version'
0.26.1
Dune parses .ocamlformat
to determine which version of ocamlformat
to
install, and 0.26.1
is not in the binary repo so it needed to be built from
source.
If your project requires a version of a package not available in the binary
repository, or you're on an operating system or architecture for which no binary
version of a package exists, the package will be built from source instead.
Currently the binary repository contains binaries of ocamlformat.0.26.2
,
ocaml-lsp-server.1.18.0
and ocaml-lsp-server.1.19.0
for
x86_64-unknown-linux-musl
, x86_64-apple-darwin
and aarch64-apple-darwin
.
Note that Linux binaries are statically linked with muslc so they should work on all distros regardless of dynamic linker.
ocamllsp
The program ocamllsp
from the package ocaml-lsp-server
analyzes OCaml code
and sends information to text editors using the Language Server
Protocol. The tool is crucial
to OCaml's editor integration and it has a couple of quirks that are worth
mentioning here.
TL;DR: Install Dune with the install script on the Developer Preview
page and you'll get an ocamllsp
shell
script
that will install and run the correct version of ocamllsp
for your project.
Firstly the ocamllsp
executable can only analyze code that has been compiled
with the same version of the OCaml compiler as was used to compile the
ocamllsp
executable itself. Different versions of the ocaml-lsp-server
package are incompatible with some versions of the OCaml compiler (e.g.
ocaml-lsp-server.1.19.0
must be built with at least 5.2.0
of the compiler).
This means that when Dune is choosing which version of ocaml-lsp-server
to
install it needs to know which version of the compiler your project is using.
This is only known after the project has been locked (by running dune pkg lock
), so Dune will refuse to install ocamllsp
in a project that doesn't
have a lock directory or for a project that doesn't depend on the OCaml compiler.
$ dune tools exec ocamllsp
Error: Unable to load the lockdir for the default build context.
Hint: Try running 'dune pkg lock'
The ocaml-lsp-server
packages in the binary
repository contain
metadata to ensure that the ocamllsp
executable that gets installed was built
with the same version of the compiler as your project. For example the
ocaml-lsp-server
package built with ocaml.5.2.0
contains this line:
conflicts: "ocaml" {!= "5.2.0"}
This prevents it from being chosen if the project depends on any version of the
compiler other than 5.2.0
.
Another quirk is that ocamllsp
will try to invoke the binaries ocamlformat
and ocamlformat-rpc
, both found in the ocamlformat
package. The
ocaml-lsp-server
package doesn't depend on ocamlformat
as the specific
version of ocamlformat
needed by a project is implied by the project's .ocamlformat
file, which package managers don't consider when solving dependencies. This
means that in general (whether using Dune or Opam for package management) it's
up to the user to make sure that the correct version of ocamlformat
is
installed in order to use the formatting features of ocamllsp
.
Otherwise expect this error in your editor:
Unable to find 'ocamlformat-rpc' binary. Types on hover may not be well-formatted. You need to install either 'ocamlformat' of version > 0.21.0 or, otherwise, 'ocamlformat-rpc' package.
Even if ocamllsp
and ocamlformat
are both installed by Dune, if you run
dune tools exec ocamllsp
you will find that ocamllsp
still can't find the
ocamlformat
or ocamlformat-rpc
executables. This is because unlike Opam,
Dune does not install tools into your $PATH
, and for the sake of simplicity,
the dune tools exec <TOOL>
command does not modify the environment of the tool
it launches. This can be fixed by adding
_build/_private/default/.dev-tool/ocamlformat/ocamlformat/target/bin
(the
directory containing ocamlformat
and ocamlformat-rpc
when ocamlformat
is
installed by dune) to the start of your $PATH
variable before running
dune tools exec ocamllsp
. For example starting ocamllsp
with the following shell script:
OCAMLFORMAT_TARGET="_build/_private/default/.dev-tool/ocamlformat/ocamlformat/target"
if!$OCAMLFORMAT_TARGET;then # Make sure that the ocamlformat dev tool is installed as it's needed by
# ocamllsp. There's currently no command that just installs ocamlformat so
# we need to run it and ignore the result.
# Add ocamlformat to the environment in which ocamllsp runs so ocamllsp can invoke ocamlformat.
# Build and run ocamllsp.
Of course, it's rare to manually start ocamllsp
directly from your terminal.
It's normally launched by text editors. It would be impractical to configure your text
editor to modify $PATH
and run a custom command to start ocamllsp
via Dune,
and doing so would make it impossible to edit any project that doesn't use
Dune for package management. Instead, the Dune Developer Preview ships with
a shell script
which installs ocamlformat
and adds its bin
directory to $PATH
before
launching dune tools exec ocamllsp
. The script is simply named ocamllsp
, and
the Dune Developer Preview install script adds it to ~/.dune/bin
which should
already be in your $PATH
if you're using the Developer Preview. The ocamllsp
script also attempts to fall back to an Opam-managed installation of ocamllsp
if it doesn't detect a Dune lockdir so the same script should work for non-Dune
projects. Because the script is named the same as the ocamllsp
executable,
most editors don't require special configuration to run it. See the "Editor
Configuration" section of the Dune Developer
Preview page for more information about setting up
your editor.
Some parts of the ocamllsp
shell script may eventually make their way into
Dune itself, but for the time being the shell script is the recommended way to
launch ocamllsp
for users of the Dune Developer Preview. The net result is
that as long as your project has a lockfile, the first time you edit some OCaml
code in the project Dune will download and run the appropriate version of
ocamllsp
.
Feedback on this post is welcomed on Discuss!
As mentioned in our talk at the OCaml Workshop 2024, we decided to switch to a time-based release cycle (every 6 months), starting with opam 2.3.
As promised, we are very pleased to announce the release of opam 2.3.0, and encourage all users to upgrade. Please read on for installation and upgrade instructions.
In case you plan a possible rollback, you may want to first backup your
~/.opam
or $env:LOCALAPPDATA\opam
directory.
The upgrade instructions are unchanged:
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh)"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) }"
or download manually from the Github "Releases" page to your PATH.
You should then run:
opam init --reinit -ni
When loading a repository, opam now ignores files in packages' files/
directories which aren't listed in the extra-files
field of the opam file.
This was done to simplify the opam specification where we hope the opam file to be the only thing that you have to look at when reading a package specification. It being optional to list all files in the extra-files:
field went against that principle. This change also reduces the surface area for potential file corruption as all extra-files must have checksums.
This is a breaking change and means that if you are using the files/
directory without listing them in the extra-files:
field, you need to make sure that all files in that directory are included in the extra-files
field.
The resulting opam file remains compatible with all previous opam 2.x releases.
If you have an opam repository, you should make sure all files are listed so every packages continues to work without any issue, which can be done automatically using the opam admin update-extrafiles
command.
Packages requiring an unsupported version of opam are now marked unavailable, instead of causing a repository error. This means an opam repository can now allow smoother upgrade in the future where some packages can require a newer version of opam without having to fork the repository to upgrade every package to that version as was done for the upgrade from opam 1.2 to 2.0
Add a new opam list --latests-only
option to list only the latest versions of packages. Note that this option respects the order options were given on the command line. For example: --available --latests-only
will first list all the available packages, then choose only the latest packages in that set; while --latests-only --available
will first list all the latest packages, then only show the ones that are available in that set
Fix and improve opam install --check
, which now checks if the whole dependency tree of the package is installed instead of only the root dependencies
Add a new --verbose-on
option to enable verbose output for specified package names. Thanks to @desumn for this contribution
Add a new opam switch import --deps-only
option to install only the dependencies of the root packages listed in the opam switch export file
opam switch list-available
no longer displays compilers flagged with avoid-version
/deprecated
unless --all
is given, meaning that pre-release or unreleased OCaml packages no longer appear to be the latest version
opam switch create --repositories
now correctly infers --kind=git
for URLs ending with .git
rather than requiring the git+https://
protocol. This is consistant with other commands such as opam repository add
. Thanks to @Keryan-dev for this contribution
opam switch set-invariant
now displays the switch invariant using the same syntax as the --formula
flag
The builtin-0install
solver was improved and should now be capable of being your default solver instead of builtin-mccs+glpk
. It was previously mostly only suited for automated tasks such as Continuous Integration. If you wish to give it a try, simply calling opam option solver=builtin-0install
(call opam option solver=
restores the default)
Most of the unhelpful conflict messages were fixed. (#4373)
Fix an opam 2.1 regression where the initial pin of a local VCS directory would store untracked and ignored files. Those files would usually be cleaned before building the package, however git submodules would not be cleaned and would cause issues when paired with the new behaviour added in 2.3.0~alpha1 which makes opam error when git submodules fail to update (it was previously a warning). (#5809)
Fix the value of the arch
variable when the current OS is 32bit on a 64bit machine (e.g. Raspberry Pi OS). (#5949)
opam now fails when git submodules fail to update instead of ignoring the error and just showing a warning
opam's libraries now compile with OCaml >= 5.0 on Windows
Fix the installed packages internal cache, which was storing the wrong version of the opam file after a build failure. This could be triggered easily for users with custom repositories with non-populated extra-files. (#6213)
Several improvements to the pre-built release binaries were made:
And many other general, performance and UI improvements were made and bugs were fixed. You can take a look to previous blog posts. API changes and a more detailed description of the changes are listed in:
This release also includes PRs improving the documentation and improving and extending the tests.
Please report any issues to the bug-tracker.
We hope you will enjoy the new features of opam 2.3!
The release of OCaml version 5.2.1 is imminent.
OCaml 5.2.1 is a collection of safe but import runtime time bug fixes backported from the 5.3 branch of OCaml. The full list of bug fixes is available above.
In order to ensure that the future release works as expected, we are planning to test a release candidate during the upcoming week.
If you find any bugs, please report them here on GitHub.
The base compiler can be installed as an opam switch with the following commands on opam 2.1:
opam update
opam switch create 5.2.1~rc1
The source code for the release candidate is available on
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update
opam switch create <switch_name> ocaml-variants.5.2.1~rc1+options <option_list>
where <option_list>
is a space-separated list of ocaml-option-*
packages. For instance, for a flambda
and no-flat-float-array
switch:
opam switch create 5.2.1~rc1+flambda+nffa ocaml-variants.5.2.1~rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
#13207: Be sure to reload the register caching the exception handler in
caml_c_call
and caml_c_call_stack_args
, as its value may have been changed
if the OCaml stack is expanded during a callback.
(Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and
Xavier Leroy)
#13252: Rework register assignment in the interpreter code on m68k on Linux, due to the %a5 register being used by GLIBC. (Miod Vallat, report by Stéphane Glondu, review by Gabriel Scherer and Xavier Leroy)
#13268: Fix a call to test in configure.ac
that was causing errors when
LDFLAGS contains several words.
(Stéphane Glondu, review by Miod Vallat)
#13234, #13267: Open runtime events file in read-write mode on ARMel (ARMv5) systems due to atomic operations limitations on that platform. (Stéphane Glondu, review by Miod Vallat and Vincent Laviron)
#13188: fix races in the FFI code coming from the use of Int_val(...)
on rooted values inside blocking questions / without the runtime lock.
(Calling Int_val(...)
on non-rooted immediates is fine, but any
access to rooted values must be done outside blocking sections /
with the runtime lock.)
(Etienne Millon, review by Gabriel Scherer, Jan Midtgaard, Olivier Nicole)
#13318: Fix regression in GC alarms, and fix them for Flambda. (Guillaume Munch-Maccagnoni, report by Benjamin Monate, review by Vincent Laviron and Gabriel Scherer)
#13140: POWER back-end: fix issue with call to caml_call_realloc_stack
from a DLL
(Xavier Leroy, review by Miod Vallat)
#13370: Fix a low-probability crash when calling Gc.counters
.
(Demi Marie Obenour, review by Gabriel Scherer)
#13402, #13512, #13549, #13553: Revise bytecode implementation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat)
#13502: Fix misindexing related to Gc.finalise_last
that could prevent
finalisers from being run.
(Nick Roberts, review by Mark Shinwell)
#13520: Fix compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by Sébastien Hinderer and Miod Vallat)
One month and half after the release of the first alpha for OCaml 5.3.0, the release of OCaml 5.3.0 is drawing near.
The internal API of the compiler libraries has been frozen, and most core developer tools support (or will support soon) the new version of the compiler.
We have thus released a first beta version of OCaml 5.3.0 to help you update your software and libraries ahead of the release (see below for the installation instructions). More information about the whole release process is now available in the compiler repository.
Compared to the first alpha release, this beta contains a few runtime or typechecker fixes, a handful of fixes for the runtime event library and other miscellaneous fixes.
Exceptionally, this beta release also introduces a new flag -keywords
for the
compiler. This backward compatibility flag aims to help compiling old code that
are using effect
as a normal identifier, now that effect
is a keyword in the
new effect handler syntax.
The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.3.0 meta-issue.
The full release is expected in the end of November or beginning of December, see the new prospective calendar for more information.
If you find any bugs, please report them on OCaml's issue tracker.
If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.3.0 is available on GitHub.
The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later:
opam update
opam switch create 5.3.0~beta1
The source code for the beta is also available at these addresses:
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update
opam switch create <switch_name> ocaml-variants.5.3.0~beta1+options <option_list>
where option_list
is a space separated list of ocaml-option-*
packages. For instance, for a flambda and no-flat-float-array switch:
opam switch create 5.3.0~beta1+flambda+nffa ocaml-variants.5.3.0~beta1+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
#13502: Fix misindexing related to Gc.finalise_last
that could prevent
finalisers from being run.
(Nick Roberts, review by Mark Shinwell)
#13402, #13512, #13549, #13553: Revise bytecode implementation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat)
#13520: Fix compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by Sébastien Hinderer and Miod Vallat)
#13579, #13583: Unsoundness involving non-injective types + gadts (Jacques Garrigue, report by @v-gb, review by Richard Eisenberg and Florian Angeletti)
#13388, #13540: raises an error message (and not an internal compiler error)
when two local substitutions are incompatible (for instance module type S:=sig end type t:=(module S)
)
(Florian Angeletti, report by Nailen Matschke, review by Gabriel Scherer, and
Leo White)
-keywords <version?+list>
flag to define the list of keywords
recognized by the lexer, for instance -keywords 5.2
disable the effect
keyword.
(Florian Angeletti, review by Gabriel Scherer)#13419: Fix memory bugs in runtime events system. (B. Szilvasy and Nick Barnes, review by Miod Vallat, Nick Barnes, Tim McGilchrist, and Gabriel Scherer)
#13407: Add Runtime_events.EV_EMPTY_MINOR (Thomas Leonard)
#13522: Confirm runtime events ring is still active after callback. (KC Sivaramakrishnan, review by Sadiq Jaffer and Miod Vallat)
#13529: Do not write to event ring after going out of stw participant set. (KC Sivaramakrishnan, review by Sadiq Jaffer)
#13424: Fix Gc.quick_stat
documentation to clarify that returned fields
live_words
, live_blocks
, free_words
, and fragments
are not zero.
(Jan Midtgaard, review by Damien Doligez and KC Sivaramakrishnan)
#13440: Update documentation of Gc.{control,get,set}
to reflect fields
not currently supported on OCaml 5.
(Jan Midtgaard, review by Gabriel Scherer)
#13469, #13474, #13535: Document that [Hashtbl.create n] creates a hash table with a default minimal size, even if [n] is very small or negative. (Antonin Décimo, Nick Bares, report by Nikolaus Huber and Jan Midtgaard, review by Florian Angeletti, Anil Madhavapeddy, Gabriel Scherer, and Miod Vallat)
Feedback on this post is welcomed on Discuss!
We're happy to announce the first and hopefully only release candidate of opam 2.3.0.
This version does not have any significant change compared to the previous 2.3.0~beta2 release and we hope the final release to also have no significant change. Regardless, we invite users to test this version to make sure there isn't any regressions.
Unless a regression is spotted or another problem arises, we hope to have the final release of 2.3.0 out on the 12th of November.
The upgrade instructions are unchanged:
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.3.0~rc1"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.3.0~rc1"
or download manually from the Github "Releases" page to your PATH.
You should then run:
opam init --reinit -ni
Please report any issues to the bug-tracker.
Happy hacking!
We're happy to announce the release of Dune 3.16.1.
This is a patch release that fixes an issue with OCaml.5.3.0 and C++ flags.
-std=gnu++11
when using OCaml >= 5.0
(#10962, @kit-ty-kate)
Discuss this post on Discuss!
Support for dune shell completions for bash and zsh has just landed in the Dune Developer Preview!
Running the installer adds a snippet to
your shell config (e.g. ~/.bashrc) that installs a completion handler for dune
.
The completion script was taken from
here, and that page has
some information about how the script was generated. Once it's installed the
completions will work any time dune
is typed at the start of a command, so
you can still use the completions when running a version of Dune installed with
Opam or your system package manager after installing the Dune Developer Preview.
Currently only command completions are supported. So you can run:
$ dune c<TAB>
cache clean coq
...or:
$ dune build -<TAB>
--action-stderr-on-success
--action-stdout-on-success
--always-show-command-line
--auto-promote
--build-dir
--build-info
--cache
...
But if you run dune build <TAB>
then it will still suggest
local files rather than build targets.
Getting started is easy:
$ curl -fsSL https://get.dune.build/install | sh
$ source ~/.bashrc # or: source ~/.zshrc
$ dune <TAB>
build
cache
clean
coq
describe
diagnostics
exec
...
Feedback on this post is welcomed on Discuss!
We're happy to announce the second beta release of opam 2.3.0.
As this version is a beta, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release.
Compared to the previous 2.3.0~beta1 release, the main change is:
Fix a regression in the detection of the current terminal size that leads to opam output that tries to fit itself into 80 columns regardless of the current terminal size (#6243).
A NetBSD/x86_64 pre-built release binary is now available
You can view the full list of changes, including API changes, in the release note.
The upgrade instructions are unchanged:
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.3.0~beta2"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.3.0~beta2"
or download manually from the Github "Releases" page to your PATH.
You should then run:
opam init --reinit -ni
Please report any issues to the bug-tracker.
Happy hacking!
Feedback on this post is welcome on Discuss!
We're happy to announce the first beta release of opam 2.3.0. Compared to the previous 2.3.0~alpha1 release, you can view the full list of changes in the release note.
This version is a beta, so we invite users to test it to spot previously unnoticed bugs as we head towards the stable release.
Fix an opam 2.1 regression where the initial pin of a local VCS directory would store untracked and ignored files. Those files would usually be cleaned before building the package; however, Git submodules would not be cleaned and would cause issues when paired with the new behaviour added in 2.3.0~alpha1, which makes an opam error when Git submodules fail to update (it was previously a warning). (#5809)
Fix a regression which would make opam crash on platforms where getconf LONG_BIT
is not available (e.g., OpenBSD). (#6215)
Fix the installed packages internal cache, which was storing the wrong version of the opam file after a build failure. This could be triggered easily for users with custom repositories with non-populated extra-files. (#6213)
Fix a regression in lint W59 with local URLs that are not archives. (#6218)
Fix the compilation of opam on Windows with OCaml >= 5.0 (again)
Several improvements to the prebuilt release binaries were made:
API changes are denoted in the release note linked above. This release also includes a couple of PRs improving and extending the tests.
The upgrade instructions are unchanged:
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.3.0~beta1"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.3.0~beta1"
or download manually from the GitHub "Releases" page to your PATH.
You should then run:
opam init --reinit -ni
Please report any issues to the bug-tracker.
Happy hacking!
Tarides' OCaml Infrastructure team has been hard at work over the last few months, focusing on improving the stability, reliability, and user experience of the OCaml ecosystem's core infrastructure. We are preparing for more substantive changes to come. We will have more fruit from this work to share soon, but updates on our efforts are overdue and we wanted to get you all caught up.
We've expanded and updated our platform support to keep pace with the evolving OCaml ecosystem:
These updates ensure that our systems continue to support OCaml developers on a broad range of systems, in particular by testing package publication to the opam repository and publishing Docker images.
We've made improvements to enhance the experience of publishing packages to the opam repository:
We hope these changes will make package publication experience smoother. We're committed to improving the experience for newcomers and existing repository contributors alike, stay tuned for more improvements!
Maintaining the security and reliability of the OCaml infrastructure remains a top priority:
Much has been done but much more is in the works! Expect updates more regularly going forward, and don't hesitate to reach out on ocaml/infrastructure/issues or discuss.ocaml.org if you have questions, requests, or ideas!
We are happy to announce the joint release of Merlin 5.2.1-502
and 4.17.1
. This release adds many new features to Merlin including the ability to add hints to a source tree, serch for values using a type signature and expanding PPX annotations to preview their source code. There are also bug fixes for both the Merlin binary and editor modes.
More information can be found in the Discuss announcement.
Contributions are always welcome at Merlin | Issues
-unboxed-types
and -no-unboxed-types
as OCaml ignored flags (ocaml/merlin#1795, fixes ocaml/merlin#1794)expand-node
command for expanding PPX annotations (ocaml/merlin#1745)inlay-hints
command for adding hints on a source tree (ocaml/merlin#1812)search-by-type
command for searching values by types (ocaml/merlin#1828)dot-merlin-reader
ignoring SOURCE_ROOT and STDLIB directives (ocaml/merlin#1839, ocaml/merlin#1803)merlin.py
(ocaml/merlin#1798)merlin-search-by-type
, merlin-search-by-polarity
and change the behaviour of merlin-search
to switch between by-type or by-polarity depending on the query (ocaml/merlin#1828)Hello folks! 👋
We'd like to welcome everyone to try and play with the Dune Developer Preview! 🎉
This experimental nightly release of dune includes a lot of improvements, including the much expected package management features, and it can be installed from that website or by using the new installation script:
$ curl -fsSL https://get.dune.build/install | bash
In a few seconds you should be ready to OCaml by calling dune
:
You can also watch and share this demo on X and Mastodon.
Please try it out and let us know what you think 🙏
📅 You can book a feedback call with us here
📝 You can submit feedback using this form
🐛 You can submit issues to Github on ocaml/dune
The Dune shared cache has been enabled by default. We're starting off by caching all downloads and dependencies.
We have improved support for dev tools. We're working to streamline this but in the latest binary you can:
Configure your LSP (in Neovim, Vim, Emacs, etc) to call dune tools exec ocamllsp
to get LSP support for your projects out of the box – this may take a little bit the first time it builds the LSP for a compiler version, but it's pretty much instant afterwards.
Call dune fmt
to get your project formatted – remember to add an .ocamlformat
file if you don't have one yet. An empty one is enough.
Call dune ocaml doc
to get documentation built
We're looking forward to streamlining the DX, working on better dependency locks, and looking into supporting Windows.
In particular, we're considering work on a few things:
dune create <repo>
– to let the community create templates that can be easily used from within dunedune pkg fetch
– to prefetch packages and prepare a repository for working in offline modedune build @deps
- to build all dependencies, useful for staged builds in Dockerfilesdune pkg add <name>
- to make adding packages straightforwardIf you've got any ideas, we'd love to hear them, so please open a feature request on Github 🙏
At FunOCaml we had a last-minute opportunity to present the work being done on Dune and we used it to introduce the Developer Preview to the community, and even tested Package Management live with suggestions from the audience (thanks @anmonteiro and Paul-Elliot for participating!) – you can watch it on Twitch.
We're working with @Claire_Vandenberghe on redesigning the Developer Preview website so that it'd feel like a seamless extension of OCaml.org – in this current iteration we've made it easier to get started and we're putting the FAQ front and center.
We'll be iterating on this design in the coming weeks until it fits perfectly within the OCaml.org design system 🎨
You can check the new website here: https://preview.dune.build
In the near future we'll be publishing blog posts about the Developer Preview and Package Management, which we're working on with @professor.rose 👏
Four months after the release of OCaml 5.2.0, the set of new features for the future version 5.3.0 of OCaml has been frozen. We are thus happy to announce the first alpha release for OCaml 5.3.0.
This alpha version is here to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the installation instructions). More information about the whole release process is now available in the compiler repository, and we will try to propagate this information to ocaml.org shortly.
The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.3.0 meta-issue.
The full release is expected around November, see the new prospective calendar for more information.
If you find any bugs, please report them on OCaml's issue tracker.
If you are interested in the ongoing list of new features and bug fixes, the updated change log for OCaml 5.3.0 is available on GitHub.
The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later:
opam update
opam switch create 5.3.0~alpha1
The source code for the alpha is also available at these addresses:
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update
opam switch create <switch_name> ocaml-variants.5.3.0~alpha1+options <option_list>
where option_list
is a space separated list of ocaml-option-*
packages. For instance, for a flambda and no-flat-float-array switch:
opam switch create 5.3.0~alpha1+flambda+nffa ocaml-variants.5.3.0~alpha1+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
Feedback on this post is welcomed on Discuss!
As mentioned in our talk at the OCaml Workshop 2024, we decided to switch to a time-based release cycle (every 6 months), starting with opam 2.3.
As promised, we are happy to announce the first alpha release of opam 2.3.0. You can view the full list of changes in the release note.
This version is an alpha, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release.
When loading a repository, opam now ignores files in packages' files/
directories which aren't listed in the extra-files
field of the opam file.
This was done to simplify the opam specification where we hope the opam file to be the only thing that you have to look at when reading a package specification. The optionality of the extra-files:
field goes against that principle. This change also reduces the surface area for potential file corruption as it ensures that extra-files are checked against their checksums.
This is a breaking change and means that if you are using the files/
directory without the extra-files:
field, you need to make sure that all files in that directory are listed in the extra-files
field.
Once done, the resulting opam file is backward-compatible and you don't need to worry about anything else.
If you have an opam repository, you should make sure all files are listed so every packages continues to work without any issue, which can be done automatically using the opam admin update-extrafiles
command.
Packages requiring an unsupported version of opam are now marked unavailable, instead of causing a repository error. This means an opam repository can now allow smoother upgrade in the future where some packages can require a newer version of opam without having to fork the repository to upgrade every package to that version as was done for the upgrade from opam 1.2 to 2.0
Add a new opam list --latests-only
option to list only the latest versions of packages. Note that this option is respects the order options were given on the command line. For example: --available --latests-only
will first list all the available packages, then choose only the latest packages in that set; while --latests-only --available
will first list all the latest packages, then only show the ones that are available in that set
Fix and improve opam install --check
, which now checks if the whole dependency tree of the package is installed instead of only the root dependencies
Add a new --verbose-on
option to enable verbose output for specified package names. Thanks to @desumn for this contribution
Add a new opam switch import --deps-only
option to install only the dependencies of the root packages listed in the opam switch export file
opam switch list-available
will now not display compilers flagged with avoid-version
/deprecated
unless --all
is given, meaning that the "trunk" build of OCaml no longer appears to be the latest version
opam switch create --repos
now accepts git URLs suffixed with .git
instead of requiring the git+https://
protocol prefix. This is consistant with other commands such as opam repository add
. Thanks to @Keryan-dev for this contribution
opam switch set-invariant
now displays the switch invariant using the same syntax as the --invariant
flag
The builtin-0install
solver was improved and should now be capable of being your default solver instead of builtin-mccs+glpk
. It was previously mostly only suited for automated tasks such as Continuous Integration. If you wish to give it a try, simply call opam option solver=builtin-0install
Most of the unhelpful conflict messages were fixed
Fix the value of the arch
variable when the current OS is 32bit on a 64bit machine (e.g. Raspberry Pi OS)
opam now fails when git submodules fail to update instead of ignoring the error and just showing a warning
opam's libraries now compile with OCaml >= 5.0 on Windows
Various performance and other improvements were made and bugs were fixed. API changes are denoted in the release note linked above. This release also includes a handful of PRs improving the documentation and more two dozen PRs improving and extending the tests.
The upgrade instructions are unchanged:
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.3.0~alpha1"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.3.0~alpha1"
or download manually from the Github "Releases" page to your PATH.
You should then run:
opam init --reinit -ni
Please report any issues to the bug-tracker.
Happy hacking!
We're happy to announce the release of Odoc 2.4.3!
This release includes three key fixes: we restored missing KaTeX headers for proper mathematical rendering, resolved an issue where ][
characters in code blocks were incorrectly interpreted as "code blocks with result" (now requiring explicit delimiters), and corrected the misprinting of type variables from ML files in OCaml 4.14 and later versions where multiple instances of the same type variable could be displayed with different names.
][
in code blocks, fixing issue #1137 (@Julow, #1149){delim@lang[ code ]delim[ result ]}
As we prepare for the public beta, we're ramping up the DX interviews and ensuring the first few users will have a fun, productive experience with the Developer Preview.
📥 If you signed up for the Dev Preview back in May, check your inbox for a link and instructions to schedule your DX interview with us.
Here's a sample video on (Mastodon or X) where you can see us building the Riot project on a machine that does not have OCaml installed. It is pretty neat!
Seriously, big shoutout to the Dune team at Tarides[0] and Jane Street[1] who have been doing a phenomenal job 👏 ✨ 🐫
So here's what getting started with OCaml looks like using the Dune Developer Preview as of today (August 19 2024):
dune
from our binary distribution – we'll soon make this public!dune pkg lock
in your favorite projectdune build
That's it. No need to install anything else! Dune will see that lock file, fetch, and build all necessary dependencies.
🗺️ These are some strong steps towards the OCaml Platform vision for 2026 that we are actively working towards. If you have any thoughts or feedback please let us know!
There are more improvements coming that will help remove friction to get started and create a delightful experience. Both of these things we strongly believe will help onboard new users to the OCaml world.
Here's a few in the works:
Various DX improvements – from new outputs to simplified workflows, we want to make using Dune just delightful.
Bundled support for dev tools (OCamlFormat, odoc
, LSP) – the default toolset will be available without any extra steps! Just call dune fmt
and it works. No need to manually install anything else.
Automatic dependency locking – when building, and even in watch mode, Dune will lock your dependencies by default and keep the lock up to date.
Cross-project caching – by default we'll enable a local Dune cache across the system, so you never rebuild the same dependency, even across projects.
Signed binaries with certificates of origin – we care deeply about security and want to make sure that any binary we ship can be easily verified and tracked back to its sources.
Stay tuned! 👋
PS: here's a longer video on (Mastodon or X) showing you the setup for OCaml from zero, creating a new project, and adding a dependency, all within ~5 minutes
[0] @emillon @Leonidas @gridbugs @tmattio @maiste . Ambre Suhamy, Alpha Diallo [1] @rgrinberg
Feedback on this post is welcomed on Discuss!
We are pleased to announce the release of opam 2.2.1.
We've fixed a couple of regressions and would like to encourage users of opam 2.2 to upgrade.
The three main changes are:
opam install --deps-only
where the direct dependencies were not set as root packages
(spotted in the wild by @rjbou and also reported on Discuss)--write-out
to --fail
if exit code 43 is returned by Curl. In particular, this fixes opam init
when run from cmd/PowerShell
on Windows 11 23H2
(#6120)A couple more improvements and additions to the testsuite were made. You can view the full list of changes in the release note.
The upgrade instructions are unchanged:
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.2.1"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) }"
(or via winget upgrade OCaml.opam
) or download manually from the Github "Releases" page to your PATH.
You should then run:
opam init --reinit -ni
Please report any issues to the bug-tracker.
Happy hacking!
We're happy to announce the release of opam-publish
2.4.0!
--exclude
to exclude the given packages from the publishing process [#161 @kit-ty-kate]We are pleased to announce the release of OCaml LSP 1.19.0. This version brings official support for OCaml 5.2. It also includes a new custom query to get
documentation and a fix regarding the handling of OCamlFormat processes.
ocamllsp/getDocumentation
request (ocaml/ocaml-lsp#1336)sigterm
rather than sigint
or sigkill
(ocaml/ocaml-lsp#1343)The Ppxlib dev team is happy to announce the release of ppxlib.0.33.0
.
This release's main feature is a series of improvement to flags controlling
unused value/module/type warnings silencing.
The ppxlib
driver generates warning silencing items to prevent [@@deriving ...]
generated code to trigger unused code warnings. Three warnings are disabled that
way:
[@@deriving ...]
attribute is attached.
This feature was added a long time ago to avoid manually disabling those
warnings when working with derivers that generate a set of values and modules
only to use a subset of those. Alternatively, the unused type warning silencing
was added to allow defining an alias type only to be consumed by a deriver (e.g.,
type error = [`Not_found | `Invalid_arg] [@@deriving to_string]
).
We since then believe that we should not disable warnings lightly, as this
behaviour makes it difficult to find and remove deadcode. The right approach in
those situations should be to fix the PPX derivers so that they are more
configurable and can be used without triggering such warnings.
We will start to move toward removing this feature, but since it is still useful in
some places, we came up with a plan to do this iteratively.
In ppxlib.0.31.0
we added the -unused-code-warnings
driver flag and the
?unused_code_warnings
Deriving.V2.make
optional argument to control whether
to silence Warnings 32 and 60. When both are set to true
, by the user and the
deriver authors, the warnings are not silenced. As of ppxlib.0.33.0
, these also
control the silencing of Warning 34 (unused type).
force
can now be passed to the -unused-code-warnings
flag in order to
disable warnings silencing, regardless of the derivers opting in. This allows
users to test whether their codebase and their set of derivers rely on warning
silencing or not and to use those results to eliminate deadcode and/or report
issues upstream to the derivers they use.
We also added a separate -unused-type-warnings
flag that works similarly to
-unused-code-warnings
(i.e., depends on the value of the
?unused_code_warnings
argument), but it only controls Warning 34 silencing, as it
turns out it is less likely to cause unwanted warnings than with the other two.
This will allow users to disable it more easily, without having to deal with
Warnings 32 and 60 straight away.
We want to encourage users to try those on their codebase in order to see the impact
it has. Did you have deadcode lying around that slipped past undetected? Does
this trigger unwanted warnings because of deriver's generated code?
The plan is to give the ecosystem some time to try those features and adapt by fixing
individual derivers and flipping setting ?unused_code_warnings
to true as they
do. After a while, we will swap the default value of the driver flag to true
so
that only derivers that haven't opted in will enable warning silencing. Then as
time goes we will swap the default of the Deriving.make
argument so that
derivers will instead have to explicitly opt out to get the warning silencing.
Finally, once we are confident the ecosystem is in a good enough state, we will
remove this feature altogether.ppxlib.0.33.0
also comes with a couple of new features for PPX authors:
Ast_builder
functions: elist_tail
and plist_tail
that can be used to build list expressions and patterns with a custom tail:
elist_tail [expr1; expr2] tail_expr
returns the expression for
expr1::expr2::tail_expr
.Context_free.special_function'
, a new version of special_function
that
allows passing a Longident.t
directly rather that relying on parsing the
string argument to a Longident.t
.Finally, the release includes a few bug fixes to Longident.parse
and
Code_path.main_module_name
and fixes the location-check
flag so it is not
required to also pass -check
to enable location checks. It also fixes the 5.2
migrations locations, as we used to build nodes with inconsistent locations when
migrating Pexp_function
nodes.
We would like to thank our external contributors who have been a huge part of this release: @octachron, @vg-b, and @jchavarri, and a special mention to @mbarbin, who has not only contributed a lot to the warning silencing features but has been extensively testing and providing very useful feedback on them.
And of course, as usual, we'd like to thank the OCaml Software Foundation who has been funding my work on Ppxlib and on this release, making all of this possible!
Fix a bug where Code_path.main_module_name
would not properly remove
extensions from the filename and therefore return an invalid module name.
(#512, @NathanReb)
Add -unused-type-warnings
flag to the driver to allow users to disable
only the generation of Warning 34 silencing structure items when using
[@@deriving ...]
on type declarations. (#511, @mbarbin, @NathanReb)
Make the -unused-code-warnings
driver flag also control Warning 34
silencing for type declarations with [@@deriving ...]
attached.
(#510, @mbarbin, @NathanReb)
Add -unused-code-warnings=force
driver command-line flag argument. (#490, @mbarbin)
Add new functions Ast_builder.{e,p}list_tail
that take an extra tail
expression/pattern argument parameter compared to Ast_builder.{e,p}list
, so
they can build ASTs like a :: b :: c
instead of only [ a; b ]
.
(#498, #502, @v-gb, @NathanReb)
Fix Longident.parse
so it also handles indexing operators such as
.!()
, .%(;..)<-
, or Vec.(.%())
(#494, @octachron)
Add a special_function'
variant that directly takes a Longident.t
argument in order to avoid the issue with Longident.t
covering distinct
syntactic classes that cannot be easily parsed by a common parser (#496, @octachron).
Keep location ranges consistent when migrating Pexp_function
nodes from 5.2+
to older versions (#504, @jchavarri)
Fix -locations-check
behaviour so it is no longer required to pass -check
and
can enable location checks. (#506, @NathanReb)
We are pleased to announce the release of OCaml LSP 1.18.0. This version comes with a lot of fixes and new features.
Notable features that are included in this release are:
TypeEnclosing
ifthenelse
expressions...and many fixes to a handful of issues.
Feedback is very much welcomed on the the Discuss Announcement post and do not hesistate to report issues in the issue tracker.
Introduce a configuration option to control Dune diagnostics. The option is called duneDiganostics
, and it may be set to { enable: false }
to disable diagnostics. (ocaml/ocaml-lsp#1221)
Support folding of ifthenelse
expressions (ocaml/ocaml-lsp#1031)
Improve hover behavior (ocaml/ocaml-lsp#1245)
Hovers are no longer displayed on useless parse tree nodes such as keywords, comments, etc.
Multiline hovers are now filtered away.
Display expanded PPXs in the hover window.
Improve document symbols (ocaml/ocaml-lsp#1247)
Use the parse tree instead of the typed tree. This means that document symbols will work even if the source code doesn't type check.
Include symbols at arbitrary depth.
Differentiate functions / types / variants / etc.
This now includes PPXs like let%expect_test
or let%bench
in the outline.
Introduce a destruct-line
code action. This is an improved version of the
old destruct
code action. (ocaml/ocaml-lsp#1283)
Improve signature inference to only include types for elements that were absent from the signature. Previously, all signature items would always be inserted. (ocaml/ocaml-lsp#1289)
Add an update-signature
code action to update the types of elements that
were already present in the signature (ocaml/ocaml-lsp#1289)
Add custom
ocamllsp/merlinCallCompatible
request (ocaml/ocaml-lsp#1265)
Add custom ocamllsp/typeEnclosing
request (ocaml/ocaml-lsp#1304)
Detect document kind by looking at Merlin's suffixes
config.
This enables more LSP features for non-.ml/.mli
files. Though it still
depends on Merlin's support. (ocaml/ocaml-lsp#1237)
Correctly accept the --clientProcessId
flag. (ocaml/ocaml-lsp#1242)
Disable automatic completion and signature help inside comments (ocaml/ocaml-lsp#1246)
Includes a new optional/configurable option to toggle syntax documentation. If toggled on, allows display of syntax documentation on hover tooltips. Can be controlled via environment variables and by GUI for VS code. (ocaml/ocaml-lsp#1218)
For completions on labels that the LSP gets from Merlin, take into account
whether the prefix being completed starts with ~
or ?
. Change the label
completions that start with ?
to start with ~
when the prefix being
completed starts with ~
. (ocaml/ocaml-lsp#1277)
Fix document syncing (ocaml/ocaml-lsp#1278, ocaml/ocaml-lsp#1280, fixes ocaml/ocaml-lsp#1207)
Stop generating inlay hints on generated code (ocaml/ocaml-lsp#1290)
Fix parenthesising of function types in SignatureHelp
(ocaml/ocaml-lsp#1296)
Fix syntax documentation rendering (ocaml/ocaml-lsp#1318)
We're happy to announce the release of opam-publish
2.3.1!
Feedback on this post is welcomed on Discuss!
We are very pleased to announce the release of opam 2.2.0, and encourage all users to upgrade. Please read on for installation and upgrade instructions.
In case you plan a possible rollback, you may want to first backup your
~/.opam
or $env:LOCALAPPDATA\opam
directory.
The upgrade instructions are unchanged:
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.2.0"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) }"
or download manually from the Github "Releases" page to your PATH.
You should then run:
opam init --reinit -ni
After 8 years' effort, opam and opam-repository now have official native Windows support! A big thank you is due to Andreas Hauptmann (@fdopen), whose WODI and OCaml for Windows projects were for many years the principal downstream way to obtain OCaml on Windows, Jun Furuse (@camlspotter) whose initial experimentation with OPAM from Cygwin formed the basis of opam-repository-mingw, and, most recently, Jonah Beckford (@jonahbeckford) whose DkML distribution kept - and keeps - a full development experience for OCaml available on Windows.
OCaml when used on native Windows requires certain tools from the Unix world
which are provided by either Cygwin or MSYS2.
We have engineered opam init
so that it is possible for a user not to need to
worry about this, with opam
managing the Unix world, and the user being able
to use OCaml from either the Command Prompt or PowerShell. However, for the Unix
user coming over to Windows to test their software, it is also possible to have
your own Cygwin/MSYS2 installation and use native Windows opam from that. Please
see the previous blog post
for more information.
There are two "ports" of OCaml on native Windows, referred to by the name of provider of the C compiler. The mingw-w64 port is GCC-based. opam's external dependency (depext) system works for this port (including providing GCC itself), and many packages are already well-supported in opam-repository, thanks to the previous efforts in opam-repository-mingw. The MSVC port is Visual Studio-based. At present, there is less support in this ecosystem for external dependencies, though this is something we expect to work on both in opam-repository and in subsequent opam releases. In particular, it is necessary to install Visual Studio or Visual Studio BuildTools separately, but opam will then automatically find and use the C compiler from Visual Studio.
opam tree
is a new command showing packages and their dependencies with a tree view.
It is very helpful to determine which packages bring which dependencies in your installed switch.
$ opam tree cppo
cppo.1.6.9
├── base-unix.base
├── dune.3.8.2 (>= 1.10)
│ ├── base-threads.base
│ ├── base-unix.base [*]
│ └── ocaml.4.14.1 (>= 4.08)
│ ├── ocaml-base-compiler.4.14.1 (>= 4.14.1~ & < 4.14.2~)
│ └── ocaml-config.2 (>= 2)
│ └── ocaml-base-compiler.4.14.1 (>= 4.12.0~) [*]
└── ocaml.4.14.1 (>= 4.02.3) [*]
Reverse-dependencies can also be displayed using the new opam why
command.
This is useful to examine how dependency versions get constrained.
$ opam why cmdliner
cmdliner.1.2.0
├── (>= 1.1.0) b0.0.0.5
│ └── (= 0.0.5) odig.0.0.9
├── (>= 1.1.0) ocp-browser.1.3.4
├── (>= 1.0.0) ocp-indent.1.8.1
│ └── (>= 1.4.2) ocp-index.1.3.4
│ └── (= version) ocp-browser.1.3.4 [*]
├── (>= 1.1.0) ocp-index.1.3.4 [*]
├── (>= 1.1.0) odig.0.0.9 [*]
├── (>= 1.0.0) odoc.2.2.0
│ └── (>= 2.0.0) odig.0.0.9 [*]
├── (>= 1.1.0) opam-client.2.2.0~alpha
│ ├── (= version) opam.2.2.0~alpha
│ └── (= version) opam-devel.2.2.0~alpha
├── (>= 1.1.0) opam-devel.2.2.0~alpha [*]
├── (>= 0.9.8) opam-installer.2.2.0~alpha
└── user-setup.0.7
Special thanks to @cannorin for contributing this feature.
There is now a way for a project maintainer to share their project development
tools: the with-dev-setup
dependency flag. It is used in the same way as
with-doc
and with-test
: by adding a {with-dev-setup}
filter after a
dependency. It will be ignored when installing normally, but it's pulled in when the
package is explicitly installed with the --with-dev-setup
flag specified on
the command line.
For example
opam-version: "2.0"
depends: [
"ocaml"
"ocp-indent" {with-dev-setup}
]
build: [make]
install: [make "install"]
post-messages:
[ "Thanks for installing the package"
"as well as its development setup. It will help with your future contributions" {with-dev-setup} ]
When pinning a package using opam pin
, opam looks for opam files in the root directory only.
With recursive pinning, you can now instruct opam to look for .opam
files in
subdirectories as well, while maintaining the correct relationship between the .opam
files and the package root for versioning and build purposes.
Recursive pinning is enabled by the following options to opam pin
and opam install
:
--recursive
, opam will look for .opam
files recursively in all subdirectories.--subpath <path>
, opam will only look for .opam
files in the subdirectory <path>
.The two options can be combined: for instance, if your opam packages are stored
as a deep hierarchy in the mylib
subdirectory of your project you can try
opam pin . --recursive --subpath mylib
.
These options are useful when dealing with a large monorepo-type repository with many opam libraries spread about.
opam switch -
, inspired by git switch -
, makes opam switch back to the previously
selected global switch.
opam pin --current
fixes a package to its current state (disabling pending
reinstallations or removals from the repository). The installed package will
be pinned to its current installed state, i.e. the pinned opam file is the
one installed.
opam pin remove --all
removes all the pinned packages from a switch.
opam exec --no-switch
removes the opam environment when running a command.
It is useful when you want to launch a command without opam environment changes.
opam clean --untracked
removes untracked files interactively remaining
from previous packages removal.
opam admin add-constraint <cst> --packages pkg1,pkg2,pkg3
applies the given constraint
to a given set of packages
opam list --base
has been renamed into --invariant
, reflecting the fact that since opam 2.1 the "base" packages of a switch are instead expressed using a switch invariant.
opam install --formula <formula>
installs a formula instead of a list of packages. This can be useful if you would like to install one package or another one. For example opam install --formula '"extlib" |"extlib-compat"'
will install either extlib
or extlib-compat
depending on what's best for the current switch.
opam env
, fixing many corner cases for environment updates and making the reverting of package environment variables precise. As a result, using setenv
in an opam file no longer triggers a lint warning.sys-ocaml-system
default global eval variable"%{var?string-if-true:string-if-false-or-undefined}%"
syntax to
support extending the variables of packages with +
in their name
(conf-c++
and conf-g++
already exist) using "%{?pgkname:var:}%"
getconf DARWIN_USER_TEMP_DIR
) as writable when TMPDIR
is not defined on macOS/tmp
is now writable again, restoring POSIX complianceopam admin: new add-extrafiles
command to add/check/update the extra-files:
field according to the files present in the files/
directoryopam lint -W @1..9
syntax to allow marking a set of warnings as errorsOPAMCURL
, OPAMFETCH
and OPAMVERBOSE
environment variables--assume-built
argumentAnd many other general and performance improvements were made and bugs were fixed. You can take a look to previous blog posts. API changes and a more detailed description of the changes are listed in:
This release also includes PRs improving the documentation and improving and extending the tests.
Please report any issues to the bug-tracker.
We hope you will enjoy the new features of opam 2.2! 📯
We are pleased to announce the release of Merlin 5.1-502
. This is an important release that brings a lot of backend changes and a major
new feature: project-wide occurrences queries.
Try it by running dune build @ocaml-index
(since dune 3.16.0
) and performing a reference query!
More information can be found in the discuss announcement and the wiki.
Merlin_lib.index_format
SOURCE_ROOT
that is used to resolve relative paths found in the
indexes.INDEX
that is used to declare the list of index files Merlin should
use when looking for occurrences.UNIT_NAME
configuration directive that can be used to tell Merlin
the correct name of the current unit in the presence of wrapping (ocaml/merlin#1776)merlin-lib.commands
: Add a find_command_opt
alternative to
find_command
that does not raise (ocaml/merlin#1778)Feedback on this post is welcomed on Discuss!
We are very excited to announce the first (and hopefully only) release candidate for opam 2.2.0.
We've squashed a few more bugs and we consider this to be ready for the final release. You can view the full list of changes in the release note.
We invite users to test it one final time just in case there are any previously unnoticed bugs!
opam upgrade
wanting to keep rebuilding the compiler (as now it contains an x-env-path-rewrite
field)opam init -y
no longer asks questions on WindowsOpamConsole.menu
when there are more than 9 options (can happen on Windows)A couple more improvements were made and bugs were fixed. The single API change is also denoted in the release note. This release also includes PRs extending the tests.
In case you plan a possible rollback, you may want to first backup your
~/.opam
or $env:LOCALAPPDATA\opam
directory.
The upgrade instructions are unchanged:
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.2.0~rc1"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) }"
or download manually from the Github "Releases" page to your PATH.
You should then run:
opam init --reinit -ni
Please report any issues to the bug-tracker.
Thanks for trying this new release out, and we hope you will enjoy the new features of opam 2.2!
We're happy to announce the release of Dune 3.16.0.
Among the list of chances, this release contains improvements to Melange support and a way to look for references in a whole project using Merlin and OCaml LSP.
Allow libraries with the same (name ..)
in projects as long as they don't
conflict during resolution (via enabled_if
). (#10307, @anmonteiro,
@jchavarri)
dune describe pp
now finds the exact module and the stanza it belongs to,
instead of guessing the name of the preprocessed file. (#10321, @anmonteiro)
Print the result of dune describe pp
with the respective dialect printer.
(#10322, @anmonteiro)
Add new flag --context
to dune ocaml-merlin
, which allows to select a
Dune context when requesting Merlin config. Add dune describe contexts
subcommand. Introduce a field generate_merlin_rules
for contexts declared
in the workspace, that allows to optionally produce Merlin rules for other
contexts besides the one selected for Merlin (#10324, @jchavarri)
Melange: add include paths for private library .cmj
files during JS
emission. (#10416, @anmonteiro)
dune ocaml-merlin
: communicate additional directives SOURCE_ROOT
,
UNIT_NAME
(the actual name with wrapping) and INDEX
with the paths to the
index(es). (#10422, @voodoos)
Add a new alias @ocaml-index
that uses the ocaml-index
binary to generate
indexes that can be read by tools such as Merlin to provide project-wide
references search. (#10422, @voodoos)
Merlin: add optional (merlin_reader CMD)
construct to (dialect)
stanza to
configure a Merlin reader (#8567, @andreypopp)
Melange: treat private libraries with (package ..)
as public libraries,
fixing an issue where import
paths were wrongly emitted. (#10415,
@anmonteiro)
Install .glob
files for Coq theories too (#10602, @ejgallego)
Don't try to document nonexistent libraries in doc-new target (#10319, fixes #10056, @jonludlam)
Make dune-site
's load_all
function look for META
files so that it
doesn't fail on empty directories in the plugin directory (#10458, fixes
#10457, @shym)
Fix incorrect warning for libraries defined inside nonexistant directories
using (subdir ..)
and used by executables using dune-build-info
(#10525,
@rgrinberg)
Don't try to take build lock when running coq top --no-build
(#10547, fixes
#7671, @lzy0505)
Make sure to truncate Dune's lock file after locking and unlocking so that users cannot observe incorrect PID's (#10575, @rgrinberg)
MDX: link MDX binary with byte_complete
. This fixes (libraries)
with
foreign archives on Linux. (#10586, fixes #10582, @anmonteiro)
Virtual libraries: fix an issue where linking an executable involving several virtual libries would cause an error. (#10581, fixes #10460, @rgrinberg)
We are pleased to announce the release of Merlin 4.16-414
and 4.16-501
.
These releases expose additional functions for packages using merlin-lib that need to manually parse merlin commands.
merlin-lib.commands
library which disassociates the
execution of commands from the new_protocol
, from the binary, allowing
it to be invoked from other projects (ocaml/merlin#1758)merlin-lib.commands
: Add a find_command_opt
alternative to
find_command
that does not raise (ocaml/merlin#1778)Feedback on this post is welcomed on Discuss!
We are very pleased to announce the third and final beta release of opam 2.2.0.
We've done our best to polish everything and squash as many bugs as possible in order to be ready for the final release. You can view the full list of changes in the release note.
This version is a beta, we invite users to test it to spot previously unnoticed bugs as we near the stable release.
opam init --cygwin-extra-packages=CYGWIN_PKGS --cygwin-internal-install
,
to specify additional packages for the internal Cygwin installationC:\opamroot\opam-xxx
when the opam root contains spaces on Windows--help
on Windowsopam install --deps-only
on an already installed packageopam tree --with-test
Various other general and performance improvements were made and bugs were fixed. API changes are denoted in the release note. This release also includes PRs improving the documentation and improving and extending the tests.
BEWARE: the command shown below is experimental, use caution and please do report any issues that you are experiencing. If you prefer to not use our experimental script, feel free to get the Windows binary directly from the Release Page and put it in your directory of choice instead.
Now that the Windows support was merged in opam-repository, testing is as simple as calling the following command from a PowerShell terminal:
Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubusercontent.com/kit-ty-kate/opam/windows-installer/shell/install.ps1) }"
opening a new terminal, and a simple opam init
will work out-of-the-box.
In case you plan a possible rollback, you may want to first backup your
~/.opam
directory.
The upgrade instructions are unchanged:
Either from binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.2.0~beta3"
or download manually from the Github "Releases" page to your PATH.
Or from source, manually: see the instructions in the README.
You should then run:
opam init --reinit -ni
Please report any issues to the bug-tracker.
Thanks for trying this new release out, and we hope you will enjoy the new features!
We are pleased to announce the release of Merlin 4.15-414
and 4.15-501
.
These releases bring a handful of bug fixes and improvements, notably to the
destruct
feature, that were already released for OCaml 5.2 in Merlin 5.0-502.
We just released version 3.15.3 with some bug fixes.
Fix interpretation of exists_if
predicate in META
files of installed
libraries containing more than one element. (#10564, fixes #10563, @dbuenzli, @nojb)
Fix TSAN warning in wait4 stubs (#10554, fixes #10553, @emillon)
Feedback on this post is welcomed on Discuss!
We are pleased to announce the patch release of opam 2.1.6.
This opam release consists of backported bug fixes and improvements:
Opam installation instructions (unchanged):
From binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.1.6"
or download manually from the Github "Releases" page to your PATH. In this case, don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update you sandbox script.
From source, using opam:
opam update; opam install opam-devel
(then copy the opam binary to your PATH as explained, and don't forget to run opam init --reinit -ni
to enable sandboxing if you had version 2.0.0~rc manually installed or to update your sandbox script)
From source, manually: see the instructions in the README.
We hope you enjoy this new minor version, and remain open to bug reports and suggestions.
GNU patch
is not detected when a patch is applied
[#5893 @kit-ty-kate]gpatch
by default instead of patch
on NetBSD and DragonFlyBSD
[#5893 @kit-ty-kate]gpatch
if it exists and is detected as GNU patch when patch
is not
GNU patch
[#5893 @kit-ty-kate]OpamSystem.patch
now displays a warning when GNU patch is not detected
and looks for both patch and gpatch as a backup option depending on the OS
[#5893 @kit-ty-kate]We are pleased to announce the release of Merlin 5.0-502!
This release brings official support for OCaml 5.2. Substantial backend changes were required to adapt to this release, especially for features such as occurrences and get-documentation. Do not hesitate to report any suspicious behavior in the issue tracker!
This release also fixes a handful of issues, two of them improving the behaviour of Merlin's destruct
feature.
destruct
: Removal of residual patterns (#1737, fixes #1560)merlin-lib.commands
library that disassociates the
execution of commands from the new_protocol
, from the binary, allowing
it to be invoked from other projects (#1758)merlin.hide
attribute is present. (#1768)uid_to_decl
table in 5.2's CMT files to get documentation.
(#1773)We have the pleasure of celebrating Inge Lehmann's birthday by announcing the release of OCaml version 5.2.0.
Some of the highlights in OCaml 5.2.0 are:
-H
flag for hidden include directoriesAnd a lot of incremental changes:
OCaml 5.2.0 is still a somewhat experimental release compared to the OCaml 4.14 branch. In particular:
statmemprof
is being tested in the developer branch.Since the Windows MSVC port and statmemprof
are still missing, the maintenance
support for OCaml 4.14 will be extended until at least the end of the year.
Please report any unexpected behaviours on the OCaml issue tracker and post any questions or comments you might have on our discussion forums.
The full list of changes can be found in the changelog below.
The base compiler can be installed as an opam switch with the following commands:
opam update
opam switch create 5.2.0
The source code for the release candidate is also directly available on:
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update
opam switch create <switch_name> ocaml-variants.5.2.0+options <option_list>
where <option_list>
is a space separated list of ocaml-option-*
packages. For instance, for a flambda
and no-flat-float-array
switch:
opam switch create 5.2.0+flambda+nffa ocaml-variants.5.0.0+options ocaml-option-flambda ocaml-option-no-flat-float-array
(Changes that can break existing programs are marked with a "*")
#12276, #12601: Native-code compilation for POWER (64 bits, little-endian) (Xavier Leroy, review by KC Sivaramakrishnan, Anil Madhavapeddy, and Stephen Dolan)
#12667: Extend the latter to POWER 64 bits, big-endian, ELFv2 ABI (A. Wilcox, review by Xavier Leroy)
#12193: Reintroduce GC compaction for shared pools.
Adds a parallel compactor for the shared pools (which contain major heap
blocks sized less than 128 words). Explicit only for now, on calls to
Gc.compact
.
(Sadiq Jaffer, Nick Barnes, review by Anil Madhavapeddy, Damien Doligez,
David Allsopp, Miod Vallat, Artem Pianykh, Stephen Dolan, Mark Shinwell,
and KC Sivaramakrishnan)
#12114: Add ThreadSanitizer support (Fabrice Buoro and Olivier Nicole, based on an initial work by Anmol Sahoo, review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)
#12850: Update Gc.quick_stat
data at the end of major cycles and compaction.
This PR adds an additional caml_collect_gc_stats_sample_stw
to the major heap
cycling STW. This means that Gc.quick_stat
now actually reflects the state of
the heap after a major cycle or compaction.
(Sadiq Jaffer, review by Miod Vallat and Gabriel Scherer)
#12859: Ensure Gc.compact
does a full major before the compactor runs
(Sadiq Jaffer, review by Leo White, Mark Shinwell, Gabriel Scherer,
Josh Berdine, David Allsopp, and KC Sivaramakrishnan)
#10111: Increase the detail of location information for debugging events to allow the end-line number and character offset to be reported. (David Allsopp, review by Nick Barnes, Enguerrand Decorne and Stephen Dolan)
#10403, #12202: Introduce caml_ext_table_add_noexc
that does not
raise Out_of_memory
exceptions, and use it inside the blocking sections
of caml_read_directory
. Also, check for overflows in EXT table sizes.
(Xavier Leroy, report by Arseniy Alekseyev, review by Gabriel Scherer)
#11332, #12702: Make sure Bool_val(v)
has type bool
in C++
(Xavier Leroy, report by ygrek, review by Gabriel Scherer)
#12772, #12787: Avoid using _Bool
in public headers for the sake of C++
compatibility
(Guillaume Munch-Maccagnoni, report by KC Sivaramakrishnan, review
by Xavier Leroy and KC Sivaramakrishnan)
#12223: Constify constructors and flags tables in C code. Now these tables will go in the read-only segment where they belong. (Antonin Décimo, review by Gabriel Scherer and Xavier Leroy)
#12234: Make instrumented time calculation more thread-safe on macOS. (Anil Madhavapeddy, review by Daniel Bünzli and Xavier Leroy)
#12235, #12468: Introduce and use the CAMLnoret
macro as
a lighter alternative to CAMLnoreturn_start
/ CAMLnoreturn_end
.
Implement it so as to conform with C11, C23, C++11, C++17.
(Xavier Leroy and Dhruv Maroo, with help from Antonin Décimo, review by
Gabriel Scherer and David Allsopp)
#12275: caml/stack.h
: More abstract macros to describe OCaml stacks and
how to traverse them, supporting more stack layouts.
(Xavier Leroy, review by KC Sivaramakrishnan and Fabrice Buoro)
#12268: Deliver Out_of_memory
exception if domain creation fails
due to memory resource exhaustion. Previously, it was always a Failure
.
(Anil Madhavapeddy, review by David Allsopp)
#12300, #12314: Discard out_channel
buffered data on permanent I/O error
(Xavier Leroy, report by Török Edwin, review by Anil Madhavapeddy
and Nicolás Ojeda Bär)
#11386: Simplifications and fixes to Multicore systhreads implementation. (Guillaume Munch-Maccagnoni, review by Anil Madhavapeddy and KC Sivaramakrishnan)
#12875, #12879, #12882: Execute preemptive systhread switching as a delayed pending action. This ensures that one can reason within the FFI that no mutation happens on the same domain when allocating on the OCaml heap from C, consistently with OCaml 4. This also fixes further bugs with the Multicore systhreads implementation. (Guillaume Munch-Maccagnoni, bug reports and suggestion by Mark Shinwell, review by Nick Barnes and Stephen Dolan)
#12408: Domain.spawn
no longer leaks its functional argument for
the whole duration of the children's domain lifetime.
(Guillaume Munch-Maccagnoni, review by Gabriel Scherer)
#12409: Fix unsafety and deadlocks should an asynchronous exception arise at specific locations during domain creation and shutdown. (Guillaume Munch-Maccagnoni, review by Gabriel Scherer)
#11911, #12381: Restore statmemprof
functionality in part, with
some API changes in Gc.Memprof
.
(Nick Barnes, review by Jacques-Henri Jourdan
and Guillaume Munch-Maccagnoni).
#12430: Simplify dynamic bytecode loading in Meta.reify_bytecode
(Stephen Dolan, review by Sébastien Hinderer, Vincent Laviron and Xavier
Leroy)
#12489: Fix an error-handling bug in caml_alloc_sprintf
(Stephen Dolan, report by Chris Casinghino, review by Jeremy Yallop
and Xavier Leroy)
#11307: Finish adapting the implementation of asynchronous actions for Multicore: soundness, liveness, and performance issues. Do not crash if a signal handler is called from an unregistered C thread and other possible soundness issues. Prevent issues where joins on other domains could make the toplevel unresponsive to Ctrl-C. Avoid needless repeated polling in C code when callbacks cannot run immediately. (Guillaume Munch-Maccagnoni, review by Enguerrand Decorne, Xavier Leroy, and KC Sivaramakrishnan)
#12634: Simplify TSan backtrace bookkeeping upon raise (Olivier Nicole and Fabrice Buoro, review by Gabriel Scherer)
CAMLexport
instead of
CAMLprim
, or remove them entirely if no longer used.
(Xavier Leroy, review by David Allsopp)#12700, continuing #11763 and trying to address #12660:
Use the correct types for primitives when generating the table of primitives
used by ocamlrun
.
(Xavier Leroy, motivation, review and improvements by Antonin Décimo)
#12345, #12710: Fix issues with finaliser orphaning at domain termination (KC Sivaramakrishnan, report by Gabriel Scherer, review by Gabriel Scherer, Sadiq Jaffer and Fabrice Buoro)
#12599: Refactor Dynlink startup to avoid parsing bytecode sections twice (Stephen Dolan, review by David Allsopp, Hugo Heuzard, Damien Doligez and Xavier Leroy)
#12678, #12898: Free channel buffers on close rather than on finalisation (Damien Doligez, review by Jan Midtgaard and Gabriel Scherer, report by Jan Midtgaard)
#12681: Fix TSan false positives due to volatile write handling (Olivier Nicole, Fabrice Buoro, and Anmol Sahoo, review by Luc Maranget, Gabriel Scherer, Hernan Ponce de Leon, and Xavier Leroy)
#12743: Use pthread_sigmask
instead of sigprocmask
.
Updates usage of sigprocmask
to pthread_sigmask
in otherlibs/unix
.
(Max Slater, review by Miod Vallat and Xavier Leroy)
#12769: Unify MSVC and MinGW-w64 code paths, by always using WinAPI directly. (David Allsopp, Antonin Décimo, and Samuel Hym, review by Nicolas Ojeda Bar)
#11911, #12382, #12383: Restore statmemprof
functionality in part
(backtrace buffers, per-thread and per-domain data structures,
GC/allocation interface). (Nick Barnes, review by Gabriel Scherer,
Fabrice Buoro, Sadiq Jaffer, Guillaume Munch-Maccagnoni, and
Jacques-Henri Jourdan).
#12735: Store both ends of the stack chain in continuations (Leo White, review by Miod Vallat and KC Sivaramakrishnan)
#12746: Simplify and clean up TSan annotations (Olivier Nicole, review by Miod Vallat and Fabrice Buoro)
#12809: Add ThreadSanitizer support to FreeBSD/AMD64 (Miod Vallat, review by Gabriel Scherer)
#12810: Port ThreadSanitizer support to Linux and macOS on arm64 (Miod Vallat, review by Tim McGilchrist)
#12811: Define and use the CAMLthread_local macro for TLS variables. (Antonin Décimo and Samuel Hym, review by Miod Vallat and Xavier Leroy)
#12814: More detailed failure messages from input_value
and Marshal.from_*
(Xavier Leroy, review by Stephen Dolan and Anil Madhavapeddy)
#12815: Correctly format multiline locations in exception backtraces in the compiler driver's style. (David Allsopp, review by Gabriel Scherer)
#12773, #12830, #12834: Rewrite caml_c_thread_(un)register
to fix
various bugs.
(Guillaume Munch-Maccagnoni, reported by Miod Vallat, suggested by
Hari Hara Naveen S, reviewed by Fabrice Buoro, Gabriel Scherer, and
Miod Vallat)
#12876: Port ThreadSanitizer support to Linux on POWER (Miod Vallat, review by Tim McGilchrist)
#12886: Reinitialise I/O mutexes after fork (Max Slater, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
#12907: Port ThreadSanitizer support to Linux on RiscV (Miod Vallat, review by Nicolás Ojeda Bär and Fabrice Buoro)
#12915: Port ThreadSanitizer support to Linux on s390x (Miod Vallat, review by Tim McGilchrist)
#12934: Fix data races between marking and sweeping functions (Olivier Nicole, suggested by Stephen Dolan, review by Gabriel Scherer, Miod Vallat, and Damien Doligez)
#12295, #12568: Give while true
a polymorphic type, similarly to
assert false
(Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer,
suggestion by Rodolphe Lepigre and John Whitington)
#12044: Add local module open syntax for types.
module A = struct
type t = int
type r = unit
type s = string
end
type example = A.(t * r * s)
(Alistair O'Brien, review by Gabriel Scherer, Nicolás Ojeda Bär, and Florian Angeletti)
#11252, RFC 27: Support raw identifier syntax \#foo
(Stephen Dolan, review by David Allsopp, Gabriel Scherer, and Olivier Nicole)
#12315: Use type annotations from arguments in let rec
(Stephen Dolan, review by Gabriel Scherer)
#12375: Allow use of [@untagged] for all immediate types like char
, bool
,
and variant
with only constant constructors.
(Christophe Raffalli, review by Gabriel Scherer)
\r\n
to
a single \n
character during lexing to guarantee that the semantics
of newlines in string literals are not modified by Windows tools
transforming \n
into \r\n
in source files.
Warning 29 [eol-in-string] is not emitted anymore, as the normalisation
gives more robust semantics to newlines in string literals.
(Gabriel Scherer and Damien Doligez, review by Daniel Bünzli, David
Allsopp, Andreas Rossberg, Xavier Leroy, report by Andreas Rossberg)#11563: Add the Dynarray module to the stdlib
. Dynamic arrays are
arrays whose length can be changed by adding or removing elements at
the end, similar to 'vectors' in C++ or Rust.
(Gabriel Scherer, Simon Cruanes, and Florian Angeletti, review by
Daniel Bünzli, Guillaume Munch-Maccagnoni, Clément Allain,
Damien Doligez, Wiktor Kuchta, and Pieter Goetschalckx)
#12716: Add Format.pp_print_nothing
function.
(Léo Andrès, review by Gabriel Scherer and Nicolás Ojeda Bär)
(Breaking Change) #6732, #12423: Make Buffer.add_substitute
surjective and fix its
documentation.
(Damien Doligez, review by Antonin Décimo)
(Breaking Change) #10775, #12499: Half-precision, floating-point elements in Bigarray. (Anton Yabchinskiy, review by Xavier Leroy and Nicolás Ojeda Bär)
#11517, #12477: Expose pp_infinity
in interface of the format module and
check that margin is less than pp_infinity
when setting or checking geometry.
(Janith Petangoda, reported by Simmo Saan, reviewed by Florian Angeletti,
Simmo Saan, Josh Berdine, and Gabriel Scherer)
#12217: Add Array.shuffle
.
(Daniel Bünzli, review by Nicolás Ojeda Bär, David Allsopp, and Alain Frisch)
#12212: Add cache-aligned constructor for atomics. The patch ensures that all allocations (of the right size) in the shared heap are aligned. (Bartosz Modelski with Gabriel Scherer, Guillaume Munch-Maccagnoni, Xavier Leroy, review by Alain Frisch, Anil Madhavapeddy, Gabriel Scherer, Guillaume Munch-Maccagnoni, KC Sivaramakrishnan, Stefan Muenzel, Xavier Leroy)
#12307: Add BLAKE2b hashing and an MD5 submodule to the Digest module. (Xavier Leroy, review by Olivier Nicole, Gabriel Scherer, Wiktor Kuchta, Daniel Bünzli, David Allsopp)
#12365: Add In_channel.input_bigarray
, In_channel.really_input_bigarray
,
Out_channel.output_bigarray
, Unix.read_bigarray
, Unix.write_bigarray
,
Unix.single_write_bigarray
.
(Nicolás Ojeda Bär, review by Jeremy Yallop, Xavier Leroy, Gabriel Scherer,
David Allsopp)
#12455: Add Array.init_matrix
, Float.Array.make_matrix
,
Float.Array.init_matrix
.
(Glen Mével, review by Xavier Leroy, Gabriel Scherer, Jeremy Yallop,
Nicolas Ojeda Bar)
Array.make_matrix dimx dimy f
now raises Invalid_argument
when dimx = 0 && dimy < 0
. This was already specified but not enforced.
(Glen Mével, report by Jeremy Yallop, review by Nicolas Ojeda Bar)#12459: Add Random.int_in_range
, Random.int32_in_range
,
Random.int64_in_range
, Random.nativeint_in_range
,
and their counterpart in Random.State
.
(Glen Mével and Xavier Leroy, review by Gabriel Scherer, Xavier Leroy,
Florian Angeletti)
#12459: Random
: Restore compatibility between 32-bit integers (JavaScript)
and 63-bit integers (64-bit OCaml).
For Random.full_int
this was guaranteed in 4.14 but wrongly removed in 5.0.
(Xavier Leroy, review by Glen Mével)
#12511: Minor performance improvements and cleanups in the implementation of modules Int32, Int64, and Nativeint (Xavier Leroy, review by Gabriel Scherer and Daniel Bünzli)
#12558: Adapt GC alarms for Multicore and fix their documentation. (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan and Gabriel Scherer)
#12625: Remove the Closure module from Obj (Vincent Laviron, review by Xavier Leroy)
#12758, #12998: Remove the Marshal.Compression
flag to the
Marshal.to_*
functions. The compilers are still able to use
ZSTD compression for compilation artefacts.
This is a forward port and clean-up of the emergency fix that was introduced
in OCaml 5.1.1 by #12734.
(Xavier Leroy, review by Damien Doligez)
#12784: Fix computation of minor-heap allocation in Gc.counters()
and Gc.allocated_bytes()
. (Nick Barnes, review by Gabriel Scherer)
#12770: Add Fun.compose
.
(Justin Frank, review by Nicolás Ojeda Bär, Daniel Bünzli, and Jeremy Yallop)
#12845: Add {In,Out}_channel.is_binary_mode
as the dual of
set_binary_mode
. This function was previously only available in the internal
C API.
(David Allsopp, review by Nicolás Ojeda Bär and Xavier Leroy)
#11239: On x86-64 and RISC-V, reduce alignment of OCaml stacks from 16 to 8. This reduces stack usage. It's only C stacks that require 16-alignment. (Xavier Leroy, review by Gabriel Scherer and Stephen Dolan)
#12311: On POWER, 32-bit FP numbers stored in memory (e.g., in Bigarrays) were not correctly rounded sometimes. (Xavier Leroy, review by Anil Madhavapeddy and Tim McGilchrist)
#12551, #12608, #12782, #12596: Overhaul of recursive value compilation.
Non-function recursive bindings are now forbidden from Lambda onwards,
and they're compiled using a new Value_rec_compiler
module.
(Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer,
Stefan Muenzel and Nathanaëlle Courant)
#1809, #12181: Rewrite compare x y op 0
to x op y
when values are integers
(Xavier Clerc, Stefan Muenzel, review by Gabriel Scherer and Vincent Laviron)
#12825: Disable common subexpression elimination for atomic loads... again. (Gabriel Scherer, review by KC Sivaramakrishnan, Xavier Leroy and Vincent Laviron, report by Vesa Karvonen)
Dynlink
library, improve legibility of error messages
(Samuel Hym, review by Gabriel Scherer and Nicolás Ojeda Bär)Runtime_events
library, C API: define
caml_runtime_events_{start,pause,resume}
as returning void
instead of value
.
(Xavier Leroy, review by David Allsopp)-H
, to allow for transitive dependencies
without including them in the initial environment.
(Chris Casinghino, François Bobot, and Gabriel Scherer, review by Leo White
and Stefan Muenzel, RFC by François Bobot)system:
in
ocamlopt -config
or the Config.system
constant). In particular, s390x and
ppc64 now report "linux" instead of "elf"; all variants of 32-bit ARM on Linux
now report "linux"; OpenBSD now reports "openbsd" instead of "bsd" for 32-bit
ARM; FreeBSD, NetBSD, and OpenBSD now report the same value for both x86_64 and
x86_32; x86_32 systems matching BSD but not FreeBSD, NetBSD*, or OpenBSD*
are no longer identified (as on x86_64); x86_32 Linux now reports "linux"
instead of "linux_elf".
(David Allsopp, request by Kate Deplaix, review by Sébastien Hinderer and
Xavier Leroy)#12247: Configure: --disable-ocamldebug
can now be used instead
of --disable-debugger
(which remains available for compatibility)
(Gabriel Scherer, review by Damien Doligez and Sébastien Hinderer)
#12199: Improve the error message for non-overriding inherit!
(Florian Angeletti, review by Jules Aguillon)
#12210: Uniform style for inline code in compiler messages (Florian Angeletti, review by Gabriel Scherer)
OCAML_FLEXLINK
environment variable from the
compiler drivers. This environment variable was previously used as part of the
FlexDLL bootstrap procedure and existed solely for that purpose. Its removal
greatly simplifies both the build system and testsuite machinery.
(David Allsopp, review by Sébastien Hinderer)#12347: Error messages: always report missing polyvariant tags (Florian Angeletti, report by Tianbo Hao, review by Gabriel Scherer)
#12224: Specialised error message when trying to apply non-functor
module (e.g., module M = Int(Int)
)
(Florian Angeletti, review by Gabriel Scherer)
#12451: Warning 53 (misplaced attributes) now works for all attributes. (Chris Casinghino, review by Florian Angeletti)
#12622: Give hints about existential types appearing in error messages (Leo White, review by Gabriel Scherer and Florian Angeletti)
#12671: When a class type parameter or class parameter does not match, identify which parameter in the error message, instead of saying "A type parameter" or "A parameter." (Stefan Muenzel, review by Gabriel Scherer)
#12679: Add more detail to the error message and manual in case of invalid module type substitutions. (Stefan Muenzel, review by Gabriel Scherer and Florian Angeletti)
#12750: Display the command executed to extract primitives in
ocamlc -verbose
(David Allsopp, review by Nicolás Ojeda Bär)
#12777: Add details about the actual and expected method types to the method mismatch error messages (Javier Chávarri, review by Gabriel Scherer and Florian Angeletti)
#12338: Clarification of the documentation of process related function in the Unix module regarding the first element of arguments and shell's PID (Christophe Raffalli, review by Florian Angeletti)
#12473: Document in runtime/memory.c
our current understanding of
accesses to the OCaml heap from the C runtime code -- the problem
of hybrid programs mixing two memory models
(Gabriel Scherer and Guillaume Munch-Maccagnoni, review by Olivier
Nicole and Xavier Leroy)
#12456: Document the incompatibility between effects, on one
hand, and caml_callback
and asynchronous callbacks (signal
handlers, finalisers, memprof callbacks...), on the other
(Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan)
#12694: Document in runtime/tsan.c
the TSan instrumentation choices and the
consequences with regard to the memory model
(Olivier Nicole, review by Miod Vallat, Gabriel Scherer, Guillaume
Munch-Maccagnoni and Fabrice Buoro)
#12802: Add manual chapter about ThreadSanitizer support (Olivier Nicole, review by Miod Vallat, Sebastien Hinderer, Fabrice Buoro, Gabriel Scherer and KC Sivaramakrishnan)
#12819: Clarify which runtime interactions are allowed in custom ops (Basile Clément, review by Guillaume Munch-Maccagnoni and Xavier Leroy)
#12840: Manual: update runtime tracing chapter for custom events (e.g., #12335) (Lucas Pluvinage, Sadiq Jaffer and Olivier Nicole, review by Gabriel Scherer, David Allsopp, Tim McGilchrist, and Thomas Leonard)
#13066: Update OCAMLRUNPARAM
documentation for the stack size parameter l
(Florian Angeletti, review by Nicolás Ojeda Bär, Tim McGilchrist, and
Miod Vallat)
#13078: Update Format tutorial on structural boxes to mention alignment questions (Edwin Török, review by Florian Angeletti)
#13092: Document the existence of the [@@poll error]
built-in attribute
(Florian Angeletti, review by Gabriel Scherer)
#12340: testsuite
: collect known issues with current -short-paths
implementation for existential types
(Florian Angeletti, Samuel Hym, review by Florian Angeletti and Thomas Refis)
#12147: ocamllex
: allow carriage returns at the end-of-line directives
(SeungCheol Jung, review by Nicolás Ojeda Bär)
#12260: Fix invalid_argument
on some external or module aliases in ocamlnat
(Fabian Hemmer, review by Vincent Laviron)
#12185: New script language for ocamltest
(Damien Doligez with Florian Angeletti, Sébastien Hinderer, Gabriel Scherer,
review by Sébastien Hinderer and Gabriel Scherer)
#12371: ocamltest
: fix recursive expansion of variables
(Antonin Décimo, Damien Doligez, review by Sébastien Hinderer,
Damien Doligez, Gabriel Scherer, and Xavier Leroy)
ocamlc/ocamlopt
fail with an error when no
input files are specified to build an executable
(Antonin Décimo, review by Sébastien Hinderer)#12576: ocamldep
: various refactors
(Antonin Décimo, review by Florian Angeletti, Gabriel Scherer, and Léo Andrès)
#12615: ocamldoc
: get rid of the odoc_literate
and odoc_todo
generators
(Sébaistien Hinderer, review by Gabriel Scherer and Florian Angeletti)
#12624: Use $XDG_CONFIG_DIRS
in addition to $XDG_CONFIG_HOME
when searching
for init.ml
, and use this to extend init.ml
support to the toplevel when
running on Windows.
(David Allsopp, report by Jonah Beckford, review by Nicolás Ojeda Bär and
Antonin Décimo)
#12688: Setting the env
variable NO_COLOR
with an empty value no longer
has effects. Previously, setting NO_COLOR
with any value, including
the empty value, would disable colours (unless OCAML_COLOR
is also set).
After this change, the user must set NO_COLOR
with an non-empty value
to disable colours. This reflects a specification clarification/change
from the upstream website at https://no-color.org.
(Favonia, review by Gabriel Scherer)
#12744: ocamltest
: run tests in recursive subdirs more eagerly
(Nick Roberts, review by Nicolás Ojeda Bär)
#12901, 12908: ocamllex
: add overflow checks to prevent generating incorrect
lexers; use unsigned numbers in the table encoding when possible
(Vincent Laviron, report by Edwin Török, review by Xavier Leroy)
compiler-libs
Changes:#12508 : Add compiler-side support for project-wide occurrences in Merlin by
generating index tables of all identifier occurrences. This extra data in .cmt
files is only added when the new flag -bin-annot-occurrences
is passed.
(Ulysse Gérard, Nathanaëlle Courant, suggestions by Gabriel Scherer and Thomas
Refis, review by Florian Angeletti, Gabriel Scherer, and Thomas Refis)
#12236, #12386, #12391, #12496, #12673: Use syntax as sole determiner of arity. This changes function arity to be based solely on the source program's parsetree. Previously, the heuristic for arity had more subtle heuristics that involved type information about patterns. Function arity is important because it determines when a pattern match's effects run and is an input into the fast path for function application.
This change affects tooling; it changes the function constructs in parsetree and typedtree.
See https://github.com/ocaml/RFCs/pull/32 for the original RFC.
(Nick Roberts; review by Richard Eisenberg, Leo White, and Gabriel Scherer; RFC by Stephen Dolan)
#12639: Parsing: attach a location to the RHS of Ptyp_alias
and improve the 'alias type mismatch' error message.
(Jules Aguillon, review by Florian Angeletti)
#12447: Remove 32-bit targets from X86_proc.system
(Masanori Ogino, review by David Allsopp)
#12216, #12248: Prevent reordering of atomic loads during instruction scheduling. This is for reference, as instruction scheduling is currently unused in OCaml 5. (Xavier Leroy, report by Luc Maranget and KC Sivaramakrishnan, review by Nicolás Ojeda Bär)
#12025: Split Typecore.unify_pat_types
into two
in order to avoid unnecessary references to the environment in type_pat
(Jacques Garrigue and Takafumi Saikawa, review by Gabriel Scherer)
#12031: Use dedicated types to represent names of compilation units and predefined exceptions in CMO files. (Sébastien Hinderer, review by Florian Angeletti, Thomas Refis, Gabriel Scherer, Vincent Laviron, Pierre Chambart, Luke Maurer, Hugo Heuzard, Xavier Leroy, and Damien Doligez)
#12109: Pack parameters to unification in unification_environment
(Takafumi Saikawa and Jacques Garrigue, review by Richard Eisenberg)
#12331, #12361: Pack the unification data for pattern checking in Typecore (Takafumi Saikawa and Jacques Garrigue, review by Gabriel Scherer, Thomas Refis, and Florian Angeletti)
#12229: Remove global mutable state for typechecking patterns in Typecore in favor of local mutable state. (Nick Roberts, review by Takafumi Saikawa)
#12542: Minor bugfix to #12236: restore dropped call to instance
(Nick Roberts, review by Jacques Garrigue)
#12242: Move the computation of stack frame parameters to a separate
Stackframe
module, and save the parameters in the results of the
Linearize
pass.
(Xavier Leroy, review by KC Sivaramakrishnan and Mark Shinwell)
#12442: Document jump summaries in the pattern-matching compiler (Gabriel Scherer and Thomas Refis, review by Florian Angeletti and Vincent Laviron)
#12446, #12792: Remove the hooks machinery around channel locking
in runtime/io.c
(Gabriel Scherer, review by Xavier Leroy)
#12389, #12544, #12984, #12987: Centralise the handling of metadata for compilation units and artifacts in preparation to improve Unicode support for OCaml source files. (Florian Angeletti, review by Vincent Laviron and Gabriel Scherer)
#12532, #12553: Improve readability of the pattern-matching debug output (Gabriel Scherer, review by Thomas Refis)
#12537: Use C11/C++11 standard static assertion (Antonin Décimo, review by Sebastien Hinderer, Xavier Leroy, and KC Sivaramakrishnan)
#12169: Runtime: document and enforce naming conventions around STW sections (Gabriel Scherer, review by Enguerrand Decorne, Miod Vallat, B. Szilvasy and Nick Barnes, report by KC Sivaramakrishnan)
#12669 : Clean up some global state handling in schedgen (Stefan Muenzel, review by Miod Vallat and Gabriel Scherer)
#12640: Make the module separator used in symbol names configurable (Miod Vallat, review by Hugo Heuzard and Xavier Leroy)
#12691 : Clean up Ctype.expand_abbrev_gen
and
rename Env.add_local_type
to add_local_constraint
(Takafumi Saikawa and Jacques Garrigue, review by Florian Angeletti)
#12786 : Clean up the algorithm of Ctype.limited_generalize
(Takafumi Saikawa and Jacques Garrigue, review by Gabriel Scherer)
#10691: Ast_mapper
, Ast_iterator
: add functions directive_argument,
toplevel_directive
, and toplevel_phrase
(Guillaume Petiot, review by Gabriel Scherer and Kate Deplaix)
#12764: Move all installable headers in caml/
subdirectories.
(Antonin Décimo, review by Gabriel Scherer and David Allsopp)
#12914: Slightly change the s390x assembly dialect in order to build with Clang's integrated assembler (Miod Vallat, review by Gabriel Scherer)
#13001: Do not read_back
entire shapes to get aliases' UIDs when building the
usages index
(Ulysse Gérard, review by Gabriel Scherer and Nathanaëlle Courant)
#12198, #12321, #12586, #12616, #12706, #13048: Continue the merge of the sub-Makefiles into the root Makefile started with #11243, #11248, #11268, #11420 and #11675. (Sébastien Hinderer, review by David Allsopp and Florian Angeletti)
#12569, #12570: Remove otherlibraries
as a prerequisite for runtop
;
use runtop-with-otherlibs
to use a library from otherlibs/
(Gabriel Scherer, review by Sébastien Hinderer, suggestion by David Allsopp)
#12652: Make magic numbers easier to bump and duplicate (Sébastien Hinderer, review by Antonin Décimo, David Allsopp and Florian Angeletti)
--with-target-bindir
configure option implemented. This option
refers to the location of the runtime binaries on the target system for a
cross-compiler and is embedded in executables produced by ocamlc
. It does
not affect the bytecode executables installed as part of the build. The old
mechanism make TARGET_BINDIR=..
no longer works.
(David Allsopp, review by Damien Doligez, Xavier Leroy, and Olivier Nicole)clang-cl
,
and fix C compiler feature detection on macOS.
(Antonin Décimo, review by Miod Vallat and Sébastien Hinderer)#10652, #12720: Fix evaluation order in presence of optional arguments (Jacques Garrigue, report by Leo White, review by Vincent Laviron)
#12595, #12597: Fix a race in caml_clear_gc_stats_sample
(Gabriel Scherer, review by B. Szilvasy, report by B. Szilvasy)
#12580: Fix location of alias pattern variables (Chris Casinghino, review Gabriel Scherer, report by Milo Davis)
#12583: Add a closing event for when EV_MAJOR_EPHE_MARK
is complete
(Sudha Parimala, review by Gabriel Scherer)
#12566: caml_output_value_to_malloc
wrongly uses caml_stat_alloc
instead of malloc
since 4.06, breaking (in pooled mode) user code
that uses free
on the result. Symmetrically,
caml_input_value_from_malloc
should use free
.
(Gabriel Scherer, review by Xavier Leroy and Enguerrand Decorne,
report by Ido Yariv)
#12490: Unix: protect the popen_processes
hashtable with a mutex
(Gabriel Scherer, report by Olivier Nicole, review by Xavier Leroy)
#11931: Fix tricky typing bug with type substitutions (Stephen Dolan, review by Leo White and Jacques Garrigue)
#12037, #12171: Fix get_extern_state
potential NULL dereference
(Alexander Skvortsov, report by Török Edwin,
design by Gabriel Scherer, Xavier Leroy)
#12635: Fix get_intern_state
potential NULL dereference
(Antonin Décimo, review by KC Sivaramakrishnan)
#12032, #12059: Bug fixes related to compilation of recursive definitions (Vincent Laviron, report by Victoire Noizet, review by Gabriel Scherer)
ocamlc
to loop.
Fixed by completely removing the call to update_type
in
Typedecl.transl_type_decl
, as the expansion is already checked by
check_regularity
. As a result, recursion is more polymorphic,
which may cause some (essentially wrong) type declarations to have
unbound type variables and some constraints unrelated to the concrete
type to be ignored (see tests/typing-misc/constraints.ml).
(Jacques Garrigue, report by Richard Eisenberg, review by Leo White)#12207, #12222: Make closure computation linear in the number of recursive functions instead of quadratic (Vincent Laviron, report by François Pottier, review by Nathanaëlle Courant and Gabriel Scherer)
#11040, #12591: Fix a data race in major_gc.c
(Gabriel Scherer, review by Guillaume Munch-Maccagnoni
and KC Sivaramakrishnan, report by Sadiq Jaffer)
#12238, #12403, #12698: Read input files in one go to avoid source reprinting issues (Gabriel Scherer, report by Mike Spivey and Vincent Laviron, review by Nicolás Ojeda Bär, Xavier Leroy and Jeremy Yallop)
#12334, #12368: Bad error message with mutually recursive abbreviations (Jacques Garrigue, report by Richard Eisenberg, review by Gabriel Scherer and Richard Eisenberg)
#12401: seek_in
and seek_out
sometimes returned normally when given
negative offsets, instead of failing. Now both functions should consistently
raise Sys_error
in this case.
(Nicolás Ojeda Bär, review by Gabriel Scherer)
#12267: Fix stack alignment computation (Miod Vallat, report by Jan Midtgaard, review by Gabriel Scherer)
#12395, #12404: Fix thread-unsafety in the fallback implementation of
Unix.create_process
(the one used when posix_spawnp
is unavailable)
(Xavier Leroy, report by Chris Vine, review by Nicolás Ojeda Bär)
#12949: Open shadowing mistriggers (Gabriel Scherer, review by Florian Angeletti, report by Andreas Rossberg)
#12526: Honor ocaml.inline always
attribute on functions with
optional arguments and default values in the Closure backend
(Alain Frisch, review by Vincent Laviron)
#12677, #12889: Make Domain.DLS
thread-safe
(Gabriel Scherer, review by Olivier Nicole and Damien Doligez,
report by Vesa Karvonen)
#12561: Fix crash when combining TSan and frame-pointers (Fabrice Buoro and Olivier Nicole, report by Jan Midtgaard, review by Miod Vallat and Gabriel Scherer)
#12482: Rework bounds checking code in the POWER backend (Miod Vallat and Xavier Leroy, report by Jan Midtgaard, review by KC Sivaramakrishnan)
#12528, #12703: Avoid pointer arithmetic overflow in Tag_val
macro
(very likely harmless, but can trigger alarms)
(Xavier Leroy, report by Sam Goldman, review by Guillaume Munch-Maccagnoni)
#12593: TSan should handle Effect.Unhandled
correctly
(Fabrice Buoro and Olivier Nicole, report by Jan Midtgaard and Miod Vallat,
review by Gabriel Scherer)
#12684: Fix locations filename in AST produced by the -pp
option
(Gabriel Scherer, review by Florian Angeletti)
#12714: Check whether macros are defined before using them to ensure
that the headers can always be used in code which turns on -Wundef
(or equivalent).
(Antonin Décimo, review by Miod Vallat, Gabriel Scherer,
Xavier Leroy, and David Allsopp)
#12726: Fix segmentation fault under Windows when executing a bytecode file if
the runtime (ocamlrun.exe
) cannot be found.
(Vadim Zborovskii, Nicolás Ojeda Bär, report by Vadim Zborovskii, review by
David Allsopp)
#12727, #12730: Fix bug with value let-rec
and labelled applications
(Vincent Laviron, review by Gabriel Scherer)
#12755: Fix data race on global pools arrays of pool_freelist
(Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer)
#12796, #12801: Fix memory corruption in caml_unix_alloc_sockaddr
(Thomas Leonard, review by Nicolás Ojeda Bär)
#12737: Fix data races in minor_gc.c
and caml_natdynlink_open
(Olivier Nicole, review by Stefan Muenzel, Miod Vallat, Guillaume
Munch-Maccagnoni, Gabriel Scherer, and Xavier Leroy)
#12831: Fix call to caml_call_realloc_stack
for s390x in PIC mode
(Vincent Laviron, report by Jerry James, review by Miod Vallat)
outcometree.mli
.
(Jacques Garrigue, review by Richard Eisenberg)#12897: Fix locking bugs in Runtime_events
(Gabriel Scherer and Thomas Leonard,
review by Olivier Nicole, Vincent Laviron, and Damien Doligez,
report by Thomas Leonard)
#12851: Fix race between runtime events teardown and event emission (Olivier Nicole, review by Miod Vallat and Gabriel Scherer)
#12860: Fix an assertion that wasn't taking into account the possibility of an ephemeron pointing at static data (Mark Shinwell, review by Gabriel Scherer and KC Sivaramakrishnan)
#12861: Fix a possible crash in the threads
library
(Mark Shinwell, review by Gabriel Scherer and KC Sivaramakrishnan)
#11040, #12894: Silence false data race observed between caml_shared_try_alloc
and oldify. Introduces macros to call TSan annotations which help annotate
a "happens before" relationship.
(Hari Hara Naveen S and Olivier Nicole,
review by Gabriel Scherer and Miod Vallat)
#12958: Fix tail-modulo-cons
compilation of try-with
, &&
, and ||
expressions.
(Gabriel Scherer and Nicolás Ojeda Bär, report by Sylvain Boilard, review by
Gabriel Scherer)
#12919: Fix register corruption in caml_callback2_asm
on s390x.
(Miod Vallat, review by Gabriel Scherer)
#12924, #12930: Rework package constraint checking to improve interaction with immediacy (Chris Casinghino and Florian Angeletti, review by Florian Angeletti and Richard Eisenberg)
#12969: Fix a data race in caml_darken_cont
(Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer and Miod Vallat)
#12971, #12974: Fix an uncaught Ctype.Escape
exception on some
invalid programs forming recursive types.
(Gabriel Scherer, review by Florian Angeletti, report by Neven Villani)
#13019: Remove linking instructions for the Unix library from threads.cma
.
(This was done for threads.cmxa
in OCaml 3.11.) Eliminates warnings from
new LLD when using threads.cma
of duplicated libraries.
(David Allsopp, review by Nicolás Ojeda Bär)
#13058: Add TSan instrumentation to caml_call_gc()
, since it may raise
exceptions.
(Fabrice Buoro, Olivier Nicole, Gabriel Scherer, and Miod Vallat)
#13079: Save and restore frame pointer across Iextcall on ARM64 (Tim McGilchrist, review by KC Sivaramakrishnan and Miod Vallat)
#13094: Fix undefined behavior of left-shifting a negative number (Antonin Décimo, review by Miod Vallat and Nicolás Ojeda Bär)
#13130: Minor fixes to Pprintast for raw identifiers and local module open syntax for types (Chet Murthy, review by Gabriel Scherer)
The release of OCaml 5.2.0 is imminent. As a final step, we are publishing a release candidate to check that everything is in order before the release in the upcoming week(s).
If you find any bugs, please report them on OCaml's issue tracker.
Compared to the second beta, this release contains one small compiler-libs printer fix and one configuration tweak.
The full change log for OCaml 5.2.0 is available on GitHub. A short summary of the changes since the second beta release is also available below.
The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later:
opam update
opam switch create 5.2.0~rc1
The source code for the release candidate is also directly available on:
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update
opam switch create <switch_name> ocaml-variants.5.2.0~rc1+options <option_list>
where <option_list>
is a space-separated list of ocaml-option-*
packages. For instance, for a flambda
and no-flat-float-array
switch:
opam switch create 5.2.0~rc1+flambda+nffa ocaml-variants.5.2.0~rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
The ppxlib team is happy to announce the release of ppxlib.0.32.1.
The main feature of this release is of course the support for the upcoming OCaml 5.2 release. Starting with this version you'll be able to use ppx with the latest compiler.
The feature also comes with a small follow up improvement to the 0.32.0 error reporting changes that simplifies how exception thrown from context free rewriting are handled. The errors will now be inserted where the generated code would have been instead of appended to the whole AST. This should lead to a better error reporting from the compiler as it will now report errors in order of their position in the code.
We'd like to thank the OCaml Software Foundation once again as they funded the vast majority of the work for this release.
Add support for OCaml 5.2
Insert errors from caught located exceptions in place of the code that should have been generated by context-free rules. (#472, @NathanReb)
We've released odoc
2.4.2 with OCaml 5.2 compatibility and a few bug fixes.
We've released OCamlFormat 0.26.2 with compatibility with OCaml 5.2.
We just released version 3.15.2 with some bug fixes.
This one is particularly important for Coq users since it fixes a bug introduced in 3.13.0 that made incremental builds very slow.
If no directory targets are defined, then do not evaluate enabled_if
(#10442, @rgrinberg)
Fix a bug where Coq projects were being rebuilt from scratch each time the dependency graph changed. (#10446, fixes #10149, @alizter)
attempt at monorepo
Last week, we merged an update to the compiler-libs "shape" API for querying definition information from the compiler.
Unfortunately, this small change of API breaks compatibility with at least odoc. Generally, we try to avoid this kind of changes during the beta releases of the compiler. However, after discussions we concluded that it will be easier on the long term to fix the API right now in order to avoid multiplying the number of supported versions of the shape API in the various OCaml developer tools .
We have thus released a second beta version of OCaml 5.2.0 to give the time to developer tools to update their 5.2.0 version ahead of the release (see below for the installation instructions).
Beyond this changes of API, the new beta contains three more bug fixes and three documentation updates, which is a good sign in term of stability.
As usual, you can follow the last remaining compatibility slags on the opam readiness for 5.2.0 meta-issue.
If you find any bugs, please report them on OCaml's issue tracker.
Currently, the release is planned for the beginning of May.
If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.2.0 is available on GitHub.
The base compiler can be installed as an opam switch with the following commands on opam 2.1:
opam update
opam switch create 5.2.0~beta2
The source code for the beta is also available at these addresses:
If you want to tweak the configuration of the compiler, you can switch to the option variant with:
opam update
opam switch create <switch_name> ocaml-variants.5.2.0~beta2+options <option_list>
where option_list
is a space-separated list of ocaml-option-*
packages. For instance, for a flambda
and no-flat-float-array
switch:
opam switch create 5.2.0~beta2+flambda+nffa ocaml-variants.5.2.0~beta2+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
#13058: Add TSan instrumentation to caml_call_gc(), since it may raise exceptions. (Fabrice Buoro, Olivier Nicole, Gabriel Scherer and Miod Vallat)
#13079: Save and restore frame pointer across Iextcall on ARM64 (Tim McGilchrist, review by KC Sivaramakrishnan and Miod Vallat)
#13094: Fix undefined behavior of left-shifting a negative number. (Antonin Décimo, review by Miod Vallat and Nicolás Ojeda Bär)
#13078: update Format tutorial on structural boxes to mention alignment questions. (Edwin Török, review by Florian Angeletti)
#13092: document the existence of the [@@poll error]
built-in attribute
(Florian Angeletti, review by Gabriel Scherer)
#13066, update OCAMLRUNPARAM documentation for the stack size parameter l (Florian Angeletti, review by Nicolás Ojeda Bär, Tim McGilchrist, and Miod Vallat)
This release reverts the change introduce in Mdx 2.4.0 that allows the execution of included OCaml code blocks after users reported issues. We will revisit the feature to ensure it is opt-in and doesn't break users setup.
Feedback on this post is welcomed on Discuss!
We are indescribably thrilled to announce the second beta release of opam 2.2.0.
It contains everything required to be able to make opam-repository compatible with Windows, as well as a whole bunch of fixes. You can view the full list of changes in the release note.
We'll post another blog post very soon with more directions on how to test opam on Windows with this release.
This version is a beta, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release.
This beta introduces a handful of changes necessary to be able to make the default opam-repository support Windows out of the box:
sys-ocaml-system
init default global eval variable"%{var?string-if-true:string-if-false-or-undefined}%"
syntax to
support extending the variables of packages with + in their name
(conf-c++
and conf-g++
already exist) using "%{?pgkname:var:}%"
winsymlinks:native
to the CYGWIN
environment variable when installing
a package on Windows. In particular, this provides a workaround when extracting
ocamlbuild's sources.PATH
as
is necessary not to shadow bash
, tar
, sort
or git
We expect to be able to show the proposed changed to opam-repository very soon to take advantage of all these changes.
The current draft resolution resulting from the discussion in
ocaml/opam-repository#23789
about the scalability of opam-repository includes the removal of some
packages. However currently, opam uses the patch
system command to apply
changes from a repository. The behaviour of that command is thus very
important and it is a known behaviour for the macOS and BSDs patch
command to not be able to delete files which leads to failures and
inconsistencies for opam. Package managers on those platforms installing
opam already make opam depend on GNU patch, however a certain number of
people do not install opam via a system package manager (e.g. our own install script!)
and end up using their system version of patch
. This is in particular
a problem on macOS as the name of the GNU patch command is not gpatch
like
on BSDs but simply patch
when installed via Homebrew.
This issue is surprisingly tricky to fix, and after many trials and errors, we've decided to:
gpatch
by default instead of patch
on NetBSD and DragonFlyBSDgpatch
if it exists and is detected as GNU patch when patch
is not
GNU patchThese changes will make their way to the upcoming opam 2.1.6, in a few weeks.
swhid
regarding release
archive (neither publication tools support) and some concerns were raised
regarding the degree of trust of the hashing method used by Software
Heritage (sha1).opam source --dev
with git sources, clones the whole repository
instead of using --depth=1
getconf DARWIN_USER_TEMP_DIR
) as writable when TMPDIR
is not defined on macOSVarious other general and performance improvements were made and bugs were fixed. API changes are denoted in the release note. This release also includes PRs improving the documentation and improving and extending the tests.
As we've said above we're writing a separate blog post to present how to test this new release of opam on Windows.
Stay tuned!
In case you plan a possible rollback, you may want to first backup your
~/.opam
directory.
The upgrade instructions are unchanged:
Either from binaries: run
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.2.0~beta2"
or download manually from the Github "Releases" page to your PATH.
Or from source, manually: see the instructions in the README.
You should then run:
opam init --reinit -ni
Please report any issues to the bug-tracker.
Thanks for trying this new release out, and we hope you will enjoy the new features!
We're happy to announce that Dune 3.15.0 is now available. This feature has many fixes and new features that you can find in the changelog.
There are a few new features that we would like to specially highlight.
Prior to Dune 3.15 there were a number of limitations where percent forms like
%{env:...}
could be used to expand to useful values. In this release,
@rgrinberg put some effort to relax a lot of these restrictions where possible.
In the new version some of these limitations have been lifted, so for example
{env:...}
can be used in install
stanzas
(#10160).
Likewise there was no consistency where %{cma:...}
or %{cmo:...}
could be
used. With #10169, these forms
should work consistently everywhere.
Similarly the variables allowed in enabled_if
fields have been expanded in
#10250, from just allowing
variables that can be computed from the context to now allowing all variables
as long as expanding these variables does not introduce dependency cycles.
These relaxed rules can also be combined to enable a library depending on
environment variables, e.g. (enabled_if %{env:ENABLE_LIBFOO=false}))
.
Continuing the theme of conditionally enabling or disabling code to be built,
@jchavarri and @rgrinberg's work on
#10220 makes it possible to have
overlapping names between executable
and melange.emit
targets. This can be
useful when a name is to be shared in different contexts (e.g. one context with
native compilation and one emitting code for the browser).
Dune does not assume an encoding of dune files, however when files were formatted the formatter would err on the safe side and escape bytes outside the ASCII range. This means that UTF-8 characters outside of ASCII would get escaped into decimal escape sequences.
This was especially annoying in places where the user would write natural
language texts, which is common when defining Opam packages in dune-project
files. For example a discussion of a paper by Paul Erdős, Peter Frankl, Vojtěch
Rödl would upon reformatting be turned into Paul Erd\197\145s, Peter Frankl,
Vojt\196\155 R\195\182, which does a disservice to these scientists and is
hard to read.
Thanks to the work of @moyodiallo in #9728 starting with Dune 3.15 the original encoding will be preserved, so your package descriptions will be more readable.
Add link flags to to ocamlmklib
for ctypes stubs (#8784, @frejsoya)
Remove some unnecessary limitations in the expansions of percent forms in
install stanza. For example, the %{env:..}
form can be used to select files
to be installed. (#10160, @rgrinberg)
Allow artifact expansion percent forms (%{cma:..}
, %{cmo:..}
, etc.) in
more contexts. Previously, they would be randomly forbidden in some fields.
(#10169, @rgrinberg)
Allow %{inline_tests}
in more contexts (#10191, @rgrinberg)
Remove limitations on percent forms in the (enabled_if ..)
field of
libraries (#10250, @rgrinberg)
Support dialects in dune describe pp
(#10283, @emillon)
Allow defining executables or melange emit stanzas with the same name in the same folder under different contexts. (#10220, @rgrinberg, @jchavarri)
coq: Delay Coq rule setup checks so OCaml-only packages can build in hybrid
Coq/OCaml projects when coqc
is not present. Thanks to @vzaliva for the
test case and report (#9845, fixes #9818, @rgrinberg, @ejgallego)
Fix conditional source selection with select
on bigarray
in OCaml 5
(#10011, @moyodiallo)
melange: fix inconsistency in virtual library implementation. Concrete modules within a virtual library can now refer to its virtual modules too (#10051, fixes #7104, @anmonteiro)
melange: fix a bug that would cause stale import
paths to be emitted when
moving source files within (include_subdirs ..)
(#10286, fixes #9190,
@anmonteiro)
Dune file formatting: output utf8 if input is correctly encoded (#10113, fixes #9728, @moyodiallo)
Fix expanding dependencies and locks specified in the cram stanza. Previously, they would be installed in the context of the cram test, rather than the cram stanza itself (#10165, @rgrinberg)
Fix bug with dune exec --watch
where the working directory would always be
set to the project root rather than the directory where the command was run
(#10262, @gridbugs)
Regression fix: sign executables that are promoted into the source tree (#10263, fixes #9272, @emillon)
Fix crash when decoding dune-package for libraries with (include_subdirs qualified)
(#10269, fixes #10264, @emillon)
--react-to-insignificant-changes
option. (#10083, @rgrinberg)We are happy to announce the release of MDX 2.4.0! This is the first release of MDX to be compatible with OCaml 5.2.
This release also comes with support for executing included OCaml code blocks.
skip
to include
blocks
to revert to the old behavior (#446, @panglesd, @gpetiot)
Warning: this is a breaking change that is reverted in the next release.