OCaml Changelog

RSS

Read the latest releases and updates from the OCaml ecosystem.

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://raw.githubusercontent.com/ocaml/opam/master/shell/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)
If you want to contribute to a new release announcement, check out the Contributing Guide on GitHub.