OCaml Changelog

RSS

Read the latest releases and updates from the OCaml ecosystem.

Ppxlib 0.22.1

See full changelog
  • Fix location in parse error reporting (#257, @pitag-ha)

Ppxlib 0.21.1

See full changelog
  • Fix location in parse error reporting (#256, @pitag-ha)

Mdx 1.9.0

See full changelog

Added

  • Add a new dune-gen subcommand that generates testing code for Dune to build and run with the new mdx stanza. (#305, @voodoos)
See full changelog

Fixes

  • Switch verbosity from 1 to 0. This is the same default that merlin uses. The old value for verbosity (#433)

  • Get fresh diagnostics (warning and error messages) on a file save (#438)

    Note: If you want the fresh diagnostics to take into account changes in other files, you likely need to rebuild your project. An easy way to get automatic rebuilds is to run dune in a watching mode, e.g.,[dune build --watch].

On behalf of the ocaml-lsp team, I'd like to announce version 1.6.0 of ocaml-lsp-server. The highlight of this release is the updated version of merlin which brings lots of new bug fixes.

See full changelog

Features

  • Code action to annotate a value with its type (#397)

Fixes

  • Fix interface/implementation switching on Windows (#427)

  • Correctly parse project paths with spaces and other special characters that must be escaped.

  • Print types with -short-paths even if the project wasn't built yet

Merlin 4.2

See full changelog
  • merlin binary
    • external configuration reading:
      • use relative paths to communicate with Dune when possible. This solves issues related to symlinks on Unix and improve Windows support (#1271, fixes #1288)
      • make the workdir configuration value when using the dune ocaml-merlin configuration provider the same as when using dot-merlin-reader so that ppxes behaves in the same way as before (#1284, fixes ocaml/dune#4479, discussion in #1292)
    • destruct:
      • improve prefixing of generated constructors in Destruct by filtering opened modules (#1277)
      • make the destruct command more resilient to ill-typed expressions and when called without nodes (#1304, fixes #1300)
    • reintroduce some record recovery and improve completion (#1276)
    • introduce a new AST node for holes (_), allow correct typing of these holes and add a new holes command that returns the locations of all holes in the current file along with their types (#1242, #1289)
    • Mppx: don't restore cookies after invocation. Ppx are invoked only once so there is no need to manage cookies. This small change should increase performance and should not change any other behavior (#1309)
    • Windows: system command variant: do not open a window console when launching a ppx (#1270, fixes #714)
    • fix same file documentation bug (#1265 by @ulugbekna, fixes #1261)
  • editor modes
    • vim: Add MerlinNextHole and MerlinPreviousHole commands to navigate between holes. Jump to the first hole after destruct (#1287, #1303)
    • emacs: Add merlin-next-hole and merlin-previous-hole commands to navigate holes. Jump to the first hole after calling destruct. (#1291)
    • emacs: modernization of the elisp code and conformance with coding guidelines (#1247, #1310 by Steve Purcell )
    • vim & emacs : new client-side "merlin use package" commands, restoring previous behavior (#1272, fixes #1191)
  • test suite
    • cover constructor disambiguation and record fields (#1276)
    • cover the new holes command and AST node (#1242, #1289)
    • cover the document fix (#1265, #1315)
See full changelog

Oops, we went looking but didn't find the changelog for this release 🙈

See full changelog

Bug fixes

  • Fix extraneous parenthesis after let open with closing-on-separate-line (#1612, @Julow)
  • Add missing break between polytype quantification and arrow-type body (#1615, @gpetiot)

Changes

  • Use dune instrumentation backend for bisect_ppx (#1550, @tmattio)
  • Format objects and classes consistently with structure and signature items (#1569, @bikallem)

New features

  • Expose a RPC interface through a new binary ocamlformat-rpc and a new library ocamlformat-rpc-lib (#1586, @gpetiot, @voodoos)
See full changelog
  • Support 4.12 and drop support for all earlier versions

  • Update to the latest version of merlin

Dune 2.8.5

See full changelog
  • Fixed absence of executable bit for installed .cmxs (#4149, fixes #4148, @bobot)

  • Fix a race in Dune cache. It was particularly easy to hit this race when using the cache on Windows (#4406, fixes #4167, @snowleopard)

See full changelog

Fixes

  • Backport fixes from merlin (#382, #383)

  • Encode request & notification params in a list. This is required by the spec. (#351)

Dune 2.8.4

See full changelog
  • Make patdiff show refined diffs (#4257, fixes #4254, @hakuch)

  • Fixed a bug that could result in needless recompilation under Windows due to case differences in the result of Sys.getcwd (observed under emacs). (#3966, @nojb).

  • Restore compatibility with Coq < 8.10 for coq-lang < 0.3 , document that (using coq 0.3) does require Coq 8.10 at least (#4224, fixes #4142, @ejgallego)

  • Add a META rule for compiler-libs.native-toplevel (#4175, @altgr)

  • No longer call chmod on symbolic links (fixes #4195, @dannywillems)

  • Have dune communicate the location of the standard library directory to merlin (#4211, fixes #4188, @nojb)

  • Workaround incorrect exception raised by Unix.utimes (OCaml PR#8857) in Path.touch on Windows. This fixes dune cache in direct mode on Windows. (#4223, @dra27)

  • dune ocaml-merlin is now able to provide configuration for source files in the _build directory. (#4274, @voodoos)

  • Automatically delete left-over Merlin files when rebuilding for the first time a project previously built with Dune <= 2.7. (#4261, @voodoos, @aalekseyev)

  • Fix ppx.exe being compiled for the wrong target when cross-compiling (#3751, fixes #3698, @toots)

  • dune top correctly escapes the generated toplevel directives, and make it easier for dune top to locate C stubs associated to concerned libraries. (#4242, fixes #4231, @nojb)

  • Do not pass include directories containing native objects when compiling bytecode (#4200, @nojb)

  • Fix crash when META file for compiler-libs.toplevel is present (@jeremiedimino, #4249)

See full changelog

Removed

  • Remove the 'let-open' option, deprecated since 0.16.0 (#1563, @gpetiot)
  • Remove support for OCaml 4.06 and 4.07, minimal version requirement bumped to OCaml 4.08 (#1549, @gpetiot)
  • Remove the 'extension-sugar' option, deprecated since 0.14.0 (#1588, @gpetiot)

Bug fixes

  • Fix parsing of invalid file wrt original source handling (#1542, @hhugo)
  • Preserve the syntax of infix set/get operators (#1528, @gpetiot). String.get and similar calls used to be automatically rewritten to their corresponding infix form .(), that was incorrect when using the -unsafe compilation flag. Now the concrete syntax of these calls is preserved.
  • Add location of invalid docstring in warning messages (#1529, @gpetiot)
  • Fix comments on the same line as prev and next elements (#1556, @gpetiot)
  • Break or-patterns after comments and preserve their position at the end of line (#1555, @gpetiot)
  • Fix linebreak between signature items of the same group (#1560, @gpetiot)
  • Fix stack overflow on large string constants (#1562, @gpetiot)
  • Fix comment position around list cons operator (#1567, @gpetiot)
  • Fix the vertical alignment test to break down comment groups (#1575, @gpetiot)
  • Preserve spacing of toplevel comments (#1554, @gpetiot)
  • Support more sugared extension points (#1587, @gpetiot)

Changes

  • Add buffer filename in the logs when applying ocamlformat (#1557, @dannywillems)
  • Improve comment position in pattern collection (#1576, @gpetiot)
  • Consistent positioning of lambda return type annotations when no-break-infix-before-func and pre/post extensions (#1581, @gpetiot)

New features

  • Support injectivity type annotations (OCaml 4.12 feature) (#1523, @gpetiot)

Merlin 4.1

See full changelog
  • ocaml support Detailed list of changes on https://tarides.com/blog/2021-01-26-recent-and-upcoming-changes-to-merlin#dropping-support-for-old-versions-of-ocaml Summary:
    • any revision of Merlin now only supports one version of OCaml. Support for other versions will be found in other branches
    • stopped actively supporting version older than 4.11
    • add support for 4.12
  • merlin binary
    • add keyword completion (disabled by default) (#1243)
    • fix a bug which caused type-enclosing to sometimes look at an incorrect node (#1232, fixes #1226)
    • properly report leaked parsing error (#1223, fixes #1222)
    • wrap merlin_analysis and merlin_utils library
    • fix windows paths canonicalization (#1254)
    • fix hanging on windows (#1256, #1263)
  • editor modes
    • emacs: add missing mandatory argument for define-obsolete-function-alias (#1250, by Atharva Shukla, fixes #1234)
    • emacs: use "opam var" instead of "opam config var" (#1249, by Raja Boujbel)
    • vim: fix CursorMoved semantics (#1213, by @ddickstein)
    • vim: add :MerlinLocateImpl and :MerlinLocateIntf (#1208 by Matthew Ryan)
  • test suite
    • replace mdx usage by dune's cram mechanism

Mdx 1.8.1

See full changelog

Changed

  • Dropped OMP dependency and use handwritten compat layers instead (#317, @NathanReb)

Feedback on this post is welcomed on Discuss!

On behalf of the opam team, it gives me great pleasure to announce the third beta release of opam 2.1. Don’t worry, you didn’t miss beta3 - we had an issue with a configure script that caused beta2 to report as beta3 in some instances, so we skipped to beta4 to avoid any further confusion!

We encourage you to try out this new beta release: there are instructions for doing so in our wiki. The instructions include taking a backup of your ~/.opam root as part of the process, which can be restored in order to wind back. Please note that local switches which are written to by opam 2.1 are upgraded and will need to be rebuilt if you go back to opam 2.0. This can either be done by removing _opam and repeating whatever you use in your build process to create the switch, or you can use opam switch export switch.export to backup the switch to a file before installing new packages. Note that opam 2.1 shouldn’t upgrade a local switch unless you upgrade the base packages (i.e. the compiler).

What’s new in opam 2.1?

  • Switch invariants
  • Improved options configuration (see the new option and expanded var sub-commands)
  • Integration of system dependencies (formerly the opam-depext plugin), increasing their reliability as it integrates the solving step
  • Creation of lock files for reproducible installations (formerly the opam-lock plugin)
  • CLI versioning, allowing cleaner deprecations for opam now and also improvements to semantics in future without breaking backwards-compatibility
  • Performance improvements to opam-update, conflict messages, and many other areas
  • New plugins: opam-compiler and opam-monorepo

Switch invariants

In opam 2.0, when a switch is created the packages selected are put into the “base” of the switch. These packages are not normally considered for upgrade, in order to ease pressure on opam’s solver. This was a much bigger concern early on in opam 2.0’s development, but is less of a problem with the default mccs solver.

However, it’s a problem for system compilers. opam would detect that your system compiler version had changed, but be unable to upgrade the ocaml-system package unless you went through a slightly convoluted process with --unlock-base.

In opam 2.1, base packages have been replaced by switch invariants. The switch invariant is a package formula which must be satisfied on every upgrade and install. All existing switches’ base packages could just be expressed as package1 & package2 & package3 etc. but opam 2.1 recognises many existing patterns and simplifies them, so in most cases the invariant will be "ocaml-base-compiler" {= 4.11.1}, etc. This means that opam switch create my_switch ocaml-system now creates a switch invariant of "ocaml-system" rather than a specific version of the ocaml-system package. If your system OCaml package is updated, opam upgrade will seamlessly switch to the new package.

This also allows you to have switches which automatically install new point releases of OCaml. For example:

opam switch create ocaml-4.11 --formula='"ocaml-base-compiler" {>= "4.11.0" & < "4.12.0~"}' --repos=old=git+https://github.com/ocaml/opam-repository#a11299d81591
opam install utop

Creates a switch with OCaml 4.11.0 (the --repos= was just to select a version of opam-repository from before 4.11.1 was released). Now issue:

opam repo set-url old git+https://github.com/ocaml/opam-repository
opam upgrade

and opam 2.1 will automatically offer to upgrade OCaml 4.11.1 along with a rebuild of the switch. There’s not yet a clean CLI for specifying the formula, but we intend to iterate further on this with future opam releases so that there is an easier way of saying “install OCaml 4.11.x”.

opam depext integration

opam has long included the ability to install system dependencies automatically via the depext plugin. This plugin has been promoted to a native feature of opam 2.1.0 onwards, giving the following benefits:

  • You no longer have to remember to run opam depext, opam always checks depexts (there are options to disable this or automate it for CI use). Installation of an opam package in a CI system is now as easy as opam install ., without having to do the dance of opam pin add -n/depext/install. Just one command now for the common case!
  • The solver is only called once, which both saves time and also stabilises the behaviour of opam in cases where the solver result is not stable. It was possible to get one package solution for the opam depext stage and a different solution for the opam install stage, resulting in some depexts missing.
  • opam now has full knowledge of depexts, which means that packages can be automatically selected based on whether a system package is already installed. For example, if you have neither MariaDB nor MySQL dev libraries installed, opam install mysql will offer to install conf-mysql and mysql, but if you have the MariaDB dev libraries installed, opam will offer to install conf-mariadb and mysql.

opam lock files and reproducibility

When opam was first released, it had the mission of gathering together scattered OCaml source code to build a community repository. As time marches on, the size of the opam repository has grown tremendously, to over 3000 unique packages with over 18000 unique versions. opam looks at all these packages and is designed to solve for the best constraints for a given package, so that your project can keep up with releases of your dependencies.

While this works well for libraries, we need a different strategy for projects that need to test and ship using a fixed set of dependencies. To satisfy this use-case, opam 2.0.0 shipped with support for using project.opam.locked files. These are normal opam files but with exact versions of dependencies. The lock file can be used as simply as opam install . --locked to have a reproducible package installation.

With opam 2.1.0, the creation of lock files is also now integrated into the client:

  • opam lock will create a .locked file for your current switch and project, that you can check into the repository.
  • opam switch create . --locked can be used by users to reproduce your dependencies in a fresh switch.

This lets a project simultaneously keep up with the latest dependencies (without lock files) while providing a stricter set for projects that need it (with lock files).

CLI Versioning

A new --cli switch was added to the first beta release, but it’s only now that it’s being widely used. opam is a complex enough system that sometimes bug fixes need to change the semantics of some commands. For example:

  • opam show --file needed to change behaviour
  • The addition of new controls for setting global variables means that the opam config was becoming cluttered and some things want to move to opam var
  • opam switch install 4.11.1 still works in opam 2.0, but it’s really an OPAM 1.2.2 syntax.

Changing the CLI is exceptionally painful since it can break scripts and tools which themselves need to drive opam. CLI versioning is our attempt to solve this. The feature is inspired by the (lang dune ...) stanza in dune-project files which has allowed the Dune project to rename variables and alter semantics without requiring every single package using Dune to upgrade their dune files on each release.

Now you can specify which version of opam you expected the command to be run against. In day-to-day use of opam at the terminal, you wouldn’t specify it, and you’ll get the latest version of the CLI. For example: opam var --global is the same as opam var --cli=2.1 --global. However, if you issue opam var --cli=2.0 --global, you will told that --global was added in 2.1 and so is not available to you. You can see similar things with the renaming of opam upgrade --unlock-base to opam upgrade --update-invariant.

The intention is that --cli should be used in scripts, user guides (e.g. blog posts), and in software which calls opam. The only decision you have to take is the oldest version of opam which you need to support. If your script is using a new opam 2.1 feature (for example opam switch create --formula=) then you simply don’t support opam 2.0. If you need to support opam 2.0, then you can’t use --formula and should use --packages instead. opam 2.0 does not have the --cli option, so for opam 2.0 instead of --cli=2.0 you should set the environment variable OPAMCLI to 2.0. As with all opam command line switches, OPAMCLI is simply the equivalent of --cli which opam 2.1 will pick-up but opam 2.0 will quietly ignore (and, as with other options, the command line takes precedence over the environment).

Note that opam 2.1 sets OPAMCLI=2.0 when building packages, so on the rare instances where you need to use the opam command in a package build: command (or in your build system), you must specify --cli=2.1 if you’re using new features.

There’s even more detail on this feature in our wiki. We’re still finalising some details on exactly how opam behaves when --cli is not given, but we’re hoping that this feature will make it much easier in future releases for opam to make required changes and improvements to the CLI without breaking existing set-ups and tools.

What’s new since the last beta?

  • opam now uses CLI versioning (#4385)
  • opam now exits with code 31 if all failures were during fetch operations (#4214)
  • opam install now has a --download-only flag (#4036), allowing opam’s caches to be primed
  • opam init now advises the correct shell-specific command for eval $(opam env) (#4427)
  • post-install hooks are now allowed to modify or remove installed files (#4388)
  • New package variable opamfile-loc with the location of the installed package opam file (#4402)
  • opam update now has --depexts flag (#4355), allowing the system package manager to update too
  • depext support NetBSD and DragonFlyBSD added (#4396)
  • The format-preserving opam file printer has been overhauled (#3993, #4298 and #4302)
  • pins are now fetched in parallel (#4315)
  • os-family=ubuntu is now treated as os-family=debian (#4441)
  • opam lint now checks that strings in filtered package formulae are booleans or variables (#4439)

and many other bug fixes as listed on the release page.

New Plugins

Several features that were formerly plugins have been integrated into opam 2.1.0. We have also developed some new plugins that satisfy emerging workflows from the community and the core OCaml team. They are available for use with the opam 2.1 beta as well, and feedback on them should be directed to the respective GitHub trackers for those plugins.

opam compiler

The opam compiler plugin can be used to create switches from various sources such as the main opam repository, the ocaml-multicore fork, or a local development directory. It can use Git tag names, branch names, or PR numbers to specify what to install.

Once installed, these are normal opam switches, and one can install packages in them. To iterate on a compiler feature and try opam packages at the same time, it supports two ways to reinstall the compiler: either a safe and slow technique that will reinstall all packages, or a quick way that will just overwrite the compiler in place.

opam monorepo

The opam monorepo plugin lets you assemble standalone dune workspaces with your projects and all of their opam dependencies, letting you build it all from scratch using only Dune and OCaml. This satisfies the “monorepo” workflow which is commonly requested by large projects that need all of their dependencies in one place. It is also being used by projects that need global cross-compilation for all aspects of a codebase (including C stubs in packages), such as the MirageOS unikernel framework.

Next Steps

This is anticipated to be the final beta in the 2.1 series, and we will be moving to release candidate status after this. We could really use your help with testing this release in your infrastructure and projects and let us know if you run into any blockers. If you have feature requests, please also report them on our issue tracker -- we will be planning the next release cycle once we ship opam 2.1.0 shortly.

See full changelog
  • (*) Implemented CLI version compatibility layer [#4385 @rjbou]
  • (*) Return code 31 (Sync_error) instead of code 40 (Package_operation_error) when all failures happend during fetching [#4416 @rjbou - fix #4214]
  • (+) Add --download-only flag [#4071 @Armael @rjbou - fix #4036]
  • (+) Provide opam update --depexts to request an update of the system package manager databases [#4379 @AltGr - fix #4355]
  • Set OPAMCLI=2.0 during package action commands [#4492 @kit-ty-kate]
  • Fix sandbox check on first opam init [#4370 @rjbou - fix #4368]
  • Print shell-appropriate eval command on opam init [#4427 @freevoid]
  • Fix init script check in csh [#4482 @gahr]
  • The stdout of pre- and post-session hooks is now propagated to the user [#4382 @AltGr - fix #4359]
  • post-install hooks are now allowed to modify or remove installed files [#4388 @lefessan]
  • Add support for switch-specific pre/post sessions hooks [#4476 @rjbou - fix #4472]
  • Ensure we don't advertise upgrades to hidden versions [#4477 @AltGr - fix #4432]
  • Fix opam remove --autoremove <PKG> to not autoremove unrelated packages [#4369 @AltGr - fix #4250 #4332]
  • Fix cases where opam remove -a could trigger conflicts in the presence of orphan packages [#4369 @AltGr - fix #4250 #4332]
  • Fix --update-invariant when removing or changing package name [#4360 @AltGr - fix #4353]
  • Fix updates of the invariant with --update-invariant [#4431 @AltGr]
  • Fix cleanup of build dirs for version pinned packages [#4436 @rjbou - fix #4255]
  • Fix opamfile format upgrade on pinning [#4366 @rjbou - fix #4365]
  • Fix pin --show actually pinning [#4367 @rjbou - fix #4348]
  • When several pins are needed, do their fetching in parallel [#4399 @rjbou - fix #4315]
  • Don't cleanup VCS pin source directories [#4399 @rjbou]
  • Fix --working-dir with local switches [#4433 @rjbou]
  • Add package variable opamfile-loc, containing the location of installed package opam file [#4402 @rjbou]
  • Fix arch detection when using 32bit mode on ARM64 [#4462 @kit-ty-kate]
  • Fix arch detection of i486 [#4462 @kit-ty-kate]
  • Skip loading the switch state for variable lookup when possible [#4428 @rjbou]
  • Fix package variables display when no config file is found [#4428 @rjbou]
  • Fix opam option depext-bypass-=["XXX"] [#4428 @rjbou]
  • Lint: add a check that strings in filtered package formula are Booleans or variables [#443 @rjbou - fix #4439]
  • Fix handling of filename-encoded pkgname in opam files [#4401 @AltGr - fix ocaml-opam/opam-publish#107]
  • Don't recompile when modifying the package flags [#4477 @AltGr]
  • Add depext support for NetBSD and DragonFlyBSD [#4396 @kit-ty-kate]
  • Fix depexts on OpenBSD, FreeBSD, and Gentoo: Allow short names and full name paths for ports-based systems [#4396 @kit-ty-kate]
  • Handle the case where os-family=ubuntu as os-family=debian [#4441 @alan-j-hu]
  • Update opam's opam files to 2.0 [#4371 @AltGr]
  • Makefile: Add rule custom-libinstall for opam-custom-install use [#4401 @AltGr]
  • Use the archive caches when running opam admin cache [#4384 @AltGr - fix #4352]
  • Fix explosion of opam admin check --cycles on repositories with huge cliques [#4392 @AltGr]
  • Much improved format-preserving printer [#4298 #4302 @rjbou - fix #3993]
  • Fix missing conflict message when trying to remove required packages [#4362 @AltGr]
  • Fix the Z3 backend for upgrades [#4393 @AltGr]
  • Fix cases where opam would wrongly complain about action cycles [#4358 @AltGr - fix #4357]
  • Fix permission denied fallback for openssl [#4449 @Blaisorblade - fix #4448]
  • Add debug & verbose log for patch & subst applications [#4464 @rjbou - fix #4453]
  • Be more robust w.r.t. new caches updates when --read-only is not used [#4467 @AltGr - fix #4354]
  • Improved and extended tests [#4375 #4395 #4428 #4385 #4467 #4475 #4483 @emillon @rjbou @AltGr @freevoid @dra27]
  • Switched to GitHub actions [#4463 @rjbou]

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

This new version contains some backported fixes:

  • Critical for fish users! Don't add . to PATH. [#4078]
  • Fix sandbox script for newer ccache versions. [#4079 and #4087]
  • Fix sandbox crash when ~/.cache is a symlink. [#4068]
  • User modifications to the sandbox script are no longer overwritten by opam init. [#4020 & #4092]
  • macOS sandbox script always mounts /tmp read-write, regardless of TMPDIR [#3742, addressing ocaml/opam-repository#13339]
  • pre- and post-session hooks can now print to the console [#4359]
  • Switch-specific pre/post sessions hooks are now actually run [#4472]
  • Standalone opam-installer now correctly builds from sources [#4173]
  • Fix arch variable detection when using 32bit mode on ARM64 and i486 [#4462]

A more complete release note is available.


Installation instructions (unchanged):

  1. From binaries: run

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

    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, and published in discuss.ocaml.org. Please head to the latter for the comments!

Ppxlib 0.22.0

See full changelog
  • Bump ppxlib's AST to 4.12 (#193, @NathanReb)

Ppxlib 0.21.0

See full changelog
  • Fix ppxlib.traverse declaration and make it a deriver and not a rewriter (#213, @NathanReb)
  • Driver (important for bucklescript): handling binary AST's, accept any supported version as input; preserve that version (#205, @pitag-ha)
  • -as-ppx: take into account the -loc-filename argument (#197, @pitag-ha)
  • Add input name to expansion context (#202, @pitag-ha)
  • Add Driver.V2: give access to expansion context in whole file transformation callbacks of register_transformation (#202, @pitag-ha)
  • Driver: take -cookie argument into account, also when the input is a binary AST (@pitag-ha, #209)
  • run_as_ppx_rewriter: take into account the arguments -loc-filename, apply and dont-apply (#205, @pitag-ha)
  • Location.Error: add functions raise and update_loc (#205, @pitag-ha)

Dune 2.8.2

See full changelog
  • Fixed wrong workspace discovery from dune ocaml-merlin (#4127, fixes #4125, @voodoos)

  • Fixed memory blow up introduced in 2.8.0 (#4144, fixes #4134, @jeremiedimino)

  • Configurator: always link the C libraries in the build command (#4088, @MisterDA).

Mdx 1.8.0

See full changelog

Added

  • Allow to explicitly set the kind of blocks in labels: ocaml, cram, toplevel or include. (#237, @gpetiot)
  • Include blocks do not require an empty block anymore (#286, @gpetiot)
  • Support for OCaml 4.12 (#298, @kit-ty-kate)

Changed

  • Improve error message of cram test exceptions due to empty lines in a block (#270, @pitag-ha)

Fixed

  • Report #require directive errors (#276, @gpetiot)
  • Handle no such file exception: the input file and the values of options --root and --prelude are checked (#292, @gpetiot)
  • Keep locations from parsing instead of recomputing the lines, providing better error messages (#241, @gpetiot)
  • Use create_process instead of execvp to call mdx-test from mdx. This fixes running mdx from dune on Windows (#299, @emillon)

Dune 2.8.1

See full changelog
  • Fixed dune --version printing n/a rather than the version

Dune 2.8.0

On behalf of the dune, I'm pleased to announce the release of dune 2.8.0. This release contains many bug fixes, performance improvements, and interesting new features. I'll point out two new features that I'm most excited about.

First is the experimental dune_site extension that makes it possible to register and load plugins at runtime. This feature is quite involved, but we've documented it extensively in the manual.

Another cool feature is that we've eliminated the need for .merlin files and all the caveats that came with them. Now, merlin talks to dune directly to get precise configuration for every module. Say goodbye to all those "approximate .merlin file" warnings!

I encourage everyone to upgrade as soon as possible, as earlier versions are not compatible with OCaml 4.12. Happy Hacking.

See full changelog
  • dune rules accepts aliases and other non-path rules (#4063, @mrmr1993)

  • Action (diff reference test_result) now accept reference to be absent and in that case consider that the reference is empty. Then running dune promote will create the reference file. (#3795, @bobot)

  • Ignore special files (BLK, CHR, FIFO, SOCKET), (#3570, fixes #3124, #3546, @ejgallego)

  • Experimental: Simplify loading of additional files (data or code) at runtime in programs by introducing specific installation sites. In particular it allow to define plugins to be installed in these sites. (#3104, #3794, fixes #1185, @bobot)

  • Move all temporary files created by dune to run actions to a single directory and make sure that actions executed by dune also use this directory by setting TMPDIR (or TEMP on Windows). (#3691, fixes #3422, @rgrinberg)

  • Fix bootstrap script with custom configuration. (#3757, fixes #3774, @marsam)

  • Add the executable field to inline_tests to customize the compilation flags of the test runner executable (#3747, fixes #3679, @lubegasimon)

  • Add (enabled_if ...) to (copy_files ...) (#3756, @nojb)

  • Make sure Dune cleans up the status line before exiting (#3767, fixes #3737, @alan-j-hu)

  • Add {gitlab,bitbucket} as options for defining project sources with source stanza (source (<host> user/repo)) in the dune-project file. (#3813, @rgrinberg)

  • Fix generation of META and dune-package files when some targets (byte, native, dynlink) are disabled. Previously, dune would generate all archives for regardless of settings. (#3829, #4041, @rgrinberg)

  • Do not run ocamldep to for single module executables & libraries. The dependency graph for such artifacts is trivial (#3847, @rgrinberg)

  • Fix cram tests inside vendored directories not being interpreted correctly. (#3860, fixes #3843, @rgrinberg)

  • Add package field to private libraries. This allows such libraries to be installed and to be usable by other public libraries in the same project (#3655, fixes #1017, @rgrinberg)

  • Fix the %{make} variable on Windows by only checking for a gmake binary on UNIX-like systems as a unrelated gmake binary might exist on Windows. (#3853, @kit-ty-kate)

  • Fix $ dune install modifying the build directory. This made the build directory unusable when $ sudo dune install modified permissions. (fix #3857, @rgrinberg)

  • Fix handling of aliases given on the command line (using the @ and @@ syntax) so as to correctly handle relative paths. (#3874, fixes #3850, @nojb)

  • Allow link time code generation to be used in preprocessing executable. This makes it possible to use the build info module inside the preprocessor. (#3848, fix #3848, @rgrinberg)

  • Correctly call git ls-tree so unicode files are not quoted, this fixes problems with dune subst in the presence of unicode files. Fixes #3219 (#3879, @ejgallego)

  • dune subst now accepts common command-line arguments such as --debug-backtraces (#3878, @ejgallego)

  • dune describe now also includes information about executables in addition to that of libraries. (#3892, #3895, @nojb)

  • instrumentation backends can now receive arguments via (instrumentation (backend <name> <args>)). (#3906, #3932, @nojb)

  • Tweak auto-formatting of dune files to improve readability. (#3928, @nojb)

  • Add a switch argument to opam when context is not default. (#3951, @tmattio)

  • Avoid pager when running $ git diff (#3912, @AltGr)

  • Add (root_module ..) field to libraries & executables. This makes it possible to use library dependencies shadowed by local modules (#3825, @rgrinberg)

  • Allow (formatting ...) field in (env ...) stanza to set per-directory formatting specification. (#3942, @nojb)

  • [coq] In coq.theory, :standard for the flags field now uses the flags set in env profile flags (#3931 , @ejgallego @rgrinberg)

  • [coq] Add -q flag to :standard coqc flags , fixes #3924, (#3931 , @ejgallego)

  • Add support for Coq's native compute compilation mode (@ejgallego, #3210)

  • Add a SUFFIX directive in .merlin files for each dialect with no preprocessing, to let merlin know of additional file extensions (#3977, @vouillon)

  • Stop promoting .merlin files. Write per-stanza Merlin configurations in binary form. Add a new subcommand dune ocaml-merlin that Merlin can use to query the configuration files. The allow_approximate_merlin option is now useless and deprecated. Dune now conflicts with merlin < 3.4.0 and ocaml-lsp-server < 1.3.0 (#3554, @voodoos)

  • Configurator: fix a bug introduced in 2.6.0 where the configurator V1 API doesn't work at all when used outside of dune. (#4046, @aalekseyev)

  • Fix libexec and libexec-private variables. In cross-compilation settings, they now point to the file in the host context. (#4058, fixes #4057, @TheLortex)

  • When running $ dune subst, use project metadata as a fallback when package metadata is missing. We also generate a warning when (name ..) is missing in dune-project files to avoid failures in production builds.

  • Remove support for passing -nodynlink for executables. It was bypassed in most cases and not correct in other cases in particular on arm32. (#4085, fixes #4069, fixes #2527, @emillon)

  • Generate archive rules compatible with 4.12. Dune longer attempt to generate an archive file if it's unnecessary (#3973, fixes #3766, @rgrinberg)

  • Fix generated Merlin configurations when multiple preprocessors are defined for different modules in the same folder. (#4092, fixes #2596, #1212 and #3409, @voodoos)

  • Add the option use_standard_c_and_cxx_flags to dune-project that 1. disables the unconditional use of the ocamlc_cflags and ocamlc_cppflags from ocamlc -config in C compiler calls, these flags will be present in the :standard set instead; and 2. enables the detection of the C compiler family and populates the :standard set of flags with common default values when building CXX stubs. (#3875, #3802, fix #3718 and #3528, @voodoos)

See full changelog
  • Drop Github token generation feature, no longer supported by Github API.
  • Use newer github library, avoiding warning with deprecated authentication method
  • Allow publication of packages without URL (for conf packages)
  • Added flag --no-browser to disable browser popup
  • Fix detection of package names when specifying opam file names on the command-line

On behalf of the ocaml-lsp team, it is my pleasure to announce version 1.4.0. This release introduces support for automatic signature help. Signature help is not yet present in all possible contexts. We intend to improve to support as many relevant language constructs as possible in the future. Many thanks to @mnxn for implementing this feature.

The full change log is replicated at the end of this post for your convenience.

Happy Holidays!

See full changelog

Features

  • Support cancellation notifications when possible. (#323)

  • Implement signature help request for functions (#324)

  • Server LSP requests & notifications concurrently. Requests that require merlin are still serialized. (#330)

On behalf of the ocaml-lsp team, I’d like to announce version 1.3.0.

This release an improvement in keyword completion and a new code action. Keywords are now filtered by the context the user requested the completion, and there’s a new code action to quickly populate .mli files with the the inferred types from the .ml file.

See full changelog

Features

  • Code action to insert inferred module interface (#308)

  • Filter keywords by context (#307)

On behalf of the ocaml-lsp team, I’d like to announce version 1.2.0.

This version contains many bug fixes and some performance improvements A couple of interesting features made it in as well:

  • Auto-completion of OCaml keywords (not available for reason)
  • The ability to jump to the declaration of a value in the .mli.
See full changelog

Features

  • Add keyword completion

  • Add go to declaration functionality to jump to a value's specification in a .mli file (#294)

Fixes

  • #245: correctly use mutexes on OpenBSD (#264)

  • #268: Do not use vendored libraries when building the lsp package (#260)

  • #271: Clear diagnostics when files are closed

  • Disable non-prefix completion. There's no reliably way to trigger it and it can be slow.

See full changelog

Removed

  • Remove the 'escape-chars' option, deprecated since 0.14.0 (#1462, @gpetiot)
  • Remove the 'escape-strings' option, deprecated since 0.14.0 (#1463, @gpetiot)
  • Remove the 'doc-comments-val' option, deprecated since 0.14.2 (#1461, @gpetiot)
  • Removed options are now listed in the commandline manual (new REMOVED OPTIONS section) (#1469, @Julow)

Changes

  • Set 'indicate-multiline-delimiters=no' on default profile (#1452, @gpetiot)
  • Option 'let-open' is now deprecated, concrete syntax will always be preserved starting from OCamlFormat v0.17.0, corresponding to the current 'let-open=preserve' behavior. (#1467, @gpetiot)
  • Warnings printed by ocamlformat itself now use the 4.12 style with symbolic names (#1511, #1518, @emillon)
  • Remove extension from executable name in error messages. On Windows, this means that messages now start with "ocamlformat: ..." instead of "ocamlformat.exe: ..." (#1531, @emillon)
  • Using tokens instead of string manipulation when inspecting the original source (#1526, #1533, #1541 @hhugo) (#1532, @gpetiot)

Bug fixes

  • Allow a break after if%ext with if-then-else=keyword-first (#1419, #1543, @gpetiot)
  • Fix parentheses around infix applications having attributes (#1464, @gpetiot)
  • Fix parentheses around the index arg of a non-sugared index operation (#1465, @gpetiot)
  • Preserve comment position around match and try keywords (#1458, @gpetiot)
  • Add missing break in module statement (#1431, @gpetiot)
  • Indent attributes attached to included modules better (#1468, @gpetiot)
  • Clean up ocamlformat.el for submission to MELPA (#1476, #1495, @bcc32)
    • Added missing package metadata to ocamlformat.el (#1474, @bcc32)
    • Fix ocamlformat.el buffer replacement for MacOS Emacs (#1481, @juxd)
  • Add missing parentheses around a pattern matching that is the left-hand part of a sequence when an attribute is attached (#1483, @gpetiot)
  • Add missing parentheses around infix operator used to build a function (#1486, @gpetiot)
  • Fix comments around desugared expression (#1487, @gpetiot)
  • Fix invalid fragment delimiters of format-invalid-files recovery mode (#1485, @hhugo)
  • Fix misalignment of cases in docked function match (#1498, @gpetiot)
  • Preserve short-form extensions for structure item extensions (#1502, @gpetiot). For example open%ext M will not get rewritten to [%%ext open M].
  • Do not change the spaces within the code spans in docstrings (#1499, @gpetiot)
  • Comments of type constrained label in record pattern have to be relocated in 4.12 (#1517, @gpetiot)
  • Preserve functor syntax for OCaml 4.12 (#1514, @gpetiot)
  • Fix inconsistencies of the closing parentheses with indicate-multiline-delimiters (#1377, #1540, @gpetiot)
  • Fix position of comments around list constructor (::) (#1524, @gpetiot)
  • Fix comments position in extensions (#1525, @gpetiot)
  • Fix formatting of field override with constraint (#1544, @gpetiot)
See full changelog
  • merlin binary
    • simplify local store implementation and API (#1188, #1184)
    • fix a destruct issue allowing ill-typed match completions (#1194)

Ppxlib 0.20.0

See full changelog
  • Expose Ppxlib.Driver.map_signature (#194, @kit-ty-kate)

Odoc 1.5.2

See full changelog

Additions

  • Compatibility with OCaml 4.12 (ocaml/odoc#531, @Octachron)
See full changelog

Internal

  • Use ppxlib instead of ocaml-migrate-parsetree 1.x. (#1482, @emillon)
    • No functional changes are expected.
    • Cherry picked commits: 219dc1e3a4614041e1bc5428d003c0af4e, 9e453b0ef87124e33827ee2423289deef8, 7ad1e575ffa4ce3022c71daba39954d3b9, eb49db6772a9adabe611982000465d0ad7, dc79052a085950cd88fdef0843f665a029, c06c544e21bd65b726cde8fee0f78a6248, ce94d2fa50ff276b5782070375a0b30ba1

Ppxlib 0.19.0

See full changelog
  • Make ppxlib compatible with 4.12 compiler (#191, @kit-ty-kate)
See full changelog
  • Reduced startup times, in particular for opam exec [#4341 @altgr]
  • Fixed the sandboxing check on fresh inits [#4342 @altgr]
  • Fixed cases where --with-version was not respected by opam pin [#4346 @altgr]
  • Upgraded the bootstrap OCaml compiler from 4.09.1 to 4.11.1 [#4242 @avsm @dra27 @MisterDA @rjbou]

Ppxlib 0.18.0

See full changelog
  • Bump ppxlib's AST to 4.11 (#180, @NathanReb)
See full changelog
  • dot-merlin-reader
    • fix issue when multiple packages with pxxes are declared in the configuration. (#1181, fixes #1179)

Ppxlib 0.17.0

See full changelog
  • Add accessors for code_path and tool_name to Expansion_context.Base (#173, @jberdine)
  • Add cases methods to traversal classes in Ast_traverse (#183, @pitag-ha)
See full changelog
  • merlin binary
    • fix completion of pattern matchings with exception patterns (#1169)
    • delegate configuration reading to external programs via a simple protocol and create a new package dot-merlin-reader with a binary that reads .merlin files. (#1123, #1152)

Dune 2.7.1

See full changelog
  • configurator: More flexible probing of #define. We allow duplicate values in the object file, as long as they are the same after parsing. (#3739, fixes #3736, @rgrinberg)

  • Record instrumentation backends in dune-package files. This makes it possible to use instrumentation backends defined in installed libraries (eg via OPAM). (#3735, @nojb)

  • Add missing .aux & .glob targets to coq rules (#3721, fixes #3437, @rgrinberg)

  • Fix dune-package installation when META templates are present (#3743, fixes #3746, @rgrinberg)

  • Resolve symlinks before running $ git diff (#3750, fixes #3740, @rgrinberg)

  • Cram tests: when checking that all test directories contain a run.t file, skip empty directories. These can be left around by git. (#3753, @emillon)

See full changelog

Oops, we went looking but didn't find the changelog for this release 🙈

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)
If you want to contribute to a new release announcement, check out the Contributing Guide on GitHub.