OCaml Changelog

RSS

Read the latest releases and updates from the OCaml ecosystem.

Feedback on this post is welcomed on Discuss!

We are indescribably thrilled to announce the second beta release of opam 2.2.0.

It contains everything required to be able to make opam-repository compatible with Windows, as well as a whole bunch of fixes. You can view the full list of changes in the release note.

We'll post another blog post very soon with more directions on how to test opam on Windows with this release.

This version is a beta, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release.

Changes

Windows support

This beta introduces a handful of changes necessary to be able to make the default opam-repository support Windows out of the box:

  • Add a new sys-ocaml-system init 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:}%"
  • Add winsymlinks:native to the CYGWIN environment variable when installing a package on Windows. In particular, this provides a workaround when extracting ocamlbuild's sources.
  • Internal Cygwin installation's bin directory is placed as far down PATH as is necessary not to shadow bash, tar, sort or git
  • Disable ACL in Cygwin internal install to avoid permission mismatch errors

We expect to be able to show the proposed changed to opam-repository very soon to take advantage of all these changes.

opam-repository scalability

The current draft resolution resulting from the discussion in ocaml/opam-repository#23789 about the scalability of opam-repository includes the removal of some packages. However currently, opam uses the patch system command to apply changes from a repository. The behaviour of that command is thus very important and it is a known behaviour for the macOS and BSDs patch command to not be able to delete files which leads to failures and inconsistencies for opam. Package managers on those platforms installing opam already make opam depend on GNU patch, however a certain number of people do not install opam via a system package manager (e.g. our own install script!) and end up using their system version of patch. This is in particular a problem on macOS as the name of the GNU patch command is not gpatch like on BSDs but simply patch when installed via Homebrew.

This issue is surprisingly tricky to fix, and after many trials and errors, we've decided to:

  • Warn if GNU patch is not detected when a patch is applied
  • Use gpatch by default instead of patch on NetBSD and DragonFlyBSD
  • Use gpatch if it exists and is detected as GNU patch when patch is not GNU patch

These changes will make their way to the upcoming opam 2.1.6, in a few weeks.

Other noteworthy changes

  • Recommend enabling Developer Mode on Windows. This allows the creation of symlinks without requiring elevation. Longer-term, the aim is that we should never require Developer Mode, but at the moment more things work with it than without it!
  • Mark the internal Cygwin installation as recommended. Please don't try to maintain your own Cygwin install for use with opam unless you really know what you're doing!
  • Fix MSYS2 support. For 2.2.0, the focus has been on Cygwin, so configuring opam to use MSYS2 is quite manual. Please note that even if opam can use a MSYS2 installation, it is not yet officially supported and opam repository is not yet MSYS2 compatible. Use opam with MSYS2 only if you really really know what you're doing!
  • Fix issues when using fish
  • Improve the internal Cygwin installation during init on Windows
  • Unixify Windows paths in init shells scripts
  • Disable Software Heritage fallback by default as there currently no CI job in opam-repository to check validity of proposed swhid regarding release archive (neither publication tools support) and some concerns were raised regarding the degree of trust of the hashing method used by Software Heritage (sha1).
  • Make sure opam source --dev with git sources, clones the whole repository instead of using --depth=1
  • 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, treat it like Alpine family as it also uses apk
  • Upgrade the vendored dune package to 3.14.2 to allow to compile opam when the environment contains unicode characters on Windows (in particular, this means opam now works if your username contains accented characters)
  • Upgrade other vendored packages (cmdliner 1.2.0, re 1.11.0, ocamlgraph 2.1.0, opam-file-format 2.1.6)

Various other general and performance improvements were made and bugs were fixed. API changes are denoted in the release note. This release also includes PRs improving the documentation and improving and extending the tests.

Windows Support

As we've said above we're writing a separate blog post to present how to test this new release of opam on Windows.

Stay tuned!

Try it!

