OCaml Changelog

RSS

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

Ppxlib 0.23.0

See full changelog
  • Drop Parser from the API (#263, @pitag-ha)
  • Location: add set_filename and Error.get_location (#247, @pitag-ha)
  • Drop dependency on OMP2 (#187, @pitag-ha)
  • Make OMP1 a conflict (#255, @kit-ty-kate)
  • Drop Syntaxerr from the public API. Doesn't affect any user in the ppx universe (#244, @pitag-ha)
  • Add a lower-bound constraint for Sexplib0 (#240, @pitag-ha)
  • Fix bug due to which unwanted public binaries got installed when installing ppxlib (#223, @pitag-ha)
  • Add Keyword.is_keyword to check if a string is an OCaml keyword (#227, @pitag-ha)
  • Remove Lexer.keyword_table: use Keyword.is_keyword instead (#227, @pitag-ha)
  • Remove Lexer from the API: it was the same as the compiler-libs Lexer (#228, @pitag-ha)
  • Remove the modules Ast_magic, Compiler_version, Js, Find_version, Convert, Extra_warnings, Location_error, Select_ast and Import_for_core from the API: they are meant for internal use and aren't used by any current downstream user in the ppx universe (#230, @pitag-ha)
  • Remove compiler specific helper functions from Location. They aren't used by any current downstream user in the ppx universe (#238, @pitag-ha)
  • Allow "%a" when using Location.Error.createf (#239, @mlasson)
  • Fix in Location: make raise_errorf exception equivalent to exception Error (#242, @pitag-ha)
  • Fix in Pprintast: correctly pretty print local type substitutions, e.g. type t := ... (#261, @matthewelse)
  • Add Ast_pattern.esequence, for matching on any number of sequenced expressions e.g. do_a (); do_b (); .... (#264, @matthewelse)
  • Expose a part of Ast_io in order to allow reading AST values from binary files (#270, @arozovyk)

Feedback on this post is welcomed on Discuss!

We are happy to announce the release of opam 2.1.0.

Many new features made it in (see the pre-release changelogs or release notes for the details), but here are a few highlights.

What's New in opam 2.1?

  • 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)
  • Switch invariants, replacing the "base packages" in opam 2.0 and allowing for easier compiler upgrades
  • Improved options configuration (see the new option and expanded var subcommands)
  • CLI versioning, allowing cleaner deprecations for opam now and also improvements to semantics in future without breaking backwards-compatibility
  • opam root readability by newer and older versions, even if the format changed
  • Performance improvements to opam-update, conflict messages, and many other areas

Seamless Integration of System Dependencies Handling (a.k.a. "depexts")

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, as 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.

Hint: You can set OPAMCONFIRMLEVEL=unsafe-yes or --confirm-level=unsafe-yes to launch non interactive system package commands.

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 19500 unique versions. Opam looks at all these packages and is designed to solve for the best constraints for a given package, so 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).

Hint: You can export the full configuration of a switch with opam switch export new options, --full to have all packages metadata included, and --freeze to freeze all VCS to their current commit.

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 it 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 it's 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. Therefore, 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

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

Hint: You can set up a default invariant that will apply for all new switches, via a specific opamrc. The default one is ocaml >= 4.05.0

Configuring opam From the Command Line

Configuring opam is not a simple task: you need to use an opamrc at init stage, hack global/switch config file, or use opam config var for additional variables. To ease that step, and permit a more consistent opam config tweaking, a new command was added : opam option.

For example:

  • opam option download-jobs gives the global download-jobs value (as it exists only in global configuration)
  • 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
  • opam option depext-bypass=m4 --global bypasses m4 system package check globally, while opam option depext-bypass=m4 --switch myswitch will only bypass it in the selected switch.

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

Hint: to revert your changes use opam option <field>=, it will take its default value.

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, so 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 have told it that --global was added in 2.1, so it's 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.

Since 2.1.0~rc2, CLI versioning applies to opam environment variables. The previous behaviour was to ignore unknown or wrongly set environment variables. Now you will have a warning to let you know that the environment variable won't be handled by this version of opam.

To ensure not breaking compatibility of some widely used deprecated options, a default CLI is introduced: when no CLI is specified, those deprecated options are accepted. It concerns opam exec and opam var subcommands.

There's even more detail on this feature in our wiki. 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 setups and tools.

Note: For opam libraries users, since 2.1 environment variable are no more loaded by the libraries, only by opam client. You need to load them explicitly.

opam root Portability

opam root format changes during opam's life cycle. New fields are added or removed, and new files are added. An older opam version sometimes can no longer read an upgraded or newly created opam root. opam root format has been updated to allow new versions of opam to indicate that the root may still be read by older versions of the opam libraries. A plugin compiled against the 2.0.9 opam libraries will therefore be able to read information about an opam 2.1 root (plugins and tools compiled against 2.0.8 are unable to load opam 2.1.0 roots). It is a read-only best effort access, any attempt to modify the opam root fails.

Hint: for opam libraries users, you can safely load states with OpamStateConfig load functions.

Tremendous thanks to all involved people, who've developed, tested & retested, helped with issue reports, comments, feedback, etc...

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://opam.ocaml.org/install.sh) --version 2.1.0"
    

    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
See full changelog
  • Set DEBIAN_FRONTEND=noninteractive for unsafe-yes confirmation level [#4735 @dra27 - partially fix #4731]
  • Fix 2.1~alpha2 to 2.1 format upgrade with reinit [#4750 #4756 @rjbou - fix #4748]
  • Fix bypass-check handling on reinit [#4750 @rjbou]
  • fish: fix deprecated redirection syntax ^ [#4736 @vzaliva]
  • Bump src_exts and fix build compat with Dune 2.9.0 [#4754 @dra27]
  • Fix depext alpine tagged repositories handling [#4758 @rjbou]

Feedback on this post is welcomed on Discuss!

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

This new version contains some back-ported fixes.

New features

  • Back-ported ability to load upgraded roots read-only; allows applications compiled with opam-state 2.0.9 to load a root which has been upgraded to opam 2.1 [#4636]
  • macOS sandbox now supports OPAM_USER_PATH_RO for adding a custom read-only directory to the sandbox [#4589, #4609]
  • OPAMROOT and OPAMSWITCH now reflect the --root and --switch parameters in the package build [#4668]
  • When built with opam-file-format 2.1.3+, opam-format 2.0.x displays better errors for newer opam files [#4394]

Bug fixes

  • Linux sandbox now mounts host $TMPDIR read-only, then sets the sandbox $TMPDIR to a new separate tmpfs. Hardcoded /tmp access no longer works if TMPDIR points to another directory [#4589]
  • Stop clobbering DUNE_CACHE in the sandbox script [#4535, fixing ocaml/dune#4166]
  • Ctrl-C now correctly terminates builds with bubblewrap; sandbox now requires bubblewrap 0.1.8 or later [#4400]
  • Linux sandbox script no longer makes PWD read-write on remove actions [#4589]
  • Lint W59 and E60 no longer trigger for packages flagged conf [#4549]
  • Reduce the length of temporary file names for pin caching to ease pressure on Windows [#4590]
  • Security: correct quoting of arguments when removing switches [#4707]
  • Stop advertising the removed option --compiler when creating local switches [#4718]
  • Pinning no longer fails if the archive's opam file is malformed [#4580]
  • Fish: stop using deprecated ^ syntax to fix support for Fish 3.3.0+ [#4736]

Installation instructions (unchanged):

  1. From binaries: run

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

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

  2. From source, using opam:

    opam update; opam install opam-devel
    

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

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

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

See full changelog
  • merlin binary
    • recover ill-typed patterns (#1317, #1342)
    • more accurate type-enclosing for methods (#1328, fixes #1124)
    • fix location of patterns in Occurrences (#1324, fixes ocaml/ocaml-lsp#375)
    • fix location of module definitions done via functors (#1329, fixes #1199)
    • fix -cmt-path dirs mistakenly added to build path (#1330)
    • add new module holes that can replace module expressions (#1333)
    • add a new command construct that builds a list of possible terms when called on a typed hole (#1318)
    • refactor-open improvements (#1313, #1314, #1366, #1372)
      • do not make paths absolute, simply prefix with the identifier under the cursor
        open Foo (* calling refactor-open qualify on this open *)
        let _ = Foo.bar (* previously could result in [Dune__exe.Foo.bar] *)
        
      • do not return identical (duplicate) edits
      • do not return unnecessary edits that when applied do not change the document
      • handle record fields properly
      • handle multi-line paths
      • unqualify should not qualify
    • Handle Persistent_env.Error in Typemod.initial_env (#1355)
    • locate: reset global state from all entry points (#1364)
    • Windows: replace user name by its SID in socketnames (#1345, @ttamttam)
  • editor modes
    • vim: add a simple interface to the new construct command: MerlinConstruct. When several results are suggested, <c-i> and <c-u> can be use to change the depth of the recursive construction. (#1318)
    • vim: add support for the merlin-locate-type command: MerlinLocateType (#1359)
    • emacs: add a simple interface to the new construct command: merlin-construct. (#1352)
    • emacs: add support for the merlin-locate-type command. (#1359)
    • emacs: fix issue with merlin--highlight and various minor improvements (#1367, @mattiase)
  • test suite
    • cover the new construct command (#1318)
    • disable tests failing in Opam's CI due to nested dune projects (#1373)
See full changelog

Bug fixes

  • Fix formatting of odoc tags: the argument should be on the same line, indent description that wraps (#1634, #1635, @gpetiot)
  • Consistently format let bindings and monadic let bindings, do not drop comments before monadic bindings (#1636, @gpetiot)
  • Fix dropped comments attached to pattern constrained by polynewtype (#1645, @gpetiot)
  • Fix comment attachment on infix operators (#1643, @gpetiot)
  • Add missing spaces inside begin-end delimiting an ite branch (#1646, @gpetiot)
  • Add missing parens around function at RHS of infix op (#1642, @gpetiot)
  • Preserve begin-end keywords delimiting match cases (#1651, @gpetiot)
  • Fix alignment of closing paren on separate line for anonymous functions (#1649, @gpetiot)
  • Preserve begin-end keywords around infix operators (#1652, @gpetiot)
  • Preserve begin%ext syntax for infix opererator expressions (#1653, @gpetiot)
  • Consistently format comments attached to let-and bindings located at toplevel (#1663, @gpetiot)
  • Remove double parens around a functor in a module application (#1681, @gpetiot)
  • Improve breaking of comments to avoid violating the margin (#1676, @jberdine)
  • Fix parentheses around successive unary operations (#1696, @gpetiot)
  • Add missing break between pattern and attribute (#1711, @gpetiot)
  • Add missing parentheses around expression having attributes or comments inside a shorthand let-open clause (#1708, @gpetiot)
  • Do not consider leading star '*' when checking the diff of doc comments (#1712, @hhugo)
  • Fix formatting of multiline non-wrapping comments (#1723, @gpetiot)
  • Fix position of comments following a record field (#1945, @gpetiot)

Changes

  • Improve the diff of unstable docstrings displayed in error messages (#1654, @gpetiot)
  • Use UTF8 length of strings, not only in wrapped comments (#1673, @jberdine)
  • Improve position of ;; tokens (#1688, @gpetiot)
  • Depend on odoc-parser instead of odoc (#1683, #1713, @kit-ty-kate, @jonludlam, @julow). The parser from odoc has been split from the main odoc package and put into its own package, odoc-parser.
  • Revert infix-form list formatting to pre-0.17.0 (#1717, @gpetiot)

New features

  • Implement OCaml 4.13 features (#1680, @gpetiot)
    • Named existentials in pattern-matching (ocaml#9584)
    • Let-punning (ocaml#10013)
    • Module type substitutions (ocaml#10133)
  • Emacs integration (disabled for ocamlformat < 0.19.0):
    • Indent a line or a region with ocamlformat when pressing
    • Break the line and reindent the cursor when pressing (#1639, #1685, @gpetiot) (#1687, @bcc32)
  • Add 'line-endings=lf|crlf' option to specify the line endings used in the formatted output. (#1703, @nojb)

Internal

  • A script tools/build-mingw64.sh is provided to build a native Windows binary of ocamlformat using mingw64 toolchain under Cygwin.

Odoc 1.5.3

See full changelog

Additions

  • Compatibility with OCaml 4.13 (ocaml/odoc#699, @Octachron)

Mdx 1.10.0

See full changelog

Added

  • Display OCaml warnings in mdx-error blocks (#293, @gpetiot)

Fixed

  • Show exceptions in the correct order (#332, @talex5)

On behalf of the dune-release team I'm pleased to announce that we're releasing dune-release.1.5.0.

It has been quite a while since the last release so there are numerous changes and improvements in this one, along with a lot of bug fixes.

The two main new features in 1.5.0 are:

  • A draft release mode that creates a draft Github release and a draft PR to opam-repository. It comes with an undraft command that will undraft both and update the opam file's url.src field accordingly. We believe this feature will prove helpful to maintainers of tools such as dune which releases are often watched by distribution maintainers. Draft releases allow you to wait until you have opam-repository's CI approval to actually create a GH release that will notify anyone watching the repository. This feature is still a bit experimental, we have ideas on how to improve it but we wanted to get a first version out to collect feedback on how it is used and what you folks expect from it.
  • A check command that you can run ahead of a release to know if dune-release has all the information it needs in the repository, along with running the lint, build and test checks it normally runs after building the tarball. We're aware that it can be frustrating to see dune-release fail right in the middle of the release process. We're trying to improve this situation and this is a first step in that direction.

You can see the full changelog here

You'll note we also deprecated a few features such as delegates (as we announced in this post), opam 1.x and the --user option and corresponding config file field. This release is likely to be the last 1.x release of dune-release except for important bug fixes as we'll start working on 2.0 soon.

Our main goals for 2.0 are to make the experience for github users as seemless as possible. We want the tool to do the right thing for those users without them having to configure anything. Delegates got in the way there and that's why we're removing them. We do care about our non github users and we've worked on making it as configurable as possible so that you can integrate it in your release workflow. The situation should already have improved quite a bit with this release as we fixed several bugs for non github hosted repositories. We want to make sure that these users will be happy with dune-release 2.0 as well. Hopefully in the future dune-release will support other release workflows such as handling gitlab hosted repositories but we want to make sure our main user base is happy with the tool before adding this.

We'll communicate a bit more on our plans for 2.0 in the next few months. Our hope is that it will hit opam before the end of this year.

We hope that you'll like this new version and wish you all successful and happy releases!

See full changelog

Added

  • Add --no-auto-open to the default command. It was previously only available for dune-release opam. (#374, @NathanReb)
  • Add a config create subcommand to create a fresh configuration if you don't have one yet (#373, @NathanReb)
  • Add --local-repo, --remote-repo and --opam-repo options to the default command, they used to be only available for the opam subcommand (#363, @NathanReb)
  • Add a --token option to dune-release publish and dune-release opam commands to specify a github token. This allows dune-release to be called through a Github Actions workflow and use the github token through an environment variable. (#284 #368, @gpetiot @NathanReb)
  • Log curl calls on verbose/debug mode (#281, @gpetiot)
  • Try to publish the release asset again after it failed (#272, @gpetiot)
  • Improve error reporting of failing git comands (#257, @gpetiot)
  • Suggest a solution for users without ssh setup (#304, @pitag-ha)
  • Allow including git submodules to the distrib tarball by passing the --include-submodules flag to dune-release, dune-release bistro or dune-release distrib (#300, @NathanReb)
  • Support 'git://' scheme for dev-repo uri (#331, @gpetiot)
  • Support creation of draft releases and draft PRs. Define a new option --draft for dune-release publish and dune-release opam submit commands. (#248, @gpetiot)
  • Add a new command check to check the prerequisites of dune-release and avoid starting a release process that couldn't be finished (#318, #351, @pitag-ha)
  • When preparing the opam-repository PR and pushing the local branch to the user's remote opam-repository fork, use --set-upstream to ease any further update of the PR (#350, @gpetiot)

Changed

  • Entirely rely on the remote fork of opam-repository URL in opam submit instead of reading the user separately. The information was redundant and could only lead to bugs when unproperly set. (#372, @NathanReb)
  • Use pure token authentication for Github API requests rather than "token as passwords" authentication (#369, @NathanReb)
  • Require tokens earlier in the execution of commands that use the github API. If the token isn't saved to the user's configuration, the prompt for creating one will show up at the command startup rather than on sending the first request (#368, @NathanReb)
  • Attach the changelog to the annotated tag message (#283, @gpetiot)
  • Do not remove versioned files from the tarball anymore. We used to exclude .gitignore, .gitattributes and other such files from the archive. (#299, @NathanReb)
  • Don't try to push the tag if it is already present and point to the same ref on the remote. dune-release must guess which URI to pass to git push and may guess it wrong. This change allows users to push the tag manually to avoid using that code. (#219, @Julow)
  • Don't try to create the release if it is already present and points to the same tag (#277, @kit-ty-kate)
  • Recursively exclude all .git/.hg files and folders from the distrib tarball (#300, @NathanReb)
  • Make the automatic dune-release workflow to stop if a step exits with a non-zero code (#332, @gpetiot)
  • Make git-related mdx tests more robust in unusual environments (#334, @sternenseemann)
  • Set the default tag message to "Release " instead of "Distribution "
  • Opam file linter: check for synopsis instead of description (#291, @kit-ty-kate)
  • Upgrade the use of the opam libraries to opam 2.1 (#343, @kit-ty-kate)

Deprecated

  • Deprecate the --user CLI options and configuration field, they were redundant with the remote-repo option and field and could be set unproperly, leading to bugs (#372, @NathanReb)
  • Deprecate the use of delegates in dune-release publish (#276, #302, @pitag-ha)
  • Deprecate the use of opam file format 1.x (#352, @NathanReb)

Removed

  • Option --name is removed from all commands. When used with dune-release distrib, it was previously effectively ignored. Now it is required to add a (name <name>) stanza to dune-project. (#327, @lehy)

Fixed

  • Fix a bug where opam submit would look up a config file, even though all the required information was provided on the command line. This would lead to starting the interactive config creation quizz if that file did not exist which made it impossible to use it in a CI for instance. (#373, @NathanReb)
  • Fix a bug where opam submit would fail on non-github repositories if the user had no configuration file (#372, @NathanReb)
  • Fix a bug where subcommands wouldn't properly read the token files, leading to authentication failures on API requests (#368, @NathanReb)
  • Fix a bug in opam submit preventing non-github users to create the opam-repo PR via dune-release. (#359, @NathanReb)
  • Fix a bug where opam submit would try to parse the custom URI provided through --distrib-uri as a github repo URI instead of using the dev-repo (#358, @NathanReb)
  • Fix the priority of the --distrib-uri option in dune-release opam pkg. It used to have lower precedence than the url file written by dune-release publish and therefore made it impossible to overwrite it if needed. (#255, @NathanReb)
  • Fix a bug with --distrib-file in dune-release opam pkg where you would need the regular dune-release generated archive to be around even though you specified a custom distrib archive file. (#255, @NathanReb)
  • Use int64 for timestamps. (#261, @gpetiot)
  • Define the order of packages (#263, @gpetiot)
  • Allow the dry-run mode to continue even after some API call's response were expected by using placeholder values (#262, @gpetiot)
  • Build and run tests for all selected packages when checking distribution tarball (#266, @NathanReb)
  • Improve trimming of the changelog to preserve the indentation of the list of changes. (#268, @gpetiot)
  • Trim the data of the url file before filling the url.src field. This fixes an issue that caused the url.src field to be a multi-line string instead of single line. (#270, @gpetiot)
  • Fix a bug causing dune-release to exclude all hidden files and folders (starting with .) at the repository from the distrib archive (#298, @NathanReb)
  • Better report GitHub API errors, all of the error messages reported by the GitHub API are now checked and reported to the user. (#290, @gpetiot)
  • Fix error message when dune-release tag cannot guess the project name (#319, @lehy)
  • Always warn about uncommitted changes at the start of dune-release distrib (#325, @lehy). Otherwise uncommitted changes to dune-project would be silently ignored by dune-release distrib.
  • Fix rewriting of github references in changelog (#330, @gpetiot)
  • Fixes a bug under cygwin where dune-release was unable to find the commit hash corresponding to the release tag (#329, @gpetiot)
  • Fixes release names by explicitly setting it to match the released version (#338, @NathanReb)
  • Fix a bug that prevented release of a package whose version number contains invalid characters for a git branch. The git branch names are now sanitized. (#271, @gpetiot)
  • publish: Fix the process of inferring user name and repo from the dev repo uri (#348, @pitag-ha)
See full changelog
  • Added an '--output-patch' option to allow use without a Github account
  • Use the latest opam libraries (2.1.0~rc) with better format-preserving printing
  • Avoid submission of packages without a reachable archive, except if --force was set or they are conf packages

Dune 2.9.0

Dear all, on behalf of the Dune team I'm pleased to announce the release of Dune 2.9.0. This is the last release on the Dune 2.x series and could be considered a maintenance release as it mostly consists on bug fixes and miscellaneous tweaks and features for sites, instrumentation, and mdx support.

See full changelog
  • Add (enabled_if ...) to (mdx ...) (https://github.com/ocaml/dune/pull/4434, @emillon)

  • Add support for instrumentation dependencies (https://github.com/ocaml/dune/pull/4210, fixes https://github.com/ocaml/dune/issues/3983, @nojb)

  • Add the possibility to use locks with the cram tests stanza (https://github.com/ocaml/dune/pull/4480, @voodoos)

  • Allow to set up merlin in a variant of the default context (https://github.com/ocaml/dune/pull/4145, @TheLortex, @voodoos)

  • Add (package ...) to (mdx ...) (https://github.com/ocaml/dune/pull/4691, fixes https://github.com/ocaml/dune/issues/3756, @emillon)

  • Handle renaming of coq.kernel library to coq-core.kernel in Coq 8.14 (https://github.com/ocaml/dune/pull/4713, @proux01)

  • Fix generation of merlin configuration when using (include_subdirs unqualified) on Windows (https://github.com/ocaml/dune/pull/4745, @nojb)

  • Fix bug for the install of Coq native files when using (include_subdirs qualified) (https://github.com/ocaml/dune/pull/4753, @ejgallego)

  • Allow users to specify install target directories for doc and etc sections. We add new options --docdir and --etcdir to both Dune's configure and dune install command. (https://github.com/ocaml/dune/pull/4744, fixes https://github.com/ocaml/dune/issues/4723, @ejgallego, thanks to @JasonGross for reporting this issue)

  • Fix issue where Dune would ignore (env ... (coq (flags ...))) declarations appearing in dune files (https://github.com/ocaml/dune/pull/4749, fixes https://github.com/ocaml/dune/issues/4566, @ejgallego @rgrinberg)

  • Disable some warnings on Coq 8.14 and (lang coq (>= 0.3)) due to the rework of the Coq "native" compilation system (https://github.com/ocaml/dune/pull/4760, @ejgallego)

  • Fix a bug where instrumentation flags would be added even if the instrumentatation was disabled (@nojb, https://github.com/ocaml/dune/pull/4770)

  • Fix https://github.com/ocaml/dune/issues/4682: option -p takes now precedence on environement variable DUNE_PROFILE (https://github.com/ocaml/dune/pull/4730, https://github.com/ocaml/dune/pull/4774, @bobot, reported by @dra27 https://github.com/ocaml/dune/issues/4632)

  • Fix installation with opam of package with dune sites. The .install file is now produced by a local dune install during the build phase (https://github.com/ocaml/dune/pull/4730, https://github.com/ocaml/dune/pull/4645, @bobot, reported by @kit-ty-kate https://github.com/ocaml/dune/issues/4198)

  • Fix multiple issues in the sites feature (https://github.com/ocaml/dune/pull/4730, https://github.com/ocaml/dune/pull/4645 @bobot, reported by @Lelio-Brun https://github.com/ocaml/dune/issues/4219, by @Kakadu https://github.com/ocaml/dune/issues/4325, by @toots https://github.com/ocaml/dune/issues/4415)

See full changelog

Features

  • Add sub-errors as "related" information in diagnostics (#457)

  • Add support for navigating to a symbol inside a workspace (#398)

  • Show typed holes as errors

    Merlin has a concept of "typed holes" that are syntactically represented as _. Files that incorporate typed holes are not considered valid OCaml, but Merlin and OCaml-LSP support them. One example when such typed holes can occur is when on "destructs" a value, e.g., destructing (Some 1) will generate code match Some 1 with Some _ -> _ | None -> _. While the first underscore is a valid "match-all"/wildcard pattern, the rest of underscores are typed holes.

Ppxlib 0.22.2

See full changelog
  • Make ppxlib compatible with 4.13 compiler (#260, @kit-ty-kate)

Utop 2.8.0

See full changelog
  • If the current working directory is the home directory, then do not load .ocamlinit (@hyphenrf @copy #338)
  • With OCaml 4.12.0 and later, the toplevel uses the toplevel state to exit with the right status code (#348 @octachron)
  • Fix color highlight for errors (#350 @chripell)
  • Add support for OCaml 4.13 (#353 @kit-ty-kate)

Emacs mode fixes:

  • Company text-completion fixes (@leungbk #340)
  • utop-query-arguments always returns (utop-arguments) whether it sets the utop-command or not (@dansanduleac #347)
  • Fix completion returning bogus candidates (#352 @chripell @rgrinberg)

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

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

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)

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)
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)

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