OCaml Changelog

RSS

Official stable release announcements and updates from the OCaml compiler, OCaml infrastructure and the OCaml Platform Tools.

Dune 3.17.0

We're happy to announce the release of Dune 3.17.0.

Among the list of chances, this release enables the Dune cache by default for known-safe operations, adds support for Wasm_of_ocaml, adds support for the -H compiler flag introduced in OCaml 5.2 and allows specifying code hosting services like Codeberg or Gitlab organizations.

See full changelog

Fixed

  • Show the context name for errors happening in non-default contexts. (#10414, fixes #10378, @jchavarri)

  • Correctly declare dependencies of indexes so that they are rebuilt when needed. (#10623, @voodoos)

  • Don't depend on coq-stdlib being installed when expanding variables of the coq.version family (#10631, fixes #10629, @gares)

  • Error out if no files are found when using copy_files. (#10649, @jchavarri)

  • Re_export dune-section private library in the dune-site library stanza, in order to avoid failure when generating and building sites modules with implicit_transitive_deps = false. (#10650, fixes #9661, @MA0100)

  • Expect test fixes: support multiple modes and fix dependencies when there is a custom runner (#10671, @vouillon)

  • In a (library) stanza with (extra_objects) and (foreign_stubs), avoid double linking the extra object files in the final executable. (#10783, fixes #10785, @nojb)

  • Map (re_export) library dependencies to the exports field in META files, and vice-versa. This field was proposed in to https://discuss.ocaml.org/t/proposal-a-new-exports-field-in-findlib-meta-files/13947. The field is included in Dune-generated META files only when the Dune lang version is >= 3.17. (#10831, fixes #10830, @nojb)

  • Fix staged pps preprocessors on Windows (which were not working at all previously) (#10869, fixes #10867, @nojb)

  • Fix dune describe when an executable is disabled with enabled_if. (#10881, fixes #10779, @moyodiallo)

  • Fix an issue where C stubs would be rebuilt whenever the stderr of Dune was redirected. (#10883, fixes #10882, @nojb)

  • Fix the URL opened by the command dune ocaml doc. (#10897, @gridbugs)

  • Fix the file referred to in the error/warning message displayed due to the dune configuration version not supporting a particular configuration stanza in use. (#10923, @H-ANSEN)

  • Fix enabled_if when it uses env variable. (#10936, fixes #10905, @moyodiallo)

  • Fix exec -w for relative paths with --root argument (#10982, @gridbugs)

  • Do not ignore the (locks ..) field in the test and tests stanza (#11081, @rgrinberg)

  • Tolerate files without extension when generating merlin rules. (#11128, @anmonteiro)

Added

  • Make Merlin/OCaml-LSP aware of "hidden" dependencies used by (implicit_transitive_deps false) via the -H compiler flag. (#10535, @voodoos)

  • Add support for the -H flag (introduced in OCaml compiler 5.2) in dune (requires lang versions 3.17). This adaptation gives the correct semantics for (implicit_transitive_deps false). (#10644, fixes #9333, ocsigen/tyxml#274, #2733, #4963, @MA0100)

  • Add support for specifying Gitlab organization repositories in source stanzas (#10766, fixes #6723, @H-ANSEN)

  • New option to control jsoo sourcemap generation in env and executable stanza (#10777, fixes #10673, @hhugo)

  • One can now control jsoo compilation_mode inside an executable stanza (#10777, fixes #10673, @hhugo)

  • Add support for specifying default values of the authors, maintainers, and license stanzas of the dune-project file via the dune config file. Default values are set using the (project_defaults) stanza (#10835, @H-ANSEN)

  • Add names to source tree events in performance traces (#10884, @jchavarri)

  • Add codeberg as an option for defining project sources in dune-project files. For example, (source (codeberg user/repo)). (#10904, @nlordell)

  • dune runtest can now run individual tests with dune runtest mytest.t (#11041, @Alizter).

  • Wasm_of_ocaml support (#11093, @vouillon)

  • Add a coqdep_flags field to the coq field of the env stanza, and to the coq.theory stanza, allowing to configure coqdep flags. (#11094, @rlepigre)

Changed

  • Remove all remnants of the experimental patch-back-source-tree. (#10771, @rgrinberg)

  • Change the preset value for author and maintainer fields in the dune-project file to encourage including emails. (#10848, @punchagan)

  • Tweak the preset value for tags in the dune-project file to hint at topics not having a special meaning. (#10849, @punchagan)

  • Change some colors to improve readability in light-mode terminals (#10890, @gridbugs)

  • Forward the linkall flag to jsoo in whole program compilation as well (#10935, @hhugo)

  • Configurator uses pkgconf as pkg-config implementation when available and forwards it the target of ocamlc -config. (#10937, @pirbo)

  • Enable Dune cache by default. Add a new Dune cache setting enabled-except-user-rules, which enables the Dune cache, but excludes user-written rules from it. This is a conservative choice that can avoid breaking rules whose dependencies are not correctly specified. This is the current default. (#10944, #10710, @nojb, @ElectreAAS)

  • Do not add dune dependency in dune-project when creating projects with dune init proj. The Dune dependency is implicitely added when generating opam files (#11129, @Leonidas-from-XIV)

We have the pleasure of announcing the release of OCaml 5.2.1, dedicated to the memory of Niels Bohr and Paul Éluard on the anniversary of their deaths.

OCaml 5.2.1 is a collection of safe but import runtime time bug fixes backported from the 5.3 branch of OCaml.

The full list of changes is available above for more details.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands:

opam update
opam switch create 5.2.1

The source code for the release is also directly available on:

See full changelog

Changes Since OCaml 5.2.0

Runtime System:

  • #13207: Be sure to reload the register caching the exception handler in caml_c_call and caml_c_call_stack_args, as its value may have been changed if the OCaml stack is expanded during a callback. (Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and Xavier Leroy)

  • #13252: Rework register assignment in the interpreter code on m68k on Linux, due to the %a5 register being used by GLIBC. (Miod Vallat, report by Stéphane Glondu, review by Gabriel Scherer and Xavier Leroy)

  • #13268: Fix a call to test in configure.ac that was causing errors when LDFLAGS contains several words. (Stéphane Glondu, review by Miod Vallat)

  • #13234, #13267: Open runtime events file in read-write mode on ARMel (ARMv5) systems due to atomic operations limitations on that platform. (Stéphane Glondu, review by Miod Vallat and Vincent Laviron)

  • #13188: fix races in the FFI code coming from the use of Int_val(...) on rooted values inside blocking questions / without the runtime lock. (Calling Int_val(...) on non-rooted immediates is fine, but any access to rooted values must be done outside blocking sections / with the runtime lock.) (Etienne Millon, review by Gabriel Scherer, Jan Midtgaard, Olivier Nicole)

  • #13318: Fix regression in GC alarms, and fix them for Flambda. (Guillaume Munch-Maccagnoni, report by Benjamin Monate, review by Vincent Laviron and Gabriel Scherer)

  • #13140: POWER back-end: fix issue with call to caml_call_realloc_stack from a DLL (Xavier Leroy, review by Miod Vallat)

  • #13370: Fix a low-probability crash when calling Gc.counters. (Demi Marie Obenour, review by Gabriel Scherer)

  • #13402, #13512, #13549, #13553: Revise bytecode implementation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat)

  • #13502: Fix misindexing related to Gc.finalise_last that could prevent finalisers from being run. (Nick Roberts, review by Mark Shinwell)

  • #13520: Fix compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by Sébastien Hinderer and Miod Vallat)

opam 2.3.0

Feedback on this post is welcomed on Discuss!

As mentioned in our talk at the OCaml Workshop 2024, we decided to switch to a time-based release cycle (every 6 months), starting with opam 2.3.

As promised, we are very pleased to announce the release of opam 2.3.0, and encourage all users to upgrade. Please read on for installation and upgrade instructions.

Try it!

In case you plan a possible rollback, you may want to first backup your ~/.opam or $env:LOCALAPPDATA\opam directory.

The upgrade instructions are unchanged:

  1. Either from binaries: run

For Unix systems

bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh)"

or from PowerShell for Windows systems

Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) }"

or download manually from the Github "Releases" page to your PATH.

  1. Or from source, manually: see the instructions in the README.

You should then run:

opam init --reinit -ni

Major breaking change: extra-files

When loading a repository, opam now ignores files in packages' files/ directories which aren't listed in the extra-files field of the opam file. This was done to simplify the opam specification where we hope the opam file to be the only thing that you have to look at when reading a package specification. It being optional to list all files in the extra-files: field went against that principle. This change also reduces the surface area for potential file corruption as all extra-files must have checksums.

This is a breaking change and means that if you are using the files/ directory without listing them in the extra-files: field, you need to make sure that all files in that directory are included in the extra-files field. The resulting opam file remains compatible with all previous opam 2.x releases.

If you have an opam repository, you should make sure all files are listed so every packages continues to work without any issue, which can be done automatically using the opam admin update-extrafiles command.

Major changes

  • Packages requiring an unsupported version of opam are now marked unavailable, instead of causing a repository error. This means an opam repository can now allow smoother upgrade in the future where some packages can require a newer version of opam without having to fork the repository to upgrade every package to that version as was done for the upgrade from opam 1.2 to 2.0

  • Add a new opam list --latests-only option to list only the latest versions of packages. Note that this option respects the order options were given on the command line. For example: --available --latests-only will first list all the available packages, then choose only the latest packages in that set; while --latests-only --available will first list all the latest packages, then only show the ones that are available in that set

  • Fix and improve opam install --check, which now checks if the whole dependency tree of the package is installed instead of only the root dependencies

  • Add a new --verbose-on option to enable verbose output for specified package names. Thanks to @desumn for this contribution

  • Add a new opam switch import --deps-only option to install only the dependencies of the root packages listed in the opam switch export file

  • opam switch list-available no longer displays compilers flagged with avoid-version/deprecated unless --all is given, meaning that pre-release or unreleased OCaml packages no longer appear to be the latest version

  • opam switch create --repositories now correctly infers --kind=git for URLs ending with .git rather than requiring the git+https:// protocol. This is consistant with other commands such as opam repository add. Thanks to @Keryan-dev for this contribution

  • opam switch set-invariant now displays the switch invariant using the same syntax as the --formula flag

  • The builtin-0install solver was improved and should now be capable of being your default solver instead of builtin-mccs+glpk. It was previously mostly only suited for automated tasks such as Continuous Integration. If you wish to give it a try, simply calling opam option solver=builtin-0install (call opam option solver= restores the default)

  • Most of the unhelpful conflict messages were fixed. (#4373)

  • Fix an opam 2.1 regression where the initial pin of a local VCS directory would store untracked and ignored files. Those files would usually be cleaned before building the package, however git submodules would not be cleaned and would cause issues when paired with the new behaviour added in 2.3.0~alpha1 which makes opam error when git submodules fail to update (it was previously a warning). (#5809)

  • Fix the value of the arch variable when the current OS is 32bit on a 64bit machine (e.g. Raspberry Pi OS). (#5949)

  • opam now fails when git submodules fail to update instead of ignoring the error and just showing a warning

  • opam's libraries now compile with OCaml >= 5.0 on Windows

  • Fix the installed packages internal cache, which was storing the wrong version of the opam file after a build failure. This could be triggered easily for users with custom repositories with non-populated extra-files. (#6213)

  • Several improvements to the pre-built release binaries were made:

    • The Linux binaries are now built on Alpine 3.20
    • The FreeBSD binary is now built on FreeBSD 14.1
    • The OpenBSD binary is now built on OpenBSD 7.6 and loses support for OpenBSD 7.5 and earlier
    • Linux/riscv64 and NetBSD/x86_64 binaries are now available

And many other general, performance and UI improvements were made and bugs were fixed. You can take a look to previous blog posts. API changes and a more detailed description of the changes are listed in:

This release also includes PRs improving the documentation and improving and extending the tests.

Please report any issues to the bug-tracker.

We hope you will enjoy the new features of opam 2.3!

Dune 3.16.1

We're happy to announce the release of Dune 3.16.1.

This is a patch release that fixes an issue with OCaml.5.3.0 and C++ flags.

See full changelog

Fixed

  • Call the C++ compiler with -std=gnu++11 when using OCaml >= 5.0 (#10962, @kit-ty-kate)

    Added

We are happy to announce the joint release of Merlin 5.2.1-502 and 4.17.1. This release adds many new features to Merlin including the ability to add hints to a source tree, serch for values using a type signature and expanding PPX annotations to preview their source code. There are also bug fixes for both the Merlin binary and editor modes.

More information can be found in the Discuss announcement.

Contributions are always welcome at Merlin | Issues

See full changelog
  • merlin binary
    • A new WRAPPING_PREFIX configuration directive that can be used to tell Merlin what to append to the current unit name in the presence of wrapping (ocaml/merlin#1788)
    • Add -unboxed-types and -no-unboxed-types as OCaml ignored flags (ocaml/merlin#1795, fixes ocaml/merlin#1794)
    • Destruct: Refinement in the presence of optional arguments (ocaml/merlin#1800 ocaml/merlin#1807, fixes ocaml/merlin#1770)
    • Implement new expand-node command for expanding PPX annotations (ocaml/merlin#1745)
    • Implement new inlay-hints command for adding hints on a source tree (ocaml/merlin#1812)
    • Implement new search-by-type command for searching values by types (ocaml/merlin#1828)
    • Canonicalise paths in occurrences. This helps deduplicate the results and
    • Show more user-friendly paths. (ocaml/merlin#1840)
    • Fix dot-merlin-reader ignoring SOURCE_ROOT and STDLIB directives (ocaml/merlin#1839, ocaml/merlin#1803)
  • editor modes
    • Vim:
      • Fix Python-3.12 syntax warnings in merlin.py (ocaml/merlin#1798)
      • Dead code / doc removal for previously deleted MerlinPhrase command (ocaml/merlin#1804)
    • Emacs:
      • Improve the way that result of polarity search is displayed (#1814)
      • Add merlin-search-by-type, merlin-search-by-polarity and change the behaviour of merlin-search to switch between by-type or by-polarity depending on the query (ocaml/merlin#1828)

Odoc 2.4.3

We're happy to announce the release of Odoc 2.4.3!

This release includes three key fixes: we restored missing KaTeX headers for proper mathematical rendering, resolved an issue where ][ characters in code blocks were incorrectly interpreted as "code blocks with result" (now requiring explicit delimiters), and corrected the misprinting of type variables from ML files in OCaml 4.14 and later versions where multiple instances of the same type variable could be displayed with different names.

See full changelog

Fixed

  • Fix missing katex headers (@panglesd, #1096)
  • Allow ][ in code blocks, fixing issue #1137 (@Julow, #1149)
    This was interpreted as "code blocks with result", which now mandates a
    delimiter: {delim@lang[ code ]delim[ result ]}
  • Fix misprinting of type variables from ml files for OCaml 4.14 and later
    (multiple occurences of the same type variable could be named differently)
    (@Octachron, #1173)

opam 2.2.1

Feedback on this post is welcomed on Discuss!

We are pleased to announce the release of opam 2.2.1.

We've fixed a couple of regressions and would like to encourage users of opam 2.2 to upgrade.

Changes

The three main changes are:

  • Fixe a regression in opam install --deps-only where the direct dependencies were not set as root packages (spotted in the wild by @rjbou and also reported on Discuss)
  • Fix a regression when fetching Git packages where the resulting Git repository could lead to unexpected outputs of Git commands, by disabling shallow clone by default except when fetching opam repositories (#6145)
  • Mitigate curl/curl#13845 by falling back from --write-out to --fail if exit code 43 is returned by Curl. In particular, this fixes opam init when run from cmd/PowerShell on Windows 11 23H2 (#6120)

A couple more improvements and additions to the testsuite were made. You can view the full list of changes in the release note.

Try it!

The upgrade instructions are unchanged:

  1. Either from binaries: run

For Unix systems

bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.2.1"

or from PowerShell for Windows systems

Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) }"

(or via winget upgrade OCaml.opam) or download manually from the Github "Releases" page to your PATH.

  1. 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!

We are pleased to announce the release of OCaml LSP 1.19.0. This version brings official support for OCaml 5.2. It also includes a new custom query to get

documentation and a fix regarding the handling of OCamlFormat processes.

See full changelog

Features

Fixes

  • Kill unnecessary OCamlFormat processes with sigterm rather than sigint or sigkill (ocaml/ocaml-lsp#1343)

The Ppxlib dev team is happy to announce the release of ppxlib.0.33.0.

This release's main feature is a series of improvement to flags controlling unused value/module/type warnings silencing. The ppxlib driver generates warning silencing items to prevent [@@deriving ...] generated code to trigger unused code warnings. Three warnings are disabled that way:

  • Warning 32: unused value
  • Warning 60: unused module
  • Warning 34: unused type The first two are disabled for values and modules generated by the deriver while the third is disabled for the types in the type declaration to which the [@@deriving ...] attribute is attached. This feature was added a long time ago to avoid manually disabling those warnings when working with derivers that generate a set of values and modules only to use a subset of those. Alternatively, the unused type warning silencing was added to allow defining an alias type only to be consumed by a deriver (e.g., type error = [`Not_found | `Invalid_arg] [@@deriving to_string]). We since then believe that we should not disable warnings lightly, as this behaviour makes it difficult to find and remove deadcode. The right approach in those situations should be to fix the PPX derivers so that they are more configurable and can be used without triggering such warnings. We will start to move toward removing this feature, but since it is still useful in some places, we came up with a plan to do this iteratively. In ppxlib.0.31.0 we added the -unused-code-warnings driver flag and the ?unused_code_warnings Deriving.V2.make optional argument to control whether to silence Warnings 32 and 60. When both are set to true, by the user and the deriver authors, the warnings are not silenced. As of ppxlib.0.33.0, these also control the silencing of Warning 34 (unused type). force can now be passed to the -unused-code-warnings flag in order to disable warnings silencing, regardless of the derivers opting in. This allows users to test whether their codebase and their set of derivers rely on warning silencing or not and to use those results to eliminate deadcode and/or report issues upstream to the derivers they use. We also added a separate -unused-type-warnings flag that works similarly to -unused-code-warnings (i.e., depends on the value of the ?unused_code_warnings argument), but it only controls Warning 34 silencing, as it turns out it is less likely to cause unwanted warnings than with the other two. This will allow users to disable it more easily, without having to deal with Warnings 32 and 60 straight away. We want to encourage users to try those on their codebase in order to see the impact it has. Did you have deadcode lying around that slipped past undetected? Does this trigger unwanted warnings because of deriver's generated code? The plan is to give the ecosystem some time to try those features and adapt by fixing individual derivers and flipping setting ?unused_code_warnings to true as they do. After a while, we will swap the default value of the driver flag to true so that only derivers that haven't opted in will enable warning silencing. Then as time goes we will swap the default of the Deriving.make argument so that derivers will instead have to explicitly opt out to get the warning silencing. Finally, once we are confident the ecosystem is in a good enough state, we will remove this feature altogether.

ppxlib.0.33.0 also comes with a couple of new features for PPX authors:

  • A couple new Ast_builder functions: elist_tail and plist_tail that can be used to build list expressions and patterns with a custom tail: elist_tail [expr1; expr2] tail_expr returns the expression for expr1::expr2::tail_expr.
  • Context_free.special_function', a new version of special_function that allows passing a Longident.t directly rather that relying on parsing the string argument to a Longident.t.

Finally, the release includes a few bug fixes to Longident.parse and Code_path.main_module_name and fixes the location-check flag so it is not required to also pass -check to enable location checks. It also fixes the 5.2 migrations locations, as we used to build nodes with inconsistent locations when migrating Pexp_function nodes.

We would like to thank our external contributors who have been a huge part of this release: @octachron, @vg-b, and @jchavarri, and a special mention to @mbarbin, who has not only contributed a lot to the warning silencing features but has been extensively testing and providing very useful feedback on them.

And of course, as usual, we'd like to thank the OCaml Software Foundation who has been funding my work on Ppxlib and on this release, making all of this possible!

See full changelog
  • Fix a bug where Code_path.main_module_name would not properly remove extensions from the filename and therefore return an invalid module name. (#512, @NathanReb)

  • Add -unused-type-warnings flag to the driver to allow users to disable only the generation of Warning 34 silencing structure items when using [@@deriving ...] on type declarations. (#511, @mbarbin, @NathanReb)

  • Make the -unused-code-warnings driver flag also control Warning 34 silencing for type declarations with [@@deriving ...] attached. (#510, @mbarbin, @NathanReb)

  • Add -unused-code-warnings=force driver command-line flag argument. (#490, @mbarbin)

  • Add new functions Ast_builder.{e,p}list_tail that take an extra tail expression/pattern argument parameter compared to Ast_builder.{e,p}list, so they can build ASTs like a :: b :: c instead of only [ a; b ]. (#498, #502, @v-gb, @NathanReb)

  • Fix Longident.parse so it also handles indexing operators such as .!(), .%(;..)<-, or Vec.(.%()) (#494, @octachron)

  • Add a special_function' variant that directly takes a Longident.t argument in order to avoid the issue with Longident.t covering distinct syntactic classes that cannot be easily parsed by a common parser (#496, @octachron).

  • Keep location ranges consistent when migrating Pexp_function nodes from 5.2+ to older versions (#504, @jchavarri)

  • Fix -locations-check behaviour so it is no longer required to pass -check and can enable location checks. (#506, @NathanReb)

We are pleased to announce the release of OCaml LSP 1.18.0. This version comes with a lot of fixes and new features.

Notable features that are included in this release are:

  • Improved hover behavior with less noisy hovers on some parse tree nodes such as keywords, comments, etc., along with support for hovering over PPX annotations and preview the generated code.
  • Some additional custom queries, particularly TypeEnclosing
  • Folding ifthenelse expressions
  • A new configuration option to control Dune diagnostics
  • Improved document symbols

...and many fixes to a handful of issues.

Feedback is very much welcomed on the the Discuss Announcement post and do not hesistate to report issues in the issue tracker.

See full changelog

Features

  • Introduce a configuration option to control Dune diagnostics. The option is called duneDiganostics, and it may be set to { enable: false } to disable diagnostics. (ocaml/ocaml-lsp#1221)

  • Support folding of ifthenelse expressions (ocaml/ocaml-lsp#1031)

  • Improve hover behavior (ocaml/ocaml-lsp#1245)

    Hovers are no longer displayed on useless parse tree nodes such as keywords, comments, etc.

    Multiline hovers are now filtered away.

    Display expanded PPXs in the hover window.

  • Improve document symbols (ocaml/ocaml-lsp#1247)

    Use the parse tree instead of the typed tree. This means that document symbols will work even if the source code doesn't type check.

    Include symbols at arbitrary depth.

    Differentiate functions / types / variants / etc.

    This now includes PPXs like let%expect_test or let%bench in the outline.

  • Introduce a destruct-line code action. This is an improved version of the old destruct code action. (ocaml/ocaml-lsp#1283)

  • Improve signature inference to only include types for elements that were absent from the signature. Previously, all signature items would always be inserted. (ocaml/ocaml-lsp#1289)

  • Add an update-signature code action to update the types of elements that were already present in the signature (ocaml/ocaml-lsp#1289)

  • Add custom ocamllsp/merlinCallCompatible request (ocaml/ocaml-lsp#1265)

  • Add custom ocamllsp/typeEnclosing request (ocaml/ocaml-lsp#1304)

Fixes

  • Detect document kind by looking at Merlin's suffixes config.

    This enables more LSP features for non-.ml/.mli files. Though it still depends on Merlin's support. (ocaml/ocaml-lsp#1237)

  • Correctly accept the --clientProcessId flag. (ocaml/ocaml-lsp#1242)

  • Disable automatic completion and signature help inside comments (ocaml/ocaml-lsp#1246)

  • Includes a new optional/configurable option to toggle syntax documentation. If toggled on, allows display of syntax documentation on hover tooltips. Can be controlled via environment variables and by GUI for VS code. (ocaml/ocaml-lsp#1218)

  • For completions on labels that the LSP gets from Merlin, take into account whether the prefix being completed starts with ~ or ?. Change the label completions that start with ? to start with ~ when the prefix being completed starts with ~. (ocaml/ocaml-lsp#1277)

  • Fix document syncing (ocaml/ocaml-lsp#1278, ocaml/ocaml-lsp#1280, fixes ocaml/ocaml-lsp#1207)

  • Stop generating inlay hints on generated code (ocaml/ocaml-lsp#1290)

  • Fix parenthesising of function types in SignatureHelp (ocaml/ocaml-lsp#1296)

  • Fix syntax documentation rendering (ocaml/ocaml-lsp#1318)

opam 2.2.0

Feedback on this post is welcomed on Discuss!

We are very pleased to announce the release of opam 2.2.0, and encourage all users to upgrade. Please read on for installation and upgrade instructions.

Try it!

In case you plan a possible rollback, you may want to first backup your ~/.opam or $env:LOCALAPPDATA\opam directory.

The upgrade instructions are unchanged:

  1. Either from binaries: run

For Unix systems

bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.2.0"

or from PowerShell for Windows systems

Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) }"

or download manually from the Github "Releases" page to your PATH.

  1. Or from source, manually: see the instructions in the README.

You should then run:

opam init --reinit -ni

Changes

Major change: Windows support

After 8 years' effort, opam and opam-repository now have official native Windows support! A big thank you is due to Andreas Hauptmann (@fdopen), whose WODI and OCaml for Windows projects were for many years the principal downstream way to obtain OCaml on Windows, Jun Furuse (@camlspotter) whose initial experimentation with OPAM from Cygwin formed the basis of opam-repository-mingw, and, most recently, Jonah Beckford (@jonahbeckford) whose DkML distribution kept - and keeps - a full development experience for OCaml available on Windows.

OCaml when used on native Windows requires certain tools from the Unix world which are provided by either Cygwin or MSYS2. We have engineered opam init so that it is possible for a user not to need to worry about this, with opam managing the Unix world, and the user being able to use OCaml from either the Command Prompt or PowerShell. However, for the Unix user coming over to Windows to test their software, it is also possible to have your own Cygwin/MSYS2 installation and use native Windows opam from that. Please see the previous blog post for more information.

There are two "ports" of OCaml on native Windows, referred to by the name of provider of the C compiler. The mingw-w64 port is GCC-based. opam's external dependency (depext) system works for this port (including providing GCC itself), and many packages are already well-supported in opam-repository, thanks to the previous efforts in opam-repository-mingw. The MSVC port is Visual Studio-based. At present, there is less support in this ecosystem for external dependencies, though this is something we expect to work on both in opam-repository and in subsequent opam releases. In particular, it is necessary to install Visual Studio or Visual Studio BuildTools separately, but opam will then automatically find and use the C compiler from Visual Studio.

Major change: opam tree / opam why

opam tree is a new command showing packages and their dependencies with a tree view. It is very helpful to determine which packages bring which dependencies in your installed switch.

$ opam tree cppo
cppo.1.6.9
├── base-unix.base
├── dune.3.8.2 (>= 1.10)
│   ├── base-threads.base
│   ├── base-unix.base [*]
│   └── ocaml.4.14.1 (>= 4.08)
│       ├── ocaml-base-compiler.4.14.1 (>= 4.14.1~ & < 4.14.2~)
│       └── ocaml-config.2 (>= 2)
│           └── ocaml-base-compiler.4.14.1 (>= 4.12.0~) [*]
└── ocaml.4.14.1 (>= 4.02.3) [*]

Reverse-dependencies can also be displayed using the new opam why command. This is useful to examine how dependency versions get constrained.

$ opam why cmdliner
cmdliner.1.2.0
├── (>= 1.1.0) b0.0.0.5
│   └── (= 0.0.5) odig.0.0.9
├── (>= 1.1.0) ocp-browser.1.3.4
├── (>= 1.0.0) ocp-indent.1.8.1
│   └── (>= 1.4.2) ocp-index.1.3.4
│       └── (= version) ocp-browser.1.3.4 [*]
├── (>= 1.1.0) ocp-index.1.3.4 [*]
├── (>= 1.1.0) odig.0.0.9 [*]
├── (>= 1.0.0) odoc.2.2.0
│   └── (>= 2.0.0) odig.0.0.9 [*]
├── (>= 1.1.0) opam-client.2.2.0~alpha
│   ├── (= version) opam.2.2.0~alpha
│   └── (= version) opam-devel.2.2.0~alpha
├── (>= 1.1.0) opam-devel.2.2.0~alpha [*]
├── (>= 0.9.8) opam-installer.2.2.0~alpha
└── user-setup.0.7

Special thanks to @cannorin for contributing this feature.

Major change: with-dev-setup

There is now a way for a project maintainer to share their project development tools: the with-dev-setup dependency flag. It is used in the same way as with-doc and with-test: by adding a {with-dev-setup} filter after a dependency. It will be ignored when installing normally, but it's pulled in when the package is explicitly installed with the --with-dev-setup flag specified on the command line.

For example

opam-version: "2.0"
depends: [
  "ocaml"
  "ocp-indent" {with-dev-setup}
]
build: [make]
install: [make "install"]
post-messages:
[ "Thanks for installing the package"
  "as well as its development setup. It will help with your future contributions" {with-dev-setup} ]

Major change: opam pin --recursive

When pinning a package using opam pin, opam looks for opam files in the root directory only. With recursive pinning, you can now instruct opam to look for .opam files in subdirectories as well, while maintaining the correct relationship between the .opam files and the package root for versioning and build purposes.

Recursive pinning is enabled by the following options to opam pin and opam install:

  • With --recursive, opam will look for .opam files recursively in all subdirectories.
  • With --subpath <path>, opam will only look for .opam files in the subdirectory <path>.

The two options can be combined: for instance, if your opam packages are stored as a deep hierarchy in the mylib subdirectory of your project you can try opam pin . --recursive --subpath mylib.

These options are useful when dealing with a large monorepo-type repository with many opam libraries spread about.

New Options

  • opam switch -, inspired by git switch -, makes opam switch back to the previously selected global switch.

  • opam pin --current fixes a package to its current state (disabling pending reinstallations or removals from the repository). The installed package will be pinned to its current installed state, i.e. the pinned opam file is the one installed.

  • opam pin remove --all removes all the pinned packages from a switch.

  • opam exec --no-switch removes the opam environment when running a command. It is useful when you want to launch a command without opam environment changes.

  • opam clean --untracked removes untracked files interactively remaining from previous packages removal.

  • opam admin add-constraint <cst> --packages pkg1,pkg2,pkg3 applies the given constraint to a given set of packages

  • opam list --base has been renamed into --invariant, reflecting the fact that since opam 2.1 the "base" packages of a switch are instead expressed using a switch invariant.

  • opam install --formula <formula> installs a formula instead of a list of packages. This can be useful if you would like to install one package or another one. For example opam install --formula '"extlib" |"extlib-compat"' will install either extlib or extlib-compat depending on what's best for the current switch.

Miscellaneous changes

  • The UI now displays a status when extracting an archive or reloading a repository
  • Overhauled the implementation of opam env, fixing many corner cases for environment updates and making the reverting of package environment variables precise. As a result, using setenv in an opam file no longer triggers a lint warning.
  • Fix parsing pre-opam 2.1.4 switch import files containing extra-files
  • Add a new sys-ocaml-system default global eval variable
  • Hijack the "%{var?string-if-true:string-if-false-or-undefined}%" syntax to support extending the variables of packages with + in their name (conf-c++ and conf-g++ already exist) using "%{?pgkname:var:}%"
  • Fix issues when using fish as shell
  • Sandbox: Mark the user temporary directory (as returned by getconf DARWIN_USER_TEMP_DIR) as writable when TMPDIR is not defined on macOS
  • Add Warning 69: Warn for new syntax when package name in variable in string interpolation contains several '+' (this is related to the "hijack" item above)
  • Add support for Wolfi OS, treating it like Alpine family as it also uses apk
  • Sandbox: /tmp is now writable again, restoring POSIX compliance
  • Add a new opam admin: new add-extrafiles command to add/check/update the extra-files: field according to the files present in the files/ directory
  • Add a new opam lint -W @1..9 syntax to allow marking a set of warnings as errors
  • Fix bugs in the handling of the OPAMCURL, OPAMFETCH and OPAMVERBOSE environment variables
  • Fix bugs in the handling of the --assume-built argument
  • Software Heritage fallbacks is now supported, but is disabled-by-default for now. For more information you can read one of our previous blog post

And many other general and performance improvements were made and bugs were fixed. You can take a look to previous blog posts. API changes and a more detailed description of the changes are listed in:

This release also includes PRs improving the documentation and improving and extending the tests.

Please report any issues to the bug-tracker.

We hope you will enjoy the new features of opam 2.2! 📯

We are pleased to announce the release of Merlin 5.1-502. This is an important release that brings a lot of backend changes and a major new feature: project-wide occurrences queries.

Try it by running dune build @ocaml-index (since dune 3.16.0) and performing a reference query!

More information can be found in the discuss announcement and the wiki.

See full changelog
  • merlin binary
    • Support project-wide occurrences queries using index files (ocaml/merlin#1766)
      • The file format is described in library Merlin_lib.index_format
      • Two new configuration directives are introduced:
        • SOURCE_ROOT that is used to resolve relative paths found in the indexes.
        • INDEX that is used to declare the list of index files Merlin should use when looking for occurrences.
    • A new UNIT_NAME configuration directive that can be used to tell Merlin the correct name of the current unit in the presence of wrapping (ocaml/merlin#1776)
    • Perform incremental indexation of the buffer when typing. (ocaml/merlin#1777)
    • merlin-lib.commands: Add a find_command_opt alternative to find_command that does not raise (ocaml/merlin#1778)
    • Prevent uid clashes by not returning PWO for defs located in the current interface file (ocaml/merlin#1781)
    • Reset uid counters when restoring the typer cache so that uids are stable across re-typing (ocaml/merlin#1779)
    • Improve the behavior on occurrences when the cursor is on a label / constructor declaration (ocaml/merlin#1785)
  • editor modes
    • emacs: add basic support for project-wide occurrences (ocaml/merlin#1766)
    • vim: add basic support for project-wide occurrences (ocaml/merlin#1767, @Julow)

Dune 3.16.0

We're happy to announce the release of Dune 3.16.0.

Among the list of chances, this release contains improvements to Melange support and a way to look for references in a whole project using Merlin and OCaml LSP.

See full changelog

Added

  • Allow libraries with the same (name ..) in projects as long as they don't conflict during resolution (via enabled_if). (#10307, @anmonteiro, @jchavarri)

  • dune describe pp now finds the exact module and the stanza it belongs to, instead of guessing the name of the preprocessed file. (#10321, @anmonteiro)

  • Print the result of dune describe pp with the respective dialect printer. (#10322, @anmonteiro)

  • Add new flag --context to dune ocaml-merlin, which allows to select a Dune context when requesting Merlin config. Add dune describe contexts subcommand. Introduce a field generate_merlin_rules for contexts declared in the workspace, that allows to optionally produce Merlin rules for other contexts besides the one selected for Merlin (#10324, @jchavarri)

  • Melange: add include paths for private library .cmj files during JS emission. (#10416, @anmonteiro)

  • dune ocaml-merlin: communicate additional directives SOURCE_ROOT, UNIT_NAME (the actual name with wrapping) and INDEX with the paths to the index(es). (#10422, @voodoos)

  • Add a new alias @ocaml-index that uses the ocaml-index binary to generate indexes that can be read by tools such as Merlin to provide project-wide references search. (#10422, @voodoos)

  • Merlin: add optional (merlin_reader CMD) construct to (dialect) stanza to configure a Merlin reader (#8567, @andreypopp)

Changed

  • Melange: treat private libraries with (package ..) as public libraries, fixing an issue where import paths were wrongly emitted. (#10415, @anmonteiro)

  • Install .glob files for Coq theories too (#10602, @ejgallego)

Fixed

  • Don't try to document nonexistent libraries in doc-new target (#10319, fixes #10056, @jonludlam)

  • Make dune-site's load_all function look for META files so that it doesn't fail on empty directories in the plugin directory (#10458, fixes #10457, @shym)

  • Fix incorrect warning for libraries defined inside nonexistant directories using (subdir ..) and used by executables using dune-build-info (#10525, @rgrinberg)

  • Don't try to take build lock when running coq top --no-build (#10547, fixes #7671, @lzy0505)

  • Make sure to truncate Dune's lock file after locking and unlocking so that users cannot observe incorrect PID's (#10575, @rgrinberg)

  • MDX: link MDX binary with byte_complete. This fixes (libraries) with foreign archives on Linux. (#10586, fixes #10582, @anmonteiro)

  • Virtual libraries: fix an issue where linking an executable involving several virtual libries would cause an error. (#10581, fixes #10460, @rgrinberg)

We are pleased to announce the release of Merlin 4.16-414 and 4.16-501.

These releases expose additional functions for packages using merlin-lib that need to manually parse merlin commands.

See full changelog
  • merlin binary
    • Addition of a merlin-lib.commands library which disassociates the execution of commands from the new_protocol, from the binary, allowing it to be invoked from other projects (ocaml/merlin#1758)
    • merlin-lib.commands: Add a find_command_opt alternative to find_command that does not raise (ocaml/merlin#1778)

We are pleased to announce the release of Merlin 4.15-414 and 4.15-501.

These releases bring a handful of bug fixes and improvements, notably to the destruct feature, that were already released for OCaml 5.2 in Merlin 5.0-502.

See full changelog
  • merlin binary
    • destruct: Removal of residual patterns (ocaml/merlin#1737, fixes ocaml/merlin#1560)
    • Do not erase fields' names when destructing punned record fields (ocaml/merlin#1734, fixes ocaml/merlin#1661)
    • Ignore SIGPIPE in the Merlin server process (ocaml/merlin#1746)
    • Fix lexing of quoted strings in comments (ocaml/merlin#1754, fixes ocaml/merlin#1753)
    • Improve cursor position detection in longidents (ocaml/merlin#1756)

Dune 3.15.3

We just released version 3.15.3 with some bug fixes.

See full changelog

Fixed

  • Fix interpretation of exists_if predicate in META files of installed libraries containing more than one element. (#10564, fixes #10563, @dbuenzli, @nojb)

  • Fix TSAN warning in wait4 stubs (#10554, fixes #10553, @emillon)

opam 2.1.5

Feedback on this post is welcomed on Discuss!

We are pleased to announce the patch release of opam 2.1.6.

This opam release consists of backported bug fixes and improvements:

  • Changes necessary for opam-repository (see ocaml/opam-repository#23789)
    • Warn if GNU patch is not detected when a patch is applied (#5893)
    • Use gpatch by default instead of patch on NetBSD and DragonFlyBSD (#5893)
    • Use gpatch if it exists and is detected as GNU patch when patch is not GNU patch (#5893)
  • Better recognize depexts on Gentoo, NetBSD, OpenBSD (#5065)
  • Upgrade the vendored dune to 3.14.0 (#5869)
  • Fix debug logs showing up regardless of verbosity on macOS 12.7.1 / 13.6.3 / 14.2 and FreeBSD (#5769)

Opam installation instructions (unchanged):

  1. From binaries: run

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.1.6"
    

    or download manually from the Github "Releases" page to your PATH. In this case, don't forget to run opam init --reinit -ni to enable sandboxing if you had version 2.0.0~rc manually installed or to update you sandbox script.

  2. From source, using opam:

    opam update; opam install opam-devel
    

    (then copy the opam binary to your PATH as explained, and don't forget to run opam init --reinit -ni to enable sandboxing if you had version 2.0.0~rc manually installed or to update your sandbox script)

  3. From source, manually: see the instructions in the README.

We hope you enjoy this new minor version, and remain open to bug reports and suggestions.

See full changelog
  • Changes necessary for opam repository
  • Warn if GNU patch is not detected when a patch is applied [#5893 @kit-ty-kate]
  • Use gpatch by default instead of patch on NetBSD and DragonFlyBSD [#5893 @kit-ty-kate]
  • Use gpatch if it exists and is detected as GNU patch when patch is not GNU patch [#5893 @kit-ty-kate]
  • Better recognize depexts on Gentoo, NetBSD, OpenBSD [#5065 @mndrix]
  • Upgrade the vendored dune to 3.14.0 [#5869 @kit-ty-kate]
  • Vendor mccs.1.1+17 [#5769 @kit-ty-kate]
  • Require mccs >= 1.1+17: Fix debug logs showing up regardless of verbosity on macOS 12.7.1 / 13.6.3 / 14.2 and FreeBSD [#5769 @kit-ty-kate]
  • API Changes:
  • OpamSystem.patch now displays a warning when GNU patch is not detected and looks for both patch and gpatch as a backup option depending on the OS [#5893 @kit-ty-kate]

We are pleased to announce the release of Merlin 5.0-502!

This release brings official support for OCaml 5.2. Substantial backend changes were required to adapt to this release, especially for features such as occurrences and get-documentation. Do not hesitate to report any suspicious behavior in the issue tracker!

This release also fixes a handful of issues, two of them improving the behaviour of Merlin's destruct feature.

See full changelog
  • merlin binary
    • Support for OCaml 5.2 (#1757)
    • destruct: Removal of residual patterns (#1737, fixes #1560)
    • Do not erase fields' names when destructing punned record fields (#1734, fixes #1661)
    • Ignore SIGPIPE in the Merlin server process (#1746)
    • Fix lexing of quoted strings in comments (#1754, fixes #1753)
    • Improve cursor position detection in longidents (#1756)
    • Addition of a merlin-lib.commands library that disassociates the execution of commands from the new_protocol, from the binary, allowing it to be invoked from other projects (#1758)
    • New occurrences backend: Don't index occurrences when merlin.hide attribute is present. (#1768)
    • Use the new uid_to_decl table in 5.2's CMT files to get documentation. (#1773)

We have the pleasure of celebrating Inge Lehmann's birthday by announcing the release of OCaml version 5.2.0.

Some of the highlights in OCaml 5.2.0 are:

  • Reintroduced GC compaction
  • Restored native backend for POWER 64 bits
  • Thread sanitiser support
  • New Dynarray module
  • New -H flag for hidden include directories
  • Project-wide occurrence metadata support for developer tools
  • Raw identifiers
  • Local open in type expressions

And a lot of incremental changes:

  • Around 20 new functions in the standard library
  • Many fixes and improvements in the runtime
  • Many bug fixes

OCaml 5.2.0 is still a somewhat experimental release compared to the OCaml 4.14 branch. In particular:

  • The Windows MSVC port is still unavailable.
  • Ephemeron performances need to be investigated.
  • statmemprof is being tested in the developer branch.
  • There are a number of known runtime concurrency or GC performance bugs (that trigger under rare circumstances).

Since the Windows MSVC port and statmemprof are still missing, the maintenance support for OCaml 4.14 will be extended until at least the end of the year.

Please report any unexpected behaviours on the OCaml issue tracker and post any questions or comments you might have on our discussion forums.

The full list of changes can be found in the changelog below.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands:

opam update
opam switch create 5.2.0

The source code for the release candidate is also directly available on:

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.2.0+options <option_list>

where <option_list> is a space separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 5.2.0+flambda+nffa ocaml-variants.5.0.0+options ocaml-option-flambda ocaml-option-no-flat-float-array
See full changelog

(Changes that can break existing programs are marked with a "*")

Restored and New Backends:

  • #12276, #12601: Native-code compilation for POWER (64 bits, little-endian) (Xavier Leroy, review by KC Sivaramakrishnan, Anil Madhavapeddy, and Stephen Dolan)

  • #12667: Extend the latter to POWER 64 bits, big-endian, ELFv2 ABI (A. Wilcox, review by Xavier Leroy)

Runtime System:

  • #12193: Reintroduce GC compaction for shared pools. Adds a parallel compactor for the shared pools (which contain major heap blocks sized less than 128 words). Explicit only for now, on calls to Gc.compact. (Sadiq Jaffer, Nick Barnes, review by Anil Madhavapeddy, Damien Doligez, David Allsopp, Miod Vallat, Artem Pianykh, Stephen Dolan, Mark Shinwell, and KC Sivaramakrishnan)

  • #12114: Add ThreadSanitizer support (Fabrice Buoro and Olivier Nicole, based on an initial work by Anmol Sahoo, review by Damien Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Luc Maranget, Guillaume Munch-Maccagnoni, Gabriel Scherer)

  • #12850: Update Gc.quick_stat data at the end of major cycles and compaction. This PR adds an additional caml_collect_gc_stats_sample_stw to the major heap cycling STW. This means that Gc.quick_stat now actually reflects the state of the heap after a major cycle or compaction. (Sadiq Jaffer, review by Miod Vallat and Gabriel Scherer)

  • #12859: Ensure Gc.compact does a full major before the compactor runs (Sadiq Jaffer, review by Leo White, Mark Shinwell, Gabriel Scherer, Josh Berdine, David Allsopp, and KC Sivaramakrishnan)

  • #10111: Increase the detail of location information for debugging events to allow the end-line number and character offset to be reported. (David Allsopp, review by Nick Barnes, Enguerrand Decorne and Stephen Dolan)

  • #10403, #12202: Introduce caml_ext_table_add_noexc that does not raise Out_of_memory exceptions, and use it inside the blocking sections of caml_read_directory. Also, check for overflows in EXT table sizes. (Xavier Leroy, report by Arseniy Alekseyev, review by Gabriel Scherer)

  • #11332, #12702: Make sure Bool_val(v) has type bool in C++ (Xavier Leroy, report by ygrek, review by Gabriel Scherer)

  • #12772, #12787: Avoid using _Bool in public headers for the sake of C++ compatibility (Guillaume Munch-Maccagnoni, report by KC Sivaramakrishnan, review by Xavier Leroy and KC Sivaramakrishnan)

  • #12223: Constify constructors and flags tables in C code. Now these tables will go in the read-only segment where they belong. (Antonin Décimo, review by Gabriel Scherer and Xavier Leroy)

  • #12234: Make instrumented time calculation more thread-safe on macOS. (Anil Madhavapeddy, review by Daniel Bünzli and Xavier Leroy)

  • #12235, #12468: Introduce and use the CAMLnoret macro as a lighter alternative to CAMLnoreturn_start / CAMLnoreturn_end. Implement it so as to conform with C11, C23, C++11, C++17. (Xavier Leroy and Dhruv Maroo, with help from Antonin Décimo, review by Gabriel Scherer and David Allsopp)

  • #12275: caml/stack.h: More abstract macros to describe OCaml stacks and how to traverse them, supporting more stack layouts. (Xavier Leroy, review by KC Sivaramakrishnan and Fabrice Buoro)

  • #12268: Deliver Out_of_memory exception if domain creation fails due to memory resource exhaustion. Previously, it was always a Failure. (Anil Madhavapeddy, review by David Allsopp)

  • #12300, #12314: Discard out_channel buffered data on permanent I/O error (Xavier Leroy, report by Török Edwin, review by Anil Madhavapeddy and Nicolás Ojeda Bär)

  • #11386: Simplifications and fixes to Multicore systhreads implementation. (Guillaume Munch-Maccagnoni, review by Anil Madhavapeddy and KC Sivaramakrishnan)

  • #12875, #12879, #12882: Execute preemptive systhread switching as a delayed pending action. This ensures that one can reason within the FFI that no mutation happens on the same domain when allocating on the OCaml heap from C, consistently with OCaml 4. This also fixes further bugs with the Multicore systhreads implementation. (Guillaume Munch-Maccagnoni, bug reports and suggestion by Mark Shinwell, review by Nick Barnes and Stephen Dolan)

  • #12408: Domain.spawn no longer leaks its functional argument for the whole duration of the children's domain lifetime. (Guillaume Munch-Maccagnoni, review by Gabriel Scherer)

  • #12409: Fix unsafety and deadlocks should an asynchronous exception arise at specific locations during domain creation and shutdown. (Guillaume Munch-Maccagnoni, review by Gabriel Scherer)

  • #11911, #12381: Restore statmemprof functionality in part, with some API changes in Gc.Memprof. (Nick Barnes, review by Jacques-Henri Jourdan and Guillaume Munch-Maccagnoni).

  • #12430: Simplify dynamic bytecode loading in Meta.reify_bytecode (Stephen Dolan, review by Sébastien Hinderer, Vincent Laviron and Xavier Leroy)

  • #12489: Fix an error-handling bug in caml_alloc_sprintf (Stephen Dolan, report by Chris Casinghino, review by Jeremy Yallop and Xavier Leroy)

  • #11307: Finish adapting the implementation of asynchronous actions for Multicore: soundness, liveness, and performance issues. Do not crash if a signal handler is called from an unregistered C thread and other possible soundness issues. Prevent issues where joins on other domains could make the toplevel unresponsive to Ctrl-C. Avoid needless repeated polling in C code when callbacks cannot run immediately. (Guillaume Munch-Maccagnoni, review by Enguerrand Decorne, Xavier Leroy, and KC Sivaramakrishnan)

  • #12634: Simplify TSan backtrace bookkeeping upon raise (Olivier Nicole and Fabrice Buoro, review by Gabriel Scherer)

  • (Breaking Change) #12686: Some primitives had the wrong types to be callable from the bytecode interpreter. Either fix their types, mark them as CAMLexport instead of CAMLprim, or remove them entirely if no longer used. (Xavier Leroy, review by David Allsopp)
  • #12700, continuing #11763 and trying to address #12660: Use the correct types for primitives when generating the table of primitives used by ocamlrun. (Xavier Leroy, motivation, review and improvements by Antonin Décimo)

  • #12345, #12710: Fix issues with finaliser orphaning at domain termination (KC Sivaramakrishnan, report by Gabriel Scherer, review by Gabriel Scherer, Sadiq Jaffer and Fabrice Buoro)

  • #12599: Refactor Dynlink startup to avoid parsing bytecode sections twice (Stephen Dolan, review by David Allsopp, Hugo Heuzard, Damien Doligez and Xavier Leroy)

  • #12678, #12898: Free channel buffers on close rather than on finalisation (Damien Doligez, review by Jan Midtgaard and Gabriel Scherer, report by Jan Midtgaard)

  • #12681: Fix TSan false positives due to volatile write handling (Olivier Nicole, Fabrice Buoro, and Anmol Sahoo, review by Luc Maranget, Gabriel Scherer, Hernan Ponce de Leon, and Xavier Leroy)

  • #12743: Use pthread_sigmask instead of sigprocmask. Updates usage of sigprocmask to pthread_sigmask in otherlibs/unix. (Max Slater, review by Miod Vallat and Xavier Leroy)

  • #12769: Unify MSVC and MinGW-w64 code paths, by always using WinAPI directly. (David Allsopp, Antonin Décimo, and Samuel Hym, review by Nicolas Ojeda Bar)

  • #11911, #12382, #12383: Restore statmemprof functionality in part (backtrace buffers, per-thread and per-domain data structures, GC/allocation interface). (Nick Barnes, review by Gabriel Scherer, Fabrice Buoro, Sadiq Jaffer, Guillaume Munch-Maccagnoni, and Jacques-Henri Jourdan).

  • #12735: Store both ends of the stack chain in continuations (Leo White, review by Miod Vallat and KC Sivaramakrishnan)

  • #12746: Simplify and clean up TSan annotations (Olivier Nicole, review by Miod Vallat and Fabrice Buoro)

  • #12809: Add ThreadSanitizer support to FreeBSD/AMD64 (Miod Vallat, review by Gabriel Scherer)

  • #12810: Port ThreadSanitizer support to Linux and macOS on arm64 (Miod Vallat, review by Tim McGilchrist)

  • #12811: Define and use the CAMLthread_local macro for TLS variables. (Antonin Décimo and Samuel Hym, review by Miod Vallat and Xavier Leroy)

  • #12814: More detailed failure messages from input_value and Marshal.from_* (Xavier Leroy, review by Stephen Dolan and Anil Madhavapeddy)

  • #12815: Correctly format multiline locations in exception backtraces in the compiler driver's style. (David Allsopp, review by Gabriel Scherer)

  • #12773, #12830, #12834: Rewrite caml_c_thread_(un)register to fix various bugs. (Guillaume Munch-Maccagnoni, reported by Miod Vallat, suggested by Hari Hara Naveen S, reviewed by Fabrice Buoro, Gabriel Scherer, and Miod Vallat)

  • #12876: Port ThreadSanitizer support to Linux on POWER (Miod Vallat, review by Tim McGilchrist)

  • #12886: Reinitialise I/O mutexes after fork (Max Slater, review by Guillaume Munch-Maccagnoni and Xavier Leroy)

  • #12907: Port ThreadSanitizer support to Linux on RiscV (Miod Vallat, review by Nicolás Ojeda Bär and Fabrice Buoro)

  • #12915: Port ThreadSanitizer support to Linux on s390x (Miod Vallat, review by Tim McGilchrist)

  • #12934: Fix data races between marking and sweeping functions (Olivier Nicole, suggested by Stephen Dolan, review by Gabriel Scherer, Miod Vallat, and Damien Doligez)

Language Features:

  • #12295, #12568: Give while true a polymorphic type, similarly to assert false (Jeremy Yallop, review by Nicolás Ojeda Bär and Gabriel Scherer, suggestion by Rodolphe Lepigre and John Whitington)

  • #12044: Add local module open syntax for types.

      module A = struct
        type t = int
        type r = unit
        type s = string
      end
    
      type example = A.(t * r * s)
    

    (Alistair O'Brien, review by Gabriel Scherer, Nicolás Ojeda Bär, and Florian Angeletti)

  • #11252, RFC 27: Support raw identifier syntax \#foo (Stephen Dolan, review by David Allsopp, Gabriel Scherer, and Olivier Nicole)

  • #12315: Use type annotations from arguments in let rec (Stephen Dolan, review by Gabriel Scherer)

  • #12375: Allow use of [@untagged] for all immediate types like char, bool, and variant with only constant constructors. (Christophe Raffalli, review by Gabriel Scherer)

  • (Breaking Change) #12502: The compiler now normalises the newline sequence \r\n to a single \n character during lexing to guarantee that the semantics of newlines in string literals are not modified by Windows tools transforming \n into \r\n in source files. Warning 29 [eol-in-string] is not emitted anymore, as the normalisation gives more robust semantics to newlines in string literals. (Gabriel Scherer and Damien Doligez, review by Daniel Bünzli, David Allsopp, Andreas Rossberg, Xavier Leroy, report by Andreas Rossberg)

Standard Library:

  • #11563: Add the Dynarray module to the stdlib. Dynamic arrays are arrays whose length can be changed by adding or removing elements at the end, similar to 'vectors' in C++ or Rust. (Gabriel Scherer, Simon Cruanes, and Florian Angeletti, review by Daniel Bünzli, Guillaume Munch-Maccagnoni, Clément Allain, Damien Doligez, Wiktor Kuchta, and Pieter Goetschalckx)

  • #12716: Add Format.pp_print_nothing function. (Léo Andrès, review by Gabriel Scherer and Nicolás Ojeda Bär)

  • (Breaking Change) #6732, #12423: Make Buffer.add_substitute surjective and fix its documentation. (Damien Doligez, review by Antonin Décimo)

  • (Breaking Change) #10775, #12499: Half-precision, floating-point elements in Bigarray. (Anton Yabchinskiy, review by Xavier Leroy and Nicolás Ojeda Bär)

  • #11517, #12477: Expose pp_infinity in interface of the format module and check that margin is less than pp_infinity when setting or checking geometry. (Janith Petangoda, reported by Simmo Saan, reviewed by Florian Angeletti, Simmo Saan, Josh Berdine, and Gabriel Scherer)

  • #12217: Add Array.shuffle. (Daniel Bünzli, review by Nicolás Ojeda Bär, David Allsopp, and Alain Frisch)

  • #12212: Add cache-aligned constructor for atomics. The patch ensures that all allocations (of the right size) in the shared heap are aligned. (Bartosz Modelski with Gabriel Scherer, Guillaume Munch-Maccagnoni, Xavier Leroy, review by Alain Frisch, Anil Madhavapeddy, Gabriel Scherer, Guillaume Munch-Maccagnoni, KC Sivaramakrishnan, Stefan Muenzel, Xavier Leroy)

  • #12307: Add BLAKE2b hashing and an MD5 submodule to the Digest module. (Xavier Leroy, review by Olivier Nicole, Gabriel Scherer, Wiktor Kuchta, Daniel Bünzli, David Allsopp)

  • #12365: Add In_channel.input_bigarray, In_channel.really_input_bigarray, Out_channel.output_bigarray, Unix.read_bigarray, Unix.write_bigarray, Unix.single_write_bigarray. (Nicolás Ojeda Bär, review by Jeremy Yallop, Xavier Leroy, Gabriel Scherer, David Allsopp)

  • #12455: Add Array.init_matrix, Float.Array.make_matrix, Float.Array.init_matrix. (Glen Mével, review by Xavier Leroy, Gabriel Scherer, Jeremy Yallop, Nicolas Ojeda Bar)

  • (Breaking Change) #12455: Array.make_matrix dimx dimy f now raises Invalid_argument when dimx = 0 && dimy < 0. This was already specified but not enforced. (Glen Mével, report by Jeremy Yallop, review by Nicolas Ojeda Bar)
  • #12459: Add Random.int_in_range, Random.int32_in_range, Random.int64_in_range, Random.nativeint_in_range, and their counterpart in Random.State. (Glen Mével and Xavier Leroy, review by Gabriel Scherer, Xavier Leroy, Florian Angeletti)

  • #12459: Random: Restore compatibility between 32-bit integers (JavaScript) and 63-bit integers (64-bit OCaml). For Random.full_int this was guaranteed in 4.14 but wrongly removed in 5.0. (Xavier Leroy, review by Glen Mével)

  • #12511: Minor performance improvements and cleanups in the implementation of modules Int32, Int64, and Nativeint (Xavier Leroy, review by Gabriel Scherer and Daniel Bünzli)

  • #12558: Adapt GC alarms for Multicore and fix their documentation. (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan and Gabriel Scherer)

  • #12625: Remove the Closure module from Obj (Vincent Laviron, review by Xavier Leroy)

  • #12758, #12998: Remove the Marshal.Compression flag to the Marshal.to_* functions. The compilers are still able to use ZSTD compression for compilation artefacts. This is a forward port and clean-up of the emergency fix that was introduced in OCaml 5.1.1 by #12734. (Xavier Leroy, review by Damien Doligez)

  • #12784: Fix computation of minor-heap allocation in Gc.counters() and Gc.allocated_bytes(). (Nick Barnes, review by Gabriel Scherer)

  • #12770: Add Fun.compose. (Justin Frank, review by Nicolás Ojeda Bär, Daniel Bünzli, and Jeremy Yallop)

  • #12845: Add {In,Out}_channel.is_binary_mode as the dual of set_binary_mode. This function was previously only available in the internal C API. (David Allsopp, review by Nicolás Ojeda Bär and Xavier Leroy)

Type System:

  • #12313, #11799: Do not rebuild as-pattern types when a ground type annotation is given. This allows to work around problems with GADTs in as-patterns. (Jacques Garrigue, report by Leo White, review by Gabriel Scherer)

Code Generation and Optimisations:

  • #11239: On x86-64 and RISC-V, reduce alignment of OCaml stacks from 16 to 8. This reduces stack usage. It's only C stacks that require 16-alignment. (Xavier Leroy, review by Gabriel Scherer and Stephen Dolan)

  • #12311: On POWER, 32-bit FP numbers stored in memory (e.g., in Bigarrays) were not correctly rounded sometimes. (Xavier Leroy, review by Anil Madhavapeddy and Tim McGilchrist)

  • #12551, #12608, #12782, #12596: Overhaul of recursive value compilation. Non-function recursive bindings are now forbidden from Lambda onwards, and they're compiled using a new Value_rec_compiler module. (Vincent Laviron and Lunia Ayanides, review by Gabriel Scherer, Stefan Muenzel and Nathanaëlle Courant)

  • #1809, #12181: Rewrite compare x y op 0 to x op y when values are integers (Xavier Clerc, Stefan Muenzel, review by Gabriel Scherer and Vincent Laviron)

  • #12825: Disable common subexpression elimination for atomic loads... again. (Gabriel Scherer, review by KC Sivaramakrishnan, Xavier Leroy and Vincent Laviron, report by Vesa Karvonen)

Other Libraries:

  • #12213: Dynlink library, improve legibility of error messages (Samuel Hym, review by Gabriel Scherer and Nicolás Ojeda Bär)
  • (Breaking Change) #12686: Runtime_events library, C API: define caml_runtime_events_{start,pause,resume} as returning void instead of value. (Xavier Leroy, review by David Allsopp)

Compiler User-Interface and Warnings:

  • #11989, #12246, RFC 31: New flag, -H, to allow for transitive dependencies without including them in the initial environment. (Chris Casinghino, François Bobot, and Gabriel Scherer, review by Leo White and Stefan Muenzel, RFC by François Bobot)
  • (Breaking Change) #10613, #12405: Simplify the values used for the system variable (system: in ocamlopt -config or the Config.system constant). In particular, s390x and ppc64 now report "linux" instead of "elf"; all variants of 32-bit ARM on Linux now report "linux"; OpenBSD now reports "openbsd" instead of "bsd" for 32-bit ARM; FreeBSD, NetBSD, and OpenBSD now report the same value for both x86_64 and x86_32; x86_32 systems matching BSD but not FreeBSD, NetBSD*, or OpenBSD* are no longer identified (as on x86_64); x86_32 Linux now reports "linux" instead of "linux_elf". (David Allsopp, request by Kate Deplaix, review by Sébastien Hinderer and Xavier Leroy)
  • #12247: Configure: --disable-ocamldebug can now be used instead of --disable-debugger (which remains available for compatibility) (Gabriel Scherer, review by Damien Doligez and Sébastien Hinderer)

  • #12199: Improve the error message for non-overriding inherit! (Florian Angeletti, review by Jules Aguillon)

  • #12210: Uniform style for inline code in compiler messages (Florian Angeletti, review by Gabriel Scherer)

  • (Breaking Change) #12278, #:12325: Remove the OCAML_FLEXLINK environment variable from the compiler drivers. This environment variable was previously used as part of the FlexDLL bootstrap procedure and existed solely for that purpose. Its removal greatly simplifies both the build system and testsuite machinery. (David Allsopp, review by Sébastien Hinderer)
  • #12347: Error messages: always report missing polyvariant tags (Florian Angeletti, report by Tianbo Hao, review by Gabriel Scherer)

  • #12224: Specialised error message when trying to apply non-functor module (e.g., module M = Int(Int)) (Florian Angeletti, review by Gabriel Scherer)

  • #12451: Warning 53 (misplaced attributes) now works for all attributes. (Chris Casinghino, review by Florian Angeletti)

  • #12622: Give hints about existential types appearing in error messages (Leo White, review by Gabriel Scherer and Florian Angeletti)

  • #12671: When a class type parameter or class parameter does not match, identify which parameter in the error message, instead of saying "A type parameter" or "A parameter." (Stefan Muenzel, review by Gabriel Scherer)

  • #12679: Add more detail to the error message and manual in case of invalid module type substitutions. (Stefan Muenzel, review by Gabriel Scherer and Florian Angeletti)

  • #12750: Display the command executed to extract primitives in ocamlc -verbose (David Allsopp, review by Nicolás Ojeda Bär)

  • #12777: Add details about the actual and expected method types to the method mismatch error messages (Javier Chávarri, review by Gabriel Scherer and Florian Angeletti)

  • (Breaking Change) #12942: Fix line ordering in some module inclusion error messages (Nick Roberts, review by Florian Angeletti, report by Carl Eastlund)

Manual and Documentation:

  • #12338: Clarification of the documentation of process related function in the Unix module regarding the first element of arguments and shell's PID (Christophe Raffalli, review by Florian Angeletti)

  • #12473: Document in runtime/memory.c our current understanding of accesses to the OCaml heap from the C runtime code -- the problem of hybrid programs mixing two memory models (Gabriel Scherer and Guillaume Munch-Maccagnoni, review by Olivier Nicole and Xavier Leroy)

  • #12456: Document the incompatibility between effects, on one hand, and caml_callback and asynchronous callbacks (signal handlers, finalisers, memprof callbacks...), on the other (Guillaume Munch-Maccagnoni, review by KC Sivaramakrishnan)

  • #12694: Document in runtime/tsan.c the TSan instrumentation choices and the consequences with regard to the memory model (Olivier Nicole, review by Miod Vallat, Gabriel Scherer, Guillaume Munch-Maccagnoni and Fabrice Buoro)

  • #12802: Add manual chapter about ThreadSanitizer support (Olivier Nicole, review by Miod Vallat, Sebastien Hinderer, Fabrice Buoro, Gabriel Scherer and KC Sivaramakrishnan)

  • #12819: Clarify which runtime interactions are allowed in custom ops (Basile Clément, review by Guillaume Munch-Maccagnoni and Xavier Leroy)

  • #12840: Manual: update runtime tracing chapter for custom events (e.g., #12335) (Lucas Pluvinage, Sadiq Jaffer and Olivier Nicole, review by Gabriel Scherer, David Allsopp, Tim McGilchrist, and Thomas Leonard)

  • #13066: Update OCAMLRUNPARAM documentation for the stack size parameter l (Florian Angeletti, review by Nicolás Ojeda Bär, Tim McGilchrist, and Miod Vallat)

  • #13078: Update Format tutorial on structural boxes to mention alignment questions (Edwin Török, review by Florian Angeletti)

  • #13092: Document the existence of the [@@poll error] built-in attribute (Florian Angeletti, review by Gabriel Scherer)

Tools:

  • #12340: testsuite: collect known issues with current -short-paths implementation for existential types (Florian Angeletti, Samuel Hym, review by Florian Angeletti and Thomas Refis)

  • #12147: ocamllex: allow carriage returns at the end-of-line directives (SeungCheol Jung, review by Nicolás Ojeda Bär)

  • #12260: Fix invalid_argument on some external or module aliases in ocamlnat (Fabian Hemmer, review by Vincent Laviron)

  • #12185: New script language for ocamltest (Damien Doligez with Florian Angeletti, Sébastien Hinderer, Gabriel Scherer, review by Sébastien Hinderer and Gabriel Scherer)

  • #12371: ocamltest: fix recursive expansion of variables (Antonin Décimo, Damien Doligez, review by Sébastien Hinderer, Damien Doligez, Gabriel Scherer, and Xavier Leroy)

  • (Breaking Change) #12497, #12613: Make ocamlc/ocamlopt fail with an error when no input files are specified to build an executable (Antonin Décimo, review by Sébastien Hinderer)
  • #12576: ocamldep : various refactors (Antonin Décimo, review by Florian Angeletti, Gabriel Scherer, and Léo Andrès)

  • #12615: ocamldoc: get rid of the odoc_literate and odoc_todo generators (Sébaistien Hinderer, review by Gabriel Scherer and Florian Angeletti)

  • #12624: Use $XDG_CONFIG_DIRS in addition to $XDG_CONFIG_HOME when searching for init.ml, and use this to extend init.ml support to the toplevel when running on Windows. (David Allsopp, report by Jonah Beckford, review by Nicolás Ojeda Bär and Antonin Décimo)

  • #12688: Setting the env variable NO_COLOR with an empty value no longer has effects. Previously, setting NO_COLOR with any value, including the empty value, would disable colours (unless OCAML_COLOR is also set). After this change, the user must set NO_COLOR with an non-empty value to disable colours. This reflects a specification clarification/change from the upstream website at https://no-color.org. (Favonia, review by Gabriel Scherer)

  • #12744: ocamltest: run tests in recursive subdirs more eagerly (Nick Roberts, review by Nicolás Ojeda Bär)

  • #12901, 12908: ocamllex: add overflow checks to prevent generating incorrect lexers; use unsigned numbers in the table encoding when possible (Vincent Laviron, report by Edwin Török, review by Xavier Leroy)

Internal/compiler-libs Changes:

  • #12508 : Add compiler-side support for project-wide occurrences in Merlin by generating index tables of all identifier occurrences. This extra data in .cmt files is only added when the new flag -bin-annot-occurrences is passed. (Ulysse Gérard, Nathanaëlle Courant, suggestions by Gabriel Scherer and Thomas Refis, review by Florian Angeletti, Gabriel Scherer, and Thomas Refis)

  • #12236, #12386, #12391, #12496, #12673: Use syntax as sole determiner of arity. This changes function arity to be based solely on the source program's parsetree. Previously, the heuristic for arity had more subtle heuristics that involved type information about patterns. Function arity is important because it determines when a pattern match's effects run and is an input into the fast path for function application.

    This change affects tooling; it changes the function constructs in parsetree and typedtree.

    See https://github.com/ocaml/RFCs/pull/32 for the original RFC.

    (Nick Roberts; review by Richard Eisenberg, Leo White, and Gabriel Scherer; RFC by Stephen Dolan)

  • #12639: Parsing: attach a location to the RHS of Ptyp_alias and improve the 'alias type mismatch' error message. (Jules Aguillon, review by Florian Angeletti)

  • #12447: Remove 32-bit targets from X86_proc.system (Masanori Ogino, review by David Allsopp)

  • #12216, #12248: Prevent reordering of atomic loads during instruction scheduling. This is for reference, as instruction scheduling is currently unused in OCaml 5. (Xavier Leroy, report by Luc Maranget and KC Sivaramakrishnan, review by Nicolás Ojeda Bär)

  • #12025: Split Typecore.unify_pat_types into two in order to avoid unnecessary references to the environment in type_pat (Jacques Garrigue and Takafumi Saikawa, review by Gabriel Scherer)

  • #12031: Use dedicated types to represent names of compilation units and predefined exceptions in CMO files. (Sébastien Hinderer, review by Florian Angeletti, Thomas Refis, Gabriel Scherer, Vincent Laviron, Pierre Chambart, Luke Maurer, Hugo Heuzard, Xavier Leroy, and Damien Doligez)

  • #12109: Pack parameters to unification in unification_environment (Takafumi Saikawa and Jacques Garrigue, review by Richard Eisenberg)

  • #12331, #12361: Pack the unification data for pattern checking in Typecore (Takafumi Saikawa and Jacques Garrigue, review by Gabriel Scherer, Thomas Refis, and Florian Angeletti)

  • #12229: Remove global mutable state for typechecking patterns in Typecore in favor of local mutable state. (Nick Roberts, review by Takafumi Saikawa)

  • #12542: Minor bugfix to #12236: restore dropped call to instance (Nick Roberts, review by Jacques Garrigue)

  • #12242: Move the computation of stack frame parameters to a separate Stackframe module, and save the parameters in the results of the Linearize pass. (Xavier Leroy, review by KC Sivaramakrishnan and Mark Shinwell)

  • #12442: Document jump summaries in the pattern-matching compiler (Gabriel Scherer and Thomas Refis, review by Florian Angeletti and Vincent Laviron)

  • #12446, #12792: Remove the hooks machinery around channel locking in runtime/io.c (Gabriel Scherer, review by Xavier Leroy)

  • #12389, #12544, #12984, #12987: Centralise the handling of metadata for compilation units and artifacts in preparation to improve Unicode support for OCaml source files. (Florian Angeletti, review by Vincent Laviron and Gabriel Scherer)

  • #12532, #12553: Improve readability of the pattern-matching debug output (Gabriel Scherer, review by Thomas Refis)

  • #12537: Use C11/C++11 standard static assertion (Antonin Décimo, review by Sebastien Hinderer, Xavier Leroy, and KC Sivaramakrishnan)

  • #12169: Runtime: document and enforce naming conventions around STW sections (Gabriel Scherer, review by Enguerrand Decorne, Miod Vallat, B. Szilvasy and Nick Barnes, report by KC Sivaramakrishnan)

  • #12669 : Clean up some global state handling in schedgen (Stefan Muenzel, review by Miod Vallat and Gabriel Scherer)

  • #12640: Make the module separator used in symbol names configurable (Miod Vallat, review by Hugo Heuzard and Xavier Leroy)

  • #12691 : Clean up Ctype.expand_abbrev_gen and rename Env.add_local_type to add_local_constraint (Takafumi Saikawa and Jacques Garrigue, review by Florian Angeletti)

  • #12786 : Clean up the algorithm of Ctype.limited_generalize (Takafumi Saikawa and Jacques Garrigue, review by Gabriel Scherer)

  • #10691: Ast_mapper, Ast_iterator: add functions directive_argument, toplevel_directive, and toplevel_phrase (Guillaume Petiot, review by Gabriel Scherer and Kate Deplaix)

  • #12764: Move all installable headers in caml/ subdirectories. (Antonin Décimo, review by Gabriel Scherer and David Allsopp)

  • #12914: Slightly change the s390x assembly dialect in order to build with Clang's integrated assembler (Miod Vallat, review by Gabriel Scherer)

  • #13001: Do not read_back entire shapes to get aliases' UIDs when building the usages index (Ulysse Gérard, review by Gabriel Scherer and Nathanaëlle Courant)

Build System:

  • #12198, #12321, #12586, #12616, #12706, #13048: Continue the merge of the sub-Makefiles into the root Makefile started with #11243, #11248, #11268, #11420 and #11675. (Sébastien Hinderer, review by David Allsopp and Florian Angeletti)

  • #12569, #12570: Remove otherlibraries as a prerequisite for runtop; use runtop-with-otherlibs to use a library from otherlibs/ (Gabriel Scherer, review by Sébastien Hinderer, suggestion by David Allsopp)

  • #12652: Make magic numbers easier to bump and duplicate (Sébastien Hinderer, review by Antonin Décimo, David Allsopp and Florian Angeletti)

  • (Breaking Change) #12751: --with-target-bindir configure option implemented. This option refers to the location of the runtime binaries on the target system for a cross-compiler and is embedded in executables produced by ocamlc. It does not affect the bytecode executables installed as part of the build. The old mechanism make TARGET_BINDIR=.. no longer works. (David Allsopp, review by Damien Doligez, Xavier Leroy, and Olivier Nicole)
  • #12768, #13030: Detect MinGW-w64 coupling with GCC or LLVM, detect clang-cl, and fix C compiler feature detection on macOS. (Antonin Décimo, review by Miod Vallat and Sébastien Hinderer)

Bug Fixes:

  • #10652, #12720: Fix evaluation order in presence of optional arguments (Jacques Garrigue, report by Leo White, review by Vincent Laviron)

  • #12595, #12597: Fix a race in caml_clear_gc_stats_sample (Gabriel Scherer, review by B. Szilvasy, report by B. Szilvasy)

  • #12580: Fix location of alias pattern variables (Chris Casinghino, review Gabriel Scherer, report by Milo Davis)

  • #12583: Add a closing event for when EV_MAJOR_EPHE_MARK is complete (Sudha Parimala, review by Gabriel Scherer)

  • #12566: caml_output_value_to_malloc wrongly uses caml_stat_alloc instead of malloc since 4.06, breaking (in pooled mode) user code that uses free on the result. Symmetrically, caml_input_value_from_malloc should use free. (Gabriel Scherer, review by Xavier Leroy and Enguerrand Decorne, report by Ido Yariv)

  • #12490: Unix: protect the popen_processes hashtable with a mutex (Gabriel Scherer, report by Olivier Nicole, review by Xavier Leroy)

  • #11931: Fix tricky typing bug with type substitutions (Stephen Dolan, review by Leo White and Jacques Garrigue)

  • #12037, #12171: Fix get_extern_state potential NULL dereference (Alexander Skvortsov, report by Török Edwin, design by Gabriel Scherer, Xavier Leroy)

  • #12635: Fix get_intern_state potential NULL dereference (Antonin Décimo, review by KC Sivaramakrishnan)

  • #12032, #12059: Bug fixes related to compilation of recursive definitions (Vincent Laviron, report by Victoire Noizet, review by Gabriel Scherer)

  • (Breaking Change) #12145: Loopy constraints cause ocamlc to loop. Fixed by completely removing the call to update_type in Typedecl.transl_type_decl, as the expansion is already checked by check_regularity. As a result, recursion is more polymorphic, which may cause some (essentially wrong) type declarations to have unbound type variables and some constraints unrelated to the concrete type to be ignored (see tests/typing-misc/constraints.ml). (Jacques Garrigue, report by Richard Eisenberg, review by Leo White)
  • #12207, #12222: Make closure computation linear in the number of recursive functions instead of quadratic (Vincent Laviron, report by François Pottier, review by Nathanaëlle Courant and Gabriel Scherer)

  • #11040, #12591: Fix a data race in major_gc.c (Gabriel Scherer, review by Guillaume Munch-Maccagnoni and KC Sivaramakrishnan, report by Sadiq Jaffer)

  • #12238, #12403, #12698: Read input files in one go to avoid source reprinting issues (Gabriel Scherer, report by Mike Spivey and Vincent Laviron, review by Nicolás Ojeda Bär, Xavier Leroy and Jeremy Yallop)

  • #12334, #12368: Bad error message with mutually recursive abbreviations (Jacques Garrigue, report by Richard Eisenberg, review by Gabriel Scherer and Richard Eisenberg)

  • #12401: seek_in and seek_out sometimes returned normally when given negative offsets, instead of failing. Now both functions should consistently raise Sys_error in this case. (Nicolás Ojeda Bär, review by Gabriel Scherer)

  • #12267: Fix stack alignment computation (Miod Vallat, report by Jan Midtgaard, review by Gabriel Scherer)

  • #12395, #12404: Fix thread-unsafety in the fallback implementation of Unix.create_process (the one used when posix_spawnp is unavailable) (Xavier Leroy, report by Chris Vine, review by Nicolás Ojeda Bär)

  • #12949: Open shadowing mistriggers (Gabriel Scherer, review by Florian Angeletti, report by Andreas Rossberg)

  • #12526: Honor ocaml.inline always attribute on functions with optional arguments and default values in the Closure backend (Alain Frisch, review by Vincent Laviron)

  • #12677, #12889: Make Domain.DLS thread-safe (Gabriel Scherer, review by Olivier Nicole and Damien Doligez, report by Vesa Karvonen)

  • #12561: Fix crash when combining TSan and frame-pointers (Fabrice Buoro and Olivier Nicole, report by Jan Midtgaard, review by Miod Vallat and Gabriel Scherer)

  • #12482: Rework bounds checking code in the POWER backend (Miod Vallat and Xavier Leroy, report by Jan Midtgaard, review by KC Sivaramakrishnan)

  • #12528, #12703: Avoid pointer arithmetic overflow in Tag_val macro (very likely harmless, but can trigger alarms) (Xavier Leroy, report by Sam Goldman, review by Guillaume Munch-Maccagnoni)

  • #12593: TSan should handle Effect.Unhandled correctly (Fabrice Buoro and Olivier Nicole, report by Jan Midtgaard and Miod Vallat, review by Gabriel Scherer)

  • #12684: Fix locations filename in AST produced by the -pp option (Gabriel Scherer, review by Florian Angeletti)

  • #12714: Check whether macros are defined before using them to ensure that the headers can always be used in code which turns on -Wundef (or equivalent). (Antonin Décimo, review by Miod Vallat, Gabriel Scherer, Xavier Leroy, and David Allsopp)

  • #12726: Fix segmentation fault under Windows when executing a bytecode file if the runtime (ocamlrun.exe) cannot be found. (Vadim Zborovskii, Nicolás Ojeda Bär, report by Vadim Zborovskii, review by David Allsopp)

  • #12727, #12730: Fix bug with value let-rec and labelled applications (Vincent Laviron, review by Gabriel Scherer)

  • (Breaking Change) #12751: Always keep within the 128 character limit for shebang lines. Previous fix in #8622 handled building the compiler with a long prefix. This patch extends this to the bytecode executables emitted by that compiler. (David Allsopp, review by Damien Doligez, Xavier Leroy, and Olivier Nicole)
  • #12755: Fix data race on global pools arrays of pool_freelist (Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer)

  • #12796, #12801: Fix memory corruption in caml_unix_alloc_sockaddr (Thomas Leonard, review by Nicolás Ojeda Bär)

  • #12737: Fix data races in minor_gc.c and caml_natdynlink_open (Olivier Nicole, review by Stefan Muenzel, Miod Vallat, Guillaume Munch-Maccagnoni, Gabriel Scherer, and Xavier Leroy)

  • #12831: Fix call to caml_call_realloc_stack for s390x in PIC mode (Vincent Laviron, report by Jerry James, review by Miod Vallat)

  • (Breaking Change) #12837: Show non-generalisable type parameters in type definitions Changes type of type parameters in outcometree.mli. (Jacques Garrigue, review by Richard Eisenberg)
  • #12897: Fix locking bugs in Runtime_events (Gabriel Scherer and Thomas Leonard, review by Olivier Nicole, Vincent Laviron, and Damien Doligez, report by Thomas Leonard)

  • #12851: Fix race between runtime events teardown and event emission (Olivier Nicole, review by Miod Vallat and Gabriel Scherer)

  • #12860: Fix an assertion that wasn't taking into account the possibility of an ephemeron pointing at static data (Mark Shinwell, review by Gabriel Scherer and KC Sivaramakrishnan)

  • #12861: Fix a possible crash in the threads library (Mark Shinwell, review by Gabriel Scherer and KC Sivaramakrishnan)

  • #11040, #12894: Silence false data race observed between caml_shared_try_alloc and oldify. Introduces macros to call TSan annotations which help annotate a "happens before" relationship. (Hari Hara Naveen S and Olivier Nicole, review by Gabriel Scherer and Miod Vallat)

  • #12958: Fix tail-modulo-cons compilation of try-with, &&, and || expressions. (Gabriel Scherer and Nicolás Ojeda Bär, report by Sylvain Boilard, review by Gabriel Scherer)

  • #12919: Fix register corruption in caml_callback2_asm on s390x. (Miod Vallat, review by Gabriel Scherer)

  • #12924, #12930: Rework package constraint checking to improve interaction with immediacy (Chris Casinghino and Florian Angeletti, review by Florian Angeletti and Richard Eisenberg)

  • #12969: Fix a data race in caml_darken_cont (Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer and Miod Vallat)

  • #12971, #12974: Fix an uncaught Ctype.Escape exception on some invalid programs forming recursive types. (Gabriel Scherer, review by Florian Angeletti, report by Neven Villani)

  • #13019: Remove linking instructions for the Unix library from threads.cma. (This was done for threads.cmxa in OCaml 3.11.) Eliminates warnings from new LLD when using threads.cma of duplicated libraries. (David Allsopp, review by Nicolás Ojeda Bär)

  • #13058: Add TSan instrumentation to caml_call_gc(), since it may raise exceptions. (Fabrice Buoro, Olivier Nicole, Gabriel Scherer, and Miod Vallat)

  • #13079: Save and restore frame pointer across Iextcall on ARM64 (Tim McGilchrist, review by KC Sivaramakrishnan and Miod Vallat)

  • #13094: Fix undefined behavior of left-shifting a negative number (Antonin Décimo, review by Miod Vallat and Nicolás Ojeda Bär)

  • #13130: Minor fixes to Pprintast for raw identifiers and local module open syntax for types (Chet Murthy, review by Gabriel Scherer)

The ppxlib team is happy to announce the release of ppxlib.0.32.1.

The main feature of this release is of course the support for the upcoming OCaml 5.2 release. Starting with this version you'll be able to use ppx with the latest compiler.

The feature also comes with a small follow up improvement to the 0.32.0 error reporting changes that simplifies how exception thrown from context free rewriting are handled. The errors will now be inserted where the generated code would have been instead of appended to the whole AST. This should lead to a better error reporting from the compiler as it will now report errors in order of their position in the code.

We'd like to thank the OCaml Software Foundation once again as they funded the vast majority of the work for this release.

See full changelog
  • Add support for OCaml 5.2

  • Insert errors from caught located exceptions in place of the code that should have been generated by context-free rules. (#472, @NathanReb)

Odoc 2.4.2

We've released odoc 2.4.2 with OCaml 5.2 compatibility and a few bug fixes.

See full changelog

Added

  • OCaml 5.2.0 compatibility (@Octachron, #1094, #1112)

Fixed

  • Fix issues #1066 and #1095 with extended opens (@jonludlam, #1082, #1100)

We've released OCamlFormat 0.26.2 with compatibility with OCaml 5.2.

See full changelog

Changed

  • Compatible with OCaml 5.2.0 (#2510, @gpetiot, @Julow)

Dune 3.15.2

We just released version 3.15.2 with some bug fixes.

This one is particularly important for Coq users since it fixes a bug introduced in 3.13.0 that made incremental builds very slow.

See full changelog

Fixed

  • If no directory targets are defined, then do not evaluate enabled_if (#10442, @rgrinberg)

  • Fix a bug where Coq projects were being rebuilt from scratch each time the dependency graph changed. (#10446, fixes #10149, @alizter)

MDX 2.4.1

This release reverts the change introduce in Mdx 2.4.0 that allows the execution of included OCaml code blocks after users reported issues. We will revisit the feature to ensure it is opt-in and doesn't break users setup.

See full changelog

Changed

  • Revert #446: "Allow execution of included OCaml code blocks" (#451, @gpetiot). Included OCaml code blocks preserve their pre-2.4.0 behavior.

Dune 3.15.0

We're happy to announce that Dune 3.15.0 is now available. This feature has many fixes and new features that you can find in the changelog.

There are a few new features that we would like to specially highlight.

Removal of previous limitations in many forms

Prior to Dune 3.15 there were a number of limitations where percent forms like %{env:...} could be used to expand to useful values. In this release, @rgrinberg put some effort to relax a lot of these restrictions where possible.

In the new version some of these limitations have been lifted, so for example {env:...} can be used in install stanzas (#10160).

Likewise there was no consistency where %{cma:...} or %{cmo:...} could be used. With #10169, these forms should work consistently everywhere.

Similarly the variables allowed in enabled_if fields have been expanded in #10250, from just allowing variables that can be computed from the context to now allowing all variables as long as expanding these variables does not introduce dependency cycles.

These relaxed rules can also be combined to enable a library depending on environment variables, e.g. (enabled_if %{env:ENABLE_LIBFOO=false})).

Overlapping names in different contexts

Continuing the theme of conditionally enabling or disabling code to be built, @jchavarri and @rgrinberg's work on #10220 makes it possible to have overlapping names between executable and melange.emit targets. This can be useful when a name is to be shared in different contexts (e.g. one context with native compilation and one emitting code for the browser).

Properly output UTF-8 encoded text when formatting

Dune does not assume an encoding of dune files, however when files were formatted the formatter would err on the safe side and escape bytes outside the ASCII range. This means that UTF-8 characters outside of ASCII would get escaped into decimal escape sequences.

This was especially annoying in places where the user would write natural language texts, which is common when defining Opam packages in dune-project files. For example a discussion of a paper by Paul Erdős, Peter Frankl, Vojtěch Rödl would upon reformatting be turned into Paul Erd\197\145s, Peter Frankl, Vojt\196\155 R\195\182, which does a disservice to these scientists and is hard to read.

Thanks to the work of @moyodiallo in #9728 starting with Dune 3.15 the original encoding will be preserved, so your package descriptions will be more readable.

See full changelog

Added

  • Add link flags to to ocamlmklib for ctypes stubs (#8784, @frejsoya)

  • Remove some unnecessary limitations in the expansions of percent forms in install stanza. For example, the %{env:..} form can be used to select files to be installed. (#10160, @rgrinberg)

  • Allow artifact expansion percent forms (%{cma:..}, %{cmo:..}, etc.) in more contexts. Previously, they would be randomly forbidden in some fields. (#10169, @rgrinberg)

  • Allow %{inline_tests} in more contexts (#10191, @rgrinberg)

  • Remove limitations on percent forms in the (enabled_if ..) field of libraries (#10250, @rgrinberg)

  • Support dialects in dune describe pp (#10283, @emillon)

  • Allow defining executables or melange emit stanzas with the same name in the same folder under different contexts. (#10220, @rgrinberg, @jchavarri)

Fixed

  • coq: Delay Coq rule setup checks so OCaml-only packages can build in hybrid Coq/OCaml projects when coqc is not present. Thanks to @vzaliva for the test case and report (#9845, fixes #9818, @rgrinberg, @ejgallego)

  • Fix conditional source selection with select on bigarray in OCaml 5 (#10011, @moyodiallo)

  • melange: fix inconsistency in virtual library implementation. Concrete modules within a virtual library can now refer to its virtual modules too (#10051, fixes #7104, @anmonteiro)

  • melange: fix a bug that would cause stale import paths to be emitted when moving source files within (include_subdirs ..) (#10286, fixes #9190, @anmonteiro)

  • Dune file formatting: output utf8 if input is correctly encoded (#10113, fixes #9728, @moyodiallo)

  • Fix expanding dependencies and locks specified in the cram stanza. Previously, they would be installed in the context of the cram test, rather than the cram stanza itself (#10165, @rgrinberg)

  • Fix bug with dune exec --watch where the working directory would always be set to the project root rather than the directory where the command was run (#10262, @gridbugs)

  • Regression fix: sign executables that are promoted into the source tree (#10263, fixes #9272, @emillon)

  • Fix crash when decoding dune-package for libraries with (include_subdirs qualified) (#10269, fixes #10264, @emillon)

Changed

  • Remove the --react-to-insignificant-changes option. (#10083, @rgrinberg)

MDX 2.4.0

We are happy to announce the release of MDX 2.4.0! This is the first release of MDX to be compatible with OCaml 5.2.

This release also comes with support for executing included OCaml code blocks.

See full changelog

Added

  • Handle the error-blocks syntax (#439, @jonludlam, @gpetiot)
  • Allow execution of included OCaml code blocks. Add skip to include blocks to revert to the old behavior (#446, @panglesd, @gpetiot) Warning: this is a breaking change that is reverted in the next release.
  • Make MDX compatible with OCaml 5.2 (#448, @gpetiot)

Fixed

  • Reduce false-positives while detecting warnings (#440, @Julow)

Dune 3.14.2

We're happy to announce that Dune 3.14.2 is now available.

Note that due to a regression that was detected before publishing to opam version 3.14.1 should not be used. The fix for the regression is part of this release.

This feature brings some small bugfixes around the handling of Coq as well as solves an issue where Dune is running on Windows in a path that contains Unicode characters. This affected e.g. users with diacritics or non-latin script in their name when running Dune within their home directory.

See full changelog

Fixed

  • When a directory is changed to a file, correctly remove it in subsequent dune build runs. (#9327, fix #6575, @emillon)

  • Fix a problem with the doc-new target where transitive dependencies were missed during compile. This leads to missing expansions in the output docs. (#9955, @jonludlam)

  • coq: fix performance regression in coqdep unescaping (#10115, fixes #10088, @ejgallego, thanks to Dan Christensen for the report)

  • coq: memoize coqdep parsing, this will reduce build times for Coq users, in particular for those with many .v files (#10116, @ejgallego, see also #10088)

  • on Windows, use an unicode-aware version of CreateProcess to avoid crashes when paths contains non-ascii characters. (#10212, fixes #10180, @emillon)

  • fix compilation on non-glibc systems due to signal.h not being pulled in spawn stubs. (#10256, @emillon)

Utop 2.14.0

This release of UTop 2.14.0 brings support for the upcoming version of the compiler, OCaml 5.2.

See full changelog
  • Add support for OCaml 5.2 (#470, fixes #466, @leostera, @ManasJayanth, @huwaireb)

We're thrilled to announce the release of Merlin 4.14, a significant update that introduces a suite of enhancements and fixes to improve your OCaml editor experience.

In addition to the improvements and bug fixes in this release, Merlin 4.14 is the first version to support the upcoming OCaml 5.2 compiler.

Some highlights in this release include:

  • Improved Telemetry and Heap Usage Reporting: With the addition of the "heap_mbytes" field in server responses (#1717) and cache stats in telemetry (#1711), developers can now gain deeper insights into Merlin's performance and memory usage. These enhancements are part of our ongoing efforts to improve Merlin's performance profiling capabilities.
  • SyntaxDocument Command: Addressing a common challenge among new users, the new SyntaxDocument command (#1706) enables you to find detailed information about the syntax element under the cursor directly from your editor. This feature aims to facilitate learning and code readability by providing instant access to syntax descriptions, making it easier for developers to familiarize themselves with OCaml's syntax.

Happy coding!

See full changelog
  • merlin binary
    • Add a "heap_mbytes" field to Merlin server responses to report heap usage (#1717)
    • Add cache stats to telemetry (#1711)
    • Add new SyntaxDocument command to find information about the node under the cursor (#1706)
    • Fix FLG -pp ppx.exe -as-pp/-dump-ast use of invalid shell redirection when direct process launch on Windows. (#1723, fixes #1722)
    • Add a query_num field to the ocamlmerlin responses to detect server crashes (#1716)
    • Jump to cases within a match statement (#1726)
    • Jump to module-type (#1728, partially fixes #1656)
    • Exposes stable functions for configuration handling and pattern variable destruction. (#1730)
  • editor modes
    • vim: load merlin under the ocamlinterface and ocamllex filetypes (#1340)
    • Fix merlinpp not using binary file open (#1725, fixes #1724)

Dune 3.14.0

We're happy to announce that Dune 3.14.0 is now available. This feature has many fixes and new features that you can find in the changelog.

There are a few new features that we would like to specially highlight.

Dynamic dune files with (dynamic_include)

It is common for some parts of a build to be dynamic: for example a source file can be generated, or some parts of the configuration like C flags can be generated from a Dune rule. But until now it was not possible to generate rules dynamically.

For example, one might want to do it is to set up one rule per input file. This is a common pattern in test suites and is easy to do with Make. But Dune does not have a concept of parameterized rules, so it is necessary to set up one rule per input file.

The pattern to do this with Dune is to:

  • Write a generator that lists the input files and emits Dune stanzas (as text);
  • Add a rule that makes a dune.inc file using this generator;
  • Add (include dune.inc) in the main dune file,

However, this requires checking in the generated dune.inc file in the repository. Another drawback is that when modifying the list of input files, it is necessary to run tests twice: one to update dune.inc, one to run the new test.

This release of Dune adds a new (dynamic_include) stanza that lifts these restrictions: dune.inc does not have to be part of the source tree, it can be generated transparently. This comes with some restrictions: some stanzas can not be generated, in particular the ones that define public libraries. And due to how rule loading works, the generated stanza needs to be defined in a different directory.

Still, this should be useful for many users that rely on the generate-include-commit pattern described above.

Sherlodoc integration

Sherlodoc is a search engine for OCaml documentation, which supports search by name, documentation and fuzzy type search (similar to Hoogle in the Haskell world). It can be obtained from opam using opam install sherlodoc.

When it is available, Dune commands that produce HTML documentation, such as dune build @doc and dune build @doc-new, will include a search bar in the generated output.

See full changelog

Added

  • Introduce a (dynamic_include ..) stanza. This is like (include foo) but allows foo to be the target of a rule. Currently, there are some limitations on the stanzas that can be generated. For example, public executables, libraries are currently forbidden. (#9913, @rgrinberg)

  • Introduce $ dune promotion list to print the list of available promotions. (#9705, @moyodiallo)

  • If Sherlodoc is installed, add a search bar in generated HTML docs (#9772, @EmileTrotignon)

  • Add only_sources field to copy_files stanza (#9827, fixes #9709, @jchavarri)

  • The (foreign_library) stanza now supports the (enabled_if) field. (#9914, @nojb)

Fixed

  • Fix $ dune install -p incorrectly recognizing packages that are supposed to be filtered (#9879, fixes #4814, @rgrinberg)

  • subst: correctly handle opam files in opam/ subdirectory (#9895, fixes #9862, @emillon)

  • Odoc private rules are not set up if a library is not available due to enabled_if (#9897, @rgrinberg and @jchavarri)

Changed

  • When dune language 3.14 is enabled, resolve the binary in (run %{bin:..} ..) from where the binary is built. (#9708, @rgrinberg)

  • boot: remove single-command bootstrap. This was an alternative bootstrap strategy that was used in certain conditions. Removal makes the bootstrap a bit slower on Linux when only a single core is available, but bootstrap is now reproducible in all cases. (#9735, fixes #9507, @emillon)

The ppxlib dev team is happy to announce the release of ppxlib.0.32.0.

The main feature of this release, implemented by @burnleydev1 during their Outreachy internship, is a huge improvement of the handling of located exceptions raised by ppx-es. Whenever a rewrite of the AST throws such an exception, the ppxlib driver catches it and resumes the rewriting using the latest valid AST it knows of. All caught exceptions are appended to the final AST as [%%ocaml.error ..] nodes. This means the driver returns a valid AST instead of one composed of a single error node corresponding to the first raised exception. This leads to a much better experience for ppx users as merlin now has a valid AST to work with when this happens, allowing it to properly function, reporting all errors, from ppx-es or otherwise. Note that despite this change we still recommend ppx authors to embed errors in the rewritten AST rather than throw exceptions.

The release also comes with a few bug fixes on longident parsing or windows compatibility and a new simplified API for ppx authors using attributes as flags (i.e. attributes without payloads such as [@ignore] for instance).

We'd like to thank our external contributors for this release:

  • @burnleydev1 for their improvement of the driver exception handling
  • @dianaoigo for their addition of the new attribute flags API
  • @jonahbeckford for their fix of the windows compatibility

We'd also like to thank the OCaml Software Foundation who has been funding my work on this release.

See full changelog
  • Add an optional embed_errors argument to Context_free.map_top_down that controls how to deal with exceptions thrown by context-free rules. (#468, @NathanReb)

  • Fix Longident.parse so it properly handles unparenthesized dotted operators such as +. or *.. (#111, @rgrinberg, @NathanReb)

  • raising an exception does no longer cancel the whole context free phase(#453, @burnleydev1)

  • Sort embedded errors that are appended to the AST by location so the compiler reports the one closer to the beginning of the file first. (#463, @NathanReb)

  • Update Attribute.get to ignore loc_ghost. (#460, @ceastlund)

  • Add API to manipulate attributes that are used as flags (#408, @dianaoigo)

  • Update changelog to use ISO 8061 date format: YYYY-MM-DD. (#445, @ceastlund)

  • Replace Caml with Stdlib. (#427, @ceastlund)

  • When a transformation raises, the last valid AST is used as input to the upcoming transformations. All such errors are collected and appended as extension nodes to the final AST (#447, @burnleydev1)

  • Fix a small mistake in the man pages: Embededding errors is done by default with -as-pp, not with -dump-ast (#464, @pitag-ha)

  • Set appropriate binary mode when writing to stdout especially for Windows compatibility. (#466, @jonahbeckford)

Dune 3.13.1

We just released version 3.13.1 with some bugfixes.

See full changelog
  • Fix performance regression for incremental builds (#9769, fixes #9738, @rgrinberg)

  • Fix dune ocaml top-module to correctly handle absolute paths. (#8249, fixes #7370, @Alizter)

  • subst: ignore broken symlinks when looking at source files (#9810, fixes #9593, @emillon)

  • subst: do not fail on 32-bit systems when large files are encountered. Just log a warning in this case. (#9811, fixes #9538, @emillon)

  • boot: sort directory entries in readdir. This makes the dune binary reproducible in terms of filesystem order. (#9861, fixes #9794, @emillon)

Odoc 2.4.1

The release of odoc 2.4.0 last month introduced a regression that caused Dune rules to fail in some cases. This release of odoc 2.4.1 fixes this issue.

See full changelog

Fixed

  • Revert to outputing a file (without content) when rendering a hidden compilation unit. This fixes cases where the dune rules would fail. (@panglesd, #1069)

Dune 3.13.0

We're happy to announce that Dune 3.13.0 is now available. This feature is packed with fixes and new features that you can find in the changelog.

There are a few new features that we would like to specially highlight.

Generate Conflicts File for Menhir Grammars (#9512, @nojb)

When menhir is used to generate code from .mly files, there are sometimes issues with the grammar itself, such as shift-reduce conflicts.

Menhir has an option to generate a "conflicts" file using its --explain flag, but until now this was not exposed by Dune. Starting from this version, this file will be generated automatically to help developers debug their grammars.

Cached Directory Targets (#9535, @rleshchinskiy)

Dune's global cache is a way to save the result of intermediate build results, even across projects. Previously, it would only work with file targets. With this change, it now supports Dune's experimental directory targets.

Dynamic Module List (#9578, @nojb)

In several places in the Dune language, it is possible to pass a list of modules. For example in a (library) stanza, if for some reason the default of picking all the source files in the current directory is not the right thing to do, it is possible to pass (module A B C) to only attach these modules to the library.

An important limitation has been that the list of modules needed to be static: written as is in the dune file. This limitation has now been lifted and it is possible to use (:include) or %{read-lines:file} in this field and similar ones.

LexiFi's use case is a system of static plug-ins: a program is extended by selecting which modules are linked to the application core. This list of modules can now be emitted by a generator that reads a configuration file.

Previously, this required using OCaml syntax for the dune file, which has several issues, including incompatibility with features like (include_subdirs) and poor performance because Dune does not know the dependencies of the generator and needs to re-run the build more times than necessary.

See full changelog

Added

  • Add command dune cache clear to completely delete all traces of the Dune cache. (#8975, @nojb)

  • Allow to disable Coq 0.8 deprecation warning (#9439, @ejgallego)

  • Allow OCAMLFIND_TOOLCHAIN to be set per context in the workspace file through the env stanza. (#9449, @rgrinberg)

  • Menhir: generate .conflicts file by default. Add new field to the (menhir) stanza to control the generation of this file: (explain <blang expression>). Introduce (menhir (flags ...) (explain ...)) field in the (env) stanza, delete (menhir_flags) field. All changes are guarded under a new version of the Menhir extension, 3.0. (#9512, @nojb)

  • Directory targets can now be cached. (#9535, @rleshchinskiy)

  • It is now possible to use special forms such as (:include) and variables %{read-lines:} in (modules) and similar fields. Note that the dependencies introduced in this way (i.e., the files being read) must live in a different directory than the stanza making use of them. (#9578, @nojb)

  • Remove warning 30 from default set for projects where dune lang is at least 3.13 (#9568, @gasche)

  • Add coqdoc_flags field to coq field of env stanza, allowing the setting of workspace-wide defaults for coqdoc_flags. (#9280, fixes #9139, @Alizter)

  • ctypes: fix an error where (ctypes) with no (function_description) would cause an error trying refer to a nonexistent _stubs.a dependency (#9302, fix #9300, @emillon)

Changed

  • Check that package names in (depends) and related fields in dune-project are well-formed. (#9472, fixes #9270, @ElectreAAS)

Fixed

  • Do not ignore (formatting ..) settings in context or workspace files (#8447, @rgrinberg)

  • Fixed a bug where Dune was incorrectly parsing the output of coqdep when it was escaped, as is the case on Windows. (#9231, fixes #9218, @Alizter)

  • Copying mode for sandboxes will now follow symbolic links (#9282, @rgrinberg)

  • Forbid the empty (binaries ..) field in the env stanza in the workspace file unless language version is at least 3.2. (#9309, @rgrinberg)

  • [Coq] Fix bug in computation of flags when composed with boot theories. (#9347, fixes #7909, @ejgallego)

  • Fixed a bug where the (select) field of the (libraries) field of the (test) stanza wasn't working properly. (#9387, fixes #9365, @Alizter)

  • Fix handling of the PATH argument to dune init proj NAME PATH. An intermediate directory called NAME is no longer created if PATH is supplied, so dune init proj my_project . will now initialize a project in the current working directory. (#9447, fixes #9209, @shonfeder)

  • Experimental doc rules: Correctly handle the case when a package depends upon its own sublibraries (#9461, fixes #9456, @jonludlam)

  • Resolve various public binaries to their build location, rather than to where they're copied in the _build/install directory (#9496, fixes #7908, @rgrinberg).

  • Correctly ignore warning flags in vendored projects (#9515, @rgrinberg)

  • Use watch exclusions in watch mode on MacOS (#9643, fixes #9517, @PoorlyDefinedBehaviour)

  • Fix Merlin configuration for (include_subdirs qualified) modules (#9659, fixes #8297, @rgrinberg)

  • Fix handling of enabled_if in binary install stanzas. Previously, we'd ignore the result of enabled_if when evaluating %{bin:..} (#9707, @rgrinberg)

Dune 3.12.2

We just released version 3.12.2 with 2 bugfixes.

See full changelog

Fixed

  • Fix version check in runtest_alias for cram stanza (#9454, @emillon)

  • Fix stack overflow when a (run) action can not be parsed. (#9530, fixes #9529, @gridbugs)

In the last three months after the release of OCaml 5.1.0, three significant regressions have been discovered in OCaml 5.1.0. Those regressions concern the packaging of executables, the typechecking of OCaml programs, and the performance of numerical codes.

Since those regressions affect many users and could have lasting effects, we have published patch release OCaml 5.1.1 fixing those issues.

As a major exception to our policy for patch releases, OCaml 5.1.1 will contain one breaking change in the standard library: the Compression flag has been removed from the Marshal module.

This drastic measure was taken because supporting ZSTD compression in the standard library made ZSTD a dependency of all OCaml executables. Since the compiler should not impose its dependency on end users, the support for compressed marshaling has been moved to a compiler internal library in 5.1.1.

Accounting for the still-experimental nature of the Multicore runtime, this patch release 5.1.1 also contains safe fixes for subtle concurrency issues in the OCaml runtime.

The full list of changes is available below for more details.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands:

opam update
opam switch create 5.1.1

The source code for the release is also directly available on:

See full changelog

Standard library:

  • (breaking change) #12562, #12734, #12783: Remove the Marshal.Compression flag to the Marshal.to_* functions introduced in 5.1 by #12006, as it cannot be implemented without risking to link -lzstd with all ocamlopt-generated executables. The compilers are still able to use ZSTD compression for compilation artefacts. (Xavier Leroy and David Allsopp, report by Kate Deplaix, review by Nicolás Ojeda Bär, Kate Deplaix, and Damien Doligez).

Runtime Bug Fixes:

  • #11800, #12707: Fix an assertion race condition in install_backup_thread (Jan Midtgaard, review by Gabriel Scherer)

  • #12486, #12535: Fix delivery of unhandled effect exceptions on AMD64 with --enable-frame-pointers (Miod Vallat, report by Jan Midtgaard, review by Gabriel Scherer)

  • #12712, #12742: Fix an assertion boundary case in caml_reset_young_limit (Jan Midtgaard, review by Guillaume Munch-Maccagnoni)

  • #12713, #12715: Disable common subexpression elimination for atomic loads (Gabriel Scherer and Vincent Laviron, review by Vincent Laviron, KC Sivaramakrishnan and Xavier Leroy, report by Vesa Karvonen and Carine Morel)

GC Performance Regression Bug Fixes:

  • #12318: GC: simplify the meaning of custom_minor_max_size: blocks with out-of-heap memory above this limit are now allocated directly in the major heap. (Damien Doligez, report by Stephen Dolan, review by Gabriel Scherer)

  • #12439: Finalise and collect dead custom blocks during minor collection (Damien Doligez, review by Xavier Leroy, Gabriel Scherer and KC Sivaramakrishnan)

  • #12590, #12595: Move caml_collect_gc_stats_sample in caml_empty_minor_heap_promote before barrier arrival. (B. Szilvasy, review by Gabriel Scherer)

  • #12491, #12493, #12500, #12754: Do not change GC pace when creating subarrays of bigarrays (Xavier Leroy, report by Ido Yariv, analysis by Gabriel Scherer, review by Gabriel Scherer and Fabrice Buoro)

Bug Fixes

  • #12581, #12609: Fix error on uses of packed modules outside their pack to correctly handle nested packs (Vincent Laviron, report by Javier Chávarri, review by Pierre Chambart)

  • #12623: Fix the computation of variance composition (Florian Angeletti, report by Vesa Karvonen, review by Gabriel Scherer)

  • #12645, #12649: Fix error messages for cyclic type definitions in presence of the -short-paths flag. (Florian Angeletti, report by Vesa Karvonen, review by Gabriel Scherer)

  • #12757: Fix ocamlnat (native toplevel) by registering frametables correctly (Stephen Dolan, Nick Barnes and Mark Shinwell, review by Vincent Laviron and Sébastien Hinderer)

  • #12791: extern is applied to definitions of caml_builtin_cprim and caml_names_of_builtin_cprim when linking bytecode -custom executables with a C++ linker. (Shayne Fletcher, review by Antonin Décimo and Xavier Leroy)

We are pleased to announce the release of OCaml LSP 1.17.0. This version comes packed with fixes and new features.

Notable features that come in this release include:

  • Compatibility with Odoc 2.3.0: This version is fully compatible with Odoc 2.3.0, introducing support for the latest syntax features like tables and "codeblock output."
  • New Actions for Code Cleanup: You can now mark or remove unused elements such as 'open', types, for loop indexes, modules, match cases, 'rec', and constructors, making your code cleaner and more efficient.
  • Auto-completion for 'in' Keyword: To address the long standing issue of the in keyword completing to other terms in the editor, we've added auto-completion for this keyword in OCaml LSP. Typing in will now only suggest auto completion for the in keyword.
See full changelog

Fixes

  • Fix missing super & subscripts in markdown documentation. (#1170)
  • Do not invoke dune at all if --fallback-read-dot-merlin flag is on. (#1173)
  • Fix semantic highlighting of infix operators that contain '.'. (#1186)
  • Disable highlighting unit as an enum member to fix comment highlighting bug. (#1185)
  • Improve type-on-hover and type-annotate efficiency by only formatting the type of the first enclosing. (#1191, #1196)
  • Fix the encoding of URI's to match how vscode does it (#1197)
  • Fix parsing of completion prefixes (#1181)

Features

  • Compatibility with Odoc 2.3.0, with support for the introduced syntax: tables, and "codeblock output" (#1184)
  • Display text of references in doc strings (#1166)
  • Add mark/remove unused actions for open, types, for loop indexes, modules, match cases, rec, and constructors (#1141)
  • Offer auto-completion for the keyword in (#1217)

Odoc 2.4.0

The odoc team is delighted to announce the release of odoc 2.4.0. It mainly contains support for search engines. There are of course bugfixes and smaller new features.

🌟 Spotlight Feature of Odoc 2.4.0 : Search

Odoc now support searching in the documentation ! The search is made to run in the browser, so that you do not need a server to enable search: you can have search on your documentation hosted on github pages or even locally on your machine.

No search engine is shipped with, you need to provide one, but all the facilities to make use of one are present. We adapted @art-w 's sherlodoc for seamless integration with odoc, alongside with new features. It is not yet released on opam, but we hope it will be soon.

You can already test sherlodoc and play with it on your own projects, there are instructions in its readme. Sherlodoc has fuzzy typed-based search like hoogle in the haskell world, and is made to work best for OCaml (unlike a general purpose search engine like elastic search).

Check the results on odoc's own online documentation : ocaml.github.io/odoc.

🤝 Join The Mission

While we are dedicated to developing the best tooling to generate and serve documentation on OCaml.org, creating a well-documented library ecosystem can only be a collective effort. Package authors: we’re working hard to give you great tools, but we’ll need all your help to create an ecosystem of well-documented libraries for OCaml!

If you find that writing documentation for your library isn’t as straightforward as you would like, please do share your feedback with us.

See full changelog

Added

  • Add support for external search engines (@panglesd, @EmileTrotignon, #972) This includes the generation of an index and the display of the results in the UI (HTML only).
  • Display 'private' keyword for private type extensions (@gpetiot, #1019)
  • Allow to omit parent type in constructor reference (@panglesd, @EmileTrotignon, #933)

Fixed

  • Warn and exit when table(s) is not closed (@lubegasimon, #1050)
  • Hint when list(s) is not closed (@lubegasimon, #1050)
  • Fix crash on functors returning an alias (@Julow, #1046)
  • Fix rendering of polymorphic variants (@wikku, @panglesd, #971)
  • Add references to extension declarations (@gpetiot, @panglesd, #949)

Changed

  • Style: Adjusted line height in the TOC to improve readability (@sorawee, #1045)
  • Style: Remove font fallback to Helvetica, Arial (@Julow, #1028)
  • Style: Preformatted elements fallback to UA monospace (@toastal, #967)
  • Style: Sidebar is now stuck to the left of the content instead of the left of the viewport (@EmileTrotignon, #999)

We're happy to announce the release of Merlin 4.13. This release comes with a number of bug fixes to the Merlin binary.

It also introduces a new -cache-lifespan flag that can be used to set cache invalidation periods. This flag allows for fine-tuning of cache invalidation periods, enabling users to customize Merlin's internal configurations for optimal performance in various project contexts.

Additionally, this release includes several improvements in editor modes. For more details, we encourage you to delve into the full changelog.

See full changelog
  • merlin binary
    • Fix a follow-up issue to the preference of non-ghost nodes introduced in #1660 (#1690, fixes #1689)
    • Add -cache-lifespan flag, that sets cache invalidation period. (#1698, #1705)
    • Fix Merlin locate not fallbacking on the correct file in case of ambiguity (@goldfirere, #1699)
    • Fix Merlin reporting errors provoked by the recovery itself (#1709, fixes #1704)
  • editor modes
    • vim: load merlin when Vim is compiled with +python3/dyn (e.g. MacVim)
    • emacs: highlight only first error line by default (#1693, fixes #1663)

Dune 3.12.1

We're pleased to announce the release of Dune 3.12!

Note that due to a mistake during the release process, version 3.12.0 was not published to opam and should not be used.

This version contains many fixes but we would like to highlight the following features:

  • dune ocaml doc is a new command that will build the docs of your package, and open them in a web browser directly.
  • a new set of odoc rules will build documentation for the whole switch. It can be invoked by dune build @doc-new. Note that this is still experimental.
  • Dune can now be built and installed on Haiku.
See full changelog

Added

  • Introduce $ dune ocaml doc to open and browse documentation. (#7262, fixes #6831, @EmileTrotignon)

  • dune cache trim now accepts binary byte units: KiB, MiB, etc. (#8618, @Alizter)

  • Introduce the runtest_alias field to the cram stanza. This allows removing default runtest alias from tests. (@rgrinberg, #8887)

  • Display cache location in Dune log (#8974, @nojb)

  • Dune can now be built and installed on Haiku (#8795, fix #8551, @Alizter)

  • Mark installed directories in dune-package files. This fixes (package) dependencies against packages that contain such directories. (#8953, fixes #8915, @emillon)

  • Introduce new experimental odoc rules (#8803, @jonjudlam)

Changed

  • dune-build-info: when version="" is found in a META file, we now return None as a version string (#9177, @emillon)

  • No longer force colors for OCaml 4.03 and 4.04 (#8778, @rgrinberg)

  • Dependencies in the copying sandbox are now writeable (#8920, @rgrinberg)

  • Rules that only use internal dune actions (write-file, echo, etc.) can now be sandboxed. (#9041, fixes #8854, @rgrinberg)

  • Add test_ prefix to default test name in dune init project (#9257, fixes #9131, @9sako6)

Fixed

  • Do not ignore libraries named bigarray when they are defined in conjunction with OCaml 5.0 (#8902, fixes #8901, @rgrinberg)

  • Correctly ignore bigarray on recent versions of OCaml (#9076, @rgrinberg)

  • Absent packages shouldn't prevent all rules from being loaded (#8948, fixes #8630, @rgrinberg)

  • Correctly determine the stanza of menhir modules when (include_subdirs qualified) is enabled (@rgrinberg, #8949, fixes #7610)

  • Re-run actions whenever (expand_aliases_in_sandbox) changes (#8990, @rgrinberg)

  • Do not re-run rules when their location changes (#9052, @rgrinberg)

  • [coq rules] Be more tolerant when coqc --print-version / --config don't work properly, and fallback to a reasonable default. This fixes problems when building Coq projects with (stdlib no) and likely other cases. (#8966, fix #8958, @Alizter, reported by Lasse Blaauwbroek)

  • Dune will now run at a lower framerate of 15 fps rather than 60 when INSIDE_EMACS. (#8812, @Alizter)

We’re pleased to announce the release of opam-publish 2.3.0.

This release, apart from a couple of light improvements, mainly consists of the following new option:

  • You can now use opam-publish with the --no-confirmation argument for use in automated pipeline. Use this option with extreme caution if you do use it.

The full changelog is available below.

Enjoy, The opam team

See full changelog
  • Add a new --no-confirmation argument for use in automated pipeline [#158 @AltGr - fix #132]
  • Improve the error message when a file expected to be an opam file is given as argument [#150 @kit-ty-kate - partially fix #149]
  • Adopt the OCaml Code of Conduct [#151 @rikusilvola]
  • Changes the makefile to make sure the standard "make && make install" works [#157 @kit-ty-kate]

Odoc 2.3.1

Following the release of odoc 2.3.0, we're releasing a patch release with odoc 2.3.1 that fixes support for OCaml 5.1.

See full changelog

After giving space for feedback and objections by the community, we have deprecated ocaml-migrate-parsetree (aka OMP). It is superseded by Ppxlib.

There are four major differences between OMP and Ppxlib, which all go hand in hand.

The first major difference is in the library and therefore impacts how to write PPXs. With OMP, each PPX author had to choose a parsetree version to define their PPX against. There was no version agreement between different PPXs. With Ppxlib, each PPX author uses the same parsetree version.

The second major difference is about compatibility with new compiler syntax. While with OMP, each PPX was on its own parsetree version, Ppxlib keeps them all on the version of the latest stably released compiler. That makes using any PPX compatible with using the latest compiler syntax features!

The third major difference is in the philosophy of PPXs. With OMP, all PPX transformations were global transformations, i.e., transformations of the whole parsetree. Ppxlib has introduced the concept of "context-free" transformations, i.e., transformations that transform only one parsetree node. By restricting their scope of action, context-free PPXs are a lot more predictable and less dangerous! Also, Ppxlib merges all context-free PPXs into one parsetree pass, defining clear semantics of PPX composition.

The fourth major difference is in the driver, i.e., the binary that drives the application of all used PPXs in a project. The Ppxlib driver is significantly more performant than the OMP driver used to be. That's partly because it does a lot fewer parsetree migrations and partly thanks to merging all context-free PPXs into one parsetree pass.

As a consequence of the deprecation, OMP will be incompatible with any new compiler version. The first incompatible compiler version is OCaml 5.1.

Thanks a lot to everyone involved in OCaml's transition from OMP to Ppxlib, for example by porting their PPX!

Dune 3.11.1

Following the release of Dune 3.11.0 a few days ago, we've just released version 3.11.1 with a couple of bug fixes:

  • Fix the dune rpc status command that was incorrectly showing that there were no RPC servers running on Windows.
  • Fix a bogus error when no inline test was declared in a library using (inline_tests).
See full changelog

Fixed

  • Fix dune rpc commands on Windows (#8806, fixes #8799, @nojb)

  • Fix inline_tests when the partition list is empty (#8849, fixes #8848, @hhugo)

We're happy to announce the release of Ppxlib 0.31.0. Shortly after OCaml 5.1.0 has been released, this Ppxlib release fixes a bug in the support of OCaml 5.1.0. Before that bug fix, the warnings about a generative/applicative mismatch between a functor creation and its application introduced by OCaml 5.1.0 were also triggered when that mismatch didn't exist.

Furthermore, the release contains a couple of bug fixes in the context of attributes.

We're also excited about two main enhancements. One allows authors of extension node rewriters to add a path argument to the extension node. That's excellent for hygiene since it allows the PPX to be explicit about modules rather than depending on its scope.

The other main enhancement allows an opt-in for compiler warnings about unused code generated by derivers (warnings w32 and w60). That opting in needs to happen on both sides of the deriver, the writer side and the user side. Opting in to those code warnings will help to clean up unused code, leading to performance improvements in compilation and editor support.

See full changelog
  • Fix support for OCaml 5.1: migrated code preserves generative functor warnings, without creating more. Locations are better preserved. (#432, @pitag-ha, @panglesd)

  • Driver: Add -unused-code-warnings command-line flag. (#444, @ceastlund)

  • Add ?warning flag to Deriving.Generator.make. (#440, @jacksonzou123 via @ceastlund)

  • Restore the path_arg functionality in the V3 API. (#431, @ELLIOTTCABLE)

  • Expose migration/copying/etc. functions for all AST types needed by Pprintast. (#454, @antalsz)

  • Preserve quoted attributes on antiquotes in metaquot. (#441, @ncik-roberts)

  • Attribute namespaces: Fix semantics of reserving multi-component namespaces. (#443, @ncik-roberts)

Dune 3.11.0

We're pleased to announce the release of Dune 3.11!

Here are some highlights from this release.

Dune Terminal User Interface (TUI)

The biggest highlight in this release is the introduction of the new Terminal User Interface (TUI) display mode.

You can now run dune build --display tui to open a TUI. We recommend using it in conjunction with Dune watch mode (dune build -w --display tui).

From the TUI, you will be able to navigate messages from Dune build, scroll through them, or click to minimize them. Press ? to show the help screen.

Installing Source Directories

Another exciting feature in this release is the new (source_trees ..) field added to the (install ..) stanzas to add every files in a directory to the installation. For instance, to add your manual to the installation, you can use:

(install
 (section doc)
 (source_trees manual))

Let us know what you think about these features, and don't hesistate to open issues on Dune's bug tracker if you encounter any issue.

See full changelog

Added

  • enabled_if now supports arch_sixtyfour variable (#8023, fixes #7997, @Alizter)

  • Experimental: Added a $ dune monitor command that can connect to a running dune build in watch mode and display the errors and progress. (#8152, @Alizter)

  • The progress RPC procedure now has an extra field for the In_progress constructor for the number of failed jobs. (#8212, @Alizter)

  • Add a --preview flag to dune fmt which causes it to print out the changes it would make without applying them (#8289, @gridbugs)

  • Introduce (source_trees ..) to the install stanza to allow installing entire source trees. (#8349, @rgrinberg)

  • Add --stop-on-first-error option to dune build which will terminate the build when the first error is encountered. (#8400, @pmwhite and @Alizter)

  • Dune now displays the number of errors when waiting for changes in watch mode. (#8408, fixes #6889, @Alizter)

  • Add with_prefix keyword for changing the prefix of the destination of installed files matched by globs. (#8416, @gridbugs)

  • Added experimental --display tui option for Dune that opens an interactive Terminal User Interface (TUI) when Dune is running. Press '?' to open up a help screen when running for more information. (#8429, @Alizter and @rgrinberg)

  • Add a warnings field to dune-project files as a unified mechanism to enable or disable dune warnings (@rgrinberg, 8448)

  • dune exec: support syntax like %{bin:program}. This can appear anywhere in the command line, so things like dune exec time %{bin:program} now work. (#6035, #8474, fixes #2691, @emillon, @Leonidas-from-XIV)

  • Add a new alias @doc-json to build odoc documentation in JSON format. This output can be consumed by external tools. (#8178, @emillon)

Changed and Fixed

  • Use posix_spawn instead of fork on MacOS. This gives us a performance boost and allows us to re-enable thread. (#8090, @rgrinberg)

  • Modules that were declared in (modules_without_implementation), (private_modules) or (virtual_modules) but not declared in (modules) will raise an error. (#7674, @Alizter)

  • No longer emit linkopts(javascript) in META files (#8168, @hhugo)

  • RPC message styles are now serialised meaning that RPC diagnostics keep their ANSI styling. (#8516, fixes #6921, @Alizter)

  • Truncate output from actions that produce too much output (@tov, #8351)

  • Allow libraries to shadow OCaml built-in libraries. Previously, built-in libraries would always take precedence. (@rgrinberg, #8558)

  • dune utop no longer links utop in "custom" mode, which should make this command considerably faster. (#8631, fixes #6894, @nojb)

  • Ensure that package names in dune-project are valid opam package names. (#8331, @emillon)

  • init: check that module names are valid (#8644, fixes #8252, @emillon)

  • dune init: parse --public as a public name (#8603, fixes #7108, @emillon)

  • Stop signing source files with substitutions. Sign only binaries instead (#8361, fixes #8360, @anmonteiro)

  • Make copy sandbox support directory targets. (#8705, fixes #7724, @emillon)

Deprecated and Removed

  • Deprecate install destination paths beginning with ".." to prevent packages escaping their designated installation directories. (#8350, @gridbugs)

  • Remove warning against .dune files generated by pre Dune 2.0 (#8611, @rgrinberg)

  • Remove versions 0.1 and 0.2 of the experimental ctypes extension. (#8293, @emillon)

Odoc 2.3.0

We are thrilled to announce the release of odoc 2.3.0! 🎉 This release is the result of almost a year of diligent work from the odoc team since the last major release of odoc 2.2.0, it comes packed with significant new features and improvements!

🌟 Spotlight Features of Odoc 2.3.0

Here are a couple of the new features introduced in Odoc 2.3.0 that we'd like to highlight.

Table Support

Table support is the last addition to the odoc language, and comes with two syntax flavours: a light one, and a heavy one. The light markup is similar to markdown's markup for table, producing tables that are readable in the source file as well.

However, this markup has some limitation, since it only allows inline content in cells. It can also be difficult to read and mantain for big tables, without a proper editor support. For this reason, Odoc also provides a "heavy" markup, closer to the html one, with fewer limitations!

Here is a table in heavy, light, and rendered form:

{t
Table | support
------|--------
is    | cool!
}
{table
{tr {th Table} {th support}}
{tr {td is} {td cool!}}
}

Table | support ------|-------- is | cool!

Source Code Rendering

Source code rendering is an extremely exciting new feature. Not only odoc is now able to generate a rendering of the source files (and source hierarchy) of a project, but it is also able to create direct links from the documentation to the implementation!

This puts the documentation browsing to a new level, by helping to quickly answer any implementation-related question!

The source code rendering is also tailored to OCaml, for instance with links from variables to their definition, something missing from traditional html-based source viewing such as github!

Using this features in odoc’s driver will require some work, but you can already have a preview of the feature by going to the odoc API website, which was built with the feature enabled. For instance, the Odoc_html 19 module is now populated with many Source links, jumping right into the implementation file 5! Directory pages to browser the implementation are also included 8 :smiley:

🗺️ Background & Roadmap

Some background on our roadmap and what comes next.

The lack of access to comprehensive documentation for OCaml libraries is one of the biggest pain points reported by the OCaml community, as highlighted in the 2022 OCaml survey (c.f. Q50).

This motivated the odoc and OCaml.org teams to jointly work on a centralised package documentation, that went live in April 2022, as part of the new version of OCaml.org.

With documentation for OCaml libraries readily available on OCaml.org, we now turn our focus on making sure that library authors have the tooling they need to create high-quality documentation.

Our roadmap highlights some features we believe will make the generated documentation significantly better for readers, and documentation-writing much more pleasant and rewarding.

This release is a significant milestone in implementing the features on our roadmap and is the precursor to a series of upcoming releases. Odoc 2.4.0 will follow shortly and will bring support for search. Stay tuned and follow our progress through the OCaml Platform newsletter!

🤝 Join Our Mission

While we are dedicated to developing the best tooling to generate and serve documentation on OCaml.org, creating a well-documented library ecosystem can only be a collective effort. Package authors: we're working hard to give you great tools, but we'll need all your help to create an ecosystem of well-documented libraries for OCaml!

If you find that writing documentation for your library isn't as straightforward as you would like, please do share your feedback with us.

See full changelog

Additions

  • Source code rendering (@Julow, @panglesd, @jonludlam #909, #996, #993, #982)
  • Handle tables markup (@panglesd, @gpetiot, #893)
  • Initial support for assets (@trefis, #975)
  • odoc-parser remerged (@jonludlam, #973) This includes table support (@gpetiot, @panglesd, ocaml-doc/odoc-parser#11 ocaml-doc/odoc-parser#14) and delimited code blocks with optional output (@jonludlam, ocaml-doc/odoc-parser#17)
  • Add a tooltip to references with text (@Julow, #945)
  • Add emoji to alerts in CSS (@yawaramin, #928)
  • Add common language in shipped highlightjs (@Julow, #953)

Bugfixes

  • Fix --hidden not always taken into account (@panglesd, #940)
  • Syntax highlight labels in function arguments (@panglesd, #990)
  • Ensure generated html ends with a newline (@3Rafal, #954)
  • Warn against tags in pages (@Julow, #948)
  • Remove unhelpful 'Unresolved_apply' errors (@gpetiot, #946)
  • Allow links and references in headings (@EmileTrotignon, @panglesd, #942)
  • Fix rendering of method types (@zoggy, #935)
  • Fix section labelling with submodules (@EmileTrotignon, @panglesd, #931)
  • LaTeX backend fixes (@Octachron, #921 #920)
  • html: Remove extra space in class declarations (@Julow, #936)
  • Fix rendering of unresolved references (@Julow, #957)
If you want to contribute to a new release announcement, check out the Contributing Guide on GitHub.