In case you plan a possible rollback, you may want to first backup your ~/.opam directory.

The upgrade instructions are unchanged:

  1. Either from binaries: run

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh) --version 2.2.0~beta2"
    

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

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

You should then run:

opam init --reinit -ni

Please report any issues to the bug-tracker.

Thanks for trying this new release out, and we hope you will enjoy the new features!

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)

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)

Feedback on this post is welcomed on Discuss!

We are happy to announce the first beta release of opam 2.2.0. It contains some fixes and a new feature for Windows. You can view the full list in the release note.

This version is a beta, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release.

Major change: Check and advertise to use Git for Windows

Opam 2.2 is based on a Cygwin installation (previously installed, or managed internally by opam). Cygwin's Git has three known usability issues when used outside a Cygwin environment: it uses a different set of trusted certificate authorities, has its own Credential Manager and potentially uses a separate Git configuration. We therefore recommend using Git for Windows either installed manually or via winget.

At opam init, opam checks for available Git(s), and asks the user to choose one of the available, or to rerun opam init after installing another Git.

Other noteworthy changes

  • When compiling opam on Windows with MinGW, the resulting opam binary now contains libstdc++ instead of requiring the DLL to be distributed alongside it or present in the environment
  • Fix opam env containing carriage return on Cygwin - eval $(opam env) now works from a Cygwin bash terminal

Miscellaneous changes

  • Remove stray comments from pwsh and cmd opam env output
  • Add ./configure --enable-static to compile the opam binary statically on Linux
  • Fix debug logs showing up regardless of verbosity on macOS 12.7.1 / 13.6.3 / 14.2 and FreeBSD
  • Upgrade to, and require mccs >= 1.1+17
  • Fix opam tree options --dev and --no-switch

Various other improvements were made and bugs were fixed. API changes are denoted in the release note linked above. This release also includes PRs improving the documentation and improving and extending the tests.

Windows Support

The main opam-repository Windows compliance is still a work in progress, we recommend to use existing compatible repository (originally from @fdopen) and 32/64 bit mingw-w64 packages (by @dra27).

How to Test opam on Windows

If you're feeling adventurous, you can use the experimental pre-built binary for Windows available here.

Otherwise you can compile opam yourself using the following steps:

This beta requires a preexisting Cygwin installation for compiling opam.

  1. Check that you have all dependencies installed:
  • autoconf, make, patch, curl
  • MinGW compilers: mingw64-x86_64-gcc-g++, mingw64-i686-gcc-g++
  • Or if you want to use the MSVC port of OCaml, you'll need to install Visual Studio or Visual Studio Build Tools
  1. Download & extract the opam archive
  2. In the directory, launch make cold
  3. A coffee later, you now have an opam executable!
  4. Start your preferred Windows terminal (cmd or PowerShell), and initialise opam with the Windows sunset repository:
  • opam init git+https://github.com/ocaml-opam/opam-repository-mingw

From here, you can try to install the sunset repository packages. If you find any bugs, please submit an issue. It will help opam-repository maintainers to add Windows repository packages into the main repository.

Try it!

In case you plan a possible rollback, you may want to first backup your ~/.opam directory.

The upgrade instructions are unchanged:

  1. Either from binaries: run

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh) --version 2.2.0~beta1"
    

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

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

You should then run:

opam init --reinit -ni

Please report any issues to the bug-tracker.

Thanks for trying this new release out, and we hope you will enjoy the new features!

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)

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)

Feedback on this post is welcomed on Discuss!

We are happy to announce the third alpha release of opam 2.2.0. It contains some fixes and a new feature for Windows. You can view the full list in the release note.

This version is an alpha, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release.

Major change: Environment variables handling on Windows

opam files now support a new x-env-path-rewrite field which specifies rewriting rules for the environment variable updates defined in the setenv and build-env fields. This field allows greater control over the separator character used for PATH-like fields (i.e. ; vs :), conversion of slashes to backslashes, and even conversion from Windows native path format (C:\cygwin64\home\dra\.opam) to Cygwin format (/home/dra/.opam).

