Dune 3.20.0_alpha4 was released, with no user-facing changes.
OCaml Changelog
RSSRead the latest releases and updates from the OCaml compiler, OCaml infrastructure and the OCaml Platform Tools.
Dune 3.20.0_alpha3 was released, with no user-facing changes.
Dune 3.20.0_alpha2 was released, with no user-facing changes.
We released Dune 3.20.0_alpha1 as a minor alpha release that adds one new feature and fixes a documentation reference:
- New Feature: Added timeout support for cram tests - you can now specify
(timeout <float>)
in cram stanzas to automatically terminate tests that run too long - Documentation Fix: Corrected a reference in the RPC warning changelog entry
This unstable alpha release builds on alpha0 with minimal changes focused on improving test reliability and documentation accuracy.
Dune 3.20.0~alpha0 is now available with several user-facing improvements and fixes.
Summary of Changes
Testing improvements: Individual tests can now be run using named aliases (@runtest-<name>
), dune runtest
accepts absolute paths and can target specific build contexts, and cram tests have better process cleanup.
New command-line features: dune exec
works concurrently with watch mode, dune promote
runs while watch mode is active, dune describe location
shows executable paths, and --alias
/--alias-rec
flags provide alternatives to @
/@@
syntax.
New variables: Added %{os}
, %{os_version}
, %{os_distribution}
, and %{os_family}
variables matching opam equivalents.
Fixes: dune subst
properly handles version fields in opam files and works when no version control is detected.
Under the hood: Switched from MD5 to BLAKE3 for better performance, improved s-expression formatting, and added smart handling of transitive dependencies based on compiler capabilities.
Installation
opam install dune.3.20.0~alpha0
This is an alpha release for testing. Report issues on GitHub.
See full changelog
Fixed
-
Stop re-running cram tests after promotion when it's not necessary (#11994,
@rgrinberg) -
fix:
$ dune subst
should not fail when adding the version field in opam
files (#11801, fixes #11045, @btjorge) -
Kill all processes in the process group after the main process has
terminated; in particular this avoids background processes in cram tests to
stick around after the test finished (#11841, fixes #11820, @Alizter,
@Leonidas-from-XIV)
Added
-
(tests)
stanzas now generate aliases with the test name. To run
(test (name a))
you can dodune build @runtest-a
. (#11558, grants part of #10239,
@Alizter) -
Inline test libraries now produce aliases
runtest-name_of_lib
allowing users to run specific inline tests asdune build @runtest-name_of_lib
. (#11109, partially fixes #10239, @Alizter) -
feature:
$ dune subst
use version fromdune-project
when no version
control repository has been detected (#11801, @btjorge) -
Allow
dune exec
to run concurrently with another instance of dune in watch
mode (#11840, @gridbugs) -
Introduce
%{os}
,%{os_version}
,%{os_distribution}
, and%{os_family}
percent forms. These have the same values as their opam counterparts.
(#11863, @rgrinberg) -
Introduce option
(implicit_transitive_deps false-if-hidden-includes-supported)
that is equivalent to(implicit_transitive_deps false)
when-H
is
supported by the compiler (OCaml >= 5.2) and equivalent to
(implicit_transitive_deps true)
otherwise. (#11866, fixes #11212, @nojb) -
Add
dune describe location
for printing the path to the executable that
would be run (#11905, @gridbugs) -
dune runtest
can now understand absolute paths as well as run tests in
specific build contexts (#11936, @Alizter). -
Added 'empty' alias which contains no targets. (#11556 #11952 #11955 #11956,
grants #4161, @Alizter and @rgrinberg) -
Allow
dune promote
to properly run while a watch mode server is running
(#12010, @ElectreAAS) -
Add
--alias
and--alias-rec
flags as an alternative to the@
and@@
syntax in the command line (#12043, fixes #5775, @rgrinberg)
Changed
-
Format long lists in s-expressions to fill the line instead of
formatting them in a vertical way (#10892, fixes #10860, @nojb) -
Switch from MD5 to BLAKE3 for digesting targets and rules. BLAKE3 is both more
performant and difficult to break than MD5 (#11735, @rgrinberg, @Alizter) -
Print a warning when
dune build
runs over RPC (#11836, @gridbugs) -
Stop emitting empty module group wrapper
.js
file inmelange.emit
(#11987, fixes #11986, @anmonteiro)
We're happy to announce the release of Utop 2.16.0!
This utop release adds OCaml 5.4 support, restores backtrace functionality, improves preprocessor and Emacs integration, and relocates configuration files to a dedicated utop subdirectory.
See full changelog
- Add support for OCaml 5.4 (#500, @Octachron, @anmonteiro)
- restore backtrace (#503, fixes #501, @ysalmon)
- support camlp$n preprocessor (#486, fixes #485, @aqjune)
- utop configuration and state files (utoprc, utop-history) are now always in the relevant utop subdirectory (#484, fixes #478, #481 and #499, @tuohy).
- fix emacs completion for qualified paths (
Module.M.some\_name
) (#497, fix #455, @juergenhoetzel, @bbatsov) - implicit bindings for emacs mode (#465, fix #412, @bencef)
Feedback on this post is welcomed on Discuss!
We are pleased to announce the release of opam 2.4.1 fixing a regression affecting some uses of pin-depends
, and encourage all users to upgrade.
Please read on for installation and upgrade instructions.
Changes
- Fix
pin-depends
being ignored withopam install --deps-only
(#6610)
This release also extends the tests.
Try it!
The upgrade instructions are unchanged:
- Either from binaries: run
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.4.1"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.4.1"
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.
Happy hacking!
Two months after the release of the first alpha for OCaml 5.4.0, the release of OCaml 5.4.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.4.0 to help you update your softwares and libraries ahead of the release (see below for the installation instructions).
Compared to the first alpha release, this beta release brings two notable changes. First, this beta partially reverts the changes of symbol names in executable (in order to keep current version of perf working with OCaml executable). Second, this beta fixes a significant performance issue on Apple Silicon macOS.
Beyond these two changes, this first beta release contains a dozen of small bug fixes (from the runtime to the error messages) which is usual for the stage of the release. We are expecting the release candidate to follow this beta release soon in the beginning of August.
The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.4.0 meta-issue.
The full release is expected in the middle of August, 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.4.0 is available on GitHub.
Happy hacking, Florian Angeletti for the OCaml team
Installation Instructions
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.4.0~beta1
The source code for the beta is also available at these addresses:
Fine-Tuned Compiler Configuration
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.4.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.4.0~beta1+flambda+nffa ocaml-variants.5.4.0~beta1+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
See full changelog
Code generation fixes
-
(breaking change) #13050, #14104, +#14143: Use '$' instead of '.' to separate module names in symbol names on macOS and Windows (including the Cygwin backend). This changes mangling of OCaml identifiers on those operating systems from
camlModule.name_NNN
tocamlModule$name_NNN
. Additionally it changes the encoding of special characters from$xx
(two hex digits) to$$xx
(two dollar signs followed by two hex digits). (Tim McGilchrist, with contributions from Xavier Leroy, reviewed by Xavier Leroy, Miod Vallat, Gabriel Scherer, Nick Barnes and Hugo Heuzard) -
#14088, #14091: fix non-deterministic code generation in matching.ml (backport of rescript-lang/rescript#7557) (Christiano Calgano, review by Gabriel Scherer and Vincent Laviron)
Performance fix
- #13262, #14074: fix performance issue on Apple Silicon macOS by emitting
stlr
instead ofdmb ishld; str
. (KC Sivaramakrishnan, report by François Pottier, analysis by Frédéric Bour, Xavier Leroy, Miod Vallat, Gabriel Scherer and Stephen Dolan, review by Miod Vallat, Vincent Laviron and Xavier Leroy)
Standard library fix:
- (breaking change) #14124: Do not raise Invalid_argument on negative List.{drop,take}. (Daniel Bünzli, review by Gabriel Scherer, Nicolás Ojeda Bär)
Runtime fix
-
#14057: Don't update memprof too early at the end of a minor GC. (Nick Barnes, review by Damien Doligez).
-
#13586, #14093: Fix closing an out_channel during flush (Stephen Dolan, report by Jan Midtgaard, investigation by Nick Roberts, review by Antonin Décimo and Miod Vallat)
Error message fixes
-
#13956 Fix a regression introduced in #13308 triggering wrong unused warnings. (Ulysse Gérard, review by Florian Angeletti)
-
#14070: also point to label mismatches in error messages for labelled tuples (Florian Angeletti, review by Gabriel Scherer)
-
#14135: Fix a rare internal typechecker error when combining recursive modules, polymorphic fields or methods, and constrained type parameters. (Florian Angeletti, review by Gabriel Scherer)
Compilerlibs fixes
-
#14105: Fix a loop in Pprintast that could result in a hang when printing constructor
(::)
in isolation. (Ulysse Gérard, review by Nicolás Ojeda Bär and Florian Angeletti) -
#14108: toplevel, fix a typo in directive type mismatch (Florian Angeletti, review by Gabriel Scherer)
-
#14101, #14139: define atomic helper types inside caml/misc.h to improve header compatibility with C++ (Florian Angeletti, report by Kate Deplaix, review by Gabriel Scherer)
OCamldoc fix
Feedback on this post is welcomed on Discuss!
We are extremely happy to announce the release of opam 2.4.0 and encourage all users to upgrade. Please read on for installation and upgrade instructions.
Try it!
The upgrade instructions are unchanged:
- Either from binaries: run
For Unix systems
bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.4.0"
or from PowerShell for Windows systems
Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.4.0"
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
Major changes
-
On
opam init
the compiler chosen for the default switch will no longer beocaml-system
(#3509) This was done because the system compiler (as-is your ocaml installed system wide, e.g. /usr/bin/ocaml) is known to be under-tested and prone to a variety of bugs and configuration issues. Removing it from the default compiler allows new-comers a more smooth experience. Note: if you wish to use it anyway, you are always able to do it explicitly usingopam init --compiler=ocaml-system
-
GNU
patch
and thediff
command are no longer runtime dependencies. Instead the OCamlpatch
library is used (#6019, #6052, #3782, ocaml/setup-ocaml#933) Doing this we've removed some rarely used features of GNU Patch such as the support of Context diffs. The new implementation only supports Unified diffs including the git extended headers, however file permission changes via said extended headers have no effect. -
Add Nix support for external dependencies (depexts) by adding support for stateless package managers (#5982). Thanks to @RyanGibb for this contribution
-
Fix
opam install <local_dir>
with and without options like--deps-only
or--show-action
having unexpected behaviours (#6248, #5567) such as:- reporting
Nothing to do
despite dependencies or package not being up-to-date - asking to install the wrong dependencies
- reporting
-
opam switch create [name] <version>
will not include compiler packages flagged withavoid-version
/deprecated
in the generated invariant anymore, unless compiler flaggedavoid-version
/deprecated
are the only ones available (#6494). This will allow opam to avoid the use of theocaml-system
package unless actually explicitly requested by the user. The opam experience when theocaml-system
compiler is used is known to be prone to a variety of bugs and configuration issues. -
opam install --deps-only
no longer requires unicity of package version between the request and the installed packages. In other words, if you havepkg.1
installed, installing the dependencies ofpkg.2
no longer removespkg.1
if the installed packages are compatible. This also allows to install dependencies of conflicting packages when their dependencies are compliant. (#6520)
UI changes
-
opam show
now displays the version number of packages flagged withavoid-version
/deprecated
gray (#6354) -
opam upgrade
: Do not show the message about packages "not up-to-date" when the package is tagged withavoid-version
/deprecated
(#6271) -
Fail when trying to pin a package whose definition could not be found instead of forcing interactive edition (e.g. this could happen when making a typo in the package name of a pin-depends) (#6322)
New commands / options
-
Add
opam admin compare-versions
to compare package versions for sanity checks. Thanks to @mbarbin for this contribution -
Add
opam lock --keep-local
to keep local pins url inpin-depends
field (#4897) -
Add
opam admin migrate-extrafiles
which moves allextra-files
of an existing opam repository intoextra-sources
. Thanks to @hannesm for this contribution -
The
-i
/--ignore-test-doc
argument has been removed fromopam admin check
(#6335)
Other noteworthy changes
-
opam pin
/opam pin list
now displays the current revision of a pinned repository in a new column. Thanks to @desumn for this contribution -
The prebuilt Windows binary now includes Cygwin's
setup-x86_64.exe
in the binary itself as fallback in casecygwin.com
is inaccessible (#6538). Opam will also no longer fail ifcygwin.com
is inaccessible when checking for upgrades ofsetup-x86_64.exe
(#6495, partial fix for #6474) -
Symlinks in repositories are no longer supported (#5892)
-
Fix sandboxing support in NixOS (#6333)
-
Add the
OPAMSOLVERTOLERANCE
environment variable to allow users to fix solver timeouts for good (#3230) -
Fix a regression on
opam upgrade <package>
upgrading unrelated packages (#6373). Thanks to @AltGr for this contribution -
Fix
pin-depends
forwith-*
dependencies when creating a lock file (#5428) -
opam admin check
now setswith-test
andwith-doc
tofalse
instead oftrue
-
Add
apt-rpm
/ALTLinux family support for depexts. Thanks to @RiderALT for this contribution -
Remove handling of the
OPAMSTATS
environment variable (#6485). Thanks to @hannesm for this contribution -
Fix the detection of installed external packages on OpenBSD to not just consider manually installed packages (#6362). Thanks to @semarie for this contribution
-
Disable the detection of available system packages on SUSE-based distributions (#6426)
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:
- the release note for 2.4.0~alpha1
- the release note for 2.4.0~alpha2
- the release note for 2.4.0~beta1
- the release note for 2.4.0~rc1
- the release note for 2.4.0
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.4!
Special thanks to the whole haematology department of the NHS Greater Glasgow for making this release – in the state that it is – possible. Fighting cancer is not easy but it is much more bearable with great people <3
We're excited to announce the release of odoc 3.1.0! This release brings several new features, important improvements, and bug fixes to OCaml's documentation generator.
What's New
OCaml 5.4.0 Compatibility
Full support for OCaml 5.4.0 has been added, ensuring odoc stays current with the latest OCaml releases.
New Output Formats and Options
- Enhanced LaTeX Generator: New command-line arguments
--shorten-beyond-depth
and--remove-functor-arg-link
provide more control over LaTeX output formatting
Key Improvements
Modernized Dependencies
The cmdliner compatibility layer has been removed as it's no longer needed, simplifying the codebase and reducing maintenance overhead.
Updated System Requirements
Support for OCaml versions prior to 4.08 has been dropped, allowing the project to leverage more modern language features and reduce compatibility complexity.
Better Configuration Management
Libraries from packages can now be referenced when added in odoc-config.sexp
, improving flexibility in documentation project setup.
Improved LaTeX Output
- Heading labels now use full paths to improve navigation and reference accuracy
- Page and anchor separation in LaTeX labels prevents naming collisions
Bug Fixes
This release addresses several important issues:
- Fixed META file parsing when dependencies are absent
- Resolved rendering problems on medium screen sizes without global sidebar
- Corrected occurrence generation for documentation CI systems
- Ensured hidden pages never receive links, preventing broken references
Getting Started
To install odoc 3.1.0:
opam install odoc
For existing users, upgrade with:
opam upgrade odoc
Contributors
Special thanks to all contributors who made this release possible: @jonludlam, @Octachron, @davesnx, @dbuenzli, @panglesd, and @lukemaurer.
What's Next
We continue to work on expanding odoc's capabilities and improving documentation generation. The development team remains committed to making OCaml documentation more accessible and comprehensive.
Happy documenting!
See full changelog
### Added
- Exposed sherlodoc libraries for use in other projects (@jonludlam, #1349)
- OCaml 5.4.0 support (@Octachron, #1355)
- New arguments to LaTeX generator, --shorten-beyond-depth and
--remove-functor-arg-link (@Octachron, #1337) - New experimental markdown generator (@davesnx, #1341)
Changed
- Remove cmdliner compatibility layer, no longer needed (@dbuenzli, #1328)
- Drop support for OCaml < 4.08 (@jonludlam, #1300)
- Allow referencing libraries from package added in
odoc-config.sexp
(@panglesd, #1343) - Use full path in heading labels in LaTeX backend (@Octachron, #1332)
- Separate page from anchor in LaTeX labels to prevent collisions (@Octachron,
#1337)
Fixed
- Fix bug in parsing META files when there are no dependencies (@jonludlam, #1352)
- Fix #1335 - incorrect rendering when on medium screen size with no global
sidebar (@lukemaurer, #1361) - Fixed generation of occurrences for docs CI (@jonludlam, #1362)
- Partial fix for #1369 - ensure that we never create a link to a hidden page
(@jonludlam, #1370)
We're happy to announce the release of Ppxlib 0.36.1!
See full changelog
- Fix ppxlib driver's AST to source printer. Our copy of pprintast was not properly updated which resulted in incorrect printing of value bindings' constraints (#585, @NathanReb)
This is the first release candidate of opam 2.4.0.
Binaries and full archive are signed by the opam dev team (fingerprint 92C5 26AE 50DF 3947 0EB2 911B ED4C F1CA 67CB AA92
).
Please see our blog post for a highlight on the major changes and upgrade instructions.
See full changelog
Changes
- Fix
opam switch create <version>
when all compilers of that version are flagged withavoid-version
[#6571 @rjbou - fix #6563] - Opam update performance: No longer copy VCS directories when adding or updating local non-VCS repositories [#6575 @kit-ty-kate - fix #6560]
- Do not remove the generated patch file during updates when debug-mode is on [#6575 @kit-ty-kate]
Release script
- Switch the host of qemu-base-images from gitlab to github [#6510 @kit-ty-kate]
- Speedup the initial clone of qemu-base-images when missing [#6510 @kit-ty-kate]
- Update some of the platforms the prebuilt binaries are built on to Alpine 2.21, FreeBSD 14.3, OpenBSD 7.7 and NetBSD 10.1 [#6510 @kit-ty-kate]
Build changes
- Use coreutils'
sha512sum
instead of perl'sshasum
utility when using./configure --with-cygwin-setup
[#6566 @kit-ty-kate - fix #6557] - Upgrade the download-if-missing dependencies to
dune 3.19.1
,opam-file-format 2.2.0
,spdx_licenses 1.4.0
andpatch 3.0.0
[#6580 @kit-ty-kate]
Testing and documentation
- Improve and extend the testsuite [#6473 #6571 @rjbou @kit-ty-kate]
- Improve and extend the test infrastructure [#6575 @kit-ty-kate]
API updates
opam-format
OpamLocal
:fetch_repo_update
no longer copies vcs directories [#6575 @kit-ty-kate]
opam-core
OpamSystem
: Addcopy_dir_except_vcs
[#6575 @kit-ty-kate]OpamSystem
: Addget_files_except_vcs
[#6575 @kit-ty-kate]
We're pleased to announce the release of OCaml LSP Server 1.23.0!
See full changelog
Features
- Make
inlay-hint
for function parameters configurable (#1515) - Add custom
ocamllsp/jumpToTypedHole
to navigate through typed holes (#1516) - Add a code-action for combining pattern cases (just relaying on regex) (#1514)
- Allow (by configuration) shortening of diagnostics (just highlighting the first line) (#1513)
- Fix
yojson_of_t
forNullable_option
: serializeNone
asNull
instead of asserting false (#1525 fixes #1524)
Fixes
- Support for
class
,class type
,method
andproperty
forDocumentSymbol
query (#1487 fixes #1449) - Fix
inlay-hint
for function parameters (#1515) - More precise diagnostics in the event of a failed identifier search (
Definition_query
) (#1518) - Remove
ocamlformat
application afterdestruct
(that remove some useful parenthesis) (#1519)
Merlin 5.5-503
is now available! This release addresses several long-standing issues with jump-to-definition, occurrences reporting, and inlay hints while adding new utilities for working with typed holes.
Key changes include enhanced locate
functionality that can now disambiguate between files with identical names and contents, fixes to occurrences
that properly report stale files, and corrected inlay hints on function parameters. The outline feature has been expanded to handle class types and locally defined values, with a new selection field that provides the exact location of symbols. Several jump-to-definition issues have been resolved, and the destruct feature no longer hangs when processing patterns with the cons operator (::).
The merlin library now exposes utilities for manipulating typed holes through Merlin_analysis.Typed_hole
, and ocaml-index has improved performance through better granularity in index reading via segmented marshalization. This release also includes fixes for typer assertion failures and cache backtracking issues that were causing crashes in certain scenarios.
See full changelog
- merlin library
- Expose utilities to manipulate typed-holes in
Merlin_analysis.Typed_hole
(#1888) locate
can now disambiguate between files with identical names and contents
(#1882)occurrences
now reports stale files (#1885)inlay-hints
fix inlay hints on function parameters (#1923)- Fix issues with ident validation and Lid comparison for occurrences (#1924)
- Handle class type in outline (#1932)
- Handle locally defined value in outline (#1936)
- Fix a typer issue triggering assertions in the short-paths graph (#1935,
fixes #1913) - Downstreamed a typer fix from 5.3.X that would trigger assertions linked
to scopes bit masks when backtracking the typer cache (#1935) - Add a new selection field to outline results that contains the location of
the symbol itself. (#1942) - Fix destruct hanging when printing patterns with (::). (#1944, fixes
ocaml/ocaml-lsp#1489) - Reproduce and fix a handful of jump-to-definition (locate) issues (#1930,
fixes #1580 and #1588, workaround for #1934)
- Expose utilities to manipulate typed-holes in
- ocaml-index
- Improve the granularity of index reading by segmenting the marshalization
of the involved data-structures. (#1889)
- Improve the granularity of index reading by segmenting the marshalization
- test suite
We're pleased to announce the release of OCaml LSP Server 1.21.0-4.14!
See full changelog
Features
-
Make
inlay-hint
for function parameters configurable (#1515) -
Add custom
ocamllsp/jumpToTypedHole
to navigate through typed holes (#1516) -
Add a code-action for combining pattern cases (just relaying on regex) (#1514)
-
Allow (by configuration) shortening of diagnostics (just highlighting the first line) (#1513)
-
Fix
yojson_of_t
forNullable_option
: serializeNone
asNull
instead of asserting false (#1525 fixes #1524)
Fixes
-
Support for
class
,class type
,method
andproperty
forDocumentSymbol
query (#1487 fixes #1449) -
Fix
inlay-hint
for function parameters (#1515) -
More precise diagnostics in the event of a failed identifier search (
Definition_query
) (#1518) -
Remove
ocamlformat
application afterdestruct
(that remove some useful parenthesis) (#1519) -
Add a new server option
standardHover
, that can be used by clients to
disable the default hover provider. WhenstandardHover = false
textDocument/hover
requests always returns with empty result. (#1416)
We are pleased to announce the release of Merlin 4.19-414
!
See full changelog
- merlin library
- vim plugin
- Added support for search-by-type (#1846)
This is exposed through the existing:MerlinSearch
command, that
switches between search-by-type and polarity search depending on the
first character of the query.
- Added support for search-by-type (#1846)
This is the first beta release of opam 2.4.0.
Binaries and full archive are signed by the opam dev team (fingerprint 92C5 26AE 50DF 3947 0EB2 911B ED4C F1CA 67CB AA92
).
Please see our blog post for a highlight on the major changes and upgrade instructions.
See full changelog
New option/command/subcommand are prefixed with ◈.
Changes
Install of dependencies --deps-only
Behaviour
- ◈ Change the behaviour of
--deps-only
, where it no longer requires unicity of package version between the request and the installed packages. In other words, if you havepkg.1
installed, installing dependencies ofpkg.2
no longer removespkg.1
. This also allows to install dependencies of conflicting packages when their dependencies are compliant. [#6520 @rjbou]
Fixes
Fixed some bugs in opam install --deps-only
(and other commands simulating package pins, such as --depext-only
) more visible in 2.4:
- When a package
pkg
is already installed andopam install ./pkg --deps
is called, if there is a conflict between the installedpkg
dependencies and the definition of the localpkg
, the conflict was not seen and the already installedpkg
was kept [#6530 @rjbou - fix #6529] - No longer fetch and write the sources when simulating packages that were already pinned [#6533 @rjbou - fix #6532]
- opam was triggering the reinstall of the package based on the already pinned packages instead of the expected newly simulated pinned packages [#6522 @rjbou - partial fix #6501]
- opam was using the opam description of the wrong package in some cases [#6544 @kit-ty-kate - fix #6535]
Reinstall
- Fix a regression where the internal
sources
directory was removed unexpectedly on reinstall actions, making opam re-fetch the package [#6550 @rjbou - fix #6551]
Update
Fixed a couple of regressions in opam update
:
- An unexpected stack overflow exception was raised when updating repositories with large files when opam is compiled with OCaml <
5.1
[#6527 @kit-ty-kate - fix #6513] - Updating a repository where a line was added at the end of a file without final newline character was making the update fail [#6527 @kit-ty-kate - fix hannesm/patch#28]
Windows
- Improve the prebuilt Windows binaries by including Cygwin's
setup-x86_64.exe
in the binary itself as fallback, in casecygwin.com
is inaccessible [#6538 @kit-ty-kate]
Build changes
- Bump the downloaded-if-missing
dune
to3.19.0
,cppo
to1.8.0
,ocamlgraph
to2.2.0
,uutf
to1.0.4
andpatch
to3.0.0~beta1
[#6527 @kit-ty-kate] - Allows
./configure --without-dune
to build with OCaml5.4
[#6527 @kit-ty-kate] - Add a
--with-cygwin-setup
option to theconfigure
script, only available on Windows and disabled by default, which includes the optionally givensetup-x86_64.exe
binary inside the opam binary. If the option is given without a filename, the file with be fetched fromcygwin.com
[#6526 @kit-ty-kate @dra27 @rjbou - fix #6498]
Testing and documentation
- Improve and extend the testsuite [#6530 #6533 #6539 #6544 #6550 #6520 @rjbou @kit-ty-kate]
- Improve and extend the test infrastructure [#6524 #6553 #6549 @kit-ty-kate @rjbou]
API updates
opam-client
The Dune Team is happy to announce the release of Dune 3.19.1
.
This patch release contains a fix reverting some regressions on how dune exec
handles processes. It restores the previous behaviour.
See full changelog
Fixed
- Revert changes in
dune exec
behaviour introduced in 3.19.0. (#11879, fixes #11870, #11867 and #11881, @Alizter)
Discuss this post on discuss!
Dune lock directories record the names of any system packages needed to build projects or their dependencies. Currently this information is not portable because Dune only stores the names of system packages within the package repository on the machine where the lock directory is generated. We've recently changed how Dune stores the names of system packages in the Dune Developer Preview so that the names of packages in all known package repositories are stored. This allows a lock directory generated on one machine to be used on a different machine.
Background on depexts
in Opam
A system package, or external dependency, or depext
as I'll refer to them
from now on, is a piece of software which can't be installed by Opam directly,
but which must be installed in order for some Opam package to be built or for
code in an Opam package to be executed at runtime. These packages must be
installed by the system package manager, or by some other non-Opam means such
as manually building and installing the package from source. Common types of
depext
are build tools such as the pkg-config
command, often run to
determine linker flags while building a package, or shared libraries such as
libgtk
, which an OCaml project might link against to create GUIs.
Opam usually installs depexts
automatically. Opam knows how to invoke many
different system package managers (such as apt
or pacman
), so when
installing a package with depexts
Opam can run the commands appropriate to the
current system to install the required packages using the system's package
manager. For this to work, Opam needs to know the name of the package within the
package repository appropriate to the current system, and these names can vary
from system to system. For example the pkg-config
command is in a package
named simply pkg-config
in the apt
package manager on Ubuntu/Debian
systems, whereas in the third-party homebrew
package manager on MacOS it's in
a package named pkgconf
. In order to determine the right package name for the
current system, the package metadata for Opam packages with depexts
contains
a list of all the different known package names along with the conditions under
which that name is correct. Here is that list for the conf-pkg-config
Opam
package:
depexts: [
["pkg-config"] {os-family = "debian" | os-family = "ubuntu"}
["pkgconf"] {os-distribution = "arch"}
["pkgconf-pkg-config"] {os-family = "fedora"}
["pkgconfig"] {os-distribution = "centos" & os-version <= "7"}
["pkgconf-pkg-config"] {os-distribution = "mageia"}
["pkgconfig"] {os-distribution = "rhel" & os-version <= "7"}
["pkgconfig"] {os-distribution = "ol" & os-version <= "7"}
["pkgconf"] {os-distribution = "alpine"}
["pkg-config"] {os-distribution = "nixos"}
["pkgconf"] {os = "macos" & os-distribution = "homebrew"}
["pkgconfig"] {os = "macos" & os-distribution = "macports"}
["pkgconf"] {os = "freebsd"}
["pkgconf-pkg-config"] {os-distribution = "rhel" & os-version >= "8"}
["pkgconf-pkg-config"] {os-distribution = "centos" & os-version >= "8"}
["pkgconf-pkg-config"] {os-distribution = "ol" & os-version >= "8"}
["system:pkgconf"] {os = "win32" & os-distribution = "cygwinports"}
["pkgconf"] {os-distribution = "cygwin"}
]
depexts
in Dune
Dune doesn't install depexts
automatically as the Dune developers are a little
nervous about running commands that would modify the global system state. This
may change at some point, but for now Dune only provides support for listing the
names of depexts
, leaving it up to the user to install them as they see fit.
The dune show depexts
command can be used to list the depexts
of a project.
For that command to work the project must have a lock directory. Here's an
example of listing the depexts
of a project:
$ dune pkg lock
...
$ dune show depexts
libao
libffi
pkgconf
sdl2
I ran these commands on a Mac with homebrew installed, so the package names are
from the homebrew package repo. Each package listed there is one of the
depexts
of a package whose lockfile appears in the project's lock directory.
Let's look at how this information is stored. Using pkg-config
as an example:
$ cat dune.lock/conf-pkg-config.pkg
(version 4)
(build
(run pkgconf --version))
(depexts pkgconf)
The relevant part for us is the depexts
field. The current released version of
Dune only stores the package's depexts
for the system where dune pkg lock
was run. The command dune show depexts
simply concatenates the depexts
fields from each lockfile in the lock directory.
When thinking about portable lock directories I always like to imagine what the
experience would be using Dune for a project where the lock directory is checked
into version control. I frequently switch between using two different machines
for development - one running Linux and the other running MacOS. If I was to
check in the lock directory I just generated on my Mac, and then check it out on
Linux and continue development, dune show depexts
would show me a list of
packages for the wrong system!
Portable depexts
in Dune
To make depexts
portable, one's first instinct might be to use the same
approach as taken with the depends
field outlined in a previous
post,
listing the depexts
for each platform for which the solver was run. Indeed
such a change was added to the Dune Developer Preview when we first introduced
portable lock directories, however we quickly realized a problem.
The depends
, build
, and install
fields of a package rarely vary between OS
distribution. It's reasonably common for those fields to be different on
different OSes, but very rare for them to also be different on different OS
distributions. As such, it's expected that users will elect to solve their
projects for each common OS, but there would be little value in solving projects
for each OS distro. In fact solving for multiple distros would slow down solving
and bloat the lock directory, and users would somehow need to come up with a
definitive list of distros to solve for.
But the depexts
field is highly-dependent on the OS distro since package
names are specific to the package repository for a particular distro. Recall
that the depexts
field in Opam package metadata lists package names along with
the conditions under which that package name should be used, e.g.:
["pkg-config"] {os-family = "debian" | os-family = "ubuntu"}
["pkgconf"] {os-distribution = "arch"}
["pkgconf-pkg-config"] {os-family = "fedora"}
["pkgconfig"] {os-distribution = "centos" & os-version <= "7"}
These conditions almost always involve the name of the OS distro, and to make
matters worse they also sometimes involve the OS version, as packages can
change their names between different versions of the same OS. Evaluating these
conditions at solve time for platforms with no distro or version specified
tends to result in lockfiles with no depexts
at all, since all the
conditions evaluate to false
.
The use case we have in mind for depexts
in Dune is that a user will solve
their project coarsely, usually just for each common OS with no consideration
for distribution or version. Then when they run dune show depexts
, the
depexts
will be listed using names appropriate to the current machine. This
means Dune needs to store enough metadata about depexts
to compute
system-specific depext
names at a later time. This means storing the same
names and conditions as are currently stored in Opam files, and deferring
evaluation of the conditions until as late as possible, such as right when
dune show depexts
is run.
The latest version of the Dune Developer Preview does just this; translating the
depexts
field from each package's Opam file into a Dune-friendly S-expression.
After this change, the depexts
field of conf-pkg-config
's lockfile is:
$ cat dune.lock/conf-pkg-config.4.pkg
...
(depexts
((pkg-config)
(or_absorb_undefined_var
(= %{os_family} debian)
(= %{os_family} ubuntu)))
((pkgconf)
(= %{os_distribution} arch))
((pkgconf-pkg-config)
(= %{os_family} fedora))
((pkgconfig)
(and_absorb_undefined_var
(= %{os_distribution} centos)
(<= %{os_version} 7)))
((pkgconf-pkg-config)
(= %{os_distribution} mageia))
((pkgconfig)
(and_absorb_undefined_var
(= %{os_distribution} rhel)
(<= %{os_version} 7)))
((pkgconfig)
(and_absorb_undefined_var
(= %{os_distribution} ol)
(<= %{os_version} 7)))
((pkgconf)
(= %{os_distribution} alpine))
((pkg-config)
(= %{os_distribution} nixos))
((pkgconf)
(and_absorb_undefined_var
(= %{os} macos)
(= %{os_distribution} homebrew)))
((pkgconfig)
(and_absorb_undefined_var
(= %{os} macos)
(= %{os_distribution} macports)))
((pkgconf)
(= %{os} freebsd))
((pkgconf-pkg-config)
(and_absorb_undefined_var
(= %{os_distribution} rhel)
(>= %{os_version} 8)))
((pkgconf-pkg-config)
(and_absorb_undefined_var
(= %{os_distribution} centos)
(>= %{os_version} 8)))
((pkgconf-pkg-config)
(and_absorb_undefined_var
(= %{os_distribution} ol)
(>= %{os_version} 8)))
((system:pkgconf)
(and_absorb_undefined_var
(= %{os} win32)
(= %{os_distribution} cygwinports)))
((pkgconf)
(= %{os_distribution} cygwin)))
That's a 1:1 translation of the depexts
field from conf-pkg-config
's Opam
file. There's enough information there so that the appropriate package name can
be computed on demand rather than just at solve time.
This bring us a step closer to a world where Dune users can check their lock directories into version control with confidence that their builds are reproducible across different platforms. To try out the latest version of the Dune Developer Preview, go to preview.dune.build.
The Dune Team is happy to announce the release of Dune 3.19.0
.
This release contains some important fixes along with some improvements for the
foreign_library
stanza. It introduces support for concurrent builds through
the RPC server.
See full changelog
Fixed
-
Fixed a bug that was causing cram tests attached to multiple aliases to be run multiple times. (#11547, @Alizter)
-
Fix: pass pkg-config (extra) args in all pkgconfig invocations. A missing --personality flag would result in pkgconf not finding libraries in some contexts. (#11619, @MisterDA)
-
Fix: Evaluate
enabled_if
when computing the stubs for stanzas such asforeign_library
(#11707, @Alizter, @rgrinberg) -
Fix $ dune describe pp for libraries in the presence of
(include_subdirs unqualified)
(#11729, fixes #10999, @rgrinberg) -
Fix
$ dune subst
in sub directories of a git repository (#11760, fixes #11045, @Richard-Degenne) -
Fix a crash involving
Path.drop_prefix
when using Melange on Windows (#11767, @nojb)
Added
-
Added detection and warning for common typos in package dependency constraints (#11600, fixes #11575, @kemsguy7)
-
Added
(extra_objects)
field to(foreign_library)
stanza with(:include)
support. (#11683, @Alizter)
Changed
-
Allow build RPC messages to be handled by dune's RPC server in eager watch mode (#11622, @gridbugs)
-
Allow concurrent build with RPC server (#11712, @gridbugs)
Four months after the release of OCaml 5.3.0, the set of new features for the future version 5.4.0 of OCaml has been frozen. We are thus happy to announce the first alpha release for OCaml 5.4.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).
The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.4.0 meta-issue.
The full release is expected around the end of July.
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, you can have a look at the changelog for OCaml 5.4.0.
Happy hacking, Florian Angeletti for the OCaml team
Installation Instructions
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.4.0~alpha1
The source code for the alpha is also available at these addresses:
Fine-Tuned Compiler Configuration
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.4.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.4.0~alpha1+flambda+nffa ocaml-variants.5.4.0~alpha1+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
Dune 3.19.0~alpha0 is now available. This alpha release includes several bug fixes and new features for OCaml developers.
Bug Fixes
This release addresses several issues that affected build reliability and functionality:
- Cram tests: Fixed duplicate execution of cram tests attached to multiple aliases
- pkg-config integration: Resolved missing
--personality
flag in pkgconfig invocations that prevented library detection in certain contexts - Foreign libraries: Fixed evaluation of
enabled_if
conditions when computing stubs forforeign_library
stanzas - Preprocessing: Corrected
dune describe pp
behavior for libraries using(include_subdirs unqualified)
- Git integration: Fixed
dune subst
functionality in subdirectories of git repositories - Windows compatibility: Resolved crash in
Path.drop_prefix
when using Melange on Windows
New Features
- Dependency validation: Added automatic detection and warnings for common typos in package dependency constraints
- Foreign library support: Added
(extra_objects)
field to(foreign_library)
stanza with(:include)
support
Improvements
- RPC server: Enhanced RPC server to handle build messages in eager watch mode and support concurrent builds
Installation
Install via opam:
opam install dune.3.19.0~alpha0
As this is an alpha release, please test thoroughly before using in production environments. Bug reports and feedback are welcome on the Dune issue tracker.
For the complete list of changes with pull request references, see the release notes.
See full changelog
Fixed
-
Fixed a bug that was causing cram tests attached to multiple aliases to be run multiple
times. (#11547, @Alizter) -
Fix: pass pkg-config (extra) args in all pkgconfig invocations. A missing --personality
flag would result in pkgconf not finding libraries in some contexts. (#11619, @MisterDA) -
Fix: Evaluate
enabled_if
when computing the stubs for stanzas such as
foreign_library
(#11707, @Alizter, @rgrinberg) -
Fix $ dune describe pp for libraries in the presence of
(include_subdirs unqualified)
(#11729, fixes #10999, @rgrinberg) -
Fix
$ dune subst
in sub directories of a git repository (#11760, fixes
#11045, @Richard-Degenne) -
Fix a crash involving
Path.drop_prefix
when using Melange on Windows
(#11767, @nojb)
Added
-
Added detection and warning for common typos in package dependency
constraints (#11600, fixes #11575, @kemsguy7) -
Added
(extra_objects)
field to(foreign_library)
stanza with(:include)
support.
(#11683, @Alizter)
Changed
Discuss this post on Discuss!
We've recently made a change to how lock directories work in the Dune Developer Preview.
Previously when Dune would solve dependencies for a project and generate a lock directory, the lock directory would be specialized for the computer where it was generated, with no guarantee it would work on a different computer. This posed a problem for checking lock directories into version control for projects with multiple developers, since one developer might lock the project on their Mac, say, only for another developer on Linux to be unable to build it due to its MacOS-specific lock directory.
This post is to announce that Dune now supports generating portable lock directories; a lock directory generated on one computer will now contain a dependency solution for a range of different computers, making it safe to check lock directories into version control.
Technical Details
In Opam the dependencies of a package can be different depending on properties of the computer where the package is being installed. A package might have a different set of dependencies when being installed on MacOS verses Linux versus Windows, or the dependencies might vary depending on the CPU architecture. It's even possible (though quite rare in practice) for the dependencies of a package to vary between operating system distributions, or even operating system versions.
This expressive power makes Opam very flexible as it allows packages to be
specialized for the environment where they will be installed. The drawback of
this approach is that there might not be a single solution to a dependency
problem that works everywhere. Each combination of
OS/architecture/distro/version could, in theory, require a different dependency
solution. There are way too many combinations of those properties to run Dune's
dependency solver once for each combination in a reasonable amount of time.
Instead we elected to compromise and have Dune only generate a solution for
common platforms by default, while allowing users to specify a custom list of
platforms to solve for in their dune-workspace
file.
Lockfiles now look a little different to account for the fact that they now
contain multiple different platform-specific dependency solutions. For example,
formerly, the lockfile for the ocaml-compiler
package on an x86 machine running
Windows, you might have had a depends
field like:
(depends arch-x86_64 system-mingw mingw-w64-shims flexdll)
Most of these dependencies are specific to Windows; it's unlikely that you'll be able to install any of these dependencies on Linux or MacOS.
With the portable lock directories feature enabled, this field now might look like:
(depends
(choice
((((arch x86_64)
(os linux))
((arch arm64)
(os linux))
((arch x86_64)
(os macos)
(os-distribution homebrew)
(os-family homebrew))
((arch arm64)
(os macos)
(os-distribution homebrew)
(os-family homebrew)))
())
((((arch x86_64)
(os win32)
(os-distribution cygwin)
(os-family windows)))
(arch-x86_64 system-mingw mingw-w64-shims flexdll))
((((arch arm64)
(os win32)
(os-distribution cygwin)
(os-family windows)))
(system-mingw mingw-w64-shims flexdll))))
This new syntax is similar to a match-statement, listing the dependencies for
each platform for which Dune's solver ran. You can change the platforms Dune
will solve for by adding something like this to dune-workspace
:
(lock_dir
(solve_for_platforms
((arch arm64)
(os openbsd))
((arch x86_32)
(os win32))))
After running dune pkg lock
again, the lockfile for ocaml-compiler
will be
updated with these dependencies:
(depends
(choice
((((arch arm64) (os openbsd))) ())
((((arch x86_32)
(os win32)))
(system-mingw ocaml-option-bytecode-only flexdll))))
A few other fields of lockfiles now also use the new syntax. Dune lockfiles contain the commands needed to build and install each package, as well as the names of any system packages needed by the Opam package, and each of these fields can also have platform-specific values.
Lockfile names now include the version number of the package. The
ocaml-compiler
package used to have a lockfile named ocaml-compiler.pkg
but
now has a name like ocaml-compiler.5.3.0.pkg
instead. This is because it's
possible that different platforms may require different versions of the same
package in the dependency solution, so the lock directory needs to be able to
contain multiple lockfiles for the same package without them colliding on
filename.
How do I get it?
This feature is live in the latest version of the Dune Developer
Preview. Follow the instructions on that page to
install a version of Dune with this feature. With portable lock directories
enabled, Dune will temporarily remain backwards compatible with the original
lock directory format, though support will likely be dropped at some point.
Generate a new lock directory by running dune pkg lock
. You'll know your lock
directory is portable if each file inside it has a version number in its
filename.
Happy reproducible building!
This is the second alpha release of opam 2.4.0.
Binaries and full archive are signed by the opam dev team (fingerprint 92C5 26AE 50DF 3947 0EB2 911B ED4C F1CA 67CB AA92
).
Please see our blog post for a highlight on the major changes and upgrade instructions.
See full changelog
Changes
- Do not include compiler packages flagged with
avoid-version
/deprecated
in the generated invariant when callingopam switch create [name] <version>
[#6494 @kit-ty-kate] - Cygwin: Fallback to the existing
setup-x86_64.exe
if its upgrade failed to be fetched [#6482 @kit-ty-kate - fix #6495, partial fix #6474] - Fix a memory leak happening when running large numbers of commands or opening large number of opam files [#6485 @hannesm - fix #6484]
- Remove handling of the
OPAMSTATS
environment variable [#6485 @hannesm]
Regression fixes from 2.4.0~alpha1
- Fix a crash when updating a repository that is deleting or adding empty files [#6490 @kit-ty-kate]
- Fix an extreme performance issue (takes several hours) when applying a large repository update [#6490 @kit-ty-kate]
- Fix a crash when updating a git repository that moved a file to a new directory [#6490 @kit-ty-kate]
Build changes
- Update the requirement for the
patch
library to3.0.0~alpha2
[#6490 @kit-ty-kate] - Upgrade the downloaded-if-missing
patch
library to3.0.0~alpha2
[#6490 @kit-ty-kate]
Testing and documentation
- Improve and extend the testsuite [#6490 #6494 @rjbou @kit-ty-kate]
- Improve and extend the test infrastructure [#6277 @rjbou @kit-ty-kate]
API updates
opam-core
OpamArg.environment_variable
: makeSTATS
as removed from cli 2.3 [#6485 @rjbou]OpamClientConfig
: removeSTATS
variant and relatedprint_stats
field in config record [#6485 @hannesm]
opam-format
opam-core
OpamSystem
: removeprint_stats
function [#6485 @hannesm]OpamSystem
: add thermdir_cleanup
function [#6490 @kit-ty-kate]OpamSystem.dir_is_empty
: Speedup and change its type to handle unreachable directories better [#6490 @kit-ty-kate]OpamSystem.internal_patch
: remove parent directories when all of their content has been moved somewhere else [#6490 @kit-ty-kate]OpamSystem.internal_patch
: fix moving files to new directories when receiving a git diff [#6490 @kit-ty-kate]
The Dune Team is happy to announce the release of Dune 3.18.2
.
This release contains a bug fix to fix a compatibility issue with ocaml.5.4.0
.
See full changelog
Fixed
- fix compatibility with
ocaml.5.4.0
by avoiding shadowing sigwinch (@nojb, #11639)
We're happy to announce the release of opam-publish
2.5.1!
See full changelog
- Upgrade to opam 2.4.0 and OCaml 4.08 [#169 @kit-ty-kate]
This is the first alpha release of opam 2.4.0.
Binaries and full archive are signed by the opam dev team (fingerprint 92C5 26AE 50DF 3947 0EB2 911B ED4C F1CA 67CB AA92
).
Please see our blog post for a highlight on the major changes and upgrade instructions.
See full changelog
Possibly scripts breaking changes are prefixed with ✘.
New option/command/subcommand are prefixed with ◈.
Major changes
Init
- Remove
ocaml-system
from the list of default compilers chosen atopam init
time [#6307 @kit-ty-kate - fix #3509]
Patch: update & install
- Patches are now applied using the
patch
OCaml library instead of GNU Patch [#5892 @kit-ty-kate - fix #6019 #6052 #3782 ocaml/setup-ocaml#933]- Context diffs are not supported anymore, only Unified diffs are (including its git extensions)
- Stop support of file permission changes via git extension to the unified diff specification
- GNU
patch
and thediff
command are no longer runtime dependencies
Depexts
- Support providing external dependencies with Nix by adding support for stateless depexts systems [#5982 @RyanGibb @rjbou @kit-ty-kate - fix #5124]
Show
opam show
now displays the version number of packages flagged withavoid-version
/deprecated
gray [#6358 @kit-ty-kate - fix #6354]
Install
- Fix
opam install <local_dir>
not updating or storing pinned packages' metadata [#6209 @kit-ty-kate - fix #5567] - Fix
opam install --deps-only/--show-action <local_dir>
not updating (without storing) pinned packages' metadata [#6209 @kit-ty-kate - fix #5567]
Pin
- ✘ Fail when trying to pin a package whose definition could not be found instead of forcing interactive edition (e.g. this could happen when making a typo in the package name of a pin-depends) [#6319 @kit-ty-kate - fix #6322]
- ◈
opam pin
/opam pin list
now displays the current revision of a pinned repository in a new column [#6274 @desumn - fix #5533]
Admin
- ◈ Add
opam admin compare-versions
to compare package versions for sanity checks [#6197 @mbarbin] - ◈ Add
opam admin migrate-extrafiles
which moves allextra-files
of an existing opam repository intoextra-sources
[#5960 @hannesm @rjbou @kit-ty-kate] - ✘ The
-i
/--ignore-test-doc
argument has been removed fromopam admin check
[#6335 @kit-ty-kate] - ✘
opam admin check
now setswith-test
andwith-doc
tofalse
instead oftrue
[#6335 @kit-ty-kate]
Miscellaneous changes
Global CLI
Install
- Remove the build directories of pinned packages after successful builds [#6436 @kit-ty-kate]
UI
- Improve the messages when a package is not up-to-date on opam upgrade [#6272 @kit-ty-kate - fix #6270]
- Use a non-underline uppercase character to denote the default when asking a question [#6289 @hannesm @kit-ty-kate - fix #6288]
- Do not pre-write the answer to questions with the default anwser [#6376 @kit-ty-kate]
- Display Windows
NTSTATUS
exit codes in hex [#6401 @dra27 @MisterDA]
Switch
- Fix
opam switch remove <dir>
failure when it is a linked switch [#6276 @btjorge - fix #6275] - Fix
opam switch list-available
when given several arguments [#6318 @kit-ty-kate] - Correctly handle
pkg.version
pattern inopam switch list-available
[#6186 @arozovyk - fix #6152]
Upgrade
- Do not show the not-up-to-date message with packages tagged with
avoid-version
/deprecated
[#6273 @kit-ty-kate - fix #6271] - Fix a regression on
opam upgrade <package>
upgrading unrelated packages [#6373 @AltGr] - Fix a regression on
opam upgrade --all <uninstalled-pkg>
not upgrading the whole switch [#6373 @kit-ty-kate]
Source
Lint
- ◈ Add W74 to
opam lint
to detectpin-depends
packages that are neither present in thedepends
nodepopts
field [#6317 @rjbou - fix #5795] - ◈ Add E63 to
opam lint
to check for availability guard in case an opam file contains asubpath
field [#6438 @rjbou @kit-ty-kate]
Lock
- Fix
pin-depends
forwith-*
dependencies when creating a lock file [#5471 @rjbou - fix #5428] - ◈ Add
opam lock --keep-local
to keep local pins url inpin-depends
field [#6411 @rjbou - fix #4897]
Env
- Add the
OPAMSOLVERTOLERANCE
environment variable to allow users to fix solver timeouts for good [#5510 @kit-ty-kate - fix #3230] - Don't write empty environment update segments to
variables.sh
(FOO += ""
no longer addsFOO='':"$FOO"; export FOO;
) [#6198 @dra27]
Sandbox
- Respect the
DUNE_CACHE_ROOT
environment variable if it exists [#6326 @smorimoto] - Fix sandboxing support in NixOS [#6333 @kit-ty-kate]
Software Heritage
- Rework Software heritage fallback to have a more correct archive retrieval and more fine grained error handling [#6036 @rjbou - fix #5721]
- Fix Software Heritage liveness check [#6036 @rjbou - fix #5721]
- Update the Software Heritage API requests [#6036 @rjbou]
- Remove
wget
support for Software Heritage fallback [#6036 @rjbou - fix #5721]
Repository
- Fix
curl
download command selection when loaded from global config file [#6302 @rjbou] - Check that the repositories given to
opam repository remove
actually exist [#5014 @kit-ty-kate - fixes #5012] - ✘ Symlinks in repositories are no longer supported [#5892 @kit-ty-kate]
- Fix
subpath
handling in opam files defining a local archive [#6439 @rjbou]
Init
- Fix the detection of
ZDOTDIR
when usingzsh
[#6299 @acasta-yhliu - fix #6281]
External dependencies (depexts)
- ◈ Add
apt-rpm
/ALTLinux family support for depexts [#6207 @RiderALT] - Fix the detection of installed external packages on OpenBSD to not just consider manually installed packages [#6362 @semarie]
- Speedup the detection of available system packages with
pacman
andbrew
[#6324 @kit-ty-kate] - Change probing tool for SUSE-based distributions from
zypper
torpm
[#6464 @kit-ty-kate] - Disable the detection of available system packages on SUSE-based distributions [#6464 @kit-ty-kate]
- Add support for stateless depexts systems, by keeping synchronised already installed systems dependencies with switch state [#5982 @RyanGibb @rjbou @kit-ty-kate]
Pin
- Don't ask confirmation when pinning an unknown package (absent from repositories) [#6309 @kit-ty-kate @rjbou - fix #3199]
- Do not ask to install
pin-depends
twice [#6375 @kit-ty-kate - fix #6374] - Ensure the right version (the pinned one) of packages are used when simulating pinning [#6256 @rjbou @kit-ty-kate - fix #6248 #6379]
- No longer double pin of packages located in ./opam/opam [#6343 @kit-ty-kate - fix #6342]
Build changes
- Simplify the making of stripped binaries by introducing the
make opam-stripped
target [#6208 @kit-ty-kate] - Fix compilation on macOS with OCaml 5.3 by bumping the downloaded-if-missing
mccs
to 1.1+19 [#6192 @kit-ty-kate] - Upgrade the downloaded-if-missing
opam-file-format
to 2.2.0~alpha1,spdx_licenses
to 1.3.0 anddune
to 3.16.1 [#6321 #6370 #6192 @kit-ty-kate - fix #6369] menhir
is now part of the transitive dependency of opam (viaopam-file-format
) [#6321 @kit-ty-kate]
Admin
- Fix
opam admin check
in the presence of thewith-dev-setup
variable [#6331 @kit-ty-kate - fix #6329]
Download
- Add
fetch
on DragonFlyBSD andftp
on NetBSD to the list of download tools to use, if available [#6304 #6305 @kit-ty-kate] - Prefer
curl
over any other download tools on every systems, if available [#6305 @kit-ty-kate] - Avoid issues when using
wget2
as download-tool where the requested url might return an HTML page instead of the expected content [#6303 @kit-ty-kate]
Internal
- Allow running some opam commands on machines with limited amount of memory by running
Gc.compact
while the main process is waiting for the children processes [#5396 @kkeundotnet] - Use a C stub to call the
uname
function from the C standard library instead of calling theuname
POSIX command [#6217 @kit-ty-kate] - Only download Cygwin's
setup.exe
when the command is actually going to be displayed or used [#6467 @kit-ty-kate]
Testing and documentation
- Improve and extend the tests [#5892 #6276 #6331 #6343 #6378 #6273 #6380 #6373 #6307 #6256 #6412 #6438 #6439 #6436 #6166 #6209 #6198 #6319 #6467 #5643 #5982 @rjbou @kit-ty-kate @btjorge]
- Improve and extend the benchmarks [#6212 #6443 @kit-ty-kate]
- Improve and extend the test infrastructure [#5349 #6296 #6274 #6313 #6363 #6192 #5663 #6383 #6444 #6447 #6471 #6469 #5982 @kit-ty-kate @rjbou @RyanGibb]
- Improve and extend the documentation [#6226 #6231 #6252 #6150 #6267 #6251 #6306 #6315 #5659 #6320 #6338 #6361 #6358 #5627 #6372 #6470 @kit-ty-kate @rjbou @RyanGibb @gridbugs @fccm2 @shym @hannesm @tobil4sk @juergenhoetzel @MisterDA]
API updates
opam-client
OpamAction.prepare_package_build
: now returnsexn option
instead ofexn option OpamProcess.job
and no longer calls the system GNU Patch [#5892 @kit-ty-kate]OpamArg.InvalidCLI
: export exception [#6150 @rjbou]OpamArg.hash_kinds
: was added [#5960 @kit-ty-kate]OpamArg
: exportrequire_checksums
andno_checksums
, that are shared withbuild_options
[#5563 @rjbou]OpamAuxCommands.{simulate_autopin,autopin ~simulate:true}
: now updates thereinstall
field of the returnedswitch_state
if necessary [#6209 @kit-ty-kate]OpamLockCommand.lock_opam
: add~keep_local
argument to add local pins to pin-depends (and not resolve them) [#6411 @rjbou]OpamLockCommand.lock_opam
: make the?only_direct
argument non-optional [#6411 @kit-ty-kate]OpamRepositoryCommand.switch_repos
: expose the function [#5014 @kit-ty-kate]OpamSolution.install_depexts
: instead of the package set of new package to install, now takes 2 labelled argumentspkg_to_install
andpkg_installed
to be able to keep synchronised stateless depext systems [#5982 @rjbou @RyanGibb @kit-ty-kate]OpamSolution.install_sys_packages
: no longer takes set of package to install butOpamSysPkg.to_install
[#5982 @rjbou @RyanGibb @kit-ty-kate]OpamSolution.print_depext_msg
: takes now anOpamSysPkg.status
instead of sets [#5982 @kit-ty-kate @RyanGibb]
opam-repository
OpamDownload.download
: more fine grained HTTP request error code detection for curl [#6036 @rjbou]OpamDownload.get_output
: fixwget
option forPOST
requests [#6036 @rjbou]OpamDownload.get_output
: use long form forcurl
POST
request option [#6036 @rjbou]OpamLocal.pull_url
: fix subpath handling when the url is a local archive [#6439 @rjbou]OpamRepository.revision
: now returns astring
instead of aversion
[#6409 @kit-ty-kate]OpamRepositoryBackend.S.revision
: now returns astring
instead of aversion
[#6409 @kit-ty-kate]OpamRepositoryBackend.get_diff
: now raisesStdlib.Failure
if an unsupported file type or comparison is detected [#5892 @kit-ty-kate]OpamRepositoryBackend.get_diff
: now returnsexn option
instead ofexn option OpamProcess.job
and no longer calls the systemdiff
utility [#5892 @kit-ty-kate]
opam-state
OpamStateConfig
: Make the?lock_kind
parameters non-optional to avoid breaking the library users after they upgrade their opam root [#5488 @kit-ty-kate]OpamSwitchState.load_selections
: Make the?lock_kind
parameter non-optional to avoid breaking the library users after they upgrade their opam root [#5488 @kit-ty-kate]OpamSysInteract.Cygwin.check_setup
: unexpose the function [#6467 @kit-ty-kate]OpamSysInteract.package_manager_name
: no longer build the command, or run an action to retrieve system package manager name [#5982 @rjbou]OpamSysInteract.package_status
: SUSE-based distributions now usesrpm
instead ofzypper
and no longer return anavailable
set of system packages [#6464 @kit-ty-kate]OpamSysInteract.packages_status
: returns now aOpamSysPkg.status
instead of sets [#5982 @kit-ty-kate @RyanGib]OpamSysInteract.{install_packages_commands,install}: no longer takes set of package to install but
OpamSysPkg.to_install` [#5982 @rjbou @RyanGibb @kit-ty-kate]OpamSysInteract.{install_packages_commands,install}
: takes a new argument, a switch stat option, for stateless systems that need to write on switch [#5982 @RyanGibb @rjbou]OpamSysInteract
: addstateless_install
that return if system package manager is stateless one (per switch) [#5982 @rjbou]
opam-format
OpamFile.OPAM.{*read*,write*}
: Stop modifying theavailable
field when handling the builtinx-*
fields [#6438 @kit-ty-kate]OpamFile.Repos_config.t
: change the type to not allow repositories without an URL [#6249 @kit-ty-kate]OpamFormula.all_relop
: a list of all operators [#6197 @mbarbin]OpamFormula.string_of_relop
: export function [#6197 @mbarbin]OpamPath
: addnix_env
inner switch path for nix environment [#5982 @RyanGibb]OpamSysPkg
; add new typeto_install
to store system package to install information, newly requested ones and already installed required ones ; and its empty recodeto_install_empty
and display functionstring_of_to_install
[#5982 @rjbou]
opam-core
OpamConsole.pause
: Ensure the function always prints a newline character at the end [#6376 @kit-ty-kate]OpamConsole
: Replaceblack
text style (unused and not very readable) bygray
[#6358 @kit-ty-kate]OpamFilename.patch
: a named-parameter~allow_unclean
was added [#5892 @kit-ty-kate]OpamFilename.patch
: now returnsexn option
instead ofexn option OpamProcess.job
and no longer calls the system GNU Patch [#5892 @kit-ty-kate]OpamHash.all_kinds
: was added, which returns the list of all possible values ofOpamHash.kind
[#5960 @kit-ty-kate]OpamParallel.*.{map,reduce,iter}
: RunGc.compact
when the main process is waiting for the children processes for the first time [#5396 @kkeundotnet]OpamStd.List.split
: Improve performance [#6210 @kit-ty-kate]OpamStd.Option.equal_some
: was added, which tests equality of an option with a value [#6381 @kit-ty-kate]OpamStd.Sys.get_freebsd_version
: was added, which returns the output of theuname -U
command [#6217 @kit-ty-kate]OpamStd.Sys.get_long_bit
: was added, which returns the output of thegetconf LONG_BIT
command [#6217 @kit-ty-kate]OpamStd.Sys.getconf
: was removed, replaced byget_long_bit
[#6217 @kit-ty-kate]OpamStd.Sys.uname
: now returns the memoized result of theuname
function from the C standard library [#6217 @kit-ty-kate]OpamSystem.get_files
: was exposed which returns the list of files (without prefix) inside the given directory [#5892 @kit-ty-kate]OpamSystem.patch
: a named-parameter~allow_unclean
was added [#5892 @kit-ty-kate]OpamSystem.patch
: do not remove the original patch file if called with~preprocess:false
[#5892 @kit-ty-kate]OpamSystem.patch
: now returnsexn option
instead ofexn option OpamProcess.job
and no longer calls the system GNU Patch [#5892 @kit-ty-kate]OpamSystem.remove_dir
: do not fail with an exception when directory is a symbolic link [#6276 @btjorge @rjbou - fix #6275]OpamSystem
,OpamFilename
: addwith_tmp_file
andwith_tmp_file_job
function, that create a file name in temporary directory and removes it at the end of the call [#6036 @rjbou]
The Dune Team is happy to announce the release of Dune 3.18.1
!
This release contains a bug fix for pkg-config
that prevents it from finding some
libraries in specific contexts.
See full changelog
Fixed
- fix: pass pkg-config (extra) args in all pkgconfig invocations. A missing
--personality
flag would result in pkgconf not finding libraries in some contexts. (#11619, @MisterDA)
The Dune Team is happy to announce the release of Dune 3.18.0
!
This release contains changes to support the new x-maintenance-intent
field
by default. It also contains some changes regarding the cache about how it
handles file permissions. It introduces a new (format-dune-file ...)
stanza
with the intention to formalize the dune format-dune-file
command as an inside
rule. Finally, it includes various bug fixes for Dune.
See full changelog
Fixed
-
Support HaikuOS: don't call
execve
since it's not allowed if other pthreads have been created. The fact that Haiku can't callexecve
from other threads than the principal thread of a process (a team in haiku jargon), is a discrepancy to POSIX and hence there is a bug about it. (@Sylvain78, #10953) -
Fix flag ordering in generated Merlin configurations (#11503, @voodoos, fixes ocaml/merlin#1900, reported by @vouillon)
Added
-
Add
(format-dune-file <src> <dst>)
action. It provides a replacement todune format-dune-file
command. (#11166, @nojb) -
Allow the
--prefix
flag when configuring dune withocaml configure.ml
. This allows to set the prefix just like$ dune install --prefix
. (#11172, @rgrinberg) -
Allow arguments starting with
+
in preprocessing definitions (starting with(lang dune 3.18)
). (@amonteiro, #11234) -
Support for opam
(maintenance_intent ...)
in dune-project (#11274, @art-w) -
Validate opam
maintenance_intent
(#11308, @art-w) -
Support
not
in package dependencies constraints (#11404, @art-w, reported by @hannesm)
Changed
-
Warn when failing to discover root due to reads failing. The previous behavior was to abort. (@KoviRobi, #11173)
-
Use shorter path for inline-tests artifacts. (@hhugo, #11307)
-
Allow dash in
dune init
project name (#11402, @art-w, reported by @saroupille) -
On Windows, under heavy load, file delete operations can sometimes fail due to AV programs, etc. Guard against it by retrying the operation up to 30x with a 1s waiting gap (#11437, fixes #11425, @MSoegtropIMC)
-
Cache: we now only store the executable permission bit for files (#11541, fixes #11533, @ElectreAAS)
-
Display negative error codes on Windows in hex which is the more customary way to display
NTSTATUS
codes (#11504, @MisterDA)
OBuilder workers for FreeBSD have been updated to FreeBSD 14.2. See ocurrent/freebsd-infra
From today, ocaml-ci and opam-repo-ci will test against FreeBSD 14.2 rather than 14.1.
Following a post on discuss.ocaml.org, there has been a new release of ocurrent/ocaml-version that moves the minimum version of OCaml, considered as recent, from 4.02 to 4.08.
let recent = [ v4_08; v4_09; v4_10; v4_11; v4_12; v4_13; v4_14; v5_0; v5_1; v5_2; v5_3 ]
This change has far reaching side effects as OCaml-CI, opam-repo-ci, Docker base image builder among other things, use this to determine the set of versions of OCaml to test against. As these services are updated, testing on the old releases will be removed.
We are delighted to announce the release of Odoc 3! This is a big release with loads of new features and bug fixes, and we encourage everyone to install it and try the new features!
This release has been cooking for a long time - it’s been more than a year since odoc 2.4 landed, and a huge amount of work has gone into this. Thanks to the many others who contributed, either by code or by comments: @juloo, @panglesd, @EmileTrotignon, @gpetiot, @trefis, @sabine, @dbuenzli, @yawaramin, and more.
Here is an overview of some major new features:
- Search by type! Our detective sherlodoc will find your lost value given its type.
- Odoc 3 features a global sidebar, allowing you to discover all documentation pages
- The generated documentation include the source code. You can jump from any item in the documentation straight to its rendered source; no matter how much of OCaml’s complex module system you are using.
- You can now add images to your documentation, as well as video and audio files Hierarchical documentation pages allow you to structure your documentation better
- Reference items from other packages! With the ability to use cross-package links in your documentation, the generated documentation is now truly connected.
- The build dependencies are friendlier with incremental build systems, allowing better shared build caches
With this release we’re including a driver that makes use of all the exciting new features of odoc. This driver has been used to create the docs site for the various odoc tools. However, Dune does not yet support odoc 3 since the Dune rules for running odoc via Dune need to be rewritten to reflect the odoc's new CLI and the new incremental build related capabilities odoc 3 brings.
Until Dune supports odoc 3, here is how to get started:
$ opam install odoc-driver # will install odoc 3
$ odoc_driver odoc odoc-parser odoc-driver odoc-md sherlodoc --remap
and point your browser at _html/index.html
. This example shows odoc_driver
creating the docs for exactly the 5 packages specified. While doing so, it will remap links to other packages to instead link to their documentation page hosted on ocaml.org (see "Remapping dependencies" in the odoc documentation).
If you try the above command, you'll note something interesting, and hopefully this will encourage you to run odoc_driver
on your own packages before you release them, as then you'll be able to avoid slightly embarrassing post-release fixes like this one 😬
See full changelog
Added
- Add png, pdf and jpeg image support to the latex backend by Octachron · Pull Request #1297 · ocaml/odoc · GitHub
- Add header field to the json output by panglesd · Pull Request #1314 · ocaml/odoc · GitHub
- Extract code blocks by name by panglesd · Pull Request #1326 · ocaml/odoc · GitHub
Changed
- Fix suppress_warnings parameter by jonludlam · Pull Request #1304 · ocaml/odoc · GitHub
- Fix suppress_warnings parameter by jonludlam · Pull Request #1304 · ocaml/odoc · GitHub
- Disable warnings coming from linking implementations by jonludlam · Pull Request #1319 · ocaml/odoc · GitHub
- Driver compile warnings by jonludlam · Pull Request #1323 · ocaml/odoc · GitHub
- Fix "box model" for code blocks by panglesd · Pull Request #1317 · ocaml/odoc · GitHub
- Store raw content of code blocks in parser's AST by panglesd · Pull Request #1325 · ocaml/odoc · GitHub
Fixed
- Fix suppress_warnings parameter by jonludlam · Pull Request #1304 · ocaml/odoc · GitHub
- Don't backtrace on invalid input in compile-deps by jonludlam · Pull Request #1313 · ocaml/odoc · GitHub
- Fix indentation bug with verbatim in tags by jonludlam · Pull Request #1312 · ocaml/odoc · GitHub
- Driver: Check for missing/unknown opam packages by jonludlam · Pull Request #1311 · ocaml/odoc · GitHub
- Fix suppress_warnings parameter by jonludlam · Pull Request #1304 · ocaml/odoc · GitHub
- Further fixes for virtual libraries by jonludlam · Pull Request #1309 · ocaml/odoc · GitHub
- Fix issue #610 -
odoc html-fragment
not producing headings correctly by jonludlam · Pull Request #1306 · ocaml/odoc · GitHub - Fix classify when there are archives sharing modules by jonludlam · Pull Request #1310 · ocaml/odoc · GitHub
We are happy to announce the release of ppxlib.0.36.0!
With this release, the internal AST that ppxlib targets has been bumped to the AST of OCaml 5.2. Ppx authors can now use features from OCaml 5.2. Ppxlib still supports any OCaml compiler after and including 4.08.0.
Many ppxes will be broken by changes made to the representation of functions. Authors are encouraged to read the upgrade guide.
See full changelog
-
Change
Location.none
to match the compiler'sLocation.none
as of OCaml 4.08. This fixes a bug inloc_of_attribute
(#540, @ncik-roberts, @patricoferris) -
Bump ppxlib's AST to 5.2.0 (#514, @patricoferris)
-
Add the
[@@@expand_inline]
transformation and support for floating attribute context free transformations. (#560, @jaymody) -
Add a
-raise-embedded-errors
flag to the driver. Setting this flag raises the firstocaml.error
embedded in the final AST. -
Export
Ast_pattern.fail
. (#563, @ceastlund) -
Make
Ast_traverse.sexp_of
more concise, and add a test. (#561, @ceastlund)
We are happy to announce the release of ppxlib.0.35.0!
The main feature of this release is improved support for OCaml 5.3, allowing ppx users to have ppx rewriters operate on files with the new effect syntax.
Note that ppx-es and the effect syntax can cohabit but it is possible that ppx rewriters will error out if they encounter effect syntax node in their extension's payload or in the items they generate code from.
This feature also comes with a new --use-compiler-pp
driver flag. This flag is required to preserve the effect syntax when the ppxlib driver outputs source code instead of marshalled AST. Note that the vast majority of users won't need to use this flag but it can come in handy in some more advanced use cases.
See full changelog
-
Allow use of effect syntax in preprocessed files without causing migration failures. (#552, @hhugo, @NathanReb)
-
Remove support for compilers older than 4.08 (#556, @NathanReb)
-
Add a
--use-compiler-pp
flag to the standalone driver. This flag can be set when the driver outputs source code to make it use the compiler'sPprintast
instead of ppxlib's. (#555, @NathanReb)
Dune-release 2.1.0 has been released!
With this update,
- A new command
dune-release delegate-info version
has been added, which shows the current version of the package, as inferred bydune-release
. - The
dev-repo
field in the.opam
file can now be overridden using the--dev-repo
flag on the commandsdune-release
anddune-release publish
. - A bug related to decoding GitHub URLs has been fixed (FIXME:explain context and what's working now that wasn't before)
dune-release
no longer publishes docs to github pages. This choice has been made because, as a consequence of publishing toopam-repository
, the package documentation is built and served byocaml.org/packages
.dune-release
now works with the experimental package management feature from Dune Developer Preview.
See full changelog
Added
- Add
dune-release delegate-info version
to show the current version as infered by the tool (#495, @samoht) - Add
--dev-repo
todune-release
anddune-release publish
to overwrite thedev-repo
field specified in the opam file (#494, @samoht)
Changed
- Use the 'user' option as the fork owner, only attempt to decode the remote URL if the user option is not set. (#480, @Julow)
Fixed
- Make
dune-release
not fail in the presence of~/.dune/bin/dune
(which is present when using dune package management)
Removed
dune-release
no longer publishes docs to github pages. Instead, we rely on the docs published underocaml.org/packages
(#499 #500, @v-gb @samoht)
You can comment on this post on discuss.ocaml.org!
On behalf of the odoc team, I’m thrilled the announce the release of odoc 3.0.0 beta 1!
This release has been cooking for a long time - it’s been more than a year since odoc 2.4 landed, and a huge amount of work has gone into this. Thanks to the many others who contributed, either by code or by comments: @juloo, @panglesd, @EmileTrotignon, @gpetiot, @trefis, @sabine, @dbuenzli, @yawaramin, and more.
With this release we’re including a driver that knows how to use all of the exciting new features of odoc. This driver has been used to create the docs site for the various odoc tools.
Here are a selected set of features:
- Rendered source! Jump from any item in the documentation straight to its rendered source; no matter how much of OCaml’s complex module system you are using.
- Search by type! Our detective sherlodoc will find your lost value given its type.
- Convenient warnings! Warnings are now clearly visible and useful, no longer buried among your dependencies’ warnings.
- Self host your documentation, but link to ocaml.org for your dependencies.
- More sidebars! Odoc 3 features a global sidebar, allowing you to discover the most hidden corner of underground documentation.
- Image support! This cutting-edge feature now allows you to add images to your documentation. Video and audio come for free.
- Fully cross-package links! The OCaml docs are now a true spider web. Prepare to catch bugs, and eat them.
- Hierarchical documentation pages! We use a modular language. We don’t want a flat namespace for pages.
- The build dependencies are friendlier with incremental build systems, allowing better shared build caches.
- Quality of life improvements! Many improvements have been piling up since we started odoc 3. For instance: Add clock emoji before @since tag (@yawaramin, #1089)!
More explanation of these features is available at the odoc site, where we have documentation for authors, for users of odoc_driver, a cheatsheet, and differences from ocamldoc.
How can you help?
We need your feedback, both as authors and as users of documentation! Try things out using the new driver:
$ opam install odoc-driver # don't forget to `opam update`
$ odoc_driver <package list> # For instance: `$ odoc_driver brr odoc`
$ $YOUR_BROWSER _html/index.html
Many of those features’ implementations are not set in stone, but first versions. Please leave comments, either in this thread or as issues in the repository.
So, navigate already written documentation, and update your own docs to use the new features!
See full changelog
Highlight
-
Hierarchical documentation (@jonludlam, @panglesd, @Julow)
Pages can now be organized in a directory tree structure.
Relative and absolute references are added:
{!./other_page.label}
,{!//other_page}
. -
Improved sidebar and breadcrumbs navigation (@panglesd, @gpetiot)
The documentation pages and the libraries of the entire package are shown on
the left sidebar. -
Added support for images, videos, audio and other assets
The syntax is{image!/reference/to/asset}
or{image:URL}
for images.
The syntax for{video...}
and{audio...}
is the same.
(@panglesd, @EmileTrotignon, #1170, #1171, #1184, #1185) -
Search using Sherlodoc (@panglesd, @EmileTrotignon, @Julow)
A new search bar that supports full-text and type-based search.
Added
-
Experimental driver (@jonludlam, @panglesd)
The driver builds the documentation for a collection of Opam packages using
the newer Odoc features. It supports linking external packages to ocaml.org
and markdown files.
This is experimental and will break in the future. -
Cross-package references (@panglesd, @Julow)
Pages and modules from other packages can be referenced:
{!/otherpackage/page}
,{!/otherpackage/Module.t}
. -
Option to remap links to other packages to ocaml.org or other site.
See the--remap
option of the driver or the--remap-file
option ofodoc html-generate
.
(@jonludlam, #1189, #1248) -
Option to compute occurrences of use of each identifiers
The commandsaggregate-occurrences
andcount-occurrences
are added.
(@panglesd, #976, #1076, #1206) -
Added the
odoc classify
command (@jonludlam, #1121)
Helps driver detecting which modules belong to which libraries. -
Added
--suppress-warnings
to the CLI to remove warnings from a unit, even
if they end up being raised in another unit through expansion
(@jonludlam, #1260) -
Add clock emoji before
@since
tag (@yawaramin, #1089) -
Navigation for the search bar : use '/' to enter search, up and down arrows to
select a result, and enter to follow the selected link. (@EmileTrotignon, #1088) -
Fix a big gap between the preamble and the content of a page (@EmileTrotignon, #1147)
-
Add a marshalled search index consumable by sherlodoc (@EmileTrotignon, @panglesd, #1084)
-
Allow referencing of polymorphic constructors in polymorphic variant type
aliases (@panglesd, #1115) -
Added a home icon in the breacrumbs (@panglesd, #1251)
It can be disabled with a CLI option. -
Add a frontmatter syntax for mld pages (@panglesd, #1187, #1193, #1243, #1246, #1251)
Allows to specify the title of a page, the order of sub-pages and other
behaviors in the sidebar. -
Added
odoc-md
to process standalone Markdown pages (@jonludlam, #1234)
Changed
-
The command line interface changed to support the new features.
- Packages and libraries:
odoc link
must now be aware of packages and
libraries with the-L libname:path
and-P pkgname:path
options. The
module search path should still be passed with the-I
option.
The current package should be specified with--current-package=pkgname
. - Hierarchy:
odoc compile
now outputs.odoc
in the directory tree
specified with--output-dir=DIR
and the parent identifier must be
specified with--parent-id=PARENT
.
The option--source-parent-file
is removed. - Source code: Implementations are compiled with
compile-impl
instead of
withcompile
. The options--cmt=..
and--source-name=..
are removed.
Source code pages are generated withhtml-generate-source
. - Assets: The commands
compile-asset
,html-generate-asset
are added.
The optionhtml-generate --asset
is removed. - Sidebar: The index is built using
compile-index
. The sidebar data is
extracted from the index withsidebar-generate
and passed to
html-generate --sidebar=..
.
- Packages and libraries:
-
The syntax for
@tag
is now delimited (@panglesd, #1239)
A@tag
can now be followed by a paragraph or other elements. -
Updated colors for code fragments (@EmileTrotignon, #1023)
-
Fixed complexity of looking up
.odoc
files (@panglesd, #1075) -
Normalize whitespaces in codespans (@gpetiot, #1085)
A newline followed by any whitespaces is normalized as one space character. -
Reduce size of
Odoc_html_frontend
when compiled to javascript
(@EmileTrotignon, #1072) -
Overhaul of module-type-of expansions and shadowing code (@jonludlam, #1081)
-
Output file paths and labels in the man and latex backends changed to avoid
name clashes (@Julow, #1191)
Fixed
- Fix variant constructors being hidden if they contain hidden types
(@jonludlam, #1105) - Fix rare assertion failure due to optional parameters
(@jonludlam, #1272, issue #1001) - Fix resolution of module synopses in {!modules} lists that require --open
(@jonludlam, #1104} - Fix top comment not being taken from includes often enough (@panglesd, #1117)
- Fixed 404 links from search results (@panglesd, #1108)
- Fixed title content not being picked up across pages when rendering references
(#1116, @panglesd) - Fix wrong links to standalone comments in search results (#1118, @panglesd)
- Remove duplicated or unwanted comments with inline includes (@Julow, #1133)
- Fix bug where source rendering would cause odoc to fail completely if it
encounters invalid syntax (@jonludlam #1208) - Add missing parentheses in 'val (let*) : ...' (@Julow, #1268)
- Fix syntax highlighting not working for very large files
(@jonludlam, @Julow, #1277)
The Dune team is happy to announce the release of Dune 3.17.2!
This patch release includes some bug fixes. It brings some fixes for Melange
and Wasm_of_ocaml. It also fixes a bug that prevents the experimental feature,
package management, to build with ocaml.5.3.0
.
See full changelog
Fixed
- Fix a crash in the Melange rules that would prevent compiling public library implementations of virtual libraries. (@anmonteiro, #11248)
- Pass
melange.emit
'scompile_flags
to the JS emission phase. (@anmonteiro, #11252) - Disallow private implementations of public virtual libs in melange mode. (@anmonteiro, #11253)
- Wasm_of_ocaml: fix the execution of tests in a sandbox. (#11304, @vouillon)
We're happy to announce the release of Merlin 5.4.1-503!
See full changelog
- ocaml-index
- Bump magic number after index file format change (#1886)
We're happy to announce Utop 2.15.0 which adds support for OCaml 5.3.0!
We're pleased to announce the release of OCaml LSP Server 1.22.0, which enables experimental project-wide renaming of identifiers!
Merlin 5.4-503 is now available with support for OCaml 5.3. This release leverages new features in OCaml 5.3 to improve locate behavior, resolving issues where Merlin previously confused unique identifiers from interfaces and implementations. The indexer has been optimized to perform fewer merges, and initial support for project-wide renaming has been added, allowing occurrences to return all usages of related definitions across a project.
The Vim plugin receives an enhancement with search-by-type functionality, accessible through the existing :MerlinSearch
command. The command now automatically switches between search-by-type and polarity search based on the first character of the query.
See full changelog
- merlin binary
- Support for OCaml 5.3
- Use new 5.3 features to improve locate behavior in some cases. Merlin no
longer confuses uids from interfaces and implementations. (#1857) - Perform less merges in the indexer (#1881)
- Add initial support for project-wide renaming: occurrences can now return
all usages of all related definitions. (#1877)
- vim plugin
- Added support for search-by-type (#1846)
This is exposed through the existing:MerlinSearch
command, that
switches between search-by-type and polarity search depending on the
first character of the query.
- Added support for search-by-type (#1846)
OCaml LSP Server version 1.21.0 is now available. This release introduces a new server option called standardHover
that allows clients to disable the default hover provider functionality.
See full changelog
Features
- Add a new server option
standardHover
, that can be used by clients to
disable the default hover provider. WhenstandardHover = false
textDocument/hover
requests always returns with empty result. (#1416)
We’re happy to announce that we just released ppxlib.0.34.0.
The full patch notes are available on the release page over here.
The main features are OCaml 5.3 compatibility, new AST pretty-printing utilities and the ppxlib-tools package, support for [@@deriving ...] on class types and the addition of missing Pprintast entry points.
Changes summary
5.3 compatibility
ppxlib.0.34.0 is the first official ppxlib release that’s compatible with the new 5.3 compiler.
The ppxlib driver now also comes with a -keywords
CLI option, similar to the compiler’s that allow you to compile and preprocess with the 5.3 compiler code that uses effect as an identifier. This is pretty niche but it’s there should you need it.
Please note that means you can use ppx-es with a 5.3 compiler but not that ppx-es can consume/produce 5.3 language features. We’re currently working on a fix allowing you to use the effect syntax in files that require preprocessing as it’s not possible with 0.34.0. The fix should be released in the next few days as 0.34.1.
AST pretty-printing
We added a new Pp_ast
module that allows you to pretty print AST fragments.
The only way ppxlib would print ASTs before were as S-expressions. In practice we found that it was not always helpful and wanted a more readable and human friendly way of displaying the AST.
The default output of those printer is a simplified version of the AST to keep things clear and avoid cluttering the output with information that is not always useful. For example, if you run Ppxlib.Pp_ast.Default.expression
on the AST for x + 2
, you’ll get the following:
Pexp_apply
( Pexp_ident (Lident "+")
, [ ( Nolabel, Pexp_ident (Lident "x"))
; ( Nolabel, Pexp_constant (Pconst_integer ( "2", None)))
]
)
The alert reader will note that there are no locations or attributes and that the expression record layer is omitted here.
You can of course configure the printer to display more information if you need to.
We’ve been using these new printers internally to debug migration code and they have been a huge help so we hope they will make working with ppxlib easier for you too.
In addition to this new module, we also added a command line utility called ppxlib-pp-ast
to pretty print ASTs from source files, source code fragments or even marshalled AST files. It is very similar to the old ppx_tools
’s dumpast
.
Note that it will print ppxlib’s internal AST after it’s been migrated from the installed compiler’s version. This is something that we could not simply achieve with OCaml’s own -dparsetree
.
This should be a useful tool for debugging ppx related bugs or learning about the AST and we hope ppx authors and users will like it.
Other changes
As mentioned above, we also added some missing Pprintast
* entries such as binding
, longident
and payload
.
It is now possible to use [@@deriving ...]
on class type declarations and therefore to write derivers for class types.
*: To the confused readers: Pprintast is entirely different from Pp_ast mentioned above as it prints the source code corresponding to a given AST.
Special thanks
We wanted to thank our external contributors for this release: @hhugo, @nojb and @dra27 for their help on the 5.3 compat and @mattiasdrp for bringing the Pprintast module up to speed.
Special thanks as well to @pedrobslisboa who started integrating their excellent ppx-by-example into ppxlib’s documentation.
Finally, I’d also like to thank the OCaml Software Foundation who’s been funding all my work on ppxlib and made this release possible!
Happy preprocessing to you all!
See full changelog
-
Add initial OCaml 5.3 support (#487, @NathanReb, @hhugo, @nojb)
-
Initialise OCaml 5.3's lexer with the
keywords
setting fromOCAMLPARAM
or the new-keywords
driver's CLI option to allow the standalone ppx driver to process old packages usingeffect
as an identifier (#535, @dra27, @NathanReb) -
Add
Pprintast.binding
,longident
andpayload
(#542, @mattiasdrp) -
Fix
deriving_inline
round-trip check so that it works with 5.01 <-> 5.02 migrations (#519, @NathanReb) -
Add ppxlib's AST pretty-printing utilities in
Ppxlib.Pp_ast
and appxlib-pp-ast
executable in a new separateppxlib-tools
package (#517, #525, #537, @NathanReb) -
Change
-dparsetree
from a sexp output to a pretty printed AST, closer to what the compiler's-dparsetree
is. (#530, @NathanReb) -
Add Parsetree documentation comments to
Ast_builder
functions (#518, @patricoferris) -
Support class type declarations in derivers with the new, optional arguments
{str,sig}_class_type_decl
inDeriving.add
(#538, @patricoferris)
We have the pleasure of announcing the release of OCaml version 5.3.0. dedicated to the memory of John William Mauchly and Paul Verlaine on the anniversary of their death.
De la musique avant toute chose, Et pour cela préfère l’Impair
(Music first and foremost of all! Choose your measure of odd not even)
Some of the highlights in OCaml 5.3.0 are:
-
Syntax for deep effect handlers
There is now a dedicated syntax for installing deep effect handler
match f () with | x -> x | effect Random_float, k -> Effect.Deep.continue k (Random.float 1.0)
This new syntax adds a new
effect
keyword, which may break existing code. To improve backward compatibility, this new keyword can be disabled with the new-keywords
flags if needed for backward compatibility. -
Restored MSVC port
It is now possible to use the MSVC toolchain on Windows, restoring the last missing port from OCaml 4 (except for the native compiler support for 32-bit architectures which is not planned)
-
Re-introduced statistical memory profiling (statmemprof)
The submodule
Gc.memprof
is restored with a slightly different API. This submodule can be used to monitor memory allocation statistics inside a program. In OCaml 5, each domain can be monitored independently while child domains inherit the parent domain profiling profile (if there is one active). -
utf-8 encoded Unicode source files and modest support of Unicode identifiers
type saison = Hiver | Été | Printemps | Automne
The OCaml lexer has been extended to support a modest subset of Unicode characters in identifiers. This is mostly intended for pedagogical use. This extended support requires source files to be utf-8 encoded Unicode text.
-
More space-efficient implementation of Dynarray
The internal implementation of
Dynarray
now uses an unboxed representation which avoids the need of storing items wrapped in aSome x
block and thus saves some spaces and indirections. -
Improved metadata on the pairs of declarations and definitions for merlin.
The metadata stored inside cmt files has been improved to better distinguish the provenance of identifiers (previous versions could confuse an interface and implementation identifier). Similarly, the metadata now tracks more precisely the association between declarations and definitions. For instance, in
module X = struct let x = 0 end module M: sig val x: int end = struct let x = 1 include X end
Merlin can now determine that the definition of the
M.x
value lies inside the moduleX
.
And a lot of incremental changes:
- Around 20 new functions in the standard library (in the
Domain
,Dynarray
Format
,List
,Queue
,Sys
, andUchar
modules). - Many fixes and improvements in the runtime
- Improved error messages for first-class modules, functors, labelled arguments, and type clashes.
- Numerous bug fixes
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 full changelog.
Installation Instructions
The base compiler can be installed as an opam switch with the following commands:
opam update
opam switch create 5.3.0
The source code for the release is also directly available on:
Fine-Tuned Compiler Configuration
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+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+flambda+nffa ocaml-variants.5.3.0+options ocaml-option-flambda ocaml-option-no-flat-float-array
See full changelog
(Changes that can break existing programs are marked with a "*")
Restored backend:
-
#12954: Restore the MSVC port (David Allsopp, Antonin Décimo, Samuel Hym, and Miod Vallat, review by Nicolás Ojeda Bär)
-
#13093: Allow building the MSVC port with clang-cl. (Antonin Décimo, review by Nicolás Ojeda Bär, Samuel Hym, David Allsopp and Sébastien Hinderer)
Language features:
-
#12309, #13158: Add syntax support for deep effect handlers (Leo White, Tom Kelly, Anil Madhavapeddy, KC Sivaramakrishnan, Xavier Leroy and Florian Angeletti, review by the same, Hugo Heuzard, and Ulysse Gérard)
-
#11736, #12664, #13628: Support utf-8 encoded source files and latin-9 compatible identifiers. (Xavier Leroy and Florian Angeletti, review by Daniel Bünzli and Jules Aguillon)
-
#12828, #13283: Add short syntax for dependent functor types
(X:A) -> ...
(Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer)
Type system
- #11891, #12507: Allow to name new locally abstract types in constructor type annotations. (Jacques Garrigue, report and review by Gabriel Scherer and Florian Angeletti)
Runtime system:
-
#11911, #12923: Multicore statistical memory profiling. This restores a notable OCaml 4 feature that was missing in OCaml 5. (Nick Barnes, review by Stephen Dolan, Jacques-Henri Jourdan and Guillaume Munch-Maccagnoni).
-
#13419: Fix memory bugs in runtime events system. (B. Szilvasy and Nick Barnes, review by Miod Vallat, Nick Barnes, Tim McGilchrist, and Gabriel Scherer)
-
#13364: Emit major slice counters in the runtime events. (KC Sivaramakrishnan and Sadiq Jaffer, review by Gabriel Scherer)
-
#13382: Add more documentation for Runtime_events types (Sadiq Jaffer, review by Tim McGilchrist, Miod Vallat and KC Sivaramakrishnan)
-
#13370: Fix a low-probability crash when calling Gc.counters. (Demi Marie Obenour, review by Gabriel Scherer)
-
#13272: Allow maximum number of domains to be specified as a OCAMLRUNPARAM parameter. (KC Sivaramakrishnan, review by Guillaume Munch-Maccagnoni, Miod Vallat, Gabriel Scherer, David Allsopp, request by Zachary Yedidia).
-
#12579: OS-based Synchronisation for Stop-the-World Sections (B. Szilvasy, review by Miod Vallat, Nick Barnes, Olivier Nicole, Gabriel Scherer and Damien Doligez)
-
#12789: Restore caml_unregister_frametable from OCaml 4 (Frédéric Recoules, review by Gabriel Scherer)
-
#13003: new, more consistent names for array-creation C functions (Gabriel Scherer, review by Olivier Nicole)
-
#13013: introduce a
caml_result
type to supersede the use of 'encoded exception values' in the FFI. (Gabriel Scherer, review by Damien Doligez, Guillaume Munch-Maccagnoni and Xavier Leroy, suggested by Guillaume Munch-Maccagnoni) -
#12407, #13226: Resource-handling improvements: add exception-returning variants for all exception-raising functions in
caml/fail.h
, for the purpose of cleaning-up state and resources before raising. (Guillaume Munch-Maccagnoni, review by Damien Doligez, Xavier Leroy and Gabriel Scherer) -
#13086: Avoid spurious major GC slices. (Damien Doligez, report by Stephen Dolan, review by Gabriel Scherer and Stephen Dolan)
-
#11779, #13117: Improve logic for fiber stack alignment. (Miod Vallat, report by Damien Doligez, review by Gabriel Scherer)
-
#12839: Remove ATOMIC_UINTNAT_INIT from camlatomic.h (as part of a larger cleanup of camlatomic.h) (David Allsopp, review by Antonin Décimo, Sébastien Hinderer, Samuel Hym, Guillaume Munch-Maccagnoni and Miod Vallat)
-
#13163: Enable frame pointers on macOS x86_64 (Tim McGilchrist, review by Sébastien Hinderer and Fabrice Buoro)
-
#12951: Constify constructors and flags tables in C code (take 2). Now these tables will go in the readonly segment, where they belong. (Antonin Décimo, review by David Allsopp)
-
#10696: Introduce __has_attribute and __has_c_attributes in <caml/misc.h> to test the support of specific attributes in C code. Introduce fallthrough as a wrapper around the fallthrough attribute. (Antonin Décimo, review by Nicolás Ojeda Bär, Xavier Leroy, and Gabriel Scherer)
-
#13083: Use macros from limits.h to avoid signed-integer wrap-around. Introduce CAML_{U,}INTNAT_{MIN,MAX} macros to expose {u,}intnat limits. (Antonin Décimo, review by Nick Barnes, Xavier Leroy, Gabriel Scherer, and Miod Vallat)
-
#13239: Check whether the compiler supports the labels as values extension to enable threaded code interpretation. (Antonin Décimo, review by Miod Vallat)
-
#13238: Enable software prefetching on x86 and x86_64 when building with MSVC or clang-cl. (Antonin Décimo, review by Miod Vallat)
-
#13241, #13261, #13271: Add CFI_SIGNAL_FRAME to ARM64 and RiscV runtimes, for the purpose of displaying backtraces correctly in GDB. (Tim McGilchrist, review by Miod Vallat, Gabriel Scherer and KC Sivaramakrishnan)
-
#13139: Simplify CAMLalign to always use C23/C++11 alignas or C11 _Alignas. Ensures that stat data is always aligned to the best boundary. (Antonin Décimo, review by Miod Vallat and Xavier Leroy)
-
#13280: Check for support of compiler attributes. Allows using compiler attributes with clang-cl. (Antonin Décimo, review by Miod Vallat)
-
#13243: Enable C compiler warnings internally when building with clang-cl or MSVC. Provide fixes too. (Antonin Décimo, review by Miod Vallat and Xavier Leroy)
-
#13242: Define and use unreachable and trap annotation, and clean-up some runtime assertions. (Antonin Décimo, review by Miod Vallat, Gabriel Scherer, and David Allsopp)
-
#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)
-
#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)
Code generation and optimizations:
-
#13014: Enable compile-time option -function-sections on all previously unsupported native backends (POWER, riscv64 and s390x) (Miod Vallat, review by Nicolás Ojeda Bär)
-
#7241, #12555, #13076, #13138, #13338, #13152, #13153, #13154: fix a soundness bug in the pattern-matching compiler when side-effects mutate the scrutinee during matching. (Gabriel Scherer, review by Nick Roberts)
-
#13341: a warning when the pattern-matching compiler pessimizes code because side-effects may mutate the scrutinee during matching. (This warning is disabled by default, as this rarely happens and its performance impact is typically not noticeable.) (Gabriel Scherer, review by Nick Roberts, Florian Angeletti and David Allsopp)
-
#13179: Fix evaluation of toplevel lets in classes containing local opens (Vincent Laviron, review by Hugo Heuzard, Nathanaëlle Courant and Gabriel Scherer)
-
#13543: Remove some String-Bytes conversion from the stdlib to behave better with js_of_ocaml (Hugo Heuzard, review by Gabriel Scherer)
Standard library:
-
#12885: move Dynarray to an unboxed representation (Gabriel Scherer, suggestions by Vincent Laviron, review by Olivier Nicole and Simon Cruanes, Yann Leray, Alain Frisch)
-
#12884: Add
Queue.drop
(Léo Andrès, review by Nicolás Ojeda Bär and Gabriel Scherer) -
#13168: In Array.shuffle, clarify the code that validates the result of the user-supplied function
rand
, and improve the error message that is produced when this result is invalid. (François Pottier, review by Florian Angeletti, Daniel Bünzli and Gabriel Scherer) -
#12133: Expose support for printing substrings in Format (Florian Angeletti, review by Daniel Bünzli, Gabriel Scherer and Nicolás Ojeda Bär)
-
#12869: Add List.take, List.drop, List.take_while and List.drop_while (Kate Deplaix and Oscar Butler-Aldridge, review by Nicolás Ojeda Bär, Craig Ferguson and Gabriel Scherer)
-
#13047: Add Sys.poll_actions to (only) run pending runtime actions. (Nick Barnes, review by Gabriel Scherer, Guillaume Munch-Maccagnoni, and Vincent Laviron)
-
#13144: Dynarray.{equal, compare} (Gabriel Scherer, review by Jeremy Yallop, Daniel Bünzli and Olivier Nicole, request by Olivier Nicole)
-
#13171: expose
Domain.self_index : unit -> int
(a somewhat-dense indexing of currently-running domains) for advanced use-cases of domain-indexed concurrent data structures. (Gabriel Scherer, review by KC Sivaramakrishnan, Miod Vallat and Nicolás Ojeda Bär, report by Vesa Karvonen) -
#13197: Dynarray.blit, which allows to extend the destination dynarray (0 <= dst_pos <= dst_length). (Gabriel Scherer, report by Hazem Elmasry, review by Olivier Nicole, Hazem Elmasry and Nicolás Ojeda Bär)
- (breaking change) #13240: Add Uchar.seeded_hash, Change Uchar.hash implementation.
Previously, Uchar.hash was aliased to Uchar.to_int. If you need that behavior,
change your module instantiation from eg
module HT = Hashtbl.Make(Uchar)
to
If the current implementation is desired, and you have a hashtable modulemodule HT = Hashtbl.Make(struct ... let hash = Uchar.to_int end)
HT
(produced with theMake
functor) in persistent storage, useHT.rebuild
to ensure it doesn't break when reading from or writing to buckets. (Hazem ElMasry, review by Gabriel Scherer and Nicolás Ojeda Bär)
-
#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)
-
#13296: Add mem, memq, find_opt, find_index, find_map and find_mapi to Dynarray. (Jake H, review by Gabriel Scherer and Florian Angeletti)
Other libraries:
-
#11996: release the dependency of dynlink on compilerlibs. (Sébastien Hinderer and Stephen Dolan, review by Damien Doligez and Hugo Heuzard)
-
#13326: Implement Unix.O_APPEND on windows. (Romain Beauxis, review by Miod Vallat, Gabriel Scherer and Antonin Décimo)
Tools:
-
#11716: ocamllex: mismatched parentheses and curly brackets are now caught by ocamllex, instead of causing invalid OCaml code to be generated. (Demi Marie Obenour, review by Damien Doligez and Xavier Leroy)
-
#12904: Run the testsuite with ThreadSanitizer on a PR when label
run-thread-sanitizer
is added (Olivier Nicole, suggested by Sébastien Hinderer and David Allsopp, review by Gabriel Scherer)
- (breaking change) #13114: Support ocamldebug remote debugging over IPv6 on all platforms, and over Unix domain sockets on Windows. (Antonin Décimo, review by Gabriel Scherer and Miod Vallat)
- #13136: Rewrite GDB extensions and macros in debugger-agnostic Python, and add LLDB support for them. (Nick Barnes, review by Tim McGilchrist and Gabriel Scherer)
Toplevel:
-
#12891: Improved styling for initial prompt (Florian Angeletti, review by Gabriel Scherer)
-
#13053: Improved display of builtin types such as
_ list
when aliased. (Samuel Vivien, review by Florian Angeletti)
Manual and documentation:
-
#13370: Document that that temporary variables holding GCd pointers must not be live across a GC. (Demi Marie Obenour)
-
#12298: Manual: emphasize that Bigarray.int refers to an OCaml integer, which does not match the C int type. (Edwin Török, review by Florian Angeletti)
-
#12868: Manual: simplify style colours of the post-processed manual and API HTML pages, and fix the search button icon (Yawar Amin, review by Simon Grondin, Gabriel Scherer, and Florian Angeletti)
-
#12949: document OCaml release cycles and version strings in
release-info/introduction.md
. (Florian Angeletti, review by Fabrice Buoro, Kate Deplaix, Damien Doligez, and Gabriel Scherer) -
#12976: Manual: use webman/
/*.html and webman/ /api/ for OCaml.org HTML manual generation (Shakthi Kannan, review by Hannes Mehnert, and Florian Angeletti) -
#13045: Emphasize caution about behaviour of custom block finalizers. (Nick Barnes)
-
#13216: document the new
caml_result
type in the FFI chapter of the manual. (Gabriel Scherer, review by Miod Vallat, Daniel Bünzli, Nick Barnes, Guillaume Munch-Maccagnoni and Antonin Décimo) -
#13287: stdlib/sys.mli: Update documentation on Sys.opaque_identity following #9412. (Matt Walker, review by Guillaume Munch-Maccagnoni and Vincent Laviron)
-
#13295: Use syntax for deep effect handlers in the effect handlers manual page. (KC Sivaramakrishnan, review by Anil Madhavapeddy, Florian Angeletti and Miod Vallat)
-
#13424: Fix
Gc.quick_stat
documentation to clarify that returned fieldslive_words
,live_blocks
,free_words
, andfragments
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)
-
#13666: Rewrite parts of the example code around nested lists in Chapter 6 (Polymorphism and its limitations -> Polymorphic recursion) giving the "depth" function [in the non-polymorphically-recursive part of the example] a much more sensible behavior; also fix a typo and some formatting. (Frank Steffahn, review by Florian Angeletti)
-
#13668: Document the basic support for unicode identifiers and the switch to UTF-8 encoded Unicode text for OCaml source file (Florian Angeletti, review by Nicolás Ojeda Bär and Daniel Bünzli)
Compiler user-interface and warnings:
- (breaking change) #12084, #13669, #13673: Check link order when creating archive and when using ocamlopt. (Hugo Heuzard, review by Stefan Muenzel and Sébastien Hinderer)
-
#12980: Explain type mismatch involving first-class modules by including the module level error message (Florian Angeletti, review by Vincent Laviron)
-
#12985, #12988: Better error messages for partially applied functors. (Florian Angeletti, report by Arthur Wendling, review by Gabriel Scherer)
-
#13034, #13260: Better error messages for mismatched function labels (Florian Angeletti, report by Daniel Bünzli, review by Gabriel Scherer and Samuel Vivien)
-
#13051: Add a "Syntax error" to error messages for invalid package signatures. (Samuel Vivien, review by Gabriel Scherer)
-
#13099: Fix erroneous loading of cmis for some module type errors. (Nick Roberts, review by Florian Angeletti)
-
#13151, name conflicts explanation as a footnote (Florian Angeletti, review by Gabriel Scherer)
-
#13228: Re-export Cmt2annot.{iterator,binary_part} which had become hidden since #11288 and broke ocamlbrowser. (David Allsopp, report by Jacques Garrigue, review by Sébastien Hinderer)
-
#13251: Register printer for errors in Emitaux (Vincent Laviron, review by Miod Vallat and Florian Angeletti)
-
#13255: Re-enable warning 34 for unused locally abstract types (Nick Roberts, review by Chris Casinghino and Florian Angeletti)
-
#12182: Improve the type clash error message. For example, this message: This expression has type ... is changed into: The constant "42" has type ... (Jules Aguillon, review by Gabriel Scherer and Florian Angeletti)
-
#13471: add
-keywords <version?+list>
flag to define the list of keywords recognized by the lexer, for instance-keywords 5.2
disable theeffect
keyword. (Florian Angeletti, review by Gabriel Scherer)
Internal/compiler-libs changes:
-
#13286: Distinguish unique identifiers
Shape.Uid.t
according to their provenance: either an implementation or an interface. (Ulysse Gérard, review by Florian Angeletti and Leo White) -
#13308: keep track of relations between declaration in the cmt files. This is useful information for external tools for navigation and analysis purposis. (Ulysse Gérard, Florian Angeletti, review by Florian Angeletti and Gabriel Scherer)
-
#11129, #11148: enforce that ppxs do not produce
parsetree
s with an empty list of universally quantified type variables (. int -> int
instead of'a . int -> int'
) (Florian Angeletti, report by Simmo Saan, review by Gabriel Scherer) -
#12534: document and refactor Matching.mk_failaction_pos (Gabriel Scherer, review by Vincent Laviron and Nick Roberts)
-
#13076: change the handling of Match_failure exits in the pattern-matching compiler, to prepare for a complete fix for #7241 (Gabriel Scherer, review by Thomas Refis and Nick Roberts)
-
#12896: Simplify the compilation of custom bytecode runtimes by explicitly compiling the primitives file before calling the linker. Tidy-up both the generating code and the output itself for C code being generated by the bytecode linker in
-custom
and-output-*
modes. (David Allsopp, Antonin Décimo and Samuel Hym, review by Vincent Laviron) -
#12932: Remove useless code in Typecore.type_label_exp (was a fix for #4862) (Jacques Garrigue, review by Gabriel Scherer)
-
#12943: Make transient_expr.scope a bitfield, and use it to store marks. Marks are automatically allocated, and removed when leaving their scope. Falls back to using TransientTypeSet when marks are exhausted. (Jacques Garrigue and Takafumi Saikawa, review by Basile Clément)
-
#12946: Make generalization automatic when leaving scope. As a result, the
Ctype.generalize*
andCtype.correct_levels
functions were removed. The latter is now calledCtype.duplicate_type
. (Jacques Garrigue and Takafumi Saikawa, review by Richard Eisenberg) -
#12968: Attach location to constants in the parsetree (Jules Aguillon, review by Gabriel Scherer)
-
#12959, #13055: Avoid an internal error on recursive module type inconsistency (Florian Angeletti, review by Jacques Garrigue and Gabriel Scherer)
-
#13049: graphical debugging printer for types (Florian Angeletti, review by Gabriel Scherer)
-
#13074, #13082, #13084: refactoring in the pattern-matching compiler (Gabriel Scherer, review by Thomas Refis, Vincent Laviron and Nick Roberts)
-
#13067: rework volatile memory access rules under TSan to consider properly aligned smaller-than-register read operations as atomic, which gets rid of false positives on s390x (Miod Vallat, review by Fabien Buoro)
-
#13162: Use quoted strings to clarify code being generated. (Antonin Décimo, review by Miod Vallat and Gabriel Scherer)
-
#13015: Emit floating-point literals in .rodata section on ELF arm64 platforms (Linux, *BSD). (Miod Vallat, review by Nicolás Ojeda Bär)
-
#13169, #13311: Introduce a document data type for compiler messages rather than relying on
Format.formatter -> unit
closures. (Florian Angeletti, review by Gabriel Scherer) -
#13193: Remove the unused env_init field from class blocks (Vincent Laviron, review by Jacques Garrigue)
-
#13257: integrate MetaOCaml in the Menhir grammar to ease MetaOCaml maintenance. This is a purely internal change: there is no support in the lexer, so no change to the surface OCaml grammar. (Oleg Kiselyov, Gabriel Scherer and Florian Angeletti, review by Jeremy Yallop)
-
#13289: Use C99 for loop to reduce the scope of the for loop iterator. (Antonin Décimo, review by Miod Vallat and Gabriel Scherer)
-
#13336: compiler-libs, split the
Printtyp
in three to only keep "user-friendly" functions in thePrinttyp
module. (Florian Angeletti, review by Gabriel Scherer) -
#13361: split runtime/array.c functions to consistently expose uniform_array and floatarray versions, use floatarray versions in Float.Array. (Gabriel Scherer, review by Nicolás Ojeda Bär)
-
#13507: A small refactoring to [free_vars] to make it a bit faster by not allocating a list when the list is not necessary. (Richard Eisenberg, review by Jacques Garrigue)
Build system:
-
#12909: Reorganise how MKEXE_VIA_CC is built to make it correct for MSVC by grouping all the linker flags at the end of the C compiler commandline (David Allsopp and Samuel Hym, review by Nicolás Ojeda Bär)
-
#12992, #13009: Check that flexlink can be executed only when building in a native windows environment. (Romain Beauxis, review by David Allsopp and Sébastien Hinderer)
-
#12996: Only link with -lgcc_eh when available. (Romain Beauxis, review by David Allsopp and Miod Vallat)
- (breaking change) #13200: Do not use CFLAGS for linking. (Sébastien Hinderer, review by Gabriel Scherer, Antonin Décimo, Miod Vallat and Samuel Hym)
- #13201, #13244: Fix and speedup builds with TSan. (Sébastien Hinderer, review by Miod Vallat, Gabriel Scherer and Olivier Nicole)
- (breaking change) #12578, #12589, #13322, #13519: Use configured CFLAGS and CPPFLAGS only during the build of the compiler itself. Do not use them when compiling third-party C sources through the compiler. Flags for compiling third-party C sources can still be specified at configure time in the COMPILER_{BYTECODE,NATIVE}_{CFLAGS,CPPFLAGS} configuration variables. (Sébastien Hinderer, report by William Hu, review by David Allsopp)
- #13285: continue the merge of the sub-makefiles into the root Makefile started with #11243, #11248, #11268, #11420, #11675, #12198, #12321, #12586, #12616, #12706 and #13048. (Sébastien Hinderer, review by David Allsopp and Florian Angeletti)
Bug fixes:
-
#12854: Add a test in the regression suite that flags the bug #12825. (Luc Maranget)
-
#12888: fix printing of uncaught exceptions in
.cmo
files passed on the command-line of the toplevel. (Nicolás Ojeda Bär, review by Florian Angeletti, report by Daniel Bünzli) -
#12910, #12920: Fix an unsound interaction between first-class modules and polymorphic records by saving and restoring univar_pairs. (Stephen Dolan, review by Gabriel Scherer, report by Jeremy Yallop)
-
#12994: Remove un-used and unsafe caml_drop_continuation (Tim McGilchrist, reviewed by Gabriel Scherer and Miod Vallat)
-
#12963: Restore caml_runtime_parameters implementation. This primitive allows programs to query the runtime parameters supplied to an OCaml program. Implementation missing since OCaml 5.0. (Tim McGilchrist, reviewed by David Allsopp and Miod Vallat)
-
#13012: parsing: Fix dropped attributes after a '-' or '+' The syntax '-(1 [@foo])' was incorrectly parsed as '-1'. (Jules Aguillon, reviewed by Gabriel Scherer, report by Gabriel Scherer)
- (breaking change) #13070: On Windows, when configured with bootstrapped flexdll, don't add
+flexdll to the search path when -nostdlib is specified (which then means
-L
no longer gets passed to the system linker). (David Allsopp, review by Florian Angeletti)
-
#13089: Fix bug in
runtime_events
library which could result in garbled output under Windows. (B. Szilvasy, review by Nicolás Ojeda Bär and Miod Vallat) -
#13088: A few type-checker behaviors look at a type to see if there are any labeled arguments in it. This sometimes required expansion, which could, in obscure scenarios, result in superfluous type errors. (Richard Eisenberg, review by Gabriel Scherer and Jacques Garrigue)
-
#13103: FreeBSD/amd64: properly annotate .o files with non-executable stack notes (Konstantin Belousov, review by Nicolás Ojeda Bär)
-
#13150: improve a transitive-closure computation algorithm in the flambda middle-end to avoid a compilation time blowup on Menhir-generated code (Florian Weimer, review by Gabriel Scherer and Pierre Chambart, report by Richard Jones)
-
#13166: Fix a MinGW/MSVC Sys.rename regression on renaming a parent directory to an empty child directory. (Jan Midtgaard, review by Antonin Décimo, Sébastien Hinderer, and David Allsopp)
-
#13185, #13192: Reject type-level module aliases on functor parameter inside signatures. (Jacques Garrigue, report by Richard Eisenberg, review by Florian Angeletti)
-
#13170: Fix a bug that would result in some floating alerts
[@@@alert ...]
incorrectly triggering Warning 53. (Nicolás Ojeda Bär, review by Chris Casinghino and Florian Angeletti) -
#13203: Do not issue warning 53 if the compiler is stopping before attributes have been accurately marked. (Chris Casinghino, review by Florian Angeletti)
-
#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)
-
#13209: Fix configure test that checks whether
ar
supports@FILE
arguments. (Nicolás Ojeda Bär, report by Boris D.) -
#13221: Compute more accurate instruction sizes for branch relocation on POWER. (Miod Vallat, review by Gabriel Scherer)
-
#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)
-
#13247: Disable lib_unix/kill test for MacOS AMD64 with TSan, linking to llvm bug report causing infinite signal loops. (Tim McGilchrist, review by Olivier Nicole, Miod Vallat, Sébastien Hinderer and Gabriel Scherer)
-
#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)
-
#13273: Fix a call to test in configure.ac that was causing errors when LDFLAGS contains several words. (Stéphane Glondu, review by Miod Vallat)
-
#13290: Fix uninitialized and out of bounds reads in runtime_events_consumer.c (Edwin Török, review by Miod Vallat and Antonin Décimo)
-
#13306: An algorithm in the type-checker that checks two types for equality could sometimes, in theory, return the wrong answer. This patch fixes the oversight. No known program triggers the bug. (Richard Eisenberg, review by Florian Angeletti)
-
#13400: Initialize th->signal_stack to avoid free of uninitialized data if the user calls caml_c_thread_unregister on the main thread. (Richard W.M. Jones, review by Guillaume Munch-Maccagnoni 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) -
#13263, #13560: fix printing true and false in toplevel and error messages (no more unexpected #true) (Florian Angeletti, report by Samuel Vivien, review by Gabriel Scherer)
-
#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) -
#13408: Fix misplaced debug runtime assertion triggerable by a race between domain exit and backup thread (Miod Vallat and Gabriel Scherer, report by Jan Midtgaard)
-
#13417:
Filename.quote_command
: fix handling of forward slashes in program path under Win32. (Nicolás Ojeda Bär, review by David Allsopp and Damien Doligez) -
#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)
-
#13502: Fix misindexing related to
Gc.finalise_last
that could prevent finalisers from being run. (Nick Roberts, review by Mark Shinwell) -
#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)
-
#13391, #13551: fix a printing bug with
-dsource
when using raw literal inside a locally abstract type constraint (i.e.let f: type \#for. ...
) (Florian Angeletti, report by Nick Roberts, review by Richard Eisenberg) -
#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)
-
#13541, #13591: Fix headers for C++ inclusion. (Antonin Décimo, review by Nick Barnes, report by Kate Deplaix)
-
#13579, #13583: Unsoundness involving non-injective types + gadts (Jacques Garrigue, report by @v-gb, review by Richard Eisenberg and 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)
-
#13603, #13604: fix source printing in the presence of the escaped raw identifier
\#mod
. (Florian Angeletti, report by Chris Casinghino, review by Gabriel Scherer)
We are excited to share the release of OCaml-LSP 1.20.1, which introduces powerful new features and vital bug fixes to improve your development workflow. The new typeSearch
request allows you to find values by type signature or polarity, making it easier to locate the functionality you need. Configurable MerlinJump
actions and the custom jump
request give you more control over code navigation. On the bug fix side, we have tackled issues like file descriptor leaks, enhanced method completion, and cleaned up duplicate responses in selectionRange
.
See full changelog
Features
- Add custom
ocamllsp/typeSearch
request (#1369) - Make MerlinJump code action configurable (#1376)
- Add custom
ocamllsp/jump
request (#1374)
Fixes
- Deactivate the jump code actions by default. Clients can enable them with the
merlinJumpCodeActions
configuration option. Alternatively, a custom request is provided for ad hoc use of the feature. (#1411) - Fix FD leak in running external processes for preprocessing (#1349)
- Fix prefix parsing for completion of object methods (#1363, fixes #1358)
- Remove some duplicates in the
selectionRange
answers (#1368)
This release introduces Merlin 5.3-502, compatible with OCaml 5.2, and 4.18-414, compatible with OCaml 4.14. Key updates include EXCLUDE_QUERY_DIR
for better file management, resolving exceptions in polarity search,
and stabilizing type-enclosing results. For users of 5.3-502, additional enhancements address path resolution issues, fixes jump to fun
functionality, and ensure proper handling of occurrences from hidden source files.
See full changelog
-
merlin binary
-
merlin binary (only in 5.3-502)
The release of OCaml 5.3.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 candidate contains a regression fix in the type system (some type expressions were not generalized when they ought to be), one fix for the new check for dependency order at link time, and a manual update.
The full change log for OCaml 5.3.0 is available on GitHub. A short summary of the changes since the second beta release is also available below.
Installation Instructions
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~rc1
The source code for the release candidate is also directly available on:
Fine-Tuned Compiler Configuration
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~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.3.0~rc1+flambda+nffa ocaml-variants.5.3.0~rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array
All available options can be listed with opam search ocaml-option
.
See full changelog
Changes since the second beta
Type system
- #13690: some type expressions were incorrectly not generalized (because they were assigned to the wrong level pool)
Documentation
- #13666: Rewrite parts of the example code around nested lists in Chapter 6 (Polymorphism and its limitations -> Polymorphic recursion) giving the "depth" function [in the non-polymorphically-recursive part of the example] a much more sensible behavior; also fix a typo and some formatting. (Frank Steffahn, review by Florian Angeletti)
Compiler user-interface and warnings:
The Dune team is happy to announce the release of Dune 3.17.1!
This patch release includes some bug fixes. To reduce computing time, it does
not build .cmxs
files anymore when the (no_dynlink)
stanza is used instead.
This behavior also corrects the semantic of the (no_dynlink)
stanza which was
building but not installing .cmxs
files. It does not try to build and install them anymore.
See full changelog
Fixed
-
When a library declares
(no_dynlink)
, then the.cmxs
file for it is no longer built. (#11176, @nojb) -
Fix bug that could result in corrupted file copies by Dune, for example when using the
copy_files#
stanza or thecopy#
action. (@nojb, #11194, fixes #11193) -
Remove useless error message when running
$ dune subst
in empty projects. (@rgrinberg, #11204, fixes #11200)
CHANGES:
Added
- Support OCaml 5.3 (#457, @anmonteiro, @samoht, @voodoos)
- Support multiple version labels in block headers. The block is active if all
the version formulaes are satisfied (#458, @samoht)
Fixed
- Avoid infinite loop in lexer on unclosed code block (#444, @edwintorok)
- Fix support for skipped blocks in mli and mld files (#462, @samoht)
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]