OCaml Changelog

RSS

Read the latest releases and updates from the OCaml ecosystem.

See full changelog
  • merlin binary
    • dune: restore compatibility with dune 1.8.0 (#1157, #1153)

Ppxlib 0.16.0

See full changelog
  • Driver.register_transformation: add optional parameter ~instrument (#161, @pitag-ha)
  • Add missing Location.init (#165, @pitag-ha)
  • Upgrade to ocaml-migrate-parsetree.2.0.0 (#164, @ceastlund)

Dune 2.7.0

On behalf of the dune team, I'm pleased to announce the release of dune 2.7.0. This release adds a couple of important features and many bug fixes. I'll just briefly summarize the two features, and let our improved documentation elaborate on the details.

The first one is first class support for instrumentation tools such as bisect_ppx and landmarks. This is one of the most requested dune features ever, and we're pleased to show you all what we've come up with

Special thanks to @stephanieyou & @nojb for implementing this feature. Many thanks to @aantron for tirelessly iterating on the end user experience with us.

While the features is looking quite good already, we consider it a "first take" on this subject. We welcome your experience reports and feature requests.

The second feature we're introducing this release is dune's cram testing framework. The cram framework is our secret weapon for making dune (relatively) bug free. I'll soon write up a dedicated post to give you a flavour of how it works. To those who can't wait, there's a new section in the documentation that explains everything.

As always, the change log is replicated below for your convenience.

Happy Hacking.

See full changelog
  • Write intermediate files in a .mdx folder for each mdx stanza to prevent the corresponding actions to be executed as part of the @all alias (#3659, @NathanReb)

  • Read Coq flags from env (#3547 , fixes #3486, @gares)

  • Allow bisect_ppx to be enabled/disabled via dune-workspace. (#3404, @stephanieyou)

  • Formatting of dune files is now done in the executing dune process instead of in a separate process. (#3536, @nojb)

  • Add a --debug-artifact-substution flag to help debug problem with version not being captured by dune-build-info (#3589, @jeremiedimino)

  • Allow the use of the context_name variable in the enabled_if fields of executable(s) and install stanzas. (#3568, fixes #3566, @voodoos)

  • Fix compatibility with OCaml 4.12.0 when compiling empty archives; no .a file is generated. (#3576, @dra27)

  • $ dune utop no longer tries to load optional libraries that are unavailable (#3612, fixes #3188, @anuragsoni)

  • Fix dune-build-info on 4.10.0+flambda (#3599, @emillon, @jeremiedimino).

  • Allow multiple libraries with inline_tests to be defined in the same directory (#3621, @rgrinberg)

  • Run exit hooks in jsoo separate compilation mode (#3626, fixes #3622, @rgrinberg)

  • Add (alias ...), (mode ...) fields to (copy_fields ...) stanza (#3631, @nojb)

  • (copy_files ...) now supports copying files from outside the workspace using absolute file names (#3639, @nojb)

  • Dune does not use ocamlc as an intermediary to call C compiler anymore. Configuration flags ocamlc_cflags and ocamlc_cppflags are always prepended to the compiler arguments. (#3565, fixes #3346, @voodoos)

  • Revert the build optimization in #2268. This optimization slows down building individual executables when they're part of an executables stanza group (#3644, @rgrinberg)

  • Use {dev} rather than {pinned} in the generated .opam file. (#3647, @kit-ty-kate)

  • Insert correct extension name when editing dune-project files. Previously, dune would just insert the stanza name. (#3649, fixes #3624, @rgrinberg)

  • Fix crash when evaluating an mdx stanza that depends on unavailable packages. (#3650, @CraigFe)

  • Fix typo in cache-check-probablity field in dune config files. This field now requires 2.7 as it wasn't usable before this version. (#3652, @edwintorok)

  • Add "odoc" {with-doc} to the dependencies in the generated .opam files. (#3667, @kit-ty-kate)

  • Do not allow user actions to capture dune's stdin (#3677, fixes #3672, @rgrinberg)

  • (subdir ...) stanzas can now appear in dune files used via (include ...). (#3676, @nojb)

See full changelog
  • No longer expose the unwrapped modules (#94, @jonludlam)
  • Remove everything but Ast versions and upgrade/downgrade conversions (#103, @ceastlund)

Ppxlib 0.15.0

See full changelog
  • Remove base and stdio dependencies (#151, @ceastlund)
  • Update README and opam description (#155, @jeremiedimino)
  • Fix Driver.partition_transformation (#156, @NathanReb)
  • Implement name mangling for ppxlib_traverse (#159, @ceastlund)
See full changelog

Changes

  • Do not break inline elements such as {i blah} in docstrings (#1346, @jberdine)
  • Distinguish hash-getter from hash-comparison infix operators. Operators of the form #**# or #**. where ** can be 0 or more operator chars are considered getter operators and are not surrounded by spaces, as opposed to regular infix operators (#1376, @gpetiot)
  • Type constraint on return type of functions is now always printed before the function body (#1381, #1397, @gpetiot)

Bug fixes

  • Restore previous functionality for pre-post extension points (#1342, @jberdine)
  • Fix extra break before function body of a fun (#1343, @jberdine)
  • Indent further args of anonymous functions (#1440, @gpetiot)
  • Do not clear the emacs *compilation* buffer on successful reformat (#1350, @jberdine)
  • Fix disabling with attributes on OCaml < 4.08 (#1322, @emillon)
  • Preserve unwrapped comments by not adding artificial breaks when wrap-comments=false and ocp-indent-compat=true are set to avoid interfering with ocp-indent indentation. (#1352, @gpetiot)
  • Break long literal strings at the margin (#1367, @gpetiot)
  • Break after a multiline argument in an argument list (#1360, @gpetiot)
  • Remove unnecessary parens around object (#1379, @gpetiot)
  • Fix placement of comments on constants (#1383, @gpetiot)
  • Do not escape arguments of some Odoc tags (#1391, 1408, @gpetiot, @Julow). The characters []{} must not be escaped in the arguments of @raise, @author, @version and others.
  • Fix missing open line between multi-line let-binding with poly-typexpr (#1372, @jberdine)
  • Remove trailing space after expression when followed by an attribute and break before attributes attached to multi-line phrases (#1382, @gpetiot)
  • Do not add a space to minimal comments (* *), (** *) and (*$ *) (#1407, @gpetiot)
  • Fix attributes position in labelled arguments type (#1434, @gpetiot)
  • Add missing parens around type annotation in anonymous function (#1433, @gpetiot)
  • Fix alignment of 'then' keyword in parenthesised expression (#1421, @gpetiot)

New features

  • Support quoted extensions (added in ocaml 4.11) (#1405, @gpetiot)
  • Recognise eliom file extensions (#1430, @jrochel)

Dune 2.6.2

See full changelog
  • Fix compatibility with OCaml 4.12 (#3585, fixes #3583, @ejgallego)
See full changelog

Changes

  • No functional changes from 0.14.2. The goal of this release is to be compatible with base and stdio v0.14.0.
  • Backport the following PRs:
    • Update opam metadata (#1386)
    • Add compatibility with base.v0.14.0 (#1396)
    • Allow stdio.v0.14 (#1399)

Mdx 1.7.0

See full changelog

Added

  • HTML comments can carry block labels (#234, @gpetiot) The syntax is: <!-- $MDX labels -->, where labels is a list of valid labels separated by a comma. This line has to immediately precede the block it is attached to. The legacy syntax is preserved and will be deprecated in a later release.
  • Add support for toplevel blocks in .mli files' doc comments (#206, @jsomers)
  • Add support for OCaml 4.11 (#261, @kit-ty-kate)

Changed

  • Apply unnamed preludes to all environments (#271, @gpetiot) New behavior:
    • env_and_file "a:f" associates f to the environment named a
    • env_and_file " :f" associates f to the default environment
    • env_and_file "f" associates f to all environments.
  • Errors in non toplevel OCaml blocks are now printed to a seperate mdx-error code block following the ocaml block instead of crashing the mdx process. Those mdx-error blocks are recognized and checked by mdx and can be intentionally used to show case specific compile errors. (#238, @gpetiot)
  • Improve error reporting for invalid (* $MDX part-... *) delimiters (#250, @gpetiot)

Deprecated

  • The command 'mdx rule' is deprecated and will be removed in 2.0.0 (#251, @gpetiot)

Fixed

  • Fix the environment selection for preludes and slightly improve quality of type names in evaluations of toplevel phrases in certain cases. (#225, @gpetiot)
  • Fix toplevel parsing when phrases contain tabs (#240, @gpetiot)
  • Avoid adding newlines to empty blocks (#253, @gpetiot)
  • Preserve the indentation of included files (#259, @gpetiot)
  • Preserve the header in shell blocks (#249, @craigfe)
  • Support underscores in environment variables in set- and unset- labels (#257, @shonfeder)
  • Fix mdx on Windows which was looking for the ocaml-mdx-test binary at the wrong place (#263, @hcarty)
  • Properly report mdx parsing errors instead of crashing with an uncaught exception (#267, @gpetiot)
See full changelog

Added

  • Add a dune-release config subcommand to display and edit the global configuration (#220, @NathanReb).
  • Add command delegate-info to print information needed by external release scripts (#221, @pitag-ha)
  • Use Curly instead of Cmd to interact with github (#202, @gpetiot)
  • Add x-commit-hash field to the opam file when releasing (#224, @gpetiot)
  • Add support for common alternative names for the license and ChangeLog file (#204, @paurkedal)

Changed

  • Command tag: improve error and log messages by comparing the provided commit with the commit correspondent to the provided tag (#226, @pitag-ha)
  • Error logs: when an external command fails, include its error message in the error message posted by dune-release (#231, @pitag-ha)
  • Error log formatting: avoid unnecessary line-breaks; indent only slightly in multi-lines (#234, @pitag-ha)
  • Linting step of dune-release distrib does not fail when opam's doc field is missing. Do not try to generate nor publish the documentation when opam's doc field is missing. (#235, @gpetiot)

Deprecated

  • Deprecate opam 1.x (#195, @gpetiot)

Fixed

  • Separate packages names by spaces in publish logs (#171, @hannesm)
  • Fix uncaught exceptions in distrib subcommand and replace them with proper error messages (#176, @gpetiot)
  • Use the 'user' field in the configuration before inferring it from repo URI and handles HTTPS URIs (#183, @gpetiot)
  • Ignore backup files when looking for README, CHANGES and LICENSE files (#194, @gpetiot)
  • Do not echo input characters when reading token (#199, @gpetiot)
  • Improve the output of VCS command errors (#193, @gpetiot)
  • Better error handling when checking opam version (#195, @gpetiot)
  • Do not write 'version' and 'name' fields in opam file (#200, @gpetiot)
  • Use Yojson to parse github json response and avoid parsing bugs. (#177, @gpetiot)
  • The git command used in publish doc should check DUNE_RELEASE_GIT (even if deprecated) before PATH. (#242, @gpetiot)
  • Adapt the docs to the removal of the log subcommand (#196, @gpetiot)

Ppxlib 0.14.0

See full changelog
  • Bump ppxlib's AST to 4.10 (#130, @NathanReb)
  • Remove omp_config from Expansion_context and replace it with tool_name (#149, @NathanReb)
  • Change undocumented Ppxlib.Driver.map_structure to return a ppxlib's structure instead of a Migrate_parsetree.Driver.some_structure. (#153, @NathanReb)

Dune 2.6.1

See full changelog
  • Fix crash when caching is enabled (@rgrinberg, #3581, fixes #3580)

  • Do not use -output-complete-exe until 4.10.1 as it is broken in 4.10.0 (@jeremiedimino, #3187)

  • Fix crash when an unknown pform is found (such as %{unknown}) (#3560, @emillon)

  • Improve error message when invalid package names (such as the empty string) are passed to dune build -p. (#3561, @emillon)

  • Fix a stack overflow when displaying large outputs (including diffs) (#3537, fixes #2767, #3490, @emillon)

  • Pass -g when compiling ppx preprocessors (#3671, @rgrinberg)

Odoc 1.5.1

See full changelog

Additions

  • Compatibility with OCaml 4.11 (#434, @kit-ty-kate)
See full changelog
  • merlin binary
    • dune: remove duplicated rules for profile=release (#1143)
  • test suite
    • fix a test that required Dune 2.5 (#1146)
    • fix another test that lacked reproducibility (#1146)
See full changelog
  • ocaml support
    • alerts are no-more ignored and are reported as warnings (#1138)
  • merlin binary
    • fix completion of names containing - (#1142)
    • fix several type-enclosing bugs by performing context-analysis (#1108)
    • lsp: add deprecation flag to outline items (#1087)
    • lsp: add go-to typedef (Locate_type) (#1067)

Dune 2.6.0

See full changelog
  • Fix a bug where valid lib names in dune init exec --libs=lib1,lib2 results in an error. (#3444, fix #3443, @bikallem)

  • Add and enabled_ if field to the install stanza. Enforce the same variable restrictions for enabled_if fields in the executable and install stanzas than in the library stanza. When using dune lang < 2.6, the usage of forbidden variables in executables stanzas with only trigger a warning to maintain compatibility. (#3408 and #3496, fixes #3354, @voodoos)

  • Insert a constraint one the version of dune when the user explicitly specify the dependency on dune in the dune-project file (#3434 , fixes #3427, @diml)

  • Generate correct META files for sub-libraries (of the form lib.foo) that contain .js runtime files. (#3445, @hhugo)

  • Add a (no-infer ...) action that prevents inference of targets and dependencies in actions. (#3456, fixes #2006, @roddyyaga)

  • Correctly infer targets for the diff? action. (#3457, fixes #2990, @greedy)

  • Fix $ dune print-rules crashing (#3459, fixes #3440, @rgrinberg)

  • Simplify js_of_ocaml rules using js_of_ocaml.3.6 (#3375, @hhugo)

  • Add a new ocaml-merlin subcommand that can be used by Merlin to get configuration directly from dune instead of using .merlin files. (#3395, @voodoos)

  • Remove experimental variants feature and make default implementations part of the language (#3491, fixes #3483, @rgrinberg)

Utop 2.6.0

See full changelog
  • compatible with OCaml 4.11 (@kit-ty-kate, #322)
  • switch to the new parser exposed since 4.11
  • Vi edit mode: register support
See full changelog

Changes

  • Merge doc-comments-val option with doc-comments. The placement of documentation comments on val and external items is now controled by doc-comments.
    • doc-comments=after becomes doc-comments=after-when-possible to take into account the technical limitations of ocamlformat;
    • doc-comments=before is unchanged;
    • doc-comments-val is now replaced with doc-comments. To reproduce the former behaviors
      • doc-comments=before + doc-comments-val=before: now use doc-comments=before;
      • doc-comments=before + doc-comments-val=after: now use doc-comments=before-except-val;
      • doc-comments=after + doc-comments-val=before: this behavior did not make much sense and is not available anymore;
      • doc-comments=after + doc-comments-val=after: now use doc-comments=after-when-possible. (#1358, @jberdine, @Julow, @gpetiot). This reverts changes introduced in 0.14.1 (#1335) and 0.14.0 (#1012).

Utop 2.5.0

See full changelog

Additions

  • add #edit_mode_vi and #edit_mode_default mode to set the editing mode(@kandu)
  • Backport the #use_output directive (@diml, #313)

General

  • Load init file from ~/.config/utop/init.ml as per XDG conventions (@copy, #144)
  • Add OCaml 4.09 and 4.10 to the CI matrix (@kit-ty-kate, #310)
  • Add documentation for dune utop usage in emacs (@samarthkishor, #307)

We are happy to announce a alpha for opam 2.1.0, one year and a half in the making after the release of 2.0.0.

Many new features made it in (see the complete changelog or release note for the details), but here are a few highlights of this release.

Release highlights

The two following features have been around for a while as plugins and are now completely integrated in the core of opam. No extra installs needed anymore, and a more smooth experience.

Seamless integration of System dependencies handling (a.k.a. "depexts")

A number of opam packages depend on tools or libraries installed on the system, which are out of the scope of opam itself. Previous versions of opam added a specification format, and opam 2.0 already handled checking the OS and extracting the required system package names.

However, the workflow generally involved letting opam fail once, then installing the dependencies and retrying, or explicitely using the opam-depext plugin, which was invaluable for CI but still incurred extra steps.

With opam 2.1.0, depexts are seamlessly integrated, and you basically won't have to worry about them ahead of time:

  • Before applying its course of actions, opam 2.1.0 checks that external dependencies are present, and will prompt you to install them. You are free to let it do it using sudo, or just run the provided commands yourself.
  • It is resilient to depexts getting removed or out of sync.
  • Opam 2.1.0 detects packages that depend on stuff that is not available on your OS version, and automatically avoids them.

This is all fully configurable, and can be bypassed without tricky commands when you need it (e.g. when you compiled a dependency yourself).

Dependency locking

To share a project for development, it is often necessary to be able to reproduce the exact same environment and dependencies setting — as opposed to allowing a range of versions as opam encourages you to do for releases.

For some reason, most other package managers call this feature "lock files". Opam can handle those in the form of [foo.]opam.locked files, and the --locked option.

With 2.1.0, you no longer need a plugin to generate these files: just running opam lock will create them for existing opam files, enforcing the exact version of all dependencies (including locally pinned packages).

If you check-in these files, new users would just have run opam switch create . --locked on a fresh clone to get a local switch ready to build the project.

Pinning sub-directories

This one is completely new: fans of the Monorepo rejoice, opam is now able to handle projects in subtrees of a repository.

  • Using opam pin PROJECT_ROOT --subpath SUB_PROJECT, opam will look for PROJECT_ROOT/SUB_PROJECT/foo.opam. This will behave as a pinning to PROJECT_ROOT/SUB_PROJECT, except that the version-control handling is done in PROJECT_ROOT.
  • Use opam pin PROJECT_ROOT --recursive to automatically lookup all sub-trees with opam files and pin them.

Opam switches are now defined by invariants

Previous versions of opam defined switches based on base packages, which typically included a compiler, and were immutable. Opam 2.1.0 instead defines them in terms of an invariant, which is a generic dependency formula.

This removes a lot of the rigidity opam switch commands had, with little changes on the existing commands. For example, opam upgrade ocaml commands are now possible; you could also define the invariant as ocaml-system and have its version change along with the version of the OCaml compiler installed system-wide.

Configuring opam from the command-line

The new opam option command allows to configure several options, without requiring manual edition of the configuration files.

For example:

  • opam option jobs=6 --global will set the number of parallel build jobs opam is allowed to run (along with the associated jobs variable)
  • opam option depext-run-commands=false disables the use of sudo for handling system dependencies; it will be replaced by a prompt to run the installation commands.

The command opam var is extended with the same format, acting on switch and global variables.

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.1.0~alpha"
    

    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

This is still a alpha, so a few glitches or regressions are to be expected. Please report them to the bug-tracker. Thanks for trying it out, and hoping you enjoy!

NOTE: this article is cross-posted on opam.ocaml.org and ocamlpro.com. Please head to the latter for the comments!

We are pleased to announce the minor release of opam 2.0.7.

This new version contains backported small fixes:


Installation instructions (unchanged):

  1. From binaries: run

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

    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 you 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.

NOTE: this article is cross-posted on opam.ocaml.org and ocamlpro.com. Please head to the latter for the comments!

Dune 2.5.1

See full changelog
  • [coq] Fix install .v files for Coq theories (#3384, @lthms)

  • [coq] Fix install path for theory names with level greater than 1 (#3358, @ejgallego)

  • Fix a bug introduced in 2.0.0 where the [locks] field in rules with no targets had no effect. (@aalekseyev, report by @craigfe)

Ppxlib 0.13.0

See full changelog
  • Add 'metaquot.' prefix to disambiguate metaquote extensions (#121, @ceastlund)
  • Bump dune language to 1.11 since the cinaps extension requires at least Dune 1.11 (#126, @diml)
See full changelog
  • ocaml support
    • full support from OCaml 4.02 to OCaml 4.10 (#1117, #1127)
    • fix desynchronized cache (#1120)
    • short path for OCaml 4.09 and OCaml 4.10 (#1082, #1117)
    • catch and test environment initialization errors (#1083, #1130)
    • restore type levels after recovery (#1092)
  • merlin binary
    • fix syntax errors in 4.08 and 4.09 (#1081)
    • complete-prefix command accepts -kind option to filter results (#1071)
    • code cleanup (#1093, #1079, #1112)
    • better handling of expression and pattern extra nodes during browse tree traversal (#1091, #1121)
    • improve context detection (e.g. appropriate namespace for lookup) for various queries (#1104, #1110)
    • add stdlib to locate source path (#1085)
  • editor modes
    • vim: tweak heuristic to select python version (#1111)
    • emacs: marlin/call
    • lsp: move server to its own repository (#1069), https://github.com/ocaml/ocaml-lsp
  • test suite
    • dune rules for the test suite are now generated, deterministic and can be run individually (#1068, #1070, #1072)
    • fix incorrect command-line arguments in tests (#1073)
    • better coverage of frontend features (#1075, #1078, #1088, #1089, #1126)
  • Build no longer relies on implicit transitive_deps (#1065).
See full changelog

Changes

  • The default for doc-comments is changed to after (#1335, @Julow). This reverts a change introduced in 0.14.0 (#1012).
  • Revert deprecation of the doc-comments option (#1331, @Julow). This reverts a change introduced in 0.14.0 (#1293).

Dune 2.5.0

The dune team is pleased to announce the release of dune 2.5.0. This release has been brewing for a while and contains a few interesting features. I'll highlight some of the bigger ones:

  • The coq support has been thoroughly extended. There's now support for both composition of coq libraries in the same workspace and extraction of coq code to OCaml.

  • There's a new $ dune upgrade subcommand to help you upgrade dune files from 1.x to 2.x

  • $ dune utop will now load ppx preprocessors to the toplevel. Ppx authors might enjoy this style of interactive development.

  • There's a new (subdir ..) stanza that can be used to evaluate stanzas in sub directories. This makes it possible to have a single dune file for an entire project (generated or not).

I'd like to thank everyone who contributed to dune 2.5.0. Your help is greatly appreciated.

See full changelog
  • Add a --release option meaning the same as -p but without the package filtering. This is useful for custom dune invocation in opam files where we don't want -p (#3260, @jeremiedimino)

  • Fix a bug introduced in 2.4.0 causing .bc programs to be built with -custom by default (#3269, fixes #3262, @jeremiedimino)

  • Allow contexts to be defined with local switches in workspace files (#3265, fix #3264, @rgrinberg)

  • Delay expansion errors until the rule is used to build something (#3261, fix #3252, @rgrinberg, @jeremiedimino)

  • [coq] Support for theory dependencies and compositional builds using new field (theories ...) (#2053, @ejgallego, @rgrinberg)

  • From now on, each version of a syntax extension must be explicitely tied to a minimum version of the dune language. Inconsistent versions in a dune-project will trigger a warning for version <=2.4 and an error for versions >2.4 of the dune language. (#3270, fixes #2957, @voodoos)

  • [coq] Bump coq lang version to 0.2. New coq features presented this release require this version of the coq lang. (#3283, @ejgallego)

  • Prevent installation of public executables disabled using the enabled_if field. Installation will now simply skip such executables instead of raising an error. (#3195, @voodoos)

  • dune upgrade will now try to upgrade projects using versions <2.0 to version 2.0 of the dune language. (#3174, @voodoos)

  • Add a top command to integrate dune with any toplevel, not just utop. It is meant to be used with the new #use_output directive of OCaml 4.11 (#2952, @mbernat, @jeremiedimino)

  • Allow per-package version in generated opam files (#3287, @toots)

  • [coq] Introduce the coq.extraction stanza. It can be used to extract OCaml sources (#3299, fixes #2178, @rgrinberg)

  • Load ppx rewriters in dune utop and add pps field to toplevel stanza. Ppx extensions will now be usable in the toplevel (#3266, fixes #346, @stephanieyou)

  • Add a (subdir ..) stanza to allow evaluating stanzas in sub directories. (#3268, @rgrinberg)

  • Fix a bug preventing one from running inline tests in multiple modes (#3352, @jeremiedimino)

  • Allow the use of the %{profile} variable in the enabled_if field of the library stanza. (#3344, @mrmr1993)

  • Allow the use of %{ocaml_version} variable in enabled_if field of the library stanza. (#3339, @voodoos)

  • Fix dune build freezing on MacOS when cache is enabled. (#3249, fixes ##2973, @artempyanykh)

If you want to contribute to a new release announcement, check out the Contributing Guide on GitHub.