The rewriting rules allow opam directory-like variables (e.g. the %{lib}% directory of a switch) to be used in setenv and build-env fields in a portable way.

For example, given:

setenv: [
  [PKG_CONFIG_PATH += "%{lib}%/pkgconfig"]
  [PATH += "%{share}%/bin"]
]
x-env-path-rewrite: [
  [ PKG_CONFIG_PATH ":" "host" ]
  [ PATH (":" {os != "win32"} | ";" {os = "win32"}) ("target" {os != "win32"} | "target-quoted" {os = "win32"}) ]
]

the environment variable changes given by opam env on Windows would be:

PKG_CONFIG_PATH='/cygdrive/c/Users/DRA/AppData/Local/opam/default/lib/pkgconfig[:<rest-of-PKG_CONFIG_PATH, if given>]'
PATH='C:\Users\DRA\AppData\Local\opam\default\share\bin;C:\Users\DRA\AppData\Local\opam\default\bin;<rest-of-PATH>'

with the following interesting parts for Windows users:

  • PKG_CONFIG_PATH, which is consumed by a Cygwin-tool, has the directory given in Unix-like syntax, and opam's share variable was automatically converted
  • The correct separator is used for each (: for PKG_CONFIG_PATH, ; for PATH is used when adding entries)
  • In the PATH update, /bin was converted to \bin

Note that the specification for PATH is opam's default behaviour, so it's not actually necessary to have this formula for PATH in the x-env-path-rewrite field.

The full syntax is described in full in the manual.

Opam files carrying this new field are still compatible with the opam 2.0 syntax as it is an extension field, however its effect is only available with opam 2.2.0~alpha3 and above. If you want to make sure users of the package containing it have a compatible opam, you can use the available field to that end:

available: opam-version >= "2.2.0~alpha3"

or, if the change is Windows-specific:

available: opam-version >= "2.2.0~alpha3" | os != "win32"

Other noteworthy changes

  • Sandbox: /tmp is now writable again, restoring POSIX compliance
  • opam tree: opam tree package.version is now supported, displaying the dependency tree of a specific version of a package
  • opam tree: --recurse and --subpath are supported for directory arguments
  • opam admin: new add-extrafiles command to add/check/update the extra-files: field according to the files present in the files/ directory
  • opam lint: new syntax allow marking a set of warnings as errors e.g. -W @1..9
  • Releases: Pre-built binaries now include ppc64le and s390x

Miscellaneous changes

  • A handful of issues related to the compilation of opam on Windows were fixed
  • Bugs in the handling of the OPAMCURL, OPAMFETCH and OPAMVERBOSE environment variables were fixed
  • Bugs in the handling of the --assume-built argument were fixed
  • Sporadic crashes and segfaults during shell detection on Windows were fixed

Various other improvements were made and bugs were fixed. API changes are denoted in the release note linked above. This release also includes a handful of PRs improving the documentation and more than a dozen PRs improving and extending the tests.

Windows Support

The main opam-repository Windows compliance is still a work in progress, we recommend to use existing compatible repository (originally from @fdopen) and 32/64 bit mingw-w64 packages (by @dra27).

How to Test opam on Windows

If you're feeling adventurous, you can use the experimental pre-built binary for Windows available here. It should work but since it's our first public pre-built binary for Windows please use at your own risk.

Otherwise you can compile opam yourself using the following steps:

This alpha requires a preexisting Cygwin installation for compiling opam.

  1. Check that you have all dependencies installed:
  • autoconf, make, patch, curl
  • MinGW compilers: mingw64-x86_64-gcc-g++, mingw64-i686-gcc-g++
  • Or if you want to use the MSVC port of OCaml, you'll need to install Visual Studio or Visual Studio Build Tools
  1. Download & extract the opam archive
  2. In the directory:
  • if you are using MSVC: launch make cold
  • if you are using MinGW: make sure the path to the libc dlls are in your PATH and launch make cold. For instance: export PATH='C:\cygwin64\usr\x86_64-w64-mingw32\sys-root\mingw\bin':$PATH && make cold. Don’t forget to update PATH accordingly or place the opam binary in the same directory as the libc dlls if you want to move the resulting opam binary.
  • alternatively, if you're using MinGW: make cold CONFIGURE_ARGS=--with-private-runtime. If you change the location of the resulting opam binary, don't forget to copy Opam.Runtime.amd64 directory (or Opam.Runtime.i386) in the same directory.
  1. A coffee later, you now have an opam executable!
  2. Start your preferred Windows terminal (cmd or PowerShell), and initialise opam with the Windows sunset repository:
  • opam init git+https://github.com/ocaml-opam/opam-repository-mingw

From here, you can try to install the sunset repository packages. If you find any bugs, please submit an issue. It will help opam-repository maintainers to add Windows repository packages into the main repository.

Try it!

In case you plan a possible rollback, you may want to first backup your ~/.opam directory.

The upgrade instructions are unchanged:

  1. Either from binaries: run

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh) --version 2.2.0~alpha3"
    

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

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

You should then run:

opam init --reinit -ni

Please report any issues to the bug-tracker.

Thanks for trying this new release out, and we hope you will enjoy the new features!

We’re 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)

MDX 2.3.1

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

We've also vendored the odoc-parser library, eliminating the need to have it as a dependency. MDX can now be installed independently of the odoc version you're using.

See full changelog

Added

  • Add os_type label to enable/disable based on Sys.os_type (#433, @polytypic)

  • Make MDX compatible with OCaml 5.1 (#435, @polytypic and @kit-ty-kate)

Changed

  • Vendored the odoc-parser library, removing the need to have it as a dependency. (#430, @jonludlam)

Merlin 4.12 is a small patch release fixing regressions introduced in previous versions.

See full changelog
  • merlin binary
    • Fix issue with let operators and tuples (ocaml/merlin#1684, fixes ocaml/merlin#1683, fixes ocaml/ocaml-lsp#1182)
    • Fix an issue causing Merlin locate queries to hang (ocaml/merlin#1686, fixes ocaml/ocaml-lsp#1192)

We are pleased to announce the release of Merlin 4.11 for OCaml 4.14.1, 5.0, and 5.1.

This release brings official support for OCaml 5.1 and introduces some changes to Emacs' default bindings proposed by the community:

  • Unbind C-c C-r (to avoid shadowing tuareg-eval-region) and bind C-c C-v instead to merlin-error-check;
  • Rebind C-c C-d to merlin-document and bind C-c M-d and C-c | instead to merlin-destruct;
  • Bind C-u C-c C-t to merlin-type-expr.

Thanks to everyone involved!

See full changelog
  • Merlin binary
    • Improve error messages for missing configuration reader (ocaml/merlin#1669)
    • Fix regression causing crash when using PPXs under Windows (ocaml/merlin#1673)
    • Fix confusion between aliased modules and module types (ocaml/merlin#1676, fixes ocaml/merlin#1667)
    • Ignore hidden branches when listing occurrences (ocaml/merlin#1677, fixes ocaml/merlin#1671)
  • Editor modes
    • Emacs: fix/improve keybindings (ocaml/merlin#1668, fixes ocaml/merlin#1386): Unbind C-c C-r (to avoid shadowing tuareg-eval-region) and bind C-c C-v instead to merlin-error-check; rebind C-c C-d to merlin-document and bind C-c M-d and C-c | instead to merlin-destruct; bind C-u C-c C-t to merlin-type-expr.
    • Emacs: remove use of obsolete defadvice macro (ocaml/merlin#1675)

We are pleased to announce the release of OCamlFormat 0.26.1!

This is the first OCamlFormat release to be compatible with OCaml 5.1.

We highlight notable formatting improvements below:

  1. Removal of extra breaks in constructor declarations
 type t =                               
   | Foo
   | (* Redirect (None, lib) looks up lib in the same database *)
-    Redirect of
-      db option * (Loc.t * Lib_name.t)
+    Redirect of db option * (Loc.t * Lib_name.t)
+    
  1. Consistent formatting for arrow class types, and consistent indentation of the object keyword
module type S = sig                    
-  class tttttttttttt : aaaaaaaaaaaaaaaaaa:int -> bbbbbbbbbbbbbbbbbbbbb:float ->
+  class tttttttttttt :
+    aaaaaaaaaaaaaaaaaa:int ->
+    bbbbbbbbbbbbbbbbbbbbb:float ->
    cccccccccccccccccccc
end

class type ct =
  let open M in
-  object
+object
  val x : t
end

We've also fixed a few bugs. Attributes that were previously skipped are not preserved, and we fixed a crash that occured in the presence of nested modules.

Have a look at the full changelog to see the list of improvements, and don’t hesitate to share your feedback on this release on OCaml Discuss.

See full changelog

Changed

  • Compatible with OCaml 5.1.0 (#2412, @Julow) The syntax of let-bindings changed sligthly in this version.
  • Improved ocp-indent compatibility (#2428, @Julow)
  • * Removed extra break in constructor declaration with comment (#2429, @Julow)
  • * De-indent the object keyword in class types (#2425, @Julow)
  • * Consistent formatting of arrows in class types (#2422, @Julow)

Fixed

  • Fix dropped attributes on a begin-end in a match case (#2421, @Julow)
  • Fix dropped attributes on begin-end in an if-then-else branch (#2436, @gpetiot)
  • Fix non-stabilizing comments before a functor type argument (#2420, @Julow)
  • Fix crash caused by module types with nested with module (#2419, @Julow)
  • Fix ';;' formatting between doc-comments and toplevel directives (#2432, @gpetiot)

We're thrilled to announce the release of Merlin 4.10, which comes with many bug fixes and improvements.

One of the standout features of this release is the significantly enhanced support for binding operators like let+ and and+. You'll find that the results from type-enclosing on expressions that contain let bindings are now more precise.

See full changelog
  • merlin binary
    • Constrain socket path buffer size to avoid build warnings (#1631)
    • Handle concurrent server start (#1622)
    • Omit module prefixes for constructors and record fields in the construct command (#1618). Prefixes are still produced when warning 42 (disambiguated name) is active.
    • Correctly invalidate PPX cache when pipeline ran partially (#1650, fixes #1647)
    • Prevent short-path from looping in some cases related to recursive type definitions (#1645)
    • Support parsing negative numbers in sexps (#1655)
    • Fix construct not working with inline records (#1658)
    • Improve behavior of type-enclosing on let/and operators (#1653)
    • Fix occurrences of extension constructors (#1662)
    • Improve node selection when ghosts are present (#1664, fixes #1660)
  • editor modes
    • emacs: call merlin-client-logger with "interrupted" if the merlin binary itself is interrupted, not just the parsing of the result (#1626).
    • emacs: merlin-construct, with a prefix argument, now includes local values in the completion options. Alternatively, this behavior can be enabled permanently by customizing merlin-construct-with-local-values (#1644)
    • emacs: add support for opam-switch-mode (#1654, fixes #1591). See https://github.com/ProofGeneral/opam-switch-mode

Odoc 2.2.1

As OCaml 5.1 is on the horizon, we're excited to announce the release of odoc 2.2.1. This latest version brings compatibility with the upcoming OCaml 5.1 release.

See full changelog

Additions

  • OCaml 5.1.0 compatibility (@Octachron, #956)
If you want to contribute to a new release announcement, check out the Contributing Guide on GitHub.