OCaml Changelog

Read the latest releases and updates from the OCaml ecosystem.

Note: The OCaml Changelog is experimental and is not yet endorsed by the maintainers of the Compiler, OCaml Platform and other featured projects.
We'll work with the maintainers of the projects to agree on the format of the Changelog and the release process as we roll out a stable version.

OCaml 5.1.0 - Second Alpha

With the progress of the ongoing stabilisation effort for OCaml 5.1.0, I am happy to announce a second alpha release for OCaml 5.1.0.

This second alpha release contains many noteworthy fixes:

  • a long-awaited GC fix
  • a Windows ABI fix

as announced in the first alpha but also

  • a compiler-libs (parsetree) fix
  • a type system compatibility enhancement change
  • a restored backed for s390x/IBM Z

The full list of changes since the first alpha is available below.

Once most major OCaml tools are updated to the last compiler-libs changes, we will switch to beta releases. Hopefully, this will happen in the upcoming weeks. The progress on stabilising the ecosystem is tracked on the opam readiness for 5.1.0 meta-issue.

Currently, the release is still planned for around July.

If you find any bugs, please report them on OCaml's issue tracker.

If you are interested in the ongoing list of new features and bug fixes, the updated change log for OCaml 5.1.0 is available on GitHub.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands on opam 2.1:

opam update
opam switch create 5.1.0~alpha2

The source code for the alpha is also available at these addresses:

Fine-Tuned Compiler Configuration

If you want to tweak the configuration of the compiler, you can switch to the option variant with:

opam update
opam switch create <switch_name> ocaml-variants.5.1.0~alpha2+options <option_list>

where option_list is a space-separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 5.1.0~alpha2+flambda+nffa ocaml-variants.5.1.0~alpha2+options ocaml-option-flambda ocaml-option-no-flat-float-array

All available options can be listed with opam search ocaml-option.

See full changelog

Runtime System

  • #11589, #11903: Modify the GC pacing code to make sure the GC keeps up with allocations in the presence of idle domains. (Damien Doligez and Stephen Dolan, report by Florian Angeletti, review by KC Sivaramakrishnan and Sadiq Jaffer)
  • (breaking change) #11865, #11868, #11876: Clarify that the operations of a custom block must never access the OCaml runtime. The previous documentation only mentioned the main illicit usages. In particular, since OCaml 5.0, it is no longer safe to call caml_remove_global_root or caml_remove_generational_global_root from within the C finalizer of a custom block, or within the finalization function passed to caml_alloc_final. As a workaround, such a finalization operation can be registered with Gc.finalize instead, which guarantees to run the finalizer at a safe point. (Report by Timothy Bourke, discussion by Yotam Barnoy, Timothy Bourke, Sadiq Jaffer, Xavier Leroy, Guillaume Munch-Maccagnoni, and Gabriel Scherer)
  • #11827, +#12249: Restore prefetching for GC marking (Fabrice Buoro and Stephen Dolan, review by Gabriel Scherer and Sadiq Jaffer)
  • #12131: Simplify implementation of weak hash sets, fixing a performance regression. (Nick Barnes, review by François Bobot, Alain Frisch and Damien Doligez).

  • #12231: Support MinGW-w64 11.0 winpthreads library, where the macro to set up to get flexdll working changed (David Allsopp and Samuel Hym, light review by Xavier Leroy)

Type System

  • (breaking change) #12189, #12211: anonymous row variables in explicitly polymorphic type annotation, e.g. 'a. [< X of 'a ] -> 'a, are now implicitly universally quantified (in other words, the example above is now read as 'a 'r. ([< X of 'a ] as 'r) -> 'a). (Florian Angeletti and Gabriel Scherer, review by Jacques Garrigue)

Code Generation And Optimizations

  • #11712, #12258, #12261: s390x / IBM Z multicore support: OCaml & C stack separation; dynamic stack size checks; fiber and effects support. (Aleksei Nikiforov, with help from Vincent Laviron and Xavier Leroy, additional suggestions by Luc Maranget, review by the same and KC Sivaramakrishnan)

Internal/compiler-libs Changes

  • #12119, +#12188, +#12191: mirror type constraints on value binding in the parsetree: the constraint typ in let pat : typ = exp is now directly stored in the value binding node in the parsetree. (Florian Angeletti, review by Richard Eisenberg)

Bug Fixes

  • #11846: Mark rbx as destroyed at C call for Win64 (mingw-w64 and Cygwin64). Reserve the shadow store for the ABI in the c_stack_link struct instead of explictly when calling C functions. This simultaneously reduces the number of stack pointer manipulations and also fixes a bug when calling noalloc functions where the shadow store was not being reserved. (David Allsopp, report by Vesa Karvonen, review by Xavier Leroy and KC Sivaramakrishnan)

  • #12170: fix pthread_geaffinity_np configure check for android (David Allsopp, review by Sébastien Hinderer)

  • #12252: Fix shared library build error on RISC-V. (Edwin Török, review by Nicolás Ojeda Bär and Xavier Leroy)

  • #12255, #12256: Handle large signal numbers correctly (Nick Barnes, review by David Allsopp).

  • #12277: ARM64, fix a potential assembler error for very large functions by emitting stack reallocation code before the body of the function. (Xavier Leroy, review by KC Sivaramakrishnan)

Merlin 4.9

We are pleased to announce the release of Merlin 4.9 for OCaml 4.14.1 and 5.0.

This maintenance release brings multiple bug fixes and improvements. In particular we identified and patched an important memory consumption issue that could greatly affect Merlin’s performance in heavily functorized projects.

See full changelog
  • merlin binary
    • Allow monadic IO in dot protocol (#1581)
    • Add a scope option to the occurrences command in preparation for the upcoming project-wide-occurrences feature (#1596)
    • Construct bool-typed holes as false instead of true in the construct command, for consistency (#1599).
    • Add a hook to configure system command for spawning ppxes when Merlin is used as a library. (#1585)
    • Implement an all-or-nothing cache for the PPX phase (#1584)
    • Cleanup functors caches when backtracking, to avoid memory leaks (#1609, fixes #1529 and ocaml-lsp#1032)
    • Fix construct results ordering for sum types sand poly variants (#1603)
    • Fix object method completion not working (#1606, fixes #1575)
    • Improve context detection for package types (#1608, fixes #1607)
    • Fix incorrect locations for string literals (#1574)
    • Fixed an issue that caused errors to erroneously alert about missing cmi files (#1577)
    • Prevent destruct from crashing on closed variant types (#1602, fixes #1601)
    • Improve longident parsing (#1612, fixes #945)
  • editor modes
    • emacs: call the user's configured completion UI in merlin-construct (#1598)
  • test suite
    • Add missing dependency to a test using ppxlib (#1583)
    • Add tests for the new PPX phase cache (#1584)
    • Add and update tests for construct ordering (#1603)

opam 2.1.5

Feedback on this post is welcomed on Discuss!

We are pleased to announce the patch release of opam 2.1.5.

This opam release consists of backported bug & security fixes:

  • Security issue: fix opam installing packages without checking their checksum when the local cache is corrupted in some case (#5538), you can find more information there.
  • Variables are now expanded in build-env (as for setenv) (#5352)
  • Correctly handle empty environment variable additions (#5350)
  • Skip empty environment variable additions (#5350)
  • Fix passing archive-mirrors field from init config file to config (#5315)
  • git, hg: Use the full SHA1 revision instead of just the 8 first characters (#5342)

Opam installation instructions (unchanged):

  1. From binaries: run

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

    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.

Utop 2.12.1

Following the release of UTop 2.12.0 a few days ago, we released UTop 2.12.1, a patch release that fixes a regression with unit qualification.

This release also includes an implementation of completion-at-point for Emacs.

See full changelog

Mdx 2.3.0

We're pleased to announce the release of Mdx 2.3.0!

This release comes with support for mld files and changes the parser used by the toplevel, which allows Camlp5's parser to be used with MDX.

See full changelog

Added

  • Added support for mld files (#423, @jonludlam)

Changed

  • Switch to using the parser that toplevel uses (found in a mutable ref, instead of always the official OCaml parser). This allows Camlp5's parser to be used with MDX. (#417, @chetmurthy)

Utop 2.12.0

UTop 2.12.0 is out with support for the upcoming release of OCaml 5.1!

This release also fixes an issue that prevented users to redefine the () constructor. You can now safely run type t = () of unit and continue using your top-level session.

See full changelog
  • Add support for OCaml 5.1 (#421, @emillon)

  • Mark prompt_continue, prompt_comment, smart_accept, new_prompt_hooks, at_new_prompt as deprecated (they have been documented as such since 2012 and most of them are ignored) (#415, @emillon)

  • Qualify () constructor in generated expressions. (#418, fixes #417, @emillon)

OCaml 5.1.0 - First Alpha

Four months after the release of OCaml 5.0.0, the set of new features for the future version 5.1.0 of OCaml has been frozen. We are thus happy to announce the first alpha release for OCaml 5.1.0.

This alpha version is here to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the installation instructions). The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.1.0 meta-issue.

If you find any bugs, please report them on OCaml's issue tracker.

Note that this early alpha version is missing two important fixes for the garbage collector and Windows support. Those fixes will be available before the beta. The full release is expected in July.

If you are interested in the ongoing list of new features and bug fixes, the updated change log for OCaml 5.1.0 is available on GitHub.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands on opam 2.1:

opam update
opam switch create 5.1.0~alpha1

For previous version of opam, the switch creation command line is slightly more verbose:

opam update
opam switch create 5.1.0~alpha1 --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

The source code for the alpha is also available at these addresses:

Fine-Tuned Compiler Configuration

If you want to tweak the configuration of the compiler, you can switch to the option variant with:

opam update
opam switch create <switch_name> ocaml-variants.5.1.0~alpha1+options <option_list>

where option_list is a space separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 5.1.0~alpha1+flambda+nffa ocaml-variants.5.1.0~alpha1+options ocaml-option-flambda ocaml-option-no-flat-float-array

The command line above is slightly more complicated for opam version anterior to 2.1:

opam update
opam switch create <switch_name> --packages=ocaml-variants.5.1.0~alpha1+options,<option_list> --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

In both cases, all available options can be listed with opam search ocaml-option.

Dune 3.7.1

We are excited to announce the release of Dune 3.7.1, which brings a few bug fixes from the recent 3.7.0 release:

  • Resolved watch mode issue for executables on macOS: We have addressed a problem with the recently introduced watch mode for executables that was causing segmentation faults on macOS. Users can now enjoy a stable watch mode without unexpected crashes on macOS.
  • Fixed "Too many links" error on Windows: We have fixed an issue that caused Dune build failures with a "Too many links" error on Windows when using Dune cache.

... and a few more, you can consult the changelog for a full list of bug fixes.

See full changelog
  • Fix segfault on MacOS when dune was being shutdown while in watch mode. (#7312, fixes #6151, @gridbugs, @emillon)

  • Fix preludes not being recorded as dependencies in the (mdx) stanza (#7109, fixes #7077, @emillon).

  • Pass correct flags when compiling stdlib.ml. (#7241, @emillon)

  • Handle "Too many links" errors when using Dune cache on Windows. The fix in 3.7.0 for this same issue was not effective due to a typo. (#7472, @nojb)

Ocamlformat 0.25.1

We are pleased to announce the release of OCamlFormat 0.25.1! This release contains several bug fixes, changes, and new features.

The library is also available through the ocamlformat-lib package on opam. The ocamlformat package only contains the binary.

The highlights of this release include:

Formatting .mld files

Formatting .mld files as odoc documentation files is now possible! This will make it much easier to maintain high-quality documentation alongside your OCaml code.

This feature is only available in ocamlformat for now, but keep an eye on the future dune releases to know when dune fmt will be able to format your .mld files!

Various improvements and bugfixes

We fixed various issues related to indentation, alignment, and comments positioning.

Here are a few examples:

  • More consistent indentation inside a parenthesized expression:
         | [ node ] ->
             ( (if List.mem node ~set:integer_graph.(node)
-              then Has_loop [ numbering.forth.(node) ]
-              else No_loop numbering.forth.(node))
+               then Has_loop [ numbering.forth.(node) ]
+               else No_loop numbering.forth.(node))
             , component_edges.(component) )
     (let open Memo.O in
-    let+ w = Dune_rules.Workspace.workspace () in
-    Dune_engine.Execution_parameters.builtin_default
-    |> Dune_rules.Workspace.update_execution_parameters w);
+     let+ w = Dune_rules.Workspace.workspace () in
+     Dune_engine.Execution_parameters.builtin_default
+     |> Dune_rules.Workspace.update_execution_parameters w);
  • More consistent formatting of module expressions:
-  module Sel = (val if is_osx () then (module Mac)
-                    else if Sys.unix then (module Unix)
-                    else (module Fail) : Unix_socket)
+  module Sel =
+    (val if is_osx () then (module Mac)
+         else if Sys.unix then (module Unix)
+         else (module Fail)
+        : Unix_socket)

We would like to thank all contributors for their valuable contributions to this release. Please see the complete changelog for more details.

We hope you enjoy this release and continue to find OCamlFormat a valuable tool for your OCaml projects. You can download ocamlformat.0.25.1 from the opam repository or GitHub.

Thank you for your support and feedback, and please don't hesitate to reach out if you have any questions or issues.

The OCamlFormat team

See full changelog

Library

  • The declaration of options is a regular module instead of a functor. (#2193, @EmileTrotignon)

Bug fixes

  • Fix indentation when ocamlformat is disabled on an expression (#2129, @gpetiot)
  • Reset max-indent when the max-indent option is not set (#2131, @hhugo, @gpetiot)
  • Add missing parentheses around immediate objects having attributes attached in 4.14 (#2144, @gpetiot)
  • Fix dropped comment attached to the identifier of an open-expression (#2155, @gpetiot)
  • Correctly format chunks of file in presence of enable/disable floating attributes (#2156, @gpetiot)
  • Remove abusive normalization in docstrings references (#2159, #2162, @EmileTrotignon)
  • Fix parentheses around symbols in if-then-else branches (#2169, @gpetiot)
  • Preserve position of comments around variant identifiers (#2179, @gpetiot)
  • Fix parentheses around symbol identifiers (#2185, @gpetiot)
  • Fix alignment inconsistency between let-binding and let-open (#2187, @gpetiot)
  • Fix reporting of operational settings origin in presence of profiles (#2188, @EmileTrotignon)
  • Fix alignment inconsistency of if-then-else in apply (#2203, @gpetiot)
  • Fix automated Windows build (#2205, @nojb)
  • Fix spacing between recursive module bindings and recursive module declarations (#2217, @gpetiot)
  • ocamlformat-rpc: use binary mode for stdin/stdout (#2218, @rgrinberg)
  • Fix interpretation of glob pattern in .ocamlformat-ignore under Windows (#2206, @nojb)
  • Remove conf mutability, and correctly display the conventional profile when using print-config (#2233, @EmileTrotignon)
  • Preserve position of comments around type alias (#2239, @EmileTrotignon)
  • Preserve position of comments around constructor record (#2237, @EmileTrotignon)
  • Preserve position of comments around external declaration strings (#2238, @EmileTrotignon, @gpetiot)
  • Preserve position of comments around module pack expressions (#2234, @EmileTrotignon, @gpetiot)
  • Correctly parenthesize array literals with attributes in argument positions (#2250, @ccasin)
  • Janestreet: Fix indentation of functions passed as labelled argument (#2259, @Julow)

Changes

  • Indent 2 columns after initializer keyword (#2145, @gpetiot)
  • Preserve syntax of generative modules ((struct end) vs ()) (#2135, #2146, @trefis, @gpetiot)
  • Preserve syntax of module unpack with type constraint (((module X) : (module Y)) vs (module X : Y)) (#2136, @trefis, @gpetiot)
  • Normalize location format for warning and error messages (#2139, @gpetiot)
  • Preserve syntax and improve readability of indexop-access expressions (#2150, @trefis, @gpetiot)
    • Break sequences containing indexop-access assignments
    • Remove unnecessary parentheses around indices
  • Mute warnings for odoc code blocks whose syntax is not specified (#2151, @gpetiot)
  • Improve formatting of odoc links (#2152, @gpetiot)
  • Preserve sugared extension node attached to an if carrying attributes (#2167, @trefis, @gpetiot)
  • Remove unnecessary parentheses around partially applied infix operators with attributes (#2198, @gpetiot)
  • JaneStreet profile: doesn't align infix ops with open paren (#2204, @gpetiot)
  • Re-use the type let_binding from the parser instead of value_binding, improve the spacing of let-bindings regarding of having extension or comments (#2219, @gpetiot)
  • The ocamlformat package now only contains the binary, the library is available through the ocamlformat-lib package (#2230, @gpetiot)

New features

  • Add a break-colon option to decide whether to break before or after the : symbol in value binding declarations and type constraints. This behavior is no longer ensured by ocp-indent-compat. (#2149, @gpetiot)
  • Format .mld files as odoc documentation files (#2008, @gpetiot)
  • New value vertical for option if-then-else (#2174, @gpetiot)
  • New value vertical for option break-cases (#2176, @gpetiot)
  • New value wrap-or-vertical for option break-infix that only wraps high precedence infix ops (#1865, @gpetiot)

Merlin 4.8

We are pleased to announce the release of Merlin 4.8 for OCaml 4.14.1 and 5.0.

This maintenance release brings multiple bug fixes and improvements to document fetching, jump-to-definition and type-on-hover for records' labels.

See full changelog
  • merlin binary
    • Update internal typer to match OCaml 4.14.1 release (#1557)
    • Improve type-enclosing behaviour when used on records' labels (#1565, fixes #1564)
    • Restore compatibility with some OCaml compiler's debug flags that were incorrectly rejected by Merlin (#1556)
    • Traverse aliases when jumping to declaration. This matches jump-to-definition's behavior (#1563)
    • Improve locate's behavior in various ill-typed expressions (#1546, fixes #1567 and partially #1543)
    • Correctly traverse patterns when looking for docs in the typedtree (#1572)
    • Get documentation when the declaration or definition is selected (#1542, fixes #1540)
    • On Windows, change to a harmless directory when launching server to avoid locking down current directory (#1569, fixes #1474)
  • test suite
    • Add multiple tests for locate over ill-typed expressions (#1546)
    • Add non-regression tests for other fixes in this release

Dune 3.7.0

The dune team is pleased to announce the release of Dune 3.7.0.

As in the previous announce, here is a changelog split in several parts: changes to the dune executable itself (new commands or options, etc) and changes to the dune language. Most of the changes to the latter are only enabled when you opt-in to the new version by specifying (lang dune 3.7) in the corresponding dune-project file. In other words, it should always be safe to upgrade the dune package.

See full changelog

dune executable

Added

  • Allow running $ dune exec in watch mode (with the -w flag). In watch mode, $ dune exec the executed binary whenever it is recompiled. (#6966, @gridbugs)

  • Add a dune cache size command for displaying the size of the cache (#6638, @Alizter)

  • Allow $ dune ocaml dump-dot-merlin to run in watch mode. Also this command shouldn't print "Entering Directory" mesages. (#6497, @rgrinberg)

  • Add native support for polling mode on Windows (#7010, @yams-yams, @nojb, review by @Rucikir and @jbeckford)

  • Auto-detect dune-workspace files as dune files in Emacs (#7061, @ilankri)

  • Allow $ dune utop to load libraries defined in data only directories defined using (subdir ..) (#6631, @rgrinberg)

Changed

  • Make dune describe workspace return consistent dependencies for executables and for libraries. By default, compile-time dependencies towards PPX-rewriters are from now not taken into account (but runtime dependencies always are). Compile-time dependencies towards PPX-rewriters can be taken into account by providing the --with-pps flag. (#6727, fixes #6486, @esope)

  • Use colored output with MDX when Dune colors are enabled. (#6462, @MisterDA)

  • Use colored output with GCC and Clang when compiling C stubs. The flag -fdiagnostics-color=always is added to the :standard set of flags. (#4083, @MisterDA)

  • Move $ dune ocaml-merlin -dump-config=$dir to $ dune ocaml merlin dump-config $dir. (#6547, @rgrinberg)

Fixed

  • Fix parsing of OCaml errors that contain code excerpts with ... in them. (#7008, @rgrinberg)

  • Fix --trace-file output. Dune now emits a single complete event for every executed process. Unterminated async events are no longer written. (#6892, @rgrinberg)

  • Print missing newline after $ dune exec. (#6821, fixes #6700, @rgrinberg, @Alizter)

  • Fix binary corruption when installing or promoting in parallel (#6669, fixes #6668, @edwintorok)

  • Report an error if dune init ... would create a "dune" file in a location which already contains a "dune" directory (#6705, @gridbugs)

  • Fix the parsing of alerts. They will now show up in diagnostics correctly. (#6678, @rginberg)

  • Print "Leaving Directory" whenever "Entering Directory" is printed. (#6419, fixes #138, @cpitclaudel, @rgrinberg)

  • Remove "Entering Directory" messages for $ dune install. (#6513, @rgrinberg)

  • dune clean should no longer fail under Windows due to the inability to remove the .lock file. Also, bring the implementation of the global lock under Windows closer to that of Unix. (#6523, @nojb)

  • Fix missing dependencies when detecting the kind of C compiler we're using (#6610, fixes #6415, @emillon)

  • Remove spurious build dir created when running dune init proj ... (#6707, fixes #5429, @gridbugs)

  • Validate the command line arguments for $ dune ocaml top-module. This command requires one positional argument (#6796, fixes #6793, @rgrinberg)

  • Fix dependency cycle when installing files to the bin section with glob_files (#6764, fixes #6708, @gridbugs)

  • Handle "Too many links" errors when using Dune cache on Windows (#6993, @nojb)

  • Pre-emptively clear screen in watch mode (#6987, fixes #6884, @rgrinberg)

  • Allow --sandbox to affect ocamldep invocations. Previously, they were wrongly marked as incompatible (#6749, @rgrinberg)

dune language

Added

  • Allow (include_subdirs qualified) for OCaml projects. (#6594, fixes #1084, @rgrinberg)

  • Format dune files when they are named dune-file. This occurs when we enable the alternative file names project option. (#6566, @rgrinberg)

  • Add map_workspace_root dune-project stanza to allow disabling of mapping of workspace root to /workspace_root. (#6988, fixes #6929, @richardlford)

  • Allow the cinaps stanza to set a custom alias. By default, if the alias is not set then the cinaps actions will be attached to both @cinaps and @runtest (#6991, @rgrinberg)

  • Add (using ctypes 0.3). When used, paths in (ctypes) are interpreted relative to where the stanza is defined. (#6883, fixes #5325, @emillon)

Changed

  • Stop passing -q flag in dune coq top, which allows for .coqrc to be loaded. (#6848, fixes #6847, @Alizter)

  • Coq native mode is now automatically detected by Dune starting with Coq lang 0.7. (mode native) has been deprecated in favour of detection from the configuration of Coq. (#6409, @Alizter)

  • Accurately determine merlin configuration for all sources selected with copy# and copy_files#. The old heuristic of looking for a module in parent directories is removed (#6594, @rgrinberg)

Fixed

  • Fix parsing of the <= operator in blang expressions of dune files. Previously, the operator would be interpreted as <. (#6928, @tatchi)

  • Fix preprocessing with staged_pps (#6748, fixes #6644, @rgrinberg)

  • Fix the parsing of decimal and hexadecimal escape literals in dune, dune-package, and other dune s-expression based files (#6710, @shym)

  • Fix cross compilation configuration when a context with targets is itself a host of another context (#6958, fixes #6843, @rgrinberg)

  • Allow compilation rules to be impacted by (env ..) stanzas that modify the environment or set binaries. (#6527, @rgrinberg)

  • Fix handling of support files generated by odoc. (#6913, @jonludlam)

  • Fix the compilation of modules generated at link time when implicit_transitive_deps is enabled (#6642, @rgrinberg)

  • Fix inline tests with js_of_ocaml and whole program compilation mode enabled (#6645, @hhugo)

  • Fix js_of_ocaml separate compilation rules when --enable=effects ,--enable=use-js-string or --toplevel is used. (#6714, #6828, #6920, @hhugo)

  • Fix js_of_ocaml separate compilation in presence of linkall (#6832, #6916, @hhugo)

  • coqdep is now called once per theory, instead of one time per Coq file. This should significantly speed up some builds, as coqdep startup time is often heavy (#7048, @Alizter, @ejgallego)

Ppxlib 0.29.1

See full changelog
  • Allow users to vendor ppxlib as-is, as well as ppx_sexp_conv in the same project (#386, @kit-ty-kate)

Ppxlib 0.29.0

See full changelog
  • Remove File_path exports. (#381, @ceastlund)
  • Add Ppxlib.Expansion_helpers with name mangling utilities from ppx_deriving (#370, @sim642)

Dune 3.6.2

See full changelog
  • Fix configurator when using the MSVC compiler (#6538, fixes #6537, @nojb)

  • Fix running the RPC server on windows (#6721 fixes #6720, @rgrinberg)

Mdx 2.2.1

See full changelog

Fixed

  • Undid the change to the pipe code to restore compatibility with Windows (#403, @MisterDA)

Ocaml-lsp 1.15.1

See full changelog

Fixes

  • Fix race condition when a document was being edited and dune in watch mode was running (#1005, fixes #941, #1003)

Mdx 2.2.0

See full changelog

Added

  • Report all parsing errors in Markdown files (#389, @NathanReb)

Changed

  • Preserve indentation in multiline OCaml blocks in .mli files (#395, @panglesd)
  • Rename the Normal syntax to Markdown to better explain what the syntax is and moved it to Mdx.Syntax (#412, @Leonidas-from-XIV)

Fixed

  • Fixed compatibility with Cmdliner 1.1.0 (#371, @Leonidas-from-XIV)
  • Report errors and exit codes of toplevel directives (#382, @talex5, @Leonidas-from-XIV)
  • Fix block locations in error reporting (#389, @NathanReb)
  • Include the content of the line that features the part-end MDX directive in the output, before that line would've been dropped (#374, #387, @Leonidas-from-XIV)
  • Handle EINTR signal on waitpid call by restarting the syscall. (#409, @tmcgilchrist)
  • Fix parsing of multiline toplevel phrases in .mli files (#394, #397, @Leonidas-from-XIV)

Removed

  • Removed warning about missing semicolons added in MDX 1.11.0 and the automatic insertion of semicolons in the corrected files introduced in MDX 2.0.0. (#398, @Leonidas-from-XIV)

Ocaml-lsp 1.15.0

On behalf of the ocaml-lsp team, I’m pleased to announce ocaml-lsp-server versions 1.15.0-4.14 and 1.15.0-5.0 for OCaml 4.14 and 5.0, respectively. This is the first time we release ocaml-lsp supporting two compiler versions. We look forward to your feedback.

See full changelog

Features

  • Enable semantic highlighting support by default (#933)

  • Support connecting over pipes and socket. Pipes on Windows aren't yet supported (#946)

    More about communication channels in LSP specification.

  • Re-enable ocamlformat-rpc for formatting code snippets (but not files and not on Windows) (#920, #939)

    One needs to have installed either ocamlformat package version > 0.21.0 or, otherwise, ocamlformat-rpc package. Note that previously ocamlformat-rpc came in a standalone OPAM package, but since ocamlformat version > 0.21.0, it comes within ocamlformat package.

  • Add custom ocamllsp/hoverExtended request (#561)

  • Support utf-8 position encoding clients (#919)

    More about position encoding in LSP specification.

  • Show unwrapped module alias types on hovering over module names. This is due to upgrading to merlin 4.7 and using merlin's verbosity=smart by default (#942)

Fixes

  • Respect the client's completion item resolve and preSelect capabilities (#925, #936)

  • Disable polling for dune's watch mode on Windows and OCaml 4.14.0 (#935)

  • Fix semantic highlighting of "long identifiers," e.g., Foo.Bar.x (#932)

  • Fix syncing of document contents:

    • For ranges that span an entire line (#927)
    • Previously, whole line edits would incorrectly eat the newline characters (#971)

Utop 2.11.0

See full changelog
  • Bump the compatibility to 4.08+ (#393 @emillon)
  • Load @toplevel_printer annotated printers for functors (#378 @metavinek)
  • Do not display a backtrace when exiting normally (#399 #398 @emillon)

Release of OCaml 4.14.1

We have the pleasure of celebrating the birthday of Oronce Finé by announcing the release of OCaml version 4.14.1.

This release is a collection of safe bug fixes, cherry-picked from the OCaml 5.0.0 release. If you were using OCaml 4.14.0 and cannot yet upgrade to OCaml 5, this release is for you.

The 4.14 branch is expected to receive more backported fixes during the maturation of OCaml 5. Thus don't hesitate to report any bugs on the OCaml issue tracker.

See the list of changes below for more details.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands:

opam update
opam switch create 4.14.1

The source code for the release candidate is also directly available on:

See full changelog

Changes in OCaml 4.14.1 (20 December 2022)

Compiler User-Interface and Warnings:

  • #11184, #11670: Stop calling ranlib on created / installed libraries (Sébastien Hinderer and Xavier Leroy, review by the same)

Build System:

  • #11370, #11373: Don't pass CFLAGS to flexlink during configure. (David Allsopp, report by William Hu, review by Xavier Leroy and Sébastien Hinderer)

  • #11487: Thwart FMA test optimisation during configure (William Hu, review by David Allsopp and Sébastien Hinderer)

Bug Fixes:

  • #10768, #11340: Fix typechecking regression when combining first class modules and GADTs. (Jacques Garrigue, report by François Thiré, review by Matthew Ryan)

  • #11204: Fix regression introduced in 4.14.0 that would trigger Warning 17 when calling virtual methods introduced by constraining the self type from within the class definition. (Nicolás Ojeda Bär, review by Leo White)

  • #11263, #11267: caml/{memory,misc}.h: Check whether _MSC_VER is defined before using it to ensure that the headers can always be used in code which turns on -Wundef (or equivalent). (David Allsopp and Nicolás Ojeda Bär, review by Nicolás Ojeda Bär and Sébastien Hinderer)

  • #11314, #11416: Fix non-informative error message for module inclusion (Florian Angeletti, report by Thierry Martinez, review by Gabriel Scherer)

  • #11358, #11379: Refactor the initialisation of bytecode threading, This avoids a "dangling pointer" warning of GCC 12.1. (Xavier Leroy, report by Armaël Guéneau, review by Gabriel Scherer)

  • #11387: Module type with constraints no longer crash the compiler in presence of both shadowing warnings and the -bin-annot compiler flag. (Florian Angeletti, report by Christophe Raffalli, review by Gabriel Scherer)

  • #11392, #11392: Assertion failure with -rectypes and external definitions (Gabriel Scherer, review by Florian Angeletti, report by Dmitrii Kosarev)

  • #11417: Fix a regression which allowed virtual methods in non-virtual classes. (Leo White, review by Florian Angeletti)

  • #11468: Fix regression from #10186 (OCaml 4.13) detecting IPv6 on Windows for Mingw-w64 i686 port. (David Allsopp, review by Xavier Leroy and Sébastien Hinderer)

  • #11489, #11496: More prudent deallocation of alternate signal stack (Xavier Leroy, report by @rajdakin, review by Florian Angeletti)

  • #11516, #11524: Fix the deprecated_mutable attribute. (Chris Casinghino, review by Nicolás Ojeda Bär and Florian Angeletti)

  • #11194, #11609: Fix inconsistent type variable names in "unbound type var" messages (Ulysse Gérard and Florian Angeletti, review Florian Angeletti and Gabriel Scherer)

  • #11622: Prevent stack overflow when printing a constructor or record mismatch error involving recursive types. (Florian Angeletti, review by Gabriel Scherer)

  • #11732: Ensure that types from packed modules are always generalised (Stephen Dolan and Leo White, review by Jacques Garrigue)

  • #11737: Fix segfault condition in Unix.stat under Windows in the presence of multiple threads. (Marc Lasson, Nicolás Ojeda Bär, review by Gabriel Scherer and David Allsopp)

  • #11776: Extend environment with functor parameters in strengthen_lazy. (Chris Casinghino and Luke Maurer, review by Gabriel Scherer)

  • #11533, #11534: Follow synonyms again in #show_module_type (this had stopped working in 4.14.0) (Gabriel Scherer, review by Jacques Garrigue, report by Yaron Minsky)

  • #11768, #11788: Fix crash at start-up of bytecode programs in no-naked-pointers mode caused by wrong initialisation of caml_global_data (Xavier Leroy, report by Etienne Millon, review by Gabriel Scherer)

  • #11803, #11808: On x86, the destination of an integer comparison must be a register; it cannot be a stack slot. (Vincent Laviron, review by Xavier Leroy, report by Emilio Jesús Gallego Arias)

Ocaml-lsp 1.15.0~5.0preview1

See full changelog

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

Release of OCaml 5.0.0

We have the pleasure of celebrating the birthdays of Jane Austen and Arthur C. Clarke by announcing the release of OCaml version 5.0.0.

The highlight of this new major version of OCaml is the long-awaited runtime support for shared memory parallelism and effect handlers.

This multicore support is the culmination of more than 8 years of effort, and required a full rewrite of the OCaml runtime environment. Consequently, OCaml 5.0.0 is expected to be a more experimental version of OCaml than the usual OCaml releases.

In this release, the native compiler only supports the x86-64 and arm64 architectures. In terms of operating systems, Linux, the BSDs, macOS and mingw64 on Windows are supported.

We are planning to restore the support for most previously supported architectures and operating systems, and address remaining known issues over the course of the next year.

Don't let those words of caution hinder your experimentation with OCaml 5: OCaml 5 as a language is fully compatible with OCaml 4 down to the performance characteristics of your programs. In other words, any code that works with OCaml 4 should work the same with OCaml 5.

The currently known exceptions to this rule are:

  • the removal of many long-deprecated functions and modules
  • changes to the internal runtime API
  • the performance of ephemerons is currently (and temporarily) strongly degraded.

Please report any unexpected behaviours on the OCaml issue tracker and post any questions or comments you might have on our discussion forums.

During the maturing period for OCaml 5, the OCaml 4.14 branch will be maintained by backporting bug fixes from the OCaml 5 branch at regular intervals. The next release on the OCaml 4.14 branch, OCaml 4.14.1, should soon follow this release.

The full list of changes can be found in the changelog below.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands:

opam update
opam switch create 5.0.0

It might be also interesting to check the new support for parallelism by installing the domainslib library with

opam install domainslib

The source code for the release candidate is also directly available on:

Fine-Tuned Compiler Configuration

If you want to tweak the configuration of the compiler, you can switch to the option variant with:

opam update
opam switch create <switch_name> ocaml-variants.5.0.0+options <option_list>

where <option_list> is a comma-separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 5.0.0+flambda+nffa ocaml-variants.5.0.0+options ocaml-option-flambda ocaml-option-no-flat-float-array

The command line above is slightly more complicated for opam versions before 2.1:

opam update
opam switch create <switch_name> --packages=ocaml-variants.5.0.0+options,<option_list>

In both cases, all available options can be listed with opam search ocaml-option.

See full changelog

OCaml 5.0.0 (16 December 2022)

  • #10831: Multicore OCaml (Enguerrand Decorne, Stephen Dolan, Tom Kelly, Sadiq Jaffer, Anil Madhavapeddy, Sudha Parimala, KC Sivaramakrishnan, Leo White, the Tarides multicore team, review by Florian Angeletti, Damien Doligez, Xavier Leroy, Guillaume Munch-Maccagnoni, Olivier Nicole, Nicolás Ojeda Bär, Gabriel Scherer, the OCaml core development team, and many other valued reviewers.)

Runtime system:

  • #11400: Runtime events counters fixes Fixes mismatch between OCaml and C APIs, removes events from 4.x that are not present in the 5.0 GC and adds some missing probes. (Sadiq Jaffer, review by Gabriel Scherer, Florian Angeletti)

  • #11368: Runtime events buffer size OCAMLRUNPARAMS fix The runtime events buffer size can now be set via the 'e' OCAMLRUNPARAM. This is previously mistakenly enabled/disabled tracing instead. (Sadiq Jaffer, review by KC Sivaramakrishnan, David Allsopp, Damien Doligez)

  • #11308: Add environment variable to preserve runtime_events after exit If the environment variable OCAML_RUNTIME_EVENTS_PRESERVE exists then the runtime will not remove the runtime events ring buffers at exit. This makes tracing very short running programs more reliable. (Sadiq Jaffer, review by KC Sivaramakrishnan)

  • #10964: Ring-buffer based runtime tracing (runtime_events) Runtime_events is a very low overhead runtime tracing system designed for continuous monitoring of OCaml applications. (Sadiq Jaffer, review by Anil Madhavapeddy, Enguerrand Decorne, Richard Warburton, Gabriel Scherer, Sabine Schmaltz, Florian Angeletti, Patrick Ferris, Tom Kelly)

  • (breaking change) #10723: do not use -flat-namespace linking for macOS. (Carlo Cabrera, review by Damien Doligez)

  • (breaking change) #10863, #10933: Remove support for old, unprefixed C runtime function names such as alloc. The new names prefixed with caml_ must be used instead, such as caml_alloc. Consequently, it is no longer needed to define CAML_NAME_SPACE to avoid bringing unprefixed names into scope: this is now the default behavior. (Nicolás Ojeda Bär, review by Xavier Leroy)

  • #10902: Do not register empty code fragments in natdynlink. (David Allsopp, review by Xavier Leroy and Damien Doligez)

  • #10965: caml_fatal_error_hook, GC timing hooks, and caml_scan_roots_hook are now atomic variables. Restore GC timing hooks in multicore. (Guillaume Munch-Maccagnoni, review by Enguerrand Decorne, Xavier Leroy, Gabriel Scherer, and KC Sivaramakrishnan)

  • #11209: Add a public and thread-safe timing hook running at domain termination, after this domain has stopped running any OCaml code: caml_domain_terminated_hook. This can be useful for implementing domain-local state in C. (Guillaume Munch-Maccagnoni, review by Xavier Leroy and Gabriel Scherer)

  • #10875, #11731: Add option to allocate fiber stacks and sigaltstacks with mmap(MAP_STACK) instead of malloc. This is exposed via a configure --enable-mmap-map-stack option, and is enabled by default on OpenBSD where it is mandatory. (Anil Madhavapeddy, review by Gabriel Scherer, Tom Kelly, Michael Hendricks and KC Sivaramakrishnan).

  • #10950: Do not use mmap to allocate Caml_state. In order to reduce virtual memory usage, we dynamically allocate the domain_state structure. (Enguerrand Decorne, KC Sivaramakrishnan and Tom Kelly, review by Anil Madhavapeddy and Gabriel Scherer)

  • #11010: Use strerror_r for reentrant error string conversion. (Anil Madhavapeddy and Xavier Leroy, review by same and Edwin Török)

  • #11002, #11066, #11086: Do not use Begin_roots/End_roots macros in the runtime system. Also fix a missing root registration in the implementation of Unix.write on Windows. (Nicolás Ojeda Bär, Daniel Bünzli and Antonin Décimo, review by Xavier Leroy and David Allsopp)

  • #11022: Track GC work for all managed bigarray allocations (Stephen Dolan, report by Andrew Hunter, review by Damien Doligez)

  • #10802: Use 4.12 value macros and helpers in C code (Antonin Décimo, review by Gabriel Scherer)

  • #11105: Fix handling of fiber stack cache with multiple domains (Jon Ludlam, KC Sivaramakrishnan and Tom Kelly)

  • #11054: Respect user provided maximum stack space Make sure the stack we initially request is sized accordingly to the user provided settings. tmc/stack_space is also updated by this PR in order to account for this change. (Enguerrand Decorne, report by Jon Ludlam, review by Tom Kelly, KC Sivaramakrishnan and Gabriel Scherer)

  • #11238: Increase the default limit for the stack size to 128 Mi words, i.e. 1 Gib for 64-bit platforms and 512 Mib for 32-bit platforms. (Xavier Leroy, review by Sébastien Hinderer)

  • (breaking change) #11295: An ISO C 2011 compliant compiler, including full support for atomic types, is now required to build the OCaml runtime system. (Xavier Leroy, review by David Allsopp and Sébastien Hinderer)
  • #10915, #11039, #11057, #11095, #11190: Implement quality treatment for asynchronous actions in multicore. Reimplement the old behaviour of caml_process_pending* for multicore. (Guillaume Munch-Maccagnoni, review by Sadiq Jaffer and Gabriel Scherer)

  • #11303: Ensure that GC is not invoked from bounds check failures (Stephen Dolan, review by Sadiq Jaffer and Xavier Leroy)

  • #11304: Fix data race on Windows file descriptors (Olivier Nicole and Xavier Leroy, review by Xavier Leroy, David Allsopp, and Sadiq Jaffer)

  • (breaking change) #11337: pass 'flags' metadata to root scanners, to optimize stack scanning in the bytecode interpreter. Changes the interface of user-provided root-scanning hooks. (Gabriel Scherer, review by Xavier Leroy, Guillaume Munch-Maccagnoni, Sadiq Jaffer and Tom Kelly)
  • #11144: Restore frame-pointers support for amd64 (Fabrice Buoro, review by Frederic Bour and KC Sivaramakrishnan)
  • (breaking change) #11255: in the C interface, &Field(v, i) now has type volatile value * instead of value * in OCaml 4. This makes the memory model for mixed OCaml/C code better defined, but can cause warnings or type errors in user C code. (KC Sivaramakrishnan, review by Xavier Leroy, Gabriel Scherer and Guillaume Munch-Maccagnoni, additional discussions with Stephen Dolan and Luc Maranget)
  • #5299, #4787, #11138, #11272, #11506: To help debugging, Caml_state now dynamically checks that the domain lock is held, and fails otherwise (with a fatal error at most entry points of the C API, or systematically in debug mode). A new variable Caml_state_opt is introduced, and is NULL when the domain lock is not held. This allows to test from C code if the current thread holds the lock of its domain. (Guillaume Munch-Maccagnoni, review by Florian Angeletti, Damien Doligez, Sadiq Jaffer, Xavier Leroy, and Gabriel Scherer)

  • #11223: The serialization format of custom blocks changed in 4.08, but the deserializer would still support the pre-4.08 format. OCaml 5.x removed support for this old format; provide a clear error message in this case. (Hugo Heuzard, review by Gabriel Scherer)

  • #11504, #11522: Use static allocation in caml_make_float_vect in no-flat-float-array mode, it's more efficient and avoids a a race condition (Xavier Leroy, report by Guillaume Munch-Maccagnoni, review by David Allsopp)

  • #11652: Fix benign off-by-one error in Windows implementation of caml_mem_map. (David Allsopp, review by Gabriel Scherer)

  • #11669, #11704: Fix construction of Effect.Unhandled exceptions in the bytecode interpreter. (David Allsopp and Xavier Leroy, report by Samuel Hym, review by Xavier Leroy and Gabriel Scherer)

Code generation and optimizations:

  • #10972: ARM64 multicore support: OCaml & C stack separation; dynamic stack size checks; fiber and effects support. (Tom Kelly and Xavier Leroy, review by KC Sivaramakrishnan, Xavier Leroy Guillaume Munch-Maccagnoni, Eduardo Rafael, Stephen Dolan and Gabriel Scherer)
  • (breaking change) #10845 Emit frametable size on amd64 BSD (OpenBSD, FreeBSD, NetBSD) systems (emitted for Linux in #8805) (Hannes Mehnert, review by Nicolás Ojeda Bär)

Standard library:

  • #10742: Use LXM as the pseudo-random number generator for module Random. Add Random.State.split and Random.split to "split" a PRNG off another PRNG. (Xavier Leroy, review by Gabriel Scherer and Hugo Heuzard)
  • (breaking change) #10867, #11345: Remove deprecated values: Array.create, Array.make_float, Array.create_matrix, Bytes.uppercase, Bytes.lowercase, Bytes.capitalize, Bytes.uncapitalize, Char.lowercase, Char.uppercase, Filename.temp_dir_name, Int32.format, Int64.format, Nativeint.format, Format.bprintf, Format.kprintf, Format.set_all_formatter_output_functions, Format.get_all_formatter_output_functions, Format.pp_set_all_formatter_output_functions, Format.pp_get_all_formatter_output_functions, Format.pp_open_tag, Format.pp_close_tag, Format.open_tag, Format.close_tag, Format.formatter_tag_functions, Format.pp_set_formatter_tag_functions, Format.pp_get_formatter_tag_functions, Format.set_formatter_tag_functions, Format.get_formatter_tag_functions, Gc (mutability of the fields of type Gc.control), Lazy.lazy_from_fun, Lazy.lazy_from_val, Lazy.lazy_is_val, Obj.set_tag, Obj.truncate, Obj.final_tag, Obj.extension_constructor, Obj.extension_name, Obj.extension_id, Scanf.stdib, Scanf.fscanf, Scanf.kfscanf, Stdlib.( & ), Stdlib.( or ), String.set, String.copy, String.fill, String.unsafe_set, String.unsafe_fill, String.uppercase, String.lowercase, String.capitalize, String.uncapitalize, Thread.kill, Thread.wait_write, Thread.wait_read, the whole ThreadUnix module, the infix operator (.[]<-). (Nicolás Ojeda Bär, review by Damien Doligez)

  • (breaking change) #10896: Remove Stream, Genlex and Pervasives. Also remove legacy standalone bigarray library (the Bigarray module is now part of the standard library). (Nicolás Ojeda Bär, review by Kate Deplaix and Anil Madhavapeddy)

  • #10921: Use getentropy, when available, to seed the generator during Random.self_init (Michael Hendricks, review by Gabriel Scherer, Xavier Leroy, and Anil Madhavapeddy)
  • (breaking change) #10924: Add deprecated attribute to Printexc.catch, Printf.kprintf and Unix.SO_ERROR. (Nicolás Ojeda Bär, review by Damien Doligez)
  • #10986: Add Scanf.sscanf_opt, Scanf.bscanf_opt and Scanf.scanf_opt. (Nicolás Ojeda Bär, review by Florian Angeletti and Gabriel Scherer)
  • (breaking change) #11157: Rename "hash" in the "Hashtbl.SeededHashedType" signature to "seeded_hash". This allows defining both seeded and unseeded hash functions in the same module. (Nicolás Ojeda Bär, review by Gabriel Scherer and Xavier Leroy)
  • #8878: Add String.hash and String.seeded_hash. (Tom Kelly, review by Alain Frisch and Nicolás Ojeda Bär)

Other libraries:

  • (breaking change) #9071, #9100, #10935: Reimplement Thread.exit() as raising the exception Thread.Exit, and mark Thread.exit as deprecated. The new implementation changes the behavior compared with the OCaml 4 implementation. For example, the new implementation causes Fun.finally finalizers to be run and catch-all exception handlers to prevent termination. (Jacques-Henri Jourdan and Xavier Leroy, review by Damien Doligez, Guillaume Munch-Maccagnoni, Gabriel Scherer, and Enguerrand Decorne)
  • #11034: Dynlink library, add a global lock to make dynlinking thread-safe. (Florian Angeletti, review by Gabriel Scherer)

  • #11087: deprecate Thread.wait_timed_read, Thread.wait_timed_write, Thread.select, Thread.wait_pid. The same functionality is available in the Unix module. (Nicolás Ojeda Bär, review by Anil Madhavapeddy)

  • #11309, #11424, #11427, #11545: Add Domain.recommended_domain_count. (Christiano Haesbaert, Konstantin Belousov, review by David Allsopp, KC Sivaramakrishnan, Gabriel Scherer, Nicolas Ojeda Bar)

  • #11461, #11466: Fix gethostbyaddr for IPv6 arguments and make it domain-safe (Olivier Nicole, Nicolás Ojeda Bär, David Allsopp and Xavier Leroy, review by the same)

  • #11479: Make Unix.symlink domain-safe on Windows (Olivier Nicole, review by Xavier Leroy and David Allsopp)

Tools:

  • (breaking change) #11004: Litmus tests for checking the implementation of the memory model. (Luc Maranget, review by Gabriel Scherer and Xavier Leroy)
  • #11024: Handle alerts in ocamldoc. The alert [@@alert deprecated] is handled specifically and it's no longer needed to duplicate the deprecated annotation (the alert for the compiler and the tag for the documentation). Every other alerts also appear in the documentation. (Jules Aguillon, review by Florian Angeletti)

  • #11065: Port the bytecode debugger to 5.0, adding support for effect handlers. (Damien Doligez and @fabbing, review by @fabbing and Xavier Leroy)

  • #11079: Add the -nobanners option to dumpobj. (Sébastien Hinderer, review by Gabriel Scherer and Vincent Laviron)

  • #11100: Fix ocamltest to make sure failed tests are not counted as "unexpected error". (Damien Doligez, review by Sébastien Hinderer)

  • #11245: Merge the common code of ocamlcp and ocamloptp into a single module. (David Allsopp, review by Sébastien Hinderer)

  • #11382: OCamlmktop use a new initialization module "OCamlmktop_init" to preserve backward-compatibility with user-module provided modules that install toplevel printers. (Florian Angeletti, review by Gabriel Scherer and David Allsopp)

Manual and documentation:

  • #11058: runtime/HACKING.adoc tips on debugging the runtime (Gabriel Scherer, review by Enguerrand Decorne and Nicolás Ojeda Bär)

  • #11093: Add an effect handlers tutorial (KC Sivaramakrishnan, review by François Pottier, Gabriel Scherer, François Bobot and Wiktor Kuchta)

  • #11192: Better documentation for condition variables. (François Pottier, review by Luc Maranget, Xavier Leroy, and Wiktor Kuchta)

  • #11093: Add tutorials on parallelism features and the relaxed memory model (KC Sivaramakrishnan, review by Damien Doligez, Anil Madhavapeddy, Gabriel Scherer, Thomas Leonard, Tom Ridge, Xavier Leroy, Luc Maranget, Fabrice Buoro, Olivier Nicole, Guillaume Munch-Maccagnoni, Jacques-Henri Jourdan)

  • #11640: Add Flambda commonly-used options to the ocamlopt manpage (Amandine Nangah, review by David Allsopp, Florian Angeletti, Sébastien Hinderer, and Vincent Laviron)

  • #11676: Fix missing since annotation in the Sys and Format modules (Github user Bukolab99, review by Florian Angeletti)

  • #11813: Make new multicore chapters easier to discover, and emphasize impact on C bindings. (Edwin Török, review by KC Sivaramakrishnan, and Florian Angeletti)

Compiler user-interface and warnings:

  • #9140, #11131: New command-line flag -nocwd to not include implicit the current directory to the load path. (Thomas Roglin, review by Gabriel Scherer and Nicolás Ojeda Bär)

  • #11089: Add 'since ' information to compiler warnings. (André Maroneze, review by Florian Angeletti and Gabriel Scherer)

  • #10909: Disable warning 59 (assignment to immutable blocks) unless flambda invariant checks are enabled. (Vincent Laviron, review by Gabriel Scherer)

  • #10981, #11276: Implement a -cmi-file option for ocamlc and ocamlopt. (Sébastien Hinderer, review by Damien Doligez, Daniel Bünzli and Florian Angeletti)

  • (breaking change) #11049: Stop padding 1-digit compiler minor version numbers. (So for instance OCaml 5.0 rather than 5.00) (Sébastien Hinderer, review by David Allsopp, Florian Angeletti and Xavier Leroy)
  • #11184, #11670: Stop calling ranlib on created / installed libraries (Sébastien Hinderer and Xavier Leroy, review by the same)

  • #11253: Deprecate ocaml script and ocamlnat script where script has no extension and is an implicit basename. (David Allsopp, review by Florian Angeletti and Sébastien Hinderer)

Internal/compiler-libs changes:

  • #10878, #10909: restore flambda after the Multicore merge. (Vincent Laviron, review by Gabriel Scherer and Xavier Leroy)

  • #10864, #10888: restore afl-fuzz mode for sequential programs. (Jan Midtgaard, review by Xavier Leroy and Gabriel Scherer)

  • #11008, #11047: rework GC statistics in the Multicore runtime (Gabriel Scherer, review by Enguerrand Decorne)

  • #11058: basic debugging documentation in runtime/HACKING.adoc (Gabriel Scherer, review by Enguerrand Decorne and Nicolás Ojeda Bär)

  • #11199: Stop installing topdirs.cmi twice. The toplevel now reads topdirs.cmi from +compiler-libs, as the debugger does. (David Allsopp, review by Sébastien Hinderer)

  • #11007, #11399: META files for the stdlib, compiler-libs and other libraries (unix, dynlink, str, runtime_events, threads, ocamldoc) are now installed along with the compiler. (David Allsopp, Florian Angeletti, Nicolás Ojeda Bär and Sébastien Hinderer, review by Daniel Bünzli, Kate Deplaix, Anil Madhavapeddy and Gabriel Scherer)

Build system:

  • (breaking change) #10893: Remove configuration options --disable-force-safe-string and DEFAULT_STRING=unsafe as well as --enable-force-safe-string and DEFAULT_STRING=safe which are now the default unconditionally. (Kate Deplaix, review by Gabriel Scherer and David Allsopp)
  • #11092: Build native-code compilers on OpenBSD/aarch64. (Christopher Zimmermann, review by Anil Madhavapeddy)

  • #11126: Build system: make it possible to choose which ocamldep (and flags) to use when computing dependencies for the compiler. Add a -no-slash option to ocamldep to let users override -slash. (Sébastien Hinderer, review by David Allsopp)

  • #11147: Factorize the stdlib-related compilation flags. Make it possible to control them consistently through the STDLIBFLAGS build variable. Make sure ocamldoc and ocamllex get compiled and linked with debugging information (-g). (Sébastien Hinderer, review by Gabriel Scherer)

  • #11149: Make the bootstrap process reproducible on systems with non-big-endian floating point. If the boot/ artefacts are up-to-date, this means that running make bootstrap on any platform should not change the images in boot/ and paves the way for automated testing that the bootstrap is repeatable. (David Allsopp, review by Damien Doligez and Sébastien Hinderer)

  • #11160: otherlibs: merge win32unix into unix. (Sébastien Hinderer, review by David Allsopp, Nicolás Ojeda Bär, Xavier Leroy, Vincent Laviron and Antonin Décimo)

  • (breaking change) #11198, #11298: Install the Dynlink, Str and Unix libraries to individual subdirectories of LIBDIR. The compiler, debugger and toplevel automatically add -I +lib if required, but display an alert. (David Allsopp, review by Florian Angeletti, Nicolás Ojeda Bär, Valentin Gatien-Baron and Sébastien Hinderer)
  • #11200: Install ocamlprof's Profiling runtime module to a +profiling, removing it from the default namespace. (David Allsopp, review by Sébastien Hinderer)

  • #11294: Switch minimum required autoconf to 2.71. (David Allsopp, review by Xavier Leroy)

  • #11370, #11373: Don't pass CFLAGS to flexlink during configure. (David Allsopp, report by William Hu, review by Xavier Leroy and Sébastien Hinderer)

  • #11487: Thwart FMA test optimization during configure (William Hu, review by David Allsopp and Sébastien Hinderer)

  • #11097: Build native-code compilers on NetBSD/aarch64 (Kate Deplaix, review by Anil Madhavapeddy)

Bug fixes:

  • #10768, #11340: Fix typechecking regression when combining first class modules and GADTs. (Jacques Garrigue, report by François Thiré, review by Matthew Ryan)

  • #10790: don't drop variance and injectivity annotations when pretty printing with constraints (for example, with type +!'a t = ...). (Florian Angeletti, report by Luke Maurer, review by Matthew Ryan and Gabriel Scherer)

  • #11167: Fix memory leak from signal stack. (Antoni Żewierżejew, review by Gabriel Scherer and Enguerrand Decorne)

  • #11112: harden -use-runtime against spaces or quotes in the provided path (Gabriel Scherer, report by Brahima Dibassi, review by David Allsopp)

  • #11068, #11070: Fix typo in function name given in Unix_error exception for Unix.readlink on Windows. (David Allsopp, report by Xia Li-yao)

  • #10807: Don't duplicate standard handles in the child process spawned by win32unix Unix.create_process if the handles were already inheritable. Fix broken signalling of EOF on standard handles if they were already inheritable. (Antonin Décimo, review by Xavier Leroy and Nicolás Ojeda Bär)

  • #10868: Fix off-by-1 bug when initializing frame hashtables (Jonah Beckford, review by Tom Kelly, Nicolás Ojeda Bär and KC Sivaramakrishnan)

  • #11077: Make dumpobj compatible with absence of naked pointer support (Olivier Nicole and Jan Midtgaard, review by Gabriel Scherer)

  • #11111: fix fork() usage in ocamltest C code. When calling fork() from C code with the Multicore runtime active, one needs to call caml_atfork_hook() on the forked child before it can use the OCaml runtime. (Gabriel Scherer, review by Xavier Leroy, report by Brahima Dibassi)

  • #10809: Use the WSA_FLAG_NO_HANDLE_INHERIT on Windows when creating sockets with WSASocket if the cloexec (non-inheritable) parameter is true. Fixes a race condition where a child process could inherit the socket and deadlock the parent. (Antonin Décimo, review by Xavier Leroy)

  • #11194, #11609: Fix inconsistent type variable names in "unbound type var" messages (Ulysse Gérard and Florian Angeletti, review Florian Angeletti and Gabriel Scherer)

  • #11204: Fix regression introduced in 4.14.0 that would trigger Warning 17 when calling virtual methods introduced by constraining the self type from within the class definition. (Nicolás Ojeda Bär, review by Leo White)

  • #11263, #11267: caml/misc.h: check whether _MSC_VER is defined before using it to ensure that the headers can always be used in code which turns on -Wundef (or equivalent). (David Allsopp and Nicolás Ojeda Bär, review by Nicolás Ojeda Bär and Sébastien Hinderer)

  • #11289, #11405: fix some leaks on systhread termination (Fabrice Buoro, Enguerrand Decorne, Gabriel Scherer, review by Xavier Leroy and Florian Angeletti, report by Romain Beauxis)

  • #11314, #11416: fix non-informative error message for module inclusion (Florian Angeletti, report by Thierry Martinez, review by Gabriel Scherer)

  • #11358, #11379: Refactor the initialization of bytecode threading, This avoids a "dangling pointer" warning of GCC 12.1. (Xavier Leroy, report by Armaël Guéneau, review by Gabriel Scherer)

  • #11387, module type with constraints no longer crash the compiler in presence of both shadowing warnings and the -bin-annot compiler flag. (Florian Angeletti, report by Christophe Raffalli, review by Gabriel Scherer)

  • #11392, #11392: assertion failure with -rectypes and external definitions (Gabriel Scherer, review by Florian Angeletti, report by Dmitrii Kosarev)

  • #11417: Fix regression allowing virtual methods in non-virtual classes. (Leo White, review by Florian Angeletti)

  • #11468: Fix regression from #10186 (OCaml 4.13) detecting IPv6 on Windows for mingw-w64 i686 port. (David Allsopp, review by Xavier Leroy and Sébastien Hinderer)

  • #11482, #11542: Fix random crash in large closure allocation (Damien Doligez, report by Thierry Martinez and Vincent Laviron, review by Xavier Leroy)

  • #11508, #11509: make Bytes.escaped domain-safe (Christiano Haesbaert and Gabriel Scherer, review by Xavier Leroy, report by Jan Midtgaard and Tom Kelly)

  • #11516, #11524: Fix the deprecated_mutable attribute. (Chris Casinghino, review by Nicolás Ojeda Bär and Florian Angeletti)

  • #11576: Fix bug in Bigarray.Genarray.init in the the case of zero-dimensional arrays. (Nicolás Ojeda Bär, Jeremy Yallop, report by Masayuki Takeda, review by Jeremy Yallop and Florian Angeletti)

  • #11587: Prevent integer comparison from being used on pointers (Vincent Laviron, review by Gabriel Scherer)

  • #11622: Prevent stack overflow when printing a constructor or record mismatch error involving recursive types. (Florian Angeletti, review by Gabriel Scherer)

  • #11662, #11673: fix a memory leak when using Dynlink, the bug was only present in development version of OCaml 5. (Stephen Dolan, report by Andre Maroneze, review by Gabriel Scherer)

  • #11732: Ensure that types from packed modules are always generalised (Stephen Dolan and Leo White, review by Jacques Garrigue)

  • #11737: Fix segfault condition in Unix.stat under Windows in the presence of multiple threads. (Marc Lasson, Nicolás Ojeda Bär, review by Gabriel Scherer and David Allsopp)

  • #11776: Extend environment with functor parameters in strengthen_lazy. (Chris Casinghino and Luke Maurer, review by Gabriel Scherer)

  • #11533, #11534: follow synonyms again in #show_module_type (this had stopped working in 4.14.0) (Gabriel Scherer, review by Jacques Garrigue, report by Yaron Minsky)

opam 2.1.4

Feedback on this post is welcomed on Discuss!

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

This opam release consists of backported fixes:

  • Make opam able to fully build with OCaml 5.0. dose3 >= 6.1 and base64 >= 3.1.0 are now required (#5357)
  • Fix a bug where opam would not output any explanation when a conflict arises when attempting to install a package (#5378)

Opam installation instructions (unchanged):

  1. From binaries: run

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

    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.

Opam-publish 2.2.0

We are pleased to announce the minor release of opam-publish 2.2.0.

This opam-publish release consists of the following breaking change:

  • Shorten the generated branch name. This is breaking change for people who want to force-push changes on an already opened PR using a previous version of opam-publish as the branch name might not be the same (#141)

and the following fixes:

  • Fix the github markdown syntax generated by opam-publish (#131)
  • Disambiguate GitHub archive URL computed from repository and tag (#135)
  • Upgrade to cmdliner >= 1.1.0 (#134)
  • Support git remotes with multiple push targets (#137)
  • Fix broken state if the initial opam-repository clone fails (#140)

Merlin 4.7.1

See full changelog

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

Odoc 2.2.0

See full changelog

Additions

  • New unstable option --as-json for the HTML renderer that emits HTML fragments (preamble, content) together with metadata (table of contents, breadcrumbs, whether katex is used) in JSON format. (@sabine, #908)
  • New maths support via {m ... } and {math ... } tags. (@giltho, @gpetiot, #886)
  • Various optimisations (@jonludlam, #870, #883)
  • Better handling of alerts and deprecation notices. (@panglesd, #828)
  • Handle language tags on code blocks (@julow, #848)

Bugfixes

  • Shadowing issues (@jonludlam, #853)
  • Layout fixes and improvements (@panglesd, #832, #839, #847)
  • Handle comments on class constraints and inherit (@julow, #844)
  • Disable the missing root warning (@jonludlam, #881)

OCaml 4.14.1 - Release candidate

The release of OCaml version 4.14.1 is imminent.

This companion release to the OCaml 5.0.0 release will backport many safe bug fixes from the currently experimental 5.0 branch to the stable 4.14 branch. A full list of bug fixes is available below.

In order to ensure that the future release works as expected, we are testing a release candidate during the upcoming weeks.

If you find any bugs, please report them here on GitHub.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands on opam 2.1:

opam update
opam switch create 4.14.1~rc1

For previous version of opam, the switch creation command line is slightly more verbose:

opam update
opam switch create 4.14.1~rc1 --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

It might be also interesting to check the new support for parallelism by installing the domainslib library with

opam install domainslib

The source code for the release candidate is available on

Fine-Tuned Compiler Configuration

If you want to tweak the configuration of the compiler, you can switch to the option variant with:

opam update
opam switch create <switch_name> ocaml-variants.4.14.1~rc1+options <option_list>

where <option_list> is a comma-separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 4.14.1~rc1+flambda+nffa ocaml-variants.4.14.1~rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array

The command line above is slightly more complicated for opam versions before 2.1:

opam update
opam switch create <switch_name> --packages=ocaml-variants.4.14.1~rc1+options,<option_list> --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

In both cases, all available options can be listed with opam search ocaml-option.

See full changelog

Changes Since OCaml 4.14.0

Compiler User-Interface and Warnings:

  • #11184, #11670: Stop calling ranlib on created / installed libraries (Sébastien Hinderer and Xavier Leroy, review by the same)

Build System:

  • #11370, #11373: Don't pass CFLAGS to flexlink during configure. (David Allsopp, report by William Hu, review by Xavier Leroy and Sébastien Hinderer)

  • #11487: Thwart FMA test optimisation during configure (William Hu, review by David Allsopp and Sébastien Hinderer)

Bug Fixes:

  • #10768, #11340: Fix typechecking regression when combining first class modules and GADTs. (Jacques Garrigue, report by François Thiré, review by Matthew Ryan)

  • #11204: Fix regression introduced in 4.14.0 that would trigger Warning 17 when calling virtual methods introduced by constraining the self type from within the class definition. (Nicolás Ojeda Bär, review by Leo White)

  • #11263, #11267: caml/{memory,misc}.h: check whether _MSC_VER is defined before using it to ensure that the headers can always be used in code which turns on -Wundef (or equivalent). (David Allsopp and Nicolás Ojeda Bär, review by Nicolás Ojeda Bär and Sébastien Hinderer)

  • #11314, #11416: fix non-informative error message for module inclusion (Florian Angeletti, report by Thierry Martinez, review by Gabriel Scherer)

  • #11358, #11379: Refactor the initialisation of bytecode threading, This avoids a "dangling pointer" warning of GCC 12.1. (Xavier Leroy, report by Armaël Guéneau, review by Gabriel Scherer)

  • #11387, module type with constraints no longer crash the compiler in presence of both shadowing warnings and the -bin-annot compiler flag. (Florian Angeletti, report by Christophe Raffalli, review by Gabriel Scherer)

  • #11392, #11392: assertion failure with -rectypes and external definitions (Gabriel Scherer, review by Florian Angeletti, report by Dmitrii Kosarev)

  • #11417: Fix regression allowing virtual methods in non-virtual classes. (Leo White, review by Florian Angeletti)

  • #11468: Fix regression from #10186 (OCaml 4.13) detecting IPv6 on Windows for mingw-w64 i686 port. (David Allsopp, review by Xavier Leroy and Sébastien Hinderer)

  • #11489, #11496: More prudent deallocation of alternate signal stack (Xavier Leroy, report by @rajdakin, review by Florian Angeletti)

  • #11516, #11524: Fix the deprecated_mutable attribute. (Chris Casinghino, review by Nicolás Ojeda Bär and Florian Angeletti)

  • #11194, #11609: Fix inconsistent type variable names in "unbound type var" messages (Ulysse Gérard and Florian Angeletti, review Florian Angeletti and Gabriel Scherer)

  • #11622: Prevent stack overflow when printing a constructor or record mismatch error involving recursive types. (Florian Angeletti, review by Gabriel Scherer)

  • #11732: Ensure that types from packed modules are always generalised (Stephen Dolan and Leo White, review by Jacques Garrigue)

  • #11737: Fix segfault condition in Unix.stat under Windows in the presence of multiple threads. (Marc Lasson, Nicolás Ojeda Bär, review by Gabriel Scherer and David Allsopp)

  • #11776: Extend environment with functor parameters in strengthen_lazy. (Chris Casinghino and Luke Maurer, review by Gabriel Scherer)

  • #11533, #11534: follow synonyms again in #show_module_type (this had stopped working in 4.14.0) (Gabriel Scherer, review by Jacques Garrigue, report by Yaron Minsky)

  • #11768, #11788: Fix crash at start-up of bytecode programs in no-naked-pointers mode caused by wrong initialisation of caml_global_data (Xavier Leroy, report by Etienne Millon, review by Gabriel Scherer)

OCaml 5.0.0 - First release candidate

The release of OCaml version 5.0.0 is imminent. As a final step before the release, we are publishing a release candidate that you can test while waiting for the release in the upcoming weeks.

If you find any bugs, please report them on OCaml's issue tracker.

Compared to the second beta release, this release contains one toplevel bug fix and a minor type system fix.

If you are interested by the bug fixes beyond the new Multicore runtime, the full change log for OCaml 5.0.0 is available on GitHub

A short summary of the changes since the second beta release is also available below.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands on opam 2.1:

opam update
opam switch create 5.0.0~rc1

For previous version of opam, the switch creation command line is slightly more verbose:

opam update
opam switch create 5.0.0~rc1 --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

It might be also interesting to check the new support for parallelism by installing the domainslib library with

opam install domainslib

The source code for the release candidate is also directly available on:

Fine-Tuned Compiler Configuration

If you want to tweak the configuration of the compiler, you can switch to the option variant with:

opam update
opam switch create <switch_name> ocaml-variants.5.0.0~rc1+options <option_list>

where <option_list> is a comma-separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 5.0.0~rc1+flambda+nffa ocaml-variants.5.0.0~rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array

The command line above is slightly more complicated for opam versions before 2.1:

opam update
opam switch create <switch_name> --packages=ocaml-variants.5.0.0~rc1+options,<option_list> --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

In both cases, all available options can be listed with opam search ocaml-option.

See full changelog

Changes Since the Second Beta Release

Bug Fixes

  • #11776: Extend environment with functor parameters in strengthen_lazy. (Chris Casinghino and Luke Maurer, review by Gabriel Scherer)

  • #11533, #11534: follow synonyms again in #show_module_type (this had stopped working in 4.14.0) (Gabriel Scherer, review by Jacques Garrigue, report by Yaron Minsky)

OCaml 5.0.0 - Second Beta

The release of OCaml 5.0.0 is drawing close.

In order to test the most recent bug fixes and to help you update your software and libraries ahead of the release, we have released a second beta version of OCaml 5.0.0, (see below for the installation instructions).

If you find any bugs, please report them on OCaml's issue tracker.

Compared to the first beta release, this second beta contains many small internal standard library fixes, one configuration fix and many small bug fixes.

We also have few updates of the documentation, which introduce two new alerts: one for the unstable modules Domain and Effect, and another for functions doing unsynchronized_access to mutable state in the standard library. Those two alerts are disabled by default, but are available for interested users.

The first release candidate for OCaml 5.0.0 is expected to follow closely this second beta release.

If you are interested in the ongoing list of bug fixes, the updated change log for OCaml 5.0.0 is available on GitHub.

You can also follow the state of the opam ecosystem on http://check.ocamllabs.io/.

A short summary of the changes since the first beta release is also available below.


Installation Instructions

The base compiler can be installed as an opam switch with the following commands on opam 2.1:

opam update
opam switch create 5.0.0~beta2

For previous versions of opam, the switch creation command line is slightly more verbose:

opam update
opam switch create 5.0.0~beta2 --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

It might also be interesting to check the new support for parallelism by installing the domainslib library with

opam install domainslib

The source code for the beta release is also available at these addresses:

Fine-Tuned Compiler Configuration

If you want to tweak the configuration of the compiler, you can switch to the option variant with:

opam update
opam switch create <switch_name> ocaml-variants.5.0.0~beta2+options <option_list>

where option_list is a comma-separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 5.0.0~beta2+flambda+nffa ocaml-variants.5.0.0~beta2+options ocaml-option-flambda ocaml-option-no-flat-float-array

The command line above is slightly more complicated for opam versions before 2.1:

opam update
opam switch create <switch_name> --packages=ocaml-variants.5.0.0~beta2+options,<option_list> --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

In both cases, all available options can be listed with opam search ocaml-option.

See full changelog

Changes since the first beta

Configuration changes

  • #11097: Build native-code compilers on NetBSD/aarch64 (Kate Deplaix, review by Anil Madhavapeddy)

Bug fixes

  • #10875, +#11731: Add option to allocate fiber stacks and sigaltstacks with mmap(MAP_STACK) instead of malloc. This is exposed via a configure –enable-mmap-map-stack option, and is enabled by default on OpenBSD where it is mandatory. (Anil Madhavapeddy, review by Gabriel Scherer, Tom Kelly, Michael Hendricks and KC Sivaramakrishnan).
  • #11652: Fix benign off-by-one error in Windows implementation of caml_mem_map. (David Allsopp, review by Gabriel Scherer)
  • #11669, #11704: Fix construction of Effect.Unhandled exceptions in the bytecode interpreter. (David Allsopp and Xavier Leroy, report by Samuel Hym, review by Xavier Leroy and Gabriel Scherer)
  • #11184, +#11670: Stop calling ranlib on created / installed libraries (Sébastien Hinderer and Xavier Leroy, review by the same)
  • #11194, #11609: Fix inconsistent type variable names in “unbound type var” messages (Ulysse Gérard and Florian Angeletti, review Florian Angeletti and Gabriel Scherer)
  • #11622: Prevent stack overflow when printing a constructor or record mismatch error involving recursive types. (Florian Angeletti, review by Gabriel Scherer)
  • #11662, #11673: fix a memory leak when using Dynlink, the bug was only present in development version of OCaml 5. (Stephen Dolan, report by Andre Maroneze, review by Gabriel Scherer)
  • #11732: Ensure that types from packed modules are always generalised (Stephen Dolan and Leo White, review by Jacques Garrigue)
  • #11737: Fix segfault condition in Unix.stat under Windows in the presence of multiple threads. (Marc Lasson, Nicolás Ojeda Bär, review by Gabriel Scherer and David Allsopp)

Documentation

  • #11193, #11227: documentation on concurrency safety for mutable data types and states in the standard library. A unsynchronized_access alert have been added for functions that require user synchronizations on concurrent access. The new alert is diabled by default. (Florian Angeletti, review by François Pottier and KC Sivaramakrishnan )
  • #11526, add a unstable alert to the Domain and Effect modules. The new alert is disabled by default. (Florian Angeletti, review by Nicolás Ojeda Bär, Daniel Bünzli, and Kate Deplaix)
  • #11640: Add Flambda commonly-used options to the ocamlopt manpage (Amandine Nangah, review by David Allsopp, Florian Angeletti, Sébastien Hinderer, and Vincent Laviron)

Merlin 4.7

See full changelog
  • merlin binary
    • Replace custom "holes" AST nodes by extensions. This restores binary compatibility and fixes issues with PPXs when using typed-holes. (#1503)
    • Do not change temporarily Merlin's cwd when starting a PPX (#1521, fixes #1420)
    • Fix a parsing issue when declaring the (??) custom prefix operator. (#1507, fixes #1506)
    • Fix variant constructors' comments grouping (#1516, @mheiber, fixes #1513)
    • Filter-out duplicates from the enclosing command result (#1512)
    • Add a new verbosity=smart mode for type enclosing that only expand modules' types (#1374, @ulugbekna)
    • Improve locate for labels' declarations in the current buffer. (#1505, fixes #1524)
    • Fix locate on module without implementation (#1522, fixes #1519)
    • Allow program name customization when merlin is used as a library. (#1532)
  • editor modes
    • vim: load the plugin when necessary if it wasn't loaded before (#1511)
    • emacs: xref works from context menus; better highlighting of xref matches; xref recognises operators and binding operators at the cursor position; bad locations are filtered out (#1385, fixes #1410)
    • emacs: update CI for newer releases and fix some warnings (#1454, @mattiase)
  • test suite
    • Add tests for constructors' documentation (#1511)
    • Add test cases for label comment documentation (#1526, @mheiber)
    • Add a test for the enclosing command (#1512)
    • Add tests for interactions between locate and record labels (#1505)
    • Add test showing an issue with locate and implicit transitive deps

Dune 3.6.1

See full changelog
  • Fix status line enabled when ANSI colors are forced. (#6503, @MisterDA)

  • Fix build with MSVC compiler (#6517, @nojb)

  • Do not shadow library interface modules (#6549, fixes #6545, @rgrinberg)

Dune 3.6.0

Dear dune users, It is my pleasure to announce that dune 3.6.0 is now available on opam 🎉. Here's the changelog - I reused the same classification as in the previous announce for dune 3.5.0. Thanks again to all the contributors including bug reporters.

See full changelog

dune executable

This lists features of the “dune” executable itself. Upgrading dune will bring in these changes. We consider these changes safe, but it is difficult to define what a breaking change is for a command-line tool (for example, some error messages change). It is important to note that just upgrading the dune executable is not supposed to change how dune interprets existing projects. If just upgrading dune breaks compilation, it is a bug in dune, please report it!

Added

  • Introduce a $ dune ocaml top-module subcommand to load modules directly without sealing them behind the signature. (#5940, @rgrinberg)
  • Revive $ dune external-lib-deps under $ dune describe external-lib-deps. (#6045, @moyodiallo)
  • Extend the promotion CLI to a dune promotion group: dune promote is moved to dune promotion apply (the former still works) and the new dune promotion diff command can be used to just display the promotion without applying it. (#6160, fixes #5368, @emillon)
  • Build progress status now shows number of failed jobs (#6242, @Alizter)
  • Allow promoting into source directories specified by subdir (#6404, fixes #3502, @rgrinberg)
  • Support CLICOLOR and CLICOLOR_FORCE to enable/disable/force ANSI colors. (#6340, fixes #6323, @MisterDA).
  • Create a fake socket file _build/.rpc/dune on windows to allow rpc clients to connect using the build directory. (#6329, @rgrinberg)

Fixed

  • Forbid multiple instances of dune running concurrently in the same workspace. (#6360, fixes #236, @rgrinberg)
  • Make dune describe workspace return the correct root path (#6380, fixes #6379, @esope)
  • Fix running inline tests in bytecode mode (#5622, fixes #5515, @dariusf)

(lang dune 3.6)

This lists changes if you opt into the new (lang dune 3.6) version in your dune-project file. For this too, these are changes that we consider safe, but they can require changes to your dune files. For example, sandboxing is enabled in more places, which means that you might have to be more precise in expressing your dependencies. Please reach out on the issue tracker if you have trouble fixing your dune file or if something does not seem to be possible anymore.

Added

  • Add (glob_files <glob>) and (glob_files_rec <glob>) terms to the files field of the install stanza (#6250, closes #6018, @gridbugs)
  • Allow Byte_complete binaries to be installable (#4837, @AltGr, @rgrinberg)
  • Allow :standard in the (modules) field of the coq.pp stanza (#6229, fixes #2414, @Alizter)

Fixed

  • Allow absolute build directories to find public executables. For example, those specified with (deps %{bin:...}) (#6326, @anmonteiro)
  • [ctypes] do not mangle user written names in the ctypes stanza (#6374, fixes #5561, @rgrinberg)
  • Forbid private libraries with (package ..) set from depending on private libraries that don't belong to a package (#6385, fixes #6153, @rgrinberg)
  • [ctypes] always re-run pkg-config because we aren't tracking its external dependencies (#6052, @rgrinberg)
  • [ctypes] remove dependency on configurator in the generated rules (#6052, @rgrinberg)
  • Fix passing of flags to dune coq top (#6369, fixes #6366, @Alizter)
  • Prevent crash if absolute paths are used in the install stanza and in recursive globs. These cases now result in a user error. (#6331, @gridbugs)

Ocaml-lsp 1.14.2

See full changelog

Fixes

  • Fix random requests failing after switching documents (#904, fixes #898)

  • Do not offer related diagnostic information unless the user enables in client capabilities (#905)

  • Do not offer diagnostic tags unless the client supports them (#909)

  • Do not attach extra data to diagnostics unless the client supports this (#910)

  • Use /bin/sh instead of /bin/bash. This fixes ocamllsp on NixOS

Ocaml-lsp 1.14.1

See full changelog

Fixes

  • Fix various server crashes when opening non OCaml/Reason files. Files such as dune, cram, etc. would cause the server to crash. (#884, fixes #871)

  • Ignore unknown tags in merlin configuration to improve forward compatibility with Dune. (#883)

Dune 3.5.0

I'd like to announce the release of dune 3.5.0 on opam. This release is packed with fixes and new features, that are described below with a description of what this means for project maintainers.

See full changelog

dune executable

This lists features of the "dune" executable itself. Upgrading dune will bring in these changes. We consider these changes safe, but it is difficult to define what a breaking change is for a command-line tool (for example, some error messages change). It is important to note that just upgrading the dune executable is not supposed to change how dune interprets existing projects. If just upgrading dune breaks compilation, it is a bug in dune, please report it!

Added

  • Allow dune describe workspace to accept directories as arguments. The provided directories restrict the worskpace description to those directories. (#6107, fixes #3893, @esope)
  • Add a terminal persistence mode that attempts to clear the terminal history. It is enabled by setting terminal persistence to clear-on-rebuild-and-flush-history (#6065, @rgrinberg)

Fixed

  • Fix build-info version when used with flambda (#6089, fixes #6075, @jberdine)
  • Fix compilation of Dune under esy on Windows (#6109, fixes #6098, @nojb)
  • Improve error message when parsing several licenses in (license) (#6114, fixes #6103, @emillon)
  • Handle CSI n K code in ANSI escape codes from commands. (#6214, fixes #5528, @emillon)
  • Do not ignore rules marked (promote (until-clean)) when --ignore-promoted-rules (or -p) is passed. (#6010, fixes #4401, @emillon)

Changed

  • dune install: copy files in an atomic way (#6150, @emillon)
  • update vendored copy of cmdliner to 1.1.1. This improves the built-in documentation for command groups such as dune ocaml. (#6038, @emillon, #6169, @shonfeder)
  • Extend dune describe to include the root path of the workspace and the relative path to the build directory. (#6136, @reubenrowe)

macOS support

This is technically a subset of above section. For M1 mac users, dune 3.5.0 is the first version which will correctly support dune-build-info.

Added

  • on macOS, sign executables produced by artifact substitution (#6137, #6231, fixes #5650, fixes #6226, @emillon)
  • Enable file watching on MacOS SDK < 10.13. (#6218, @rgrinberg)

Fixed

  • macOS: Handle unknown fsevents without crashing (#6217, @rgrinberg)

(lang dune 3.5)

This lists changes if you opt into the new (lang dune 3.5) version in your dune-project file. For this too, these are changes that we consider safe, but they can require changes to your dune files. For example, sandboxing is enabled in more places, which means that you might have to be more precise in expressing your dependencies. Please reach out on the issue tracker if you have trouble fixing your dune file or if something does not seem to be possible anymore.

Added

  • Add a runtime_deps field in the cinaps stanza to specify runtime dependencies for running the cinaps preprocessing action (#6175, @rgrinberg)
  • Allow rules producing directory targets to be not sandboxed (#6056, @rgrinberg)
  • Introduce a dirs field in the install stanza to install entire directories (#5097, fixes #5059, @rgrinberg)
  • Add an (include <file>) term to the include_dirs field for adding directories to the include paths sourced from a file. (#6058, fixes #3993, @gridbugs)
  • Support (extra_objects ...) field in (executable ...) and (library ...) stanzas (#6084, fixes #4129, @gridbugs)
  • Allow rules producing directory targets to create symlinks (#6077, fixes #5945, @rgrinberg)
  • Added an (aliases ...) field to the (rules ...) stanza which allows the specification of multiple aliases per rule (#6194, @Alizter)
  • Allow include statement in install stanza (#6139, fixes #256, @gridbugs)
  • Add a new experimental feature mode_specific_stubs that allows the specification of different flags and sources for foreign stubs depending on the build mode (#5649, @voodoos)

Changed

  • Sandbox running cinaps actions starting from cinaps 1.1 (#6176, @rgrinberg)
  • Cinaps actions are now sandboxed by default (#6062, @rgrinberg)
  • Menhir rules are now sandboxed by default (#6076, @rgrinberg)
  • Inline tests are now sandboxed by default (#6079, @rgrinberg)

Fixed

  • Shadow alias module Foo__ when building a library Foo (#6126, @rgrinberg)
  • Disallow generating targets in sub direcories in inferred rules. The check to forbid this was accidentally done only for manually specified targets (#6031, @rgrinberg)
  • odoc rules now about ODOC_SYNTAX and will rerun accordingly (#6010, fixes #1117, @emillon)

Coq support

These changes, associated with (lang dune 3.5), are specific to coq.

Added

  • Add %{coq:...} macro for accessing data about the configuration about Coq. For instance %{coq:version} (#6049, @Alizter)
  • Starting with Coq build language 0.6, theories can be built without importing Coq's standard library by including (stdlib no). (#6165 #6164, fixes #6163, @ejgallego @Alizter @LasseBlaauwbroek)

Changed

  • Dune no longer considers .aux files as targets during Coq compilation. This means that .aux files are no longer cached. (#6024, fixes #6004, @alizter)
  • The test suite for Coq now requires Coq >= 8.16 due to changes in the plugin loading mechanism upstream (which now uses Findlib).
  • The (coq.theory ...) stanza will now ensure that for each declared (plugin ...), the META file for it is built before calling coqdep. This enables the use of the new Findlib-based loading method in Coq 8.16; however as of Coq 8.16.0, Coq itself has some bugs preventing this to work yet. (#6167 , workarounds #5767, @ejgallego)

Ocaml-lsp 1.14.0

On behalf of the ocamllsp team, I'm pleased to announce version 1.14.0. This release contains a new code action to help you inline definitions thanks to @jfeser. We look forward to your feedback.

See full changelog

Features

  • Code action for inlining let bindings within a module or expression. (#847)

  • Tag "unused code" and "deprecated" warnings, allowing clients to better display them. (#848)

  • Refresh merlin configuration after every dune build in watch mode (#853)

Fixes

  • Respect showDocument capabilities. Do not offer commands or code actions that rely on this request without client support. (#836)

  • Fix signatureHelp on .mll files: avoid "Document.dune" exceptions

OCaml 5.0.0 - First Beta

The release of OCaml 5.0.0 is drawing near. The standard library has been stabilized and many opam packages already work with this release. After two alpha releases, we have released the first beta version to help you update your software and libraries ahead of the release (see below for the installation instructions).

If you find any bugs, please report them on GitHub issues.

Compared to the last alpha release, this beta contains many small, internal runtime fixes (in particular in the systhreads library).

At the user level, the interface of the Domain and Effect module has been tweaked to be (hopefully) more forward-compatible:

  • Exceptions related to effects are now defined in the Effecŧ module.
  • The value Domain.recommended_domain_count is no longer a constant and the function Domain.at_each_spawn has been removed.

With those changes, the standard library should be stable now.

If you are interested in the ongoing list of bug fixes, the updated change log for OCaml 5.0.0 is available on GitHub.

You can also follow the state of the opam ecosystem on this opam-repository issues, and at check.ocamllabs.io

A short summary of the changes since the last alpha release is also available below.

Installation Instructions

The base compiler can be installed as an opam switch with the following commands on opam 2.1:

opam update
opam switch create 5.0.0~beta1

For previous versions of opam, the switch creation command line is slightly more verbose:

opam update
opam switch create 5.0.0~beta1 --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

It might also be interesting to check the new support for parallelism by installing the domainslib library with

opam install domainslib

The source code for the beta release is also available at these addresses:

Fine-Tuned Compiler Configuration

If you want to tweak the configuration of the compiler, you can switch to the option variant with:

opam update
opam switch create <switch_name> ocaml-variants.5.0.0~beta1+options <option_list>

where option_list is a comma-separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 5.0.0~beta1+flambda+nffa ocaml-variants.5.0.0~beta1+options ocaml-option-flambda ocaml-option-no-flat-float-array

The command line above is slightly more complicated for opam versions before 2.1:

opam update
opam switch create <switch_name> --packages=ocaml-variants.5.0.0~beta1+options,<option_list> --repositories=default,beta=git+https://github.com/ocaml/ocaml-beta-repository.git

In both cases, all available options can be listed with opam search ocaml-option.

Optional opam Alpha Repository

During the beta release, if your dependencies are not yet compatible with OCaml 5.0.0, you might want to check the alpha opam repository: https://github.com/kit-ty-kate/opam-alpha-repository.

Which can be installed with

opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-repository.git

You can check that the alpha repository has been correctly installed with

$ opam repo
<><> Repository configuration for switch 5.0.0~beta1 <><><><><><><><><><><><><>
 1 alpha   git+https://github.com/kit-ty-kate/opam-alpha-repository.git
 2 default https://opam.ocaml.org

This alpha repository contains various fixes that are in the process of being upstreamed, but it should be less and less required with the progress of the beta release.

See full changelog

Changes Since Last Alpha Release

Stdlib Changes

  • #11309, #11424, #11427, +#11545: Add Domain.recommended_domain_count. (Christiano Haesbaert, Konstantin Belousov, review by David Allsopp, KC Sivaramakrishnan, Gabriel Scherer, Nicolas Ojeda Bar)
  • #11423: Move the effect exceptions to the Effect module (KC Sivaramakrishnan, Xavier Leroy, Florian Angeletti, review by Florian Angeletti, Xavier Leroy, and KC Sivaramakrishnan)

  • #11593: Remove Domain.at_each_spawn (Florian Angeletti, review by Guillaume Munch-Maccagnoni and KC Sivaramakrishnan)

Bug Fixes

  • #11303: Ensure that GC is not invoked from bounds check failures (Stephen Dolan, review by Sadiq Jaffer and Xavier Leroy)

  • #5299, #4787, #11138, #11272, #11506: To help debugging, Caml_state now dynamically checks that the domain lock is held and fails otherwise (with a fatal error at most entry points of the C API, or systematically in debug mode). A new variable Caml_state_opt is introduced and is NULL when the domain lock is not held. This allows to test from C code if the current thread holds its domain lock. (Guillaume Munch-Maccagnoni, review by Florian Angeletti, Damien Doligez, Sadiq Jaffer, Xavier Leroy, and Gabriel Scherer)

  • #11223: The serialisation format of custom blocks changed in 4.08, but the deserialiser would still support the pre-4.08 format. OCaml 5.x removed support for this old format and provided a clear error message in this case. (Hugo Heuzard, review by Gabriel Scherer)

  • #11504, #11522: Use static allocation for caml_make_float_vect in no-flat-float-array mode, it's more efficient and avoids a race condition (Xavier Leroy, report by Guillaume Munch-Maccagnoni, review by David Allsopp)

  • #11461, #11466: Fix gethostbyaddr for IPv6 arguments and make it domain-safe (Olivier Nicole, Nicolás Ojeda Bär, David Allsopp and Xavier Leroy, review by the same)

  • #11479: Make Unix.symlink domain-safe on Windows (Olivier Nicole, review by Xavier Leroy and David Allsopp)

  • #11294: Switch minimum required autoconf to 2.71. (David Allsopp, review by Xavier Leroy)

  • #11370, #11373: Don't pass CFLAGS to flexlink during configure. (David Allsopp, report by William Hu, review by Xavier Leroy and Sébastien Hinderer)

  • #11487: Thwart FMA test optimization during configure (William Hu, review by David Allsopp and Sébastien Hinderer)

  • #11468: Fix regression from #10186 (OCaml 4.13) detecting IPv6 on Windows for mingw-w64 i686 port. (David Allsopp, review by Xavier Leroy and Sébastien Hinderer)

  • #11482, #11542: Fix random crash in large closure allocation (Damien Doligez, report by Thierry Martinez and Vincent Laviron, review by Xavier Leroy)

  • #11508, #11509: make Bytes.escaped domain-safe (Christiano Haesbaert and Gabriel Scherer, review by Xavier Leroy, report by Jan Midtgaard and Tom Kelly)

  • #11516, #11524: Fix the deprecated_mutable attribute. (Chris Casinghino, review by Nicolás Ojeda Bär and Florian Angeletti)

  • #11576: Fix bug in Bigarray.Genarray.init in the the case of zero-dimensional arrays. (Nicolás Ojeda Bär, Jeremy Yallop, report by Masayuki Takeda, review by Jeremy Yallop and Florian Angeletti)

  • #11587: Prevent integer comparison from being used on pointers (Vincent Laviron, review by Gabriel Scherer)

Documentation Changes

  • #11093: Add tutorials on parallelism features and the relaxed memory model (KC Sivaramakrishnan, review by Damien Doligez, Anil Madhavapeddy, Gabriel Scherer, Thomas Leonard, Tom Ridge, Xavier Leroy, Luc Maranget, Fabrice Buoro, Olivier Nicole, Guillaume Munch-Maccagnoni, Jacques-Henri Jourdan)

Ppxlib 0.28.0

See full changelog
  • Make esequence right-associative. (#366, @ceastlund)
  • Deprecate unused attributes in Deriving.Generator (#368, @sim642)
  • Remove a pattern match on mutable state in a function argument. (#362, @ceastlund)
  • Add code-path manipulation attributes. (#352, @ceastlund)
  • Update context-free rules to collect expansion errors generated by ppxlib and propagate them to top level without failing. (#358 and #361, @ceastlund)
  • Add driver benchmarks (#376, @gridbugs)

Ocaml-lsp 1.13.0

See full changelog

Features

  • Code actions for jumping to related files (.ml, .mli, etc.) (#795)

Ocaml-lsp 1.13.2~5.0preview

See full changelog

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

Dune 3.4.1

See full changelog
  • Fix build on cygwin/i686-w64-mingw32 (#6008, @kit-ty-kate)

Dune 3.4.0

On behalf of the dune team, I’m pleased to announce the release of version 3.4.0.

Bug fixes, a couple new features, better hints and error messages - I won't restate what's in the changelog below. Thanks to everyone involved in this release!

See full changelog
  • Make dune describe correctly handle overlapping implementations for virtual libraries (#5971, fixes #5747, @esope)

  • Building the @check alias should make sure the libraries and executables don't have dependency cycles (#5892, @rgrinberg)

  • [ctypes] Add support for the errno parameter using the errno_policy field in the ctypes settings. (#5827, @droyo)

  • Fix dune coq top when it is invoked on files from a subdirectory of the directory containing the associated stanza (#5784, fixes #5552, @ejgallego, @rlepigre, @Alizter)

  • Fix hint when an invalid module name is found. (#5922, fixes #5273, @emillon)

  • The (cat) action now supports several files. (#5928, fixes #5795, @emillon)

  • Dune no longer uses shimmed META files for OCaml 5.x, solely using the ones installed by the compiler. (#5916, @dra27)

  • Fix handling of the (deps) field in (test) stanzas when there is an .expected file. (#5952, #5951, fixes #5950, @emillon)

  • Ignore insignificant filesystem events. This stops RPC in watch mode from flashing errors on insignificant file system events such as changes in the .git/ directory. (#5953, @rgrinberg)

  • Fix parsing more error messages emitted by the OCaml compiler. In particular, messages where the excerpt line number started with a blank character were skipped. (#5981, @rgrinberg)

  • env stanza: warn if some rules are ignored because they appear after a wildcard rule. (#5898, fixes #5886, @emillon)

  • On Windows, XDG_CACHE_HOME is taken to be the FOLDERID_InternetCache if unset, and XDG_CONFIG_HOME and XDG_DATA_HOME are both taken to be FOLDERID_LocalAppData if unset. (#5943, fixes #5808, @nojb)

Ocamlformat 0.24.1

See full changelog

New features

  • Support odoc-parser.2.0.0 (#2123, @gpetiot)
    • Breaking change: incompatible with earlier versions of odoc-parser
    • New inline math elements {m ...} available in doc-comments
    • New block math elements {math ...} available in doc-comments

Ocaml-lsp 1.12.4

See full changelog
  • Allow cancellation of workspace symbols requests (#777)

  • Fix unintentionally interleaved jsonrpc IO that would corrupt the session (#786)

  • Ignore SIGPIPE . (#788)

Ocaml-lsp 1.12.3

See full changelog

Fixes

  • Fix a bad interaction between inferred interfaces and promotion code actions in watch mode (#753)

  • Fix URI parsing (#739 fixes #471 and #459)

Merlin 3.8.0

See full changelog

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

Ocamlformat 0.23.0

See full changelog

Removed

  • bench binary is not distributed anymore to avoid name collisions (#2104, @gpetiot)

Bug fixes

  • Preserve comments around object open/close flag (#2097, @trefis, @gpetiot)
  • Preserve comments around private/mutable/virtual keywords (#2098, @trefis, @gpetiot)
  • Closing parentheses of local open now comply with indicate-multiline-delimiters (#2116, @gpetiot)
  • emacs: fix byte-compile warnings (#2119, @syohex)

Changes

  • Use the API of ocp-indent to parse the .ocp-indent files (#2103, @gpetiot)
  • JaneStreet profile: set max-indent = 2 (#2099, @gpetiot)
  • JaneStreet profile: align pattern-matching bar | under keyword instead of parenthesis (#2102, @gpetiot)

Odoc 2.1.1

See full changelog

Additions

  • New subcommand to resolve references (@panglesd, @lubegasimon, #812)
  • Improved rendering of long signatures (@panglesd, #782)
  • Handle comments attached to open statement as floating comment, instead of dropping them (@panglesd, #797)
  • Empty includes (containing entirely shadowed entries) are now hidden (@panglesd, #798)

Bugs fixed

  • Fix a missing Result constructor during compile. This will cause some functor arguments to have different filenames (@jonludlam, #795)
  • Better memory/disk space usage when handling module alias chains (@jonludlam, #799)
  • Resolving class-type paths (ie., val x : #c) (@jonludlam, #809)
  • Skip top-level attributes while extracting the top comment. Fix top-comment extraction with PPX preprocessing (@jorisgio, #819)
  • Better handling of @canonical tags (@jonludlam, #820)
  • css: improved layout (@jonludlam, @Julow, #822)

Utop 2.10.0

See full changelog
  • Use dependencies compatible with OCaml 5:
    • Use zed 3.2.0, based on uucp, uutf, and uuseg instead of camomile
    • Use logs.lwt instead of lwt_logs

Merlin 4.6

See full changelog
  • merlin binary
    • make most library public and split merlin in two packages: the merlin-lib package that exposes merlin's internals and the merlin package with the frontend. (#1448, #1455, #1457, #1497, @rgrinberg, @tmattio, @kit-ty-kate)
    • Type printing: use best_module_path for paths from Mty_alias (#1470)
    • Attempt at finding the 'real' capitalization of files on windows (#1462 by @mlasson)
    • Use newer Seq-based API of Yojson 2.0, avoiding the need for the deprecated Stream module (#1475 by @Leonidas-from-XIV)
    • unify parsing of MERLIN_LOG (#1480 by @ulugbekna)
    • Fix type deduplication in type-enclosing results (#1483, fixes #1477)
    • Only weakly reduce the shapes to speed up the new Merlin locate implementation. (#1488)
    • Ignore unknown configuration tags from dune configuration provider but not from dot-merlin-reader (#1486)
    • typing recovery: recover at the granularity of core_type (#1484)
  • editor modes
    • add method imenu items for emacs (#1481, @mndrix)
    • emacs: Make the prefix argument to merlin-locate optional, both for consistency with Emacs convention and for backwards compatibility. (#1476, @antalsz)
    • emacs: fix duplicated prefix path in imenu entries (#1495, @bcc32)

Ocaml-lsp 1.12.2

See full changelog

Fixes

  • Fix shutting down an already closed socket (#740)

Ocaml-lsp 1.12.0

See full changelog

Features

  • Fix cancellation mechanism for all requests (#707)

  • Allow cancellation of formatting requests (#707)

  • Add --fallback-read-dot-merlin to the LSP Server (#705). If ocamllsp is started with this new flag, it will fall back to looking for Merlin configuration in .merlin files rather than calling dune ocaml-merlin. (#705)

  • Support folding more ranges (#692)

Ocaml-lsp 1.12.1

See full changelog

Fixes

  • Fix preprocessing, ppx, and reason support (#735 fixes #696, #706)

  • Support include in folding ranges (#730)

Dune 3.3.1

See full changelog
  • Improve parsing of ocamlc errors. We now correctly strip excerpts and parse alerts (#5879, @rgrinberg)

  • The (libraries) field of the coq.theory stanza has been renamed to (plugins) and the Coq language version has been bumped to 0.5.

Dune 3.3.0

On behalf of the dune team, I’m pleased to announce the release of version 3.3.0. This is the first version that supports the upcoming OCaml 5.0. It also improves safety by sandboxing more rules and enabling more warnings, and there's a bunch of new features on the coq side too. Full changelog follows.

Note that as usual, dune works hard not to break existing packages. So even if it mentions that rules require precise dependencies, for example, this new safety net is only enabled for project that use (lang dune 3.3).

Happy hacking.

See full changelog
  • Sandbox preprocessing, lint, and dialect rules by default. All these rules now require precise dependency specifications (#5807, @rgrinberg)

  • Allow list expansion in the pps specification for preprocessing (#5820, @Firobe)

  • Add warnings 67-69 to dune's default set of warnings. These are warnings of the form "unused X.." (#5844, @rgrinberg)

  • Introduce project "composition" for coq theories. Coq theories in separate projects can now refer to each other when in the same workspace (#5784, @Alizter, @rgrinberg)

  • Fix hint message for data_only_dirs that wrongly mentions the unknown constructor data_only (#5803, @lambdaxdotx)

  • Fix creating sandbox directory trees by getting rid of buggy memoization (#5794, @rgrinberg, @snowleopard)

  • Handle directory dependencies in sandboxed rules. Previously, the parents of these directory dependencies weren't created. (#5754, @rgrinberg)

  • Set the exit code to 130 when dune is terminated with a signal (#5769, fixes #5757)

  • Support new locations of unix, str, dynlink in OCaml >= 5.0 (#5582, @dra27)

  • The coq.theory stanza now produces rules for running coqdoc. Given a theory named mytheory, the directory targets mytheory.html/ and mytheory.tex/ or additionally the aliases @doc and @doc-latex will build the HTML and LaTeX documentation repsectively. (#5695, fixes #3760, @Alizter)

  • Coq theories marked as (boot) cannot depend on other theories (#5867, @ejgallego)

  • Ignore bigarray in (libraries) with OCaml >= 5.0. (#5526, fixes #5494, @moyodiallo)

  • Start with :standard when building the ctypes generated foreign stubs so that we include important compiler flags, such as -fPIC (#5816, fixes #5809).

Omp ocaml-migrate-parsetree-2.4.0

See full changelog
  • Add support for 5.0 (#122, @pitag-ha)

Ppxlib 0.25.1

See full changelog
  • Update expansion context to leave out value name when multiple are defined at once. (#351, @ceastlund)
  • Add support for OCaml 5.0 (#348, @pitag-ha)
  • Add Code_path.enclosing_value (#349, @ceastlund)
  • Add Code_path.enclosing_module (#346, @ceastlund)
  • Expand code generated by ~enclose_intf and ~enclose_impl (#345, @ceastlund)
  • Add type annotations to code generated by metaquot (#344, @ceastlund)
  • Fix typo in description field of dune-project (#343, @ceastlund)
  • Fix Ast_pattern.many (#333, @nojb)
  • Fix quoter and optimize identifier quoting (#327, @sim642)
  • Driver, when run with --check: Allow toplevel_printer attributes (#340, @pitag-ha)
  • Documentation: Add a section on reporting errors by embedding extension nodes in the AST (#318, @panglesd)
  • Driver: In the case of ppxlib internal errors, embed those errors instead of raising to return a meaningful AST (#329, @panglesd)
  • API: For each function that could raise a located error, add a function that return a result instead (#329, @panglesd)

Utop 2.9.2

See full changelog
  • Add support for OCaml 5.0 (#377 @dra27)

Ppxlib 0.27.0

See full changelog
  • Bump ppxlib's AST to 4.14/5.00 (#320, @pitag-ha)

Ocamlformat 0.22.4

See full changelog

Removed

  • Profiles compact and sparse are now removed (#2075, @gpetiot)
  • Options align-cases, align-constructors-decl and align-variants-decl are now removed (#2076, @gpetiot)
  • Option disable-outside-detected-project is now removed (#2077, @gpetiot)

Deprecated

  • Cancel the deprecations of options that are not set by the preset profiles (#2074, @gpetiot)

Bug fixes

  • emacs: Remove temp files in the event of an error (#2003, @gpetiot)
  • Fix unstable comment formatting around prefix op (#2046, @gpetiot)

Changes

  • Qtest comments are not re-formatted (#2034, @gpetiot)
  • ocamlformat-rpc is now distributed through the ocamlformat package (#2035, @Julow)
  • Doc-comments code blocks with a language other than 'ocaml' (set in metadata) are not parsed as OCaml (#2037, @gpetiot)
  • More comprehensible error message in case of version mismatch (#2042, @gpetiot)
  • The global configuration file ($XDG_CONFIG_HOME or $HOME/.config) is only applied when no project is detected, --enable-outside-detected-project is set, and no applicable .ocamlformat file has been found. Global and local configurations are no longer used at the same time. (#2039, @gpetiot)
  • Set ocaml-version to a fixed version (4.04.0) by default to avoid reproducibility issues and surprising behaviours (#2064, @kit-ty-kate)
  • Split option --numeric=X-Y into --range=X-Y and --numeric (flag). For now --range can only be used with --numeric. (#2073, #2082, @gpetiot)

New features

  • New syntax (*= ... *) for verbatim comments (#2028, @gpetiot)
  • Preserve the begin-end construction in the AST (#1785, @hhugo, @gpetiot)
  • Preserve position of comments located after the semi-colon of the last element of lists/arrays/records (#2032, @gpetiot)
  • Option --print-config displays a warning when an .ocamlformat file defines redundant options (already defined by a profile) (#2084, @gpetiot)

Dune-release 1.6.2

See full changelog

Fixed

  • Fix project name detection from dune-project. The parser could get confused when opam file generation is used. Now it only considers the first (name X) in the file. (#445, #446, @emillon)

Dune 3.2.0

On behalf of the dune team, I'm pleased to announce the availability of version 3.2.0. This release contains few new features, but is packed with bug fixes and usability improvements. In particular, I'd like to point out that we've continued to improve the user experience with the watch mode. I encourage you all to try it out if you haven't already.

Happy Hacking.

See full changelog
  • Fixed dune describe workspace --with-deps so that it correctly handles Reason files, as well as files any other dialect. (#5701, @esope)

  • Disable alerts when compiling code in vendored directories (#5683, @NathanReb)

  • Fixed dune describe --with-deps, that crashed when some preprocessing was required in a dune file using per_module. (#5682, fixes #5680, @esope)

  • Add $ dune describe pp to print the preprocssed ast of sources. (#5615, fixes #4470, @cannorin)

  • Report dune file evaluation errors concurrently. In the same way we report build errors. (#5655, @rgrinberg)

  • Watch mode now default to clearing the terminal on rebuild (#5636, fixes, #5216, @rgrinberg)

  • The output of jobs that finished but were cancelled is now omitted. (#5631, fixes #5482, @rgrinberg)

  • Allows to configure all the default destination directories with ./configure (adds bin, sbin, data, libexec). Use OPAM_SWITCH_PREFIX instead of calling the opam binaries in dune install. Fix handling of multiple libdir in ./configure for handling /usr/lib/ocaml/ and /usr/local/lib/ocaml. In dune install forbid relative directories in libdir, docdir and others specific directory setting because their handling was inconsistent (#5516, fixes #3978 and #5455, @bobot)

  • --terminal-persistence=clear-on-rebuild will no longer destroy scrollback on some terminals (#5646, @rgrinberg)

  • Add a fmt command as a shortcut of dune build @fmt --auto-promote (#5574, @tmattio)

  • Watch mode now tracks copied external files, external directories for dependencies, dune files in OCaml syntax, files used by include stanzas, dune-project, opam files, libraries builtin with compiler, and foreign sources (#5627, #5645, #5652, #5656, #5672, #5691, #5722, fixes #5331, @rgrinberg)

  • Improve metrics for cram tests. Include test names in the event and add a category for cram tests (#5626, @rgrinberg)

  • Allow specifying multiple licenses in project file (#5579, fixes #5574, @liyishuai)

  • Match glob_files only against files in external directories (#5614, fixes #5540, @rgrinberg)

  • Add pid's to chrome trace output (#5617, @rgrinberg)

  • Fix race when creating local cache directory (#5613, fixes #5461, @rgrinberg)

  • Add not to boolean expressions (#5610, fix #5503, @rgrinberg)

  • Fix relative dependencies outside the workspace (#4035, fixes #5572, @bobot)

  • Allow to specify --prefix via the environment variable DUNE_INSTALL_PREFIX (#5589, @vapourismo)

  • Dune-site.plugin: add support for archive(native|byte, plugin) used in the wild before findlib documented plugin(native|byte) in 2015 (#5518, @bobot)

  • Fix a bug where Dune would not correctly interpret META files in alternative layout (ie when the META file is named META.$pkg). The Llvm bindings were affected by this issue. (#5619, fixes #5616, @nojb)

  • Support (binaries) in (env) in dune-workspace files (#5560, fix #5555, @emillon)

  • (mdx) stanza: add support for (locks). (#5628, fixes #5489, @emillon)

  • (mdx) stanza: support including files in different directories using relative paths, and provide better error messages when paths are invalid (#5703, #5704, fixes #5596, @emillon)

  • Fix ctypes rules for external lib names which aren't valid ocaml names (#5667, fixes #5511, @Khady)

Ocaml-lsp 1.11.6

See full changelog

Fixes

  • Stop leaking file descriptors like a sieve (#701)

Ocaml-lsp 1.11.5

See full changelog
  • Fix process termination. Once the lsp server is stepped, the process will gracefully terminate (#697, fixes #694)

  • Forward stderr from dune's merlin configuration to the lsp server's stderr (#697)

Ocaml-lsp 1.11.4

See full changelog
  • Fix bug with large buffers being resized incorrectly in Lev

  • Add folding ranges for more AST types (#680)

Ocaml-lsp 1.11.3

See full changelog

Fixes

  • Enable dune rpc integration by default (#691, fixes #690)

Dune 3.1.1

See full changelog
  • Fix build on Cygwin. (#5593, fixes 5577, @nojb)

  • Fix execution of (system ..) actions on Windows. (#5593, fixes #5523, @nojb)

Ocaml-lsp 1.11.2

See full changelog

Fixes

  • Fix running external processes on Windows

Dune 3.1.0

On behalf of the dune team, I'm pleased to announce version 3.1.0. This release contains some small, but interesting features, and some important quality of life bug fixes. I encourage everyone to upgrade as soon as possible.

Happy Hacking.

See full changelog
  • Add sourcehut as an option for defining project sources in dune-project files. For example, (source (sourcehut user/repo)). (#5564, @rgrinberg)

  • Add dune coq top command for running a Coq toplevel (#5457, @rlepigre)

  • Fix dune exec dumping database in wrong directory (#5544, @bobot)

  • Always output absolute paths for locations in RPC reported diagnostics (#5539, @rgrinberg)

  • Add (deps <deps>) in ctype field (#5346, @bobot)

  • Add (include <file>) constructor to dependency specifications. This can be used to introduce dynamic dependencies (#5442, @anmonteiro)

  • Ensure that dune describe computes a transitively closed set of libraries (#5395, @esope)

  • Add direct dependencies to $ dune describe output (#5412, @esope)

  • Show auto-detected concurrency on Windows too (#5502, @MisterDA)

  • Fix operations that remove folders with absolute path. This happens when using esy (#5507, @EduardoRFS)

  • Dune will not fail if some directories are non-empty when uninstalling. (#5543, fixes #5542, @nojb)

  • coqdep now depends only on the filesystem layout of the .v files, and not on their contents (#5547, helps with #5100, @ejgallego)

  • The mdx stanza 0.2 can now be used with (implicit_transitive_deps false) (#5558, fixes #5499, @emillon)

  • Fix missing parenthesis in printing of corresponding terminal command for (with-outputs-to ) (#5551, fixes #5546, @Alizter)

Ocaml-lsp 1.11.1

See full changelog

Fixes

  • Fix Uri handling on Windows

  • Fix build on MSVC 2015

Ocaml-lsp 1.11.0

On behalf of the ocamllsp team, I’m excited to announce the availability of version 1.11.0. This release is an important milestone for the project because it introduces integration with our favorite build system. When you run dune in watch mode, you will now be able to see build errors in the diagnostics panel of your editor. It’s all rather experimental for now, so your feedback and bug reports are appreciated.

As usual, the full change log is below.

Happy hacking.

See full changelog

Features

  • Add support for dune in watch mode. The lsp server will now display build errors in the diagnostics and offer promotion code actions.

  • Re-introduce ocamlformat-rpc (#599, fixes #495)

Fixes

  • Fix workspace symbols that could have a wrong path in some cases (#675)

Ocaml-lsp 1.10.5

See full changelog

Fixes

  • Patch merlin to remove the result module

Merlin 4.5

See full changelog
  • merlin binary
    • don't reset the environment when running merlin in single mode so that the parent environment is forwarded the the child processes (#1425)
    • filter dups in source paths (#1218)
    • improve load path performance (#1323)
    • fix handlink of ppx's under Windows (#1413)
    • locate: look for original source files before looking for preprocessed files (#1219 by @ddickstein, fixes #894)
    • handle = syntax in compiler flags (#1409)
    • expose all destruct exceptions in the api (#1437)
    • fix superfluous break in error reporting (#1432)
    • recognise binding operators in locate and occurrences (#1398, @mattiase)
    • remove dependency on Result (#1441, @kit-ty-kate)
    • use the new "shapes" generated by the compiler to perform precise jump-to-definition (#1431)
  • editor modes
    • fix an issue in Neovim where the current line jumps to the top of the window on repeated calls to MerlinTypeOf (#1433 by @ddickstein, fixes #1221)
    • add module, module type, and class imenu items for emacs (#1244, @ivg)
    • add prefix argument to force or prevent opening in a new buffer in locate command (#1426, @panglesd)
    • add type-on-hover functionality for vim (#1439, @nilsbecker)
    • add a dedicated buffer *merlin-errors* containing the last viewed error (#1414, @panglesd)
  • test suite
    • make merlin-wrapper create a default .merlin file only when there is no dune-project to let tests use dune ocaml-merlin reader. (#1425)
    • cover locate calls on module aliases with and without dune
    • Add a test expliciting the interaction between locate and Dune's generated source files (#1444)

Utop 2.9.1

See full changelog
  • Add support for OCaml 5.0 (#371 @favonia)

Ppxlib 0.26.0

See full changelog
  • Add support for OCaml 5.0 (#355, @pitag-ha)

Ppxlib 0.25.0

See full changelog
  • Added error_extensionf function to the Location module (#316, @panglesd)
  • Ast patterns: add drop and as patterns (#313 by @Kakadu, review by @pitag-ha)
  • Fixed a bug resulting in disscarded rewriters in the presence of instrumentations, as well as a wrong order of rewriting (#296, @panglesd)
  • Driver: Append the last valid AST to the error in case of located exception when embedding errors (#315, @panglesd)

Dune 3.0.3

See full changelog
  • Do not enable warnings 63-70 by default (#5476, fixes #5464, @rgrinberg)

  • Allow %{read-lines} to introduce dynamic dependencies like %{read}. (#5440, @anmonteiro)

  • Look up gmake before make (#5474, fixes #5470, @rgrinberg)

  • Handle empty output from getconf (#5473 fixes #5471, @mndrix)

  • Depend on any provided foreign_archives for ctypes stub generation (#5475, @mbacarella)

Ocamlformat 0.21.0

See full changelog

Bug fixes

  • Add missing parentheses around variant class arguments (#1967, @gpetiot)
  • Fix indentation of module binding RHS (#1969, @gpetiot)
  • Fix position of := when assignment-operator=end-line (#1985, @gpetiot)
  • Fix position of comments attached to constructor decl (#1986, @gpetiot)
  • Do not wrap docstrings, wrap-comments should only impact non-documentation comments, wrapping invalid docstrings would cause the whole file to not be formatted (#1988, @gpetiot)
  • Do not break between 2 module items when the first one has a comment attached on the same line. Only a comment on the next line should induce a break to make it clear to which element it is attached to (#1989, @gpetiot)
  • Preserve position of comments attached to the last node of a subtree (#1667, @gpetiot)
  • Do not override the values of the following non-formatting options when a profile is set: comment-check, disable, max-iters, ocaml-version, and quiet (#1995, @gpetiot).
  • Remove incorrect parentheses around polymorphic type constraint (#2002, @gpetiot)
  • Handle cases where an attribute is added to a bind expression, e.g. (x >>= (fun () -> ())) [@a] (#2013, @emillon)
  • Fix indentation of constraints of a package type pattern (#2025, @gpetiot)

Changes

  • More expressions are considered "simple" (not inducing a break e.g. as an argument of an application):
    • Variants with no argument (#1968, @gpetiot)
    • Empty or singleton arrays/lists (#1943, @gpetiot)
  • Print odoc code block delimiters on their own line (#1980, @gpetiot)
  • Make formatting of cons-list patterns consistent with cons-list expressions, (::) operators are aligned when possible, comments position also improved (#1983, @gpetiot)
  • Apply 'sequence-style' to add a space before ';;' between toplevel items, consistently with the formatting of ';' in sequences (#2004, @gpetiot)

New features

  • Format toplevel phrases and their output (#1941, @Julow, @gpetiot). This feature is enabled with the flag --parse-toplevel-phrases. Toplevel phrases are supported when they are located in doc-comments blocks and cinaps comments. Whole input files can also be formatted as toplevel phrases with the flag --repl-file.

RPC

  • ocamlformat-rpc-lib is now functorized over the IO (#1975, @gpetiot). Now handles Csexp.t types instead of Sexplib0.Sexp.t.
  • RPC v2 (#1935, @panglesd): Define a 'Format' command parameterized with optionnal arguments to set or override the config and path, to format in the style of a file.
  • Prevent RPC to crash on version mismatch with .ocamlformat (#2011, @panglesd, @Julow)

Dune-release 1.6.1

See full changelog

Fixed

  • Fix compatibility with Cmdliner 1.1.0. This also unfortunately means that the minimum OCaml version is 4.08 now. (#429, @NathanReb)

Ocaml-lsp 1.10.2

See full changelog

Fixes

  • Catch merlin desturct exceptions (#626)

  • Fix broken debouncing (#627)

Dune 3.0.0

On behalf of the dune team, I’m delighted to announce the availability of dune 3.0.

The team has been working on this release for over 6 months, and there’s a bunch of new work to report. I’ll only highlight the some of the interesting new developments:

  • The watch mode has been rewritten from scratch to be faster and more scalable. We also no longer rely on any 3rd party tools such as fswatch. If any of you still have a dune workspace dune is still struggling with, we cannot wait to hear from you.

  • The watch mode now also starts an RPC server in the background. This RPC protocol is going to be the basis for other tools to interact with dune. Watch out for announcement on the LSP side to see how we’ll be making use of it to improve the editing experience.

  • The dune cache has been rewritten as well. It is now simpler and more reliable. There are still some components missing, such as distribution of the artifacts over the network. Nevertheless, we welcome you all to experiment with this feature and give us feedback.

  • We’ve addressed one of our oldest feature requests: high level rules for ctypes projects. This feature is still experimental, so we need feedback from real world projects before declaring it as mature.

Of course, there are many other fixes, enhancements, and only a few breaking changes in this release. We hope you have an easy time upgrading.

Happy Hacking.

See full changelog
  • Remove uchar and seq dummy ocamlfind libraries from dune's builtin library database (#5260, @kit-ty-kate)

  • Add a DUNE_DIFF_COMMAND environment variable to match --diff-command command-line parameter (@raphael-proust, fix #5369, #5375)

  • Add support for odoc-link rules (#5045, @jonludlam, @lubegasimon)

  • Dune will no longer generate documentation for hidden modules (#5045, @jonludlam, @lubegasimon)

  • Parse the native_pack_linker field of ocamlc -config (#5281, @TheLortex)

  • Fix plugins with dot in the name (#5182, @bobot, review @rgrinberg)

  • Don't generate the dune-site build part when not needed (#4861, @bobot, review @kit-ty-kate)

  • Fix installation of implementations of virtual libraries (#5150, fix #3636, @rgrinberg)

  • Run tests in all modes defined. Previously, jsoo was excluded. (@hhugo, #5049, fix #4951)

  • Allow to configure the alias to run the jsoo tests (@hhugo, #5049, #4999)

  • Set jsoo compilation flags in the env stanza (@hhugo, #5049, #1613)

  • Allow to configure jsoo separate compilation in the env stanza. Previously, it was hard coded to always be enabled in the dev profile. (@hhugo, #5049, fix #970)

  • Fix build-info version in jsoo executables (@hhugo, #5049, fix #4444)

  • Pass -no-check-prims when building bytecode for jsoo (@hhugo, #5049, #4027)

  • Fix jsoo builds when dynamically linked foreign archives are disabled (@hhugo, #5049)

  • Disallow empty packages starting from 3.0. Empty packages may be re-enabled by adding the (allow_empty) to the package stanza in the dune-project file. (#4867, fix #2882, @kit-ty-kate, @rgrinberg)

  • Add link_flags field to the executable field of inline_tests (#5088, fix #1530, @jvillard)

  • In watch mode, use fsevents instead of fswatch on OSX (#4937, #4990, fixes #4896 @rgrinberg)

  • Remove inotifywait watch mode backend on Linux. We now use the inotify API exclusively (#4941, @rgrinberg)

  • Report cycles between virtual libraries and their implementation (#5050, fixes #2896, @rgrinberg)

  • Warn when lang versions have an ignored suffix. (lang dune 2.3.4) or (lang dune 2.3suffix) were silently parsed as 2.3 and we know suggest to remove the prefix. (#5040, @emillon)

  • Allow users to specify dynamic dependencies in rules. For example (deps %{read:foo.gen}) (#4662, fixes #4089, @jeremiedimino)

  • Sandbox infer rules for menhir. Fixes possible "inconsistent assumptions" errors (#5015, @rgrinberg)

  • Experimental support for ctypes stubs (#3905, fixes #135, @mbacarella)

  • Fix interpretation of binaries defined in the env stanza. Binaries defined in x/dune wouldn't be visible in `x/*/**/dune. (#4975, fixes #4976, @Leonidas-from-XIV, @rgrinberg)

  • Do not list private libraries in package listings (#4945, fixes #4799, @rgrinberg)

  • Allow spaces in cram test paths (#4980, fixes #4162, @rgrinberg)

  • Improve error handling of misbehaving cram scripts. (#4981, fix #4230, @rgrinberg)

  • Fix foreign_stubs inside a tests stanza. Previously, dune would crash when this field was present (#4942, fix #4946, @rgrinberg)

  • Add the enabled_if field to inline_tests within the library stanza. This allows us to disable executing the inline tests while still allowing for compilation (#4939, @rgrinberg)

  • Generate a dune-project when initializing projects with dune init proj ... (#4881, closes #4367, @shonfeder)

  • Allow spaces in the directory argument of the subdir stanza (#4943, fixes #4907, @rgrinberg)

  • Add a %{toolchain} expansion variable (#4899, fixes #3949, @rgrinberg)

  • Include dependencies of executables when creating toplevels (either dune top or dune utop) (#4882, fixes #4872, @Gopiancode)

  • Fixes opam META file requires entry for private libs (#4841, fixes #4839, @toots)

  • Fixes dune exec not adding .exe on Windows (#4371, fixes #3322, @MisterDA)

  • Allow multiple cinaps stanzas in the same directory (#4460, @rgrinberg)

  • Fix $ dune subst in empty git repositories (#4441, fixes #3619, @rgrinberg)

  • Improve interpretation of ansi escape sequence when spawning processes (#4408, fixes #2665, @rgrinberg)

  • Allow (package pkg) in dependencies even if pkg is an installed package (#4170, @bobot)

  • Allow %{version:pkg} to work for external packages (#4104, @kit-ty-kate)

  • Add (glob_files_rec <dir>/<glob>) for globbing files recursively (#4176, @jeremiedimino)

  • Automatically generate empty .mli files for executables and tests (#3768, fixes #3745, @CraigFe)

  • Add ocaml command subgroup for OCaml related commands such as utop, top, and merlin (#3936, @rgrinberg).

  • Detect unknown variables more eagerly (#4184, @jeremiedimino)

  • Improve location of variables and macros in error messages (#4205, @jeremiedimino)

  • Auto-detect dune-project files as dune files in Emacs (#4222, @shonfeder)

  • Dune no longer automatically create or edit dune-project files (#4239, fixes #4108, @jeremiedimino)

  • Warn if dune-project is not found (fatal in release mode) (#5343, @emillon)

  • Cleanup temporary files after running $ dune exec. (#4260, fixes #4243, @rgrinberg)

  • Add a new subcommand dune ocaml dump-dot-merlin that prints a mix of all the merlin configuration of a directory (defaulting to the current directory) in the Merlin configuration syntax. (#4250, @voodoos)

  • Enable cram tests by default (#4262, @rgrinberg)

  • Drop support for opam 1.x (#4280, @jeremiedimino)

  • Stop calling ocamlfind to determine the library search path or library installation directory. This makes the behavior of Dune simpler and more reproducible (#4281, @jeremiedimino)

  • Remove the external-lib-deps command. This command was only approximative and the cost of maintainance was getting too high. We removed it to make room for new more important features (#4298, @jeremiedimino)

  • It is now possible to define action dependencies through a chain of aliases. (#4303, @aalekseyev)

  • If an .ml file is not used by an executable, Dune no longer report parsing error in this file (#4330, @jeremiedimino)

  • Add support for sandboxing using hard links (#4360, Andrey Mokhov)

  • Fix dune crash when subdir is an absolute path (#4366, @anmonteiro)

  • Changed the implementation of actions attached to aliases, as in (rule (alias runtest) (action (run ./test))). A visible result for users is that such actions are now memoized for longer. For instance:

    $ echo '(rule (alias runtest) (action (echo "X=%{env:X=0}\n")))` > dune
    $ X=1 dune runtest
    X=1
    $ X=2 dune runtest
    X=2
    $ X=1 dune runtest
    

    Previously, Dune would have re-executed the action again at the last line. Now it remembers the result of the first execution.

  • Fix a bug where dune would always re-run all actions that produce symlinks, even if their dependencies did not change. (#4405, @aalekseyev)

  • Fix a bug that was causing Dune to re-hash generated files more often than necessary (#4419, @jeremiedimino)

  • Fields allowed in the config file are now also allowed in the workspace file (#4426, @jeremiedimino)

  • Add options to control how Dune should handle stdout and stderr of actions when then succeed. It is now possible to ask Dune to ignore the stdout of actions when they succeed or to request that the stderr of actions must be empty. This allows to reduce the noise of large builds (#4422, #4515, @jeremiedimino)

  • The @all alias no longer depends directly on copies of files from the source directory (#4461, @nojb)

  • Allow dune-file as an alternative file name for dune files (needs to be enabled in the dune-project file) (#4428, @nojb)

  • Drop support for upgrading jbuilder projects (#4473, @jeremiedimino)

  • Extend the environment variable BUILD_PATH_PREFIX_MAP to rewrite the root of the build dir (or sandbox) to /workspace_root (#4466, @jeremiedimino)

  • Simplify the implementation of build cache. We stop using the cache daemon to access the cache and instead write to and read from it directly. The new cache implementation is based on Jenga's cache library, which was thoroughly tested on large-scale builds. Using Jenga's cache library will also make it easier for us to port Jenga's cloud cache to Dune. (#4443, #4465, Andrey Mokhov)

  • More informative error message when Dune can't read a target that's supposed to be produced by the action. Old message is still produced on ENOENT, but other errors deserve a more detailed report. (#4501, @aalekseyev)

  • Fixed a bug where a sandboxed action would fail if it declares no dependencies in its initial working directory or any directory it chdirs into. (#4509, @aalekseyev)

  • Fix a crash when clearing temporary directories (#4489, #4529, Andrey Mokhov)

  • Dune now memoizes all errors when running in the file-watching mode. This speeds up incremental rebuilds but may be inconvenient in rare cases, e.g. if a build action fails due to a spurious error, such as running out of memory. Right now, the only way to force such actions to be rebuilt is to restart Dune, which clears all memoized errors. In future, we would like to provide a way to rerun all actions failed due to errors without restarting the build, e.g. via a Dune RPC call. (#4522, Andrey Mokhov)

  • Remove dune compute. It was broken and unused (#4540, @jeremiedimino)

  • No longer generate an approximate merlin files when computing the ocaml flags fails, for instance because they include the contents of a file that failed to build. This was a niche feature and it was getting in the way of making Dune's core better. (#4607, @jeremiedimino)

  • Make Dune display the progress indicator in all output modes except quiet (#4618, @aalekseyev)

  • Report accurate process timing information in trace mode (enabled with --trace-file) (#4517, @rgrinberg)

  • Do not log live_words and free_words in trace file. This allows using Gc.quick_stat which does not scan the heap. (#4643, @emillon)

  • Don't let command run by Dune observe the environment variable INSIDE_EMACS in order to improve reproducibility (#4680, @jeremiedimino)

  • Fix root_module when used in public libraries (#4685, fixes #4684, @rgrinberg, @CraigFe)

  • Fix root_module when used with preprocessing (#4683, fixes #4682, @rgrinberg, @CraigFe)

  • Display Coq profile flags in dune printenv (#4767, @ejgallego)

  • Introduce mdx stanza 0.2, requiring mdx >= 1.9.0, with a new generic deps field and the possibility to statically link libraries in the test executable. (#3956, #5391, fixes #3955)

  • Improve lookup of optional or disabled binaries. Previously, we'd treat every executable with missing libraries as optional. Now, we treat make sure to look at the library's optional or enabled_if status (#4786).

  • Always use 7 char hash prefix in build info version (#4857, @jberdine, fixes #4855)

  • Allow to explicitly disable/enable the use of dune subst by adding a new (subst <disable|enable>) stanza to the dune-project file. (#4864, @kit-ty-kate)

  • Simplify the way dune discovers the root of the workspace. It now stops at the first dune-workspace file it encounters, and fails if it finds neither a dune-workspace nor a dune-project file (#4921, fixes #4459, @jeremiedimino)

  • Dune no longer reads installed META files for libraries distributed with the compiler, instead using its own internal database. (#4946, @nojb)

  • Add support for (empty_module_interface_if_absent) in executable and library stanzas. (#4955, @nojb)

  • Add support for %{bin-available:...} (#4995, @jeremiedimino)

  • Make sure running git or hg in a sandboxed action, such as a cram test cannot escape the sandbox and pick up some random git or mercurial repository on the file system (#4996, @jeremiedimino)

  • Allow %{read:...} in more places such as (enabled_if ...) (#4994, @jeremiedimino)

  • Run each action in its own process group so that we don't leave stray processes behind when killing actions (#4998, @jeremiedimino)

  • Add an option expand_aliases_in_sandbox (#5003, @jeremiedimino)

  • Allow to cancel the initial scan via Control+C (#4460, fixes #4364 @jeremiedimino)

  • Add experimental support for directory targets (#3316, #5025, Andrey Mokhov), enabled via (using directory-targets 0.1) in dune-project.

  • Delete old promote-into, promote-until-clean and promote-until-clean-into syntax (#5091, Andrey Mokhov).

  • Add link_flags in the env stanza (#5215)

  • Bootstrap: ignore errors when trying to remove generated files. (#5407, @damiendoligez)

Dune 3.0.2

See full changelog
  • Fix compilation on MacOS SDK < 10.13. The native watch mode is disabled in such instances (#5431 fix #5430, @rgrinberg)

  • Do no add workspace_root to BUILD_PATH_PREFIX_MAP for projects before 3.0 (5448, @rgrinberg)

  • Fix performance regression in incremental builds (#5439, @snowleopard)

  • Fix digest computation bug introduced in 3.0.1 (#5451, @rgrinberg)

Ocaml-lsp 1.10.0

On behalf of the ocamllsp team, I’m pleased to announce version 1.10.0. The only new feature this release offers is better code folding, but there are some important bug fixes and performance improvements. If you encounter any sluggishness with our server, do not hesitate to report it.

Unless there are serious bugs with this release, this will be the last release for OCaml 4.13.

Happy Hacking.

See full changelog

Features

  • Add better support for code folding: more folds and more precise folds

Fixes

  • Fix infer interface code action crash when implementation source does not exist (#597)

  • Improve error message when the reason plugin for merlin is absent (#608)

  • Fix chdir races when running ppx (#550)

  • More accurate completion kinds. New completion kinds for variants and fields. Removed inaccurate completion kinds for constructors and types. (#510)

  • Fix handling request cancellation (#616)

Dune-release 1.6.0

See full changelog

Added

  • Add --skip-lint, --skip-build, --skip-test and --keep-build-dir to the main command (#419, @NathanReb)
  • Added support for parsing changelogs written in the style of keepachangelog.com (#421, @ifazk)

Odoc 2.1.0

See full changelog

Additions

  • New subcommand to resolve references (@panglesd, @lubegasimon, #812)
  • Improved rendering of long signatures (@panglesd, #782)
  • Handle comments attached to open statement as floating comment, instead of dropping them (@panglesd, #797)
  • Empty includes (containing entirely shadowed entries) are now hidden (@panglesd, #798)

Bugs fixed

  • Fix a missing Result constructor during compile. This will cause some functor arguments to have different filenames (@jonludlam, #795)
  • Better memory/disk space usage when handling module alias chains (@jonludlam, #799)
  • Resolving class-type paths (ie., val x : #c) (@jonludlam, #809)
  • Skip top-level attributes while extracting the top comment. Fix top-comment extraction with PPX preprocessing (@jorisgio, #819)
  • Better handling of @canonical tags (@jonludlam, #820)
  • css: improved layout (@jonludlam, @Julow, #822)

Dune 2.9.3

See full changelog
  • Disable warning for deprecated Toploop functions used in dune files written in OCaml syntax. Restores 4.02 compatibility. (#5381, @nojb)

Mdx 2.1.0

See full changelog

Added

  • Add support for adding language tags and metadata labels in mli files. (#339, #357, @julow, @Leonidas-from-XIV)
  • Add support for running non-deterministic tests in dune MDX 0.2 stanza by setting the MDX_RUN_NON_DETERMINISTIC environment variable. (#365, #366, @Leonidas-from-XIV)

Dune 2.9.2

See full changelog
  • Fix missing -linkall flag when linking library dune-sites.plugin ( #4348, @kakadu, @bobot, reported by @kakadu)

  • No longer reference deprecated Toploop functions when using dune files in OCaml syntax. (#4834, fixes #4830, @nojb)

  • Use the stag format API to be compatible with OCaml 5.0 (#5351, @emillon).

  • Fix post-processing of dune-package (fix #4389, @strub)

Mdx 2.0.0

See full changelog

Added

  • Add trailing ;; to the output of toplevel phrases that were missing it. (#346, @Leonidas-from-XIV)
  • Make MDX compatible with OCaml 4.14 (#356, @NathanReb)

Fixed

  • Use the same output as the normal toplevel. Mdx used to carry an unsafe patch to work around a bug fixed in OCaml 4.06 and that patch would change the printed types in some corner cases. (#322, @emillon)

Removed

  • Dropped compatibility with older OCaml versions. The minimal supported range is 4.08 to 4.13 now (#345, @Leonidas-from-XIV)
  • Do not install deprecated mdx binary anymore (#274, @gpetiot)
  • Remove deprecated rule command (#312, @gpetiot)
  • Remove support for require-package label, use the mdx stanza in dune instead. This label was only used for the rule command and can now be safely removed. (#363, @Leonidas-from-XIV)

Ocamlformat 0.20.1

See full changelog

New features

  • Update to odoc-parser 1.0.0 (#1843, @Julow). New syntax: code blocks can carry metadata, e.g.: {@ocaml kind=toplevel env=e1[ code ]}

Ppxlib 0.24.0

See full changelog
  • Add support for OCaml 4.14 (#304, @kit-ty-kate)
  • Expand nodes before applying derivers or other inline attributes based transformation, allowing better interactions between extensions and derivers (#279, #297, @NathanReb)
  • Add support for registering ppx_import as a pseudo context-free rule (#271, @NathanReb)
  • Add input_name to the Expansion_context.Extension and Expansion_context.Deriver modules (#284, @tatchi)
  • Improve gen_symbol to strip previous unique suffix before adding a new one (#285, @ceastlund)
  • Improve name_type_params_in_td to use prefixes a, b, ... instead of v_x. (#285, @ceastlund)
  • Fix a bug in type_is_recursive and really_recursive where they would consider a type declaration recursive if the type appeared inside an attribute payload (#299, @NathanReb)

Mdx 1.11.1

See full changelog

Changed

  • Use odoc-parser.0.9.0 (#333, @julow)

Deprecated

  • Add a deprecation warning for toplevel blocks that are not terminated with ;; (#342, @Leonidas-from-XIV)

Fixed

  • Fix accidental redirect of stderr to stdout (#343, @Leonidas-from-XIV)
  • Remove trailing whitespaces that were added to indent empty lines (#341, @gpetiot)

Utop 2.9.0

See full changelog
  • Add support for OCaml 4.14 (#360 @kit-ty-kate)
  • Document options in utop(1) manpage (#364 #365 @lindig)

Omp ocaml-migrate-parsetree-2.3.0

See full changelog
  • Add support for 4.14 (#119, @kit-ty-kate)

Ocamlformat 0.20.0

See full changelog

Deprecated

  • Profiles compact and sparse are now deprecated and will be removed by version 1.0 (#1803, @gpetiot)
  • Options that are not set by the preset profiles are now deprecated and will be removed by version 1.0:
    • align-cases, align-constructors-decl and align-variants-decl (#1793, @gpetiot)
    • disambiguate-non-breaking-match (#1805, @gpetiot)
    • break-before-in (#1888, @gpetiot)
    • break-cases={toplevel,all} (#1890, @gpetiot)
    • break-collection-expressions (#1891, @gpetiot)
    • break-fun-decl=smart (#1892, @gpetiot)
    • break-fun-sig=smart (#1893, @gpetiot)
    • break-string-literals (#1894, @gpetiot)
    • break-struct (#1895, @gpetiot)
    • extension-indent (#1896, @gpetiot)
    • function-indent (#1897, @gpetiot)
    • function-indent-nested (#1898, @gpetiot)
    • if-then-else={fit-or-vertical,k-r} (#1899, @gpetiot)
    • indicate-multiline-delimiters=closing-on-separate-line (#1900, @gpetiot)
    • indent-after-in (#1901, @gpetiot)
    • let-binding-indent (#1902, @gpetiot)
    • let-binding-spacing=sparse (#1903, @gpetiot)
    • match-indent (#1904, @gpetiot)
    • match-indent-nested (#1905, @gpetiot)
    • module-item-spacing=preserve (#1906, @gpetiot)
    • nested-match (#1907, @gpetiot)
    • parens-tuple-patterns (#1908, @gpetiot)
    • sequence-style=before (#1909, @gpetiot)
    • stritem-extension-indent (#1910, @gpetiot)
    • type-decl-indent (#1911, @gpetiot)

Bug fixes

  • Fix normalization of sequences of expressions (#1731, @gpetiot)
  • Type constrained patterns are now always parenthesized, parentheses were missing in a class context (#1734, @gpetiot)
  • Support sugared form of coercions in let bindings (#1739, @gpetiot)
  • Add missing parentheses around constructor used as indexing op (#1740, @gpetiot)
  • Honour .ocamlformat-ignore on Windows (#1752, @nojb)
  • Avoid normalizing newlines inside quoted strings {|...|} (#1754, @nojb, @hhugo)
  • Fix quadratic behavior when certain constructs are nested. This corresponds to the cases where a partial layout is triggered to determine if a construct fits on a single line for example. (#1750, #1766, @emillon)
  • Fix non stabilizing comments after infix operators (*, %, #-ops) (#1776, @gpetiot)
  • Fix excessive break and wrong indentation after a short-open when indicate-multiline-delimiters=closing-on-separate-line (#1786, @gpetiot)
  • Add parentheses around type alias used as type constraint (#1801, @gpetiot)
  • Fix alignment of comments inside a tuple pattern and remove incorrect linebreak. Fix formatting of labelled arguments containing comments. (#1797, @gpetiot)
  • Emacs: only hook ocamlformat mode on tuareg/caml modes when ocamlformat is not disabled (#1814, @gpetiot)
  • Fix boxing of labelled arguments, avoid having a linebreak after a label when the argument has a comment attached (#1830, #1885, @gpetiot)
  • Add missing parentheses around application of prefix op when applied to other operands (#1825, @gpetiot)
  • Fix application of a monadic binding when 'break-infix-before-func=false' (#1849, @gpetiot)
  • Fix dropped comments attached to a sequence in a sugared extension node (#1853, @gpetiot)
  • Fix formatting of exception types, and add missing parentheses (#1873, @gpetiot)
  • Fix indentation of with-type constraints (#1883, @gpetiot)
  • Preserve sugared syntax of extension points with attributes (#1913, @gpetiot)
  • Improve comment attachment when followed but not preceded by a linebreak (#1926, @gpetiot)
  • Fix position of comments preceding Pmod_ident (#1939, @gpetiot)
  • Make the formatting of attributes and docstrings more consistent (#1929, @gpetiot)
  • Fix stabilization of comments inside attributes (#1942, @gpetiot)

Changes

  • Set 'module-item-spacing=compact' in the default/conventional profile (#1848, @gpetiot)
  • Preserve bracketed lists in the Parsetree (#1694, #1876, #1914, @gpetiot)
  • Line directives now cause OCamlFormat to emit an error, they were previously silently ignored (#1845, @gpetiot)
  • Apply option 'module-item-spacing' on mutually recursive type declarations for more consistency (#1854, @gpetiot)

New features

  • Handle merlin typed holes (#1698, @gpetiot)
  • Handle punned labelled arguments with type constraint in function applications. For example, function application of the form foo ~(x:int) instead of the explicit foo ~x:(x:int). (ocaml#10434) (#1756, #1759, @gpetiot). This syntax is only produced when the output syntax is at least OCaml 4.14.
  • Allow explicit binders for type variables (ocaml#10437) (#1757, @gpetiot)
  • Add a new ocaml-version option to select the version of OCaml syntax of the output (#1759, @gpetiot)
  • Allow disambiguated global identifiers (like t/2) so they can be formatted by tools like OCaml-LSP (#1716, @let-def)
  • Handle let operator punning uniformly with other punning forms. Normalizes let operator to the punned form where possible, if output syntax version is at least OCaml 4.13.0. (#1834, #1846, @jberdine)
  • Remove unnecessary surrounding parentheses for immediate objects. This syntax is only produced when the output syntax is at least OCaml 4.14. (#1934, @gpetiot)

Odoc 2.0.2

See full changelog

Additions

  • Compatibility with OCaml 4.14 (@patricoferris, @kit-ty-kate, #788)

Odoc 2.0.1

See full changelog

Bugs fixed

  • Man page renderer fails to output pages that have children (@jonludlam, @Julow, #766)
  • Fix resolution of unprefixed references to pages (@Julow, #755)
  • Fix reporting of ambiguous labels (@Julow, @jonludlam, #773, #781)
  • Allow referencing of labels in the top comment (@jonludlam, #771)

Additions

  • Strip unquoted spaces in identifiers for a more flexible reference syntax (@lubegasimon, @panglesd, #783)
  • Add context to messages raised in expansions of includes (@Julow, #780)

Ocaml-lsp 1.9.1

See full changelog

Fixes

  • Disable functionality reliant on ocamlformat-rpc for now (#555)

  • 4.13 compatiblity

Merlin 3.7.0

See full changelog

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

Merlin 4.4

See full changelog
  • ocaml support
    • add support for 4.13
    • stopped actively supporting version older than 4.12
  • merlin binary
    • Mbrowse.select_leaf: correctly ignore merlin.hide (#1376)
    • enable occurences to work when looking for locally abstract types (#1382)
    • handle -alert compiler flag (#1401)
    • avoid a race condition when the process started to read a configuration file crashes/is not found (#1378, @antalsz)
    • log the backtrace even when the exception is a Failure (#1377, @antalsz)
    • ignore -error-style compiler flag (#1402, @nojb)
    • fix handling of record field expressions (#1375)
    • allow -pp to return an AST (#1394)
    • fix merlin crashing due to short-paths (#1334, fixes #1322)
  • editor modes
    • update quick setup instructions for emacs (#1380, @ScriptDevil)
  • test suite
    • improve record field destruction testing (#1375)

Ocaml-lsp 1.9.0

See full changelog

Fixes

  • Ppx processes are now executed correctly (#513)

Breaking Change

  • ocamllsp drops support for .merlin files, and as a consequence no longer depends on dot-merlin-reader. (#523)

Features

  • New code action to automatically remove values, types, opens (#502)

opam 2.0.10

Feedback on this post is welcomed on Discuss!

We are pleased to announce the release of opam 2.0.10.

Two subtle fixes are included in opam 2.0.10. These actually affect the ocaml package. Both of these are Heisenbugs - investigating what's going wrong on your system may well have fixed them, they were both found on Windows!

$(opam env --revert) is the reverse of the more familiar $(opam env) but it's effectively called by opam whenever you change switch. It has been wrong since 2.0.0 for the case where several values are added to an environment variable in one setenv update. For example, if a package included a setenv field of the form [PATH += "dir1:dir2"], then this would not be reverted, but [[PATH += "dir1"] [PATH += "dir2"]] would be reverted. As it happens, this bug affects the ocaml package, but it was masked by another setenv update in the same package.

The other fix is also to do with setenv. It can be seen immediately after creating a switch but before any additional packages are installed, as this Dockerfile shows:

FROM ocaml/opam@sha256:244b948376767fe91e2cd5caca3b422b2f8d332f105ef2c8e14fcc9a20b66e25
RUN sudo apt-get install -y ocaml-nox
RUN opam --version
RUN opam switch create show-issue ocaml-system
RUN eval $(opam env) ; echo $CAML_LD_LIBRARY_PATH
RUN opam install conf-which
RUN eval $(opam env) ; echo $CAML_LD_LIBRARY_PATH

Immediately after switch creation, $CAML_LD_LIBRARY_PATH was set to /home/opam/.opam/show-issue/lib/stublibs:, rather than /home/opam/.opam/show-issue/lib/stublibs:/usr/local/lib/ocaml/4.08.1/stublibs:/usr/lib/ocaml/stublibs


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

    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
  • Fix reverting environment additions to PATH-like variables when several dirs added at once [#4861 @dra27]
  • Ensure setenv can use package variables defined during the build [#4841 @dra27]

opam 2.1.1

Feedback on this post is welcomed on Discuss!

We are pleased to announce the release of opam 2.1.1.

With opam 2.1.1, if you export OPAMCLI=2.0 into your environment then workflows expecting opam 2.0 should now behave even more equivalently.

opam 2.1.1 includes both the fixes in opam 2.0.10.

General fixes:

  • Restore support for switch creation with "positional" package arguments and --packages option for CLI version 2.0, e.g. OPAMCLI=2.0 opam switch create . 4.12.0+options --packages=ocaml-option-flambda. In opam 2.1 and later, this syntax remains an error (#4843)
  • Fix opam switch set-invariant: default repositories were loaded instead of the switch's repositories selection (#4869)
  • Run the sandbox check in a temporary directory (#4783)

Integrated depext support has a few updates:

  • Homebrew now has support for casks and full-names (#4800)
  • Archlinux now handles virtual package detection (#4833, partially addressing #4759)
  • Disable the detection of available packages on RHEL-based distributions. This fixes an issue on RHEL-based distributions where yum list used to detect available and installed packages would wait for user input without showing any output and/or fail in some cases (#4791)

And finally two regressions have been dealt with:

  • Regression: avoid calling Unix.environment on load (as a toplevel expression). This regression affected opam's libraries, rather than the binary itself (#4789)
  • Regression: handle empty environment variable updates (#4840)

A few issues with the compilation of opam from sources have been fixed as well (e.g. mingw-w64 with g++ 11.2 now works)


Opam installation instructions (unchanged):

  1. From binaries: run

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

    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
  • Fix typo in error message for opam var [#4786 @kit-ty-kate - fix #4785]
  • Run the sandbox check in the temporary directory [#4787 @dra27 - fix #4783]
  • OpamSystem: avoid calling Unix.environment at top level [#4789 @hannesm]
  • Homebrew: Add support for casks and full-names [#4801 @kit-ty-kate]
  • Fix the cold target in presence of an older OCaml compiler version on macOS [#4802 @kit-ty-kate - fix #4801]
  • Archlinux: handle virtual package detection [#4833 @rjbou - partial fix #4759]
  • Disable the detection of available packages on RHEL-based distributions. This fixes an issue on RHEL-based distributions where yum list used to detect available and installed packages would wait for user input without showing any output and/or fail in some cases [#4791 @kit-ty-kate - fixes #4790]
  • Handle empty environment variable updates - missed cherry-pick from 2.0 [#4840 @dra27]
  • Fix vendored build on mingw-w64 with g++ 11.2 [#4835 @dra27]
  • Put back support for switch creation with packages argument and --packages option with cli 2.0, and a specific error message for cli 2.1 [#4853 @rjbou - fix #4843]
  • Fix reverting environment additions to PATH-like variables when several dirs added at once [#4861 @dra27]
  • Fix dose3 download url since gforge is gone [#4870 @avsm]
  • Ensure setenv can use package variables defined during the build [#4841 @dra27]
  • Fix `set-invariant: default repos were loaded instead of switch repos [#4866 @rjbou]

Dune-release 1.5.2

See full changelog

Fixed

  • Fixed the release asset URL for projects with multiple opam packages. Before, the packages would attempt to infer their URL and fail in rare cases where the project uses v as prefix for tags but the project version omits it. Now they share the same URL. (#402, #404, @Leonidas-from-XIV)

Dune-release 1.5.1

See full changelog

Added

  • Added support for creating releases from unannotated Git tags. dune-release supported unannotated tags in a few places already, now it supports using them for creating a release. (#383, @Leonidas-from-XIV)

Fixed

  • Change the ---V command option to be -V (#388, @Leonidas-from-XIV)
  • Infer release versions are inferred from VCS tags. This change allows using dune-release on projects that do not use the changelog or have it in a different format. (#381, #383 @Leonidas-from-XIV)
  • Fix a bug where dune-release couldn't retrieve a release on GitHub if the tag and project version don't match (e.g. v1.0 vs 1.0). dune-release would in such case believe the release doesn't exist, attempt to create it and subsequently fail. (#387, #395, @Leonidas-from-XIV)

Odoc 2.0.0

Hot on the heels of the OCaml 4.13 announcement(s!), the odoc team is pleased to announce the release of odoc 2.0.0!

tl;dr: The new version produces much better output than the old version, it's the engine at the core of the package docs in v3.ocaml.org, and it also has a new website.

This release has been a long time coming -- years! -- and contains several notable improvements over the odoc 1.5 series: a new language model, a new rendering layer allowing output in several formats, and improved control over the output structure.

New Features

New Language Model

The internal library used by odoc that models the OCaml module system has been completely rewritten over a multi-year effort by @jonludlam and @Julow, according to a design by @lpw25. The rewrite gives odoc a much better understanding of the module system compared to the original implementation. This library is used for two main processes:

  1. To perform expansions, which is the process where odoc takes complex module type expressions like this one from tyxml:
module Make
    (Xml : Xml_sigs.T with type ('a, 'b) W.ft = 'a -> 'b)
    (Svg : Svg_sigs.T with module Xml := Xml)
  : Html_sigs.Make(Xml)(Svg).T
    with type +'a elt = Xml.elt
     and type +'a attrib = Xml.attrib

Then turns it into an output page containing the correct types, values, modules, includes, and documentation.

  1. To perform resolutions, which is where odoc handles complex paths found in OCaml source in order to calculate the correct definition link. For example, in the following snippet:
module type A = sig
  module M : sig module type S end
  module N : M.S
end

module B : sig module type S = sig type t end end

module C : A with module M = B with type N.t = int

type t = C.N.t

resolution is the process by which odoc determines which documentation page to take you when you click on C.N.t.

The new model has logic to handle many features of the OCaml language, as can be explored here.

A particularly important improvement is in handling canonical modules (explained in the link above). The upshot of this is that there should never be any more odd double underscores leaking into your docs!

For some more info on this, as well as the new output renderers, see our talk at the OCaml workshop last year

New Output Renderers

@Drup put a considerable amount of work into replacing the odoc 1.5 custom HTML generator with a new rendering layer. This features a new intermediate format allowing new output formats to be added far more easily than before.

Included in odoc 2.0 are renderers for HTML and man pages (both contributed by @Drup) and LaTeX (contributed by @Octachron). The LaTeX renderer has already been integrated into the OCaml build process to generate docs (see https://github.com/ocaml/ocaml/pull/9997 and related PRs). @jonludlam also made an alternative HTML renderer designed specifically for v3.ocaml.org. Finally, a new markdown renderer is being prepared by @lubegasimon and should land in the next release.

We look forward to many new renderers being created for the varied use cases present in the community!

Output Structure

odoc 2.0 introduces a new mechanism to specify the structure of the files produced. Although it's a relatively simple new feature, it nevertheless has enabled odoc to be used in new ways. In particular, it has allowed odoc to construct the package documentation for the new OCaml website, v3.ocaml.org. There is also an example driver, showing how odoc can be used to construct a stand-alone website for an OCaml package that contains fully-linked documentation for a package and all of its dependencies. This has been used to create odoc's new website.

New Drivers

Like the OCaml compiler itself, running odoc on your code requires careful sequencing of the invocations to produce the correct result. Fortunately both dune and odig understand how to do this, so most users don't need to know the details. If you want more than these tools provide though, we've written a simple reference driver, documenting exactly what's necessary to use odoc to produce rich documentation. A more complete (and more complex) example is the tool voodoo, which is being used to create the docs for v3.ocaml.org.

v3.ocaml.org

As previously posted, the new version of the OCaml website has been under development for some time now, and an important new feature is the integration of package listings, including documentation for every version of every package. More has been written about this elsewhere, but it's important to note that the new OCaml.org website required a preview version of odoc 2.0 to work. We've made a few bug fixes since then, so we will update the pipeline to use the released version very soon. For more info on the pipeline to build the docs, see our recent talk at this year's OCaml Workshop.

New Website

The website for odoc has been improved with guides for documentation authors, integrators, and contributors. This site is intended to grow over time with more content to help people write docs for their packages.

OCamldoc?

This release, particularly because of the new output renderers, puts odoc in a place where it supercedes OCamldoc in most respects. There are a few features we're missing (see the comparison in the docs), including most notably that we don't render the source (OCamldoc's --keep-code argument), and that there is no support for custom tags. If odoc is lacking features that you're currently relying on in OCamldoc, we'd love to hear from you!

More Docs!

Finally, I'd like to use this opportunity to launch an invitation. With v3.ocaml.org now showing all the package docs in their current state, I'd like to invite all our package authors, maintainers, contributors, and users to take a look over their favourite packages and see what the documentation looks like. Good documentation is one of the most important requests from the previous OCaml developer surveys, and with v3.ocaml.org as a new documentation hub, now is a great time to be making improvements where they're required. With this new release of odoc, previewing your docs should be as simple as dune build @doc.

Some packages already have great docs - a few examples are:

many others have more patchy docs. Let's fix that!

We're also looking for more contributors to odoc. It's much improved now, but there's still plenty more to do. Come and join the fun!

See full changelog

Breaking changes

  • Refactor the comment parser in preparation for it to be octavius 2 (@jonludlam, #621)
  • Remove odoc-parser into a separate repository (@jonludlam, #700)

Additions

  • New model for expanding and cross referencing (@jonludlam, @Julow, @lubegasimon)
  • New document output layer, supporting HTML, LaTeX and man page output (@Drup, @Octachron, @jonludlam, @Julow, @lubegasimon)
  • Experimental parent/child support for structured output (@jonludlam)
  • Add the ability to specifiy canonical paths for types and module types (@jonludlam, #596)
  • Several improvements to the HTML tree (@dbuenzli, #600, #605, #589, @Drup, #579)
  • Render module synopses in {!modules:...} (@Julow, #597)
  • Better HTML rendering (@dbuenzli, #607, #612, #615)
  • Better handling of signature comments (@Julow, #627, #629, #640, #643, #647, #654)
  • Centre, left and right alignment constructs now parse correctly (@lubegasimon, #624)
  • Allow reference to pages that contain hyphens and dots (@lubegasimon, #622)
  • Allow type definitions to be copied and pasted with correct syntax (@Drup, #626)
  • Install Ocamlary as a library for testing (@dbuenzli, #639)
  • Handle @canonical tags on compilation units (@Julow, #649)
  • Alias more when strengthening (@jonludlam, #653)
  • Light theme fixes (@xvw, #660)
  • Handle @canonical tags in the top-comment of modules (@Julow, #662)
  • Simplify paths referring to Stdlib (@jonludlam, #677)
  • New odoc command to report warnings encountered during compilation/linking (@Julow, #667)
  • Anchors on type extensions (@Julow, #684)
  • OCaml 4.13 support (@octachron, #687, #689)
  • Better errors/warnings (@Julow, #692, #717, #720, #732)
  • ModuleType 'Alias' support (@jonludlam, #703)
  • Improved test suite (@lubegasimon, #697)
  • Improved documentation (@lubegasimon, @jonludlam, #702, #733)
  • Strengthen module types (@jonludlam, #731)

Bugs fixed

  • Fix for resolving references in mld files (@jonludlam, #611)
  • Fix placement of documentation in module aliases (@Julow, #606)
  • Fix breakage involving includes and shadowing (@jonludlam, #603)
  • Don't link to hidden items (@lubegasimon, #583)
  • Don't remove docs of inlined includes (@Julow, #595)
  • Don't render shadowed values (@lubegasimon, #580)
  • Fix unresolved references in the first comment of a file (@Julow, #592)
  • LaTeX: Hardened description environments (@Octachron, #608)
  • Resolve references in module synopses (@Julow, #658)
  • Fix reference resolution in the presence of shadowing (@Julow, #682)
  • uwt now can be documented (@jonludlam, #708)
  • Fix resolution involving deeply nested substitutions (@jonludlam, #727)
  • Fix off-by-one error in error reporting (@asavahista, #736)

Ocaml-lsp 1.8.3

See full changelog
  • Fix debouncing of document updates. It was essentially completely broken in all but the most trivial cases. (#509 fixes #504)

  • Fix completion when passing named and functional arguments (#512)

Ocaml-lsp 1.8.2

See full changelog
  • Disable experimental dune support. It was accidentally left enabled.

Ocaml-lsp 1.8.0

On behalf of the ocaml-lsp team, I’m pleased to announce version 1.8.0. This release contains some quality of life bug fixes, better diagnostics locations, and a few new code actions. Happy hacking.

See full changelog

Features

  • Add a new code action Add missing rec keyword, which is available when adding a rec keyword can fix Unbound value ... error, e.g.,

    let fact n = if n = 0 then 1 else n * fact (n - 1)
                                      (* ^^^^ Unbound value fact *)
    

    Adding rec to the definition of fact will fix the problem. The new code action offers adding rec.

  • Use ocamlformat to properly format type snippets. This feature requires the ocamlformat-rpc opam package to be installed. (#386)

  • Add completion support for polymorphic variants, when it is possible to pin down the precise type. Examples (<|> stands for the cursor) when completion will work (#473)

    Function application:

    let foo (a: [`Alpha | `Beta]) = ()
    
    foo `A<|>
    

    Type explicitly shown:

    let a : [`Alpha | `Beta] = `B<|>
    

    Note: this is actually a bug fix, since we were ignoring the backtick when constructing the prefix for completion.

  • Parse merlin errors (best effort) into a more structured form. This allows reporting all locations as "related information" (#475)

  • Add support for Merlin Construct command as completion suggestions, i.e., show complex expressions that could complete the typed hole. (#472)

  • Add a code action Construct an expression that is shown when the cursor is at the end of the typed hole, i.e., _|, where | is the cursor. The code action simply triggers the client (currently only VS Code is supported) to show completion suggestions. (#472)

  • Change the formatting-on-save error notification to a warning notification (#472)

  • Code action to qualify ("put module name in identifiers") and unqualify ("remove module name from identifiers") module names in identifiers (#399)

    Starting from:

    open Unix
    
    let times = Unix.times ()
    let f x = x.Unix.tms_stime, x.Unix.tms_utime
    

    Calling "remove module name from identifiers" with the cursor on the open statement will produce:

    open Unix
    
    let times = times ()
    let f x = x.tms_stime, x.tms_utime
    

    Calling "put module name in identifiers" will restore:

    open Unix
    
    let times = Unix.times ()
    let f x = x.Unix.tms_stime, x.Unix.tms_utime
    

Fixes

  • Handle workspace change notifications. Previously, the server would only use the set of workspaces given at startup to search for workspace symbols. After this change, workspace folders that are added later will also be considered. (#498)

  • Do not show "random" documentation on hover

  • Correctly rename a variable used as a named/optional argument (#478)

  • When reporting an error at the beginning of the file, use the first line not the second (#489)

Mdx 1.11.0

See full changelog

Changed

  • Use odoc-parser.0.9.0 (#333, @julow)

Deprecated

  • Add a deprecation warning for toplevel blocks that are not terminated with ;; (#342, @Leonidas-from-XIV)

Fixed

  • Fix accidental redirect of stderr to stdout (#343, @Leonidas-from-XIV)
  • Remove trailing whitespaces that were added to indent empty lines (#341, @gpetiot)

Dune 2.9.1

Dear all,

on behalf of the Dune team I'm pleased to announce the release of Dune 2.9.1.

This is a minor release, fixing an important problem with opam file generation when (lang dune 2.9) was set, and a few other minor fixes.

See full changelog
  • Don't use subst --root in Opam files (https://github.com/ocaml/dune/pull/4806, @MisterDA)

  • Fix compilation on Haiku (https://github.com/ocaml/dune/pull/4885, @Sylvain78)

  • Allow depending on ocamldoc library when ocamlfind is not installed. (https://github.com/ocaml/dune/pull/4811, fixes https://github.com/ocaml/dune/issues/4809, @nojb)

  • Fix (enabled_if ...) for installed libraries (https://github.com/ocaml/dune/pull/4824, fixes https://github.com/ocaml/dune/issues/4821, @dra27)

  • Create more future-proof opam files using --promote-install-files=false (https://github.com/ocaml/dune/pull/4860, @bobot)

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)

opam 2.1.0 is released!

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 sub-commands)
  • 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, 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 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).

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

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, or 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 bypass 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, 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.

Since 2.1.0~rc2, CLI versioning applies to opam environment variables. The previous behavior was to ignore unknown or wrongly set environment variable, while 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 set-ups 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 life-cycle, new field are added or removed, 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...

Try it!

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

The upgrade instructions are unchanged:

  1. Either from binaries: run

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

    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

opam 2.0.9 release

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://raw.githubusercontent.com/ocaml/opam/master/shell/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.

Merlin 3.6.1

See full changelog

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

Merlin 4.3.1

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)

Ocamlformat 0.19.0

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.

Mdx 1.10.1

See full changelog

Added

  • Support for OCaml 4.13 (#330, @emillon)

Odoc 1.5.3

See full changelog

Additions

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

Dune-release 1.5.0

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)

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)

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)

Opam-publish 2.1.0

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

Ocaml-lsp 1.7.0

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)

opam 2.1.0~rc2 released

Feedback on this post is welcomed on Discuss!

The opam team has great pleasure in announcing opam 2.1.0~rc2!

The focus since beta4 has been preparing for a world with more than one released version of opam (i.e. 2.0.x and 2.1.x). The release candidate extends CLI versioning further and, under the hood, includes a big change to the opam root format which allows 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).

Please do take this release candidate for a spin! It is available in the Docker images at ocaml/opam on Docker Hub as the opam-2.1 command (or you can sudo ln -f /usr/bin/opam-2.1 /usr/bin/opam in your Dockerfile to switch to it permanently). The release candidate can also be tested via our installation script (see the wiki for more information).

Thank you to anyone who noticed the unannounced first release candidate and tried it out. Between tagging and what would have been announcing it, we discovered an issue with upgrading local switches from earlier alpha/beta releases, and so fixed that for this second release candidate.

Assuming no showstoppers, we plan to release opam 2.1.0 next week. The improvements made in 2.1.0 will allow for a much faster release cycle, and we look forward to posting about the 2.2.0 plans soon!

Try it!

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

The upgrade instructions are unchanged:

  1. Either from binaries: run

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

    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

We hope there won't be any, but please report any issues to the bug-tracker. Thanks for trying it out, and hoping you enjoy!

Omp ocaml-migrate-parsetree-2.2.0

See full changelog
  • Add support for 4.13 (#114, @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.21.1

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

Ppxlib 0.22.1

See full changelog
  • Fix location in parse error reporting (#257, @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)

Ocaml-lsp 1.6.1

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

Ocaml-lsp 1.6.0

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

See full changelog

Features

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

Fixes

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

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

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

Merlin 3.5.0

See full changelog

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

Merlin 4.2

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

Ocamlformat 0.18.0

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)

Ocaml-lsp 1.5.0

See full changelog
  • Support 4.12 and drop support for all earlier versions

  • Update to the latest version of merlin

Dune 2.8.5

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

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

Ocaml-lsp 1.4.1

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)

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

Ocamlformat 0.17.0

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)

Mdx 1.8.1

See full changelog

Changed

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

opam 2.0.8 release

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!

opam 2.1.0~beta4 released

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.

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

Dune 2.8.1

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

Opam-publish 2.0.3

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

Utop 2.7.0

See full changelog
  • add support for OCaml 4.12 (@emillon, #339)

Ocaml-lsp 1.4.0

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)

Ocaml-lsp 1.3.0

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)

Ocaml-lsp 1.2.0

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.

Merlin 3.4.2

See full changelog
  • merlin binary
    • simplify local store implementation and API (#1188, #1184)
    • fix a destruct issue allowing ill-typed match completions (#1194)

Ocamlformat 0.16.0

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)

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)

Ocamlformat 0.15.1

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

Omp ocaml-migrate-parsetree-1.8.0

See full changelog

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

Ppxlib 0.19.0

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

Omp ocaml-migrate-parsetree-2.1.0

See full changelog
  • Add support for 4.12 (#107, @ceastlund)

Ppxlib 0.18.0

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

Merlin 3.4.1

See full changelog
  • dot-merlin-reader
    • fix issue when multiple packages with pxxes are declared in the configuration. (#1181, fixes #1179)

Merlin 3.4.0

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)

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)

Dune 2.7.1

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

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

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

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

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

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

Merlin 3.3.9

See full changelog

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

Merlin 3.3.8

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

Merlin 3.3.7

See full changelog
  • ocaml support
    • full support from OCaml 4.02 to OCaml 4.11 (#1153)

Ppxlib 0.16.0

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

Dune 2.7.0

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

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

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

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

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

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

Happy Hacking.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Omp ocaml-migrate-parsetree-2.0.0

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

Ocamlformat 0.15.0

See full changelog

Changes

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

Bug fixes

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

New features

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

Ppxlib 0.15.0

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

Dune 2.6.2

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

Ocamlformat 0.14.3

See full changelog

Changes

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

Mdx 1.7.0

See full changelog

Added

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

Changed

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

Deprecated

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

Fixed

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

Dune-release 1.4.0

See full changelog

Added

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

Changed

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

Deprecated

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

Fixed

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

Ppxlib 0.14.0

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

Dune 2.6.1

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

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

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

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

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

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

Odoc 1.5.1

See full changelog

Additions

  • Compatibility with OCaml 4.11 (#434, @kit-ty-kate)

Merlin 3.3.6

See full changelog
  • merlin binary
    • dune: remove duplicated rules for profile=release (#1143)
  • test suite
    • fix a test that required Dune 2.5 (#1146)
    • fix another test that lacked reproducibility (#1146)

Merlin 3.3.5

See full changelog
  • ocaml support
    • alerts are no-more ignored and are reported as warnings (#1138)
  • merlin binary
    • fix completion of names containing - (#1142)
    • fix several type-enclosing bugs by performing context-analysis (#1108)
    • lsp: add deprecation flag to outline items (#1087)
    • lsp: add go-to typedef (Locate_type) (#1067)

Dune 2.6.0

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

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

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

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

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

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

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

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

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

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

Utop 2.6.0

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

Ocamlformat 0.14.2

See full changelog

Changes

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

Omp ocaml-migrate-parsetree-1.7.3

See full changelog
  • Fix magic numbers for the 4.11 ast (#96, @hhugo)

Utop 2.5.0

See full changelog

Additions

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

General

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

opam 2.0.7 release

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

This new version contains backported small fixes:


Installation instructions (unchanged):

  1. From binaries: run

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

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

  2. From source, using opam:

    opam update; opam install opam-devel
    

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

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

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

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

opam 2.1.0 alpha is here!

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

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

Release highlights

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

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

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

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

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

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

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

Dependency locking

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

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

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

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

Pinning sub-directories

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

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

Opam switches are now defined by invariants

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

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

Configuring opam from the command-line

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

For example:

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

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

Try it!

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

The upgrade instructions are unchanged:

  1. Either from binaries: run

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

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

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

You should then run:

opam init --reinit -ni

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

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

Dune 2.5.1

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

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

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

Omp ocaml-migrate-parsetree-1.7.2

See full changelog
  • Remove toplevel Option module accidentally added in 1.7.0

Merlin 3.3.4

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

Omp ocaml-migrate-parsetree-1.7.1

See full changelog
  • Fix build with OCaml < 4.08

From 1.7.0:

  • Add support for 4.11 (#92, @diml)

Ppxlib 0.13.0

See full changelog
  • Add 'metaquot.' prefix to disambiguate metaquote extensions (#121, @ceastlund)
  • Bump dune language to 1.11 since the cinaps extension requires at least Dune 1.11 (#126, @diml)

Ocamlformat 0.14.1

See full changelog

Changes

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

Dune 2.5.0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ocamlformat 0.14.0

See full changelog

New features

  • Add an option --format-invalid-files to print unparsable parts of the input as verbatim text. This feature is still experimental. (#1026, @gpetiot)
  • Support multi-indices extended indexing operators (#1279, #1277, @Julow, @gpetiot). This feature has been added in OCaml 4.10.0
  • Handle OCaml 4.10.0 AST (#1276, @gpetiot)
  • Preserve functor syntax for consistency (#1312, @gpetiot). Previously both functor syntax: module M = functor (K : S) -> struct end and module M (K : S) = struct end would be formatted as the latter, the original syntax is now preserved.

Changes

  • Add the option doc-comments-val=before|after (#1012, @Julow). This option set the placement of documentation comment on val and external only. It is set to after by default.
  • The default for doc-comments is changed from after to before (#1012, #1325, @Julow). This affects both conventional (default) and ocamlformat profiles.
  • Some options are now deprecated:
    • doc-comments (#1293, #1012). This option depends on a flawed heuristic. It is replaced by doc-comments-val for val and external declarations. There is no equivalent to this option in the general case.
    • escape-chars, escape-strings and extension-sugar (#1293). These options are rarely used and their default behavior is considered to be the right behavior.
  • Add space between row_field attributes and the label or arguments, to be consistent with the non-polymorphic case. (#1299, @CraigFe)

Bug fixes

  • Fix missing parentheses around let open (#1229, @Julow). eg. M.f (M.(x) [@attr]) would be formatted to M.f M.(x) [@attr], which would crash OCamlformat
  • Remove unecessary parentheses with attributes in some structure items:
    • extensions and eval items (#1230, @Julow). eg. the expression [%ext (() [@attr])] or the structure item (() [@attr]) ;;
    • let _ = ... constructs (#1244, @emillon)
  • Fix some bugs related to comments:
    • after a function on the rhs of an infix (#1231, @Julow). eg. the comment in (x >>= fun y -> y (* A *)) would be dropped
    • in module unpack (#1309, @Julow). eg. in the module expression module M = (val x : S (* A *))
  • Fix formatting of empty signature payload [%a:] (#1236, @emillon)
  • Fix parenthesizing when accessing field of construct application (#1247, @gpetiot)
  • Fix formatting of attributes on object overrides {< >} (#1238, @emillon)
  • Fix attributes on coercion (#1239, @emillon)
  • Fix formatting of attributes on packed modules (#1243, @emillon)
  • Fix parens around binop operations with attributes (#1252, #1306, @gpetiot, @CraigFe)
  • Remove unecessary parentheses in the argument of indexing operators (#1280, @Julow)
  • Retain attributes on various AST nodes:
    • field set expressions, e.g. (a.x <- b) [@a] (#1284, @CraigFe)
    • instance variable set expressions, e.g. (a <- b) [@a] (#1288, @CraigFe)
    • indexing operators, e.g. (a.(b)) [@a] (#1300, @CraigFe)
    • sequences, e.g. (a; b) [@a] (#1291, @CraigFe)
  • Avoid unnecessary spacing after object types inside records and polymorphic variants, e.g. {foo : < .. > [@a]} and { foo : < .. > } (#1296, @CraigFe)
  • Fix missing parentheses around tuples with attributes. (#1301, @CraigFe). Previously, f ((0, 0) [@a]) would be formatted to f (0, 0) [@a], crashing OCamlformat.
  • Avoid emitting >] when an object type is contained in an extension point or attribute payload (#1298, @CraigFe)
  • Fix crash on the expression (0).*(0) (#1304, @Julow). It was formatting to 0.*(0) which parses as an other expression.
  • Preserve empty doc-comments syntax. (#1311, @gpetiot). Previously (**) would be formatted to (***).
  • Do not crash when a comment contains just a newline (#1290, @emillon)
  • Handle lazy patterns as arguments to class (#1289, @emillon)
  • Preserve cinaps comments containing unparsable code (#1303, @Julow). Previously, OCamlformat would fallback to the "wrapping" logic, making the comment unreadable and crashing in some cases.
  • Fix normalization of attributes, fixing the docstrings in attributes (#1314, @gpetiot)
  • Add missing parentheses around OR-patterns with attributes (#1317, @gpetiot)
  • Fix spacing inside parens for symbols when the spacing was handled by the englobing exp (#1316, @gpetiot)
  • Fix invalid (unparsable) docstrings (#1315, @gpetiot). When parsing a comment raises an error in odoc, it is printed as-is.
  • Fix parenthesizing of optional arguments rebound to non-variables, e.g. let f ?a:(A) = () rather than the unparsable let f ?a:A = () (#1305, @CraigFe)

Dune 2.4.0

On behalf of the dune team, I'm pleased to announce the release of dune 2.4.0. This releases features support for mdx, an interesting take on the notebook paradigm by the RWO team. This release also includes a crucial fix to polling mode which makes it usable in environments with finite memory :slight_smile:.

Happy hacking!

See full changelog
  • Add mdx extension and stanza version 0.1 (#3094, @NathanReb)

  • Allow to make Odoc warnings fatal. This is configured from the (env ...) stanza. (#3029, @Julow)

  • Fix separate compilation of JS when findlib is not installed. (#3177, @nojb)

  • Add a dune describe command to obtain the topology of a dune workspace, for projects such as ROTOR. (#3128, @jeremiedimino)

  • Add plugin linking mode for executables and the (embed_in_plugin_libraries ...) field. (#3141, @nojb)

  • Add an %{ext_plugin} variable (#3141, @nojb)

  • Dune will no longer build shared objects for stubs if supports_shared_libraries is false (#3225, fixes #3222, @rgrinberg)

  • Fix a memory leak in the file-watching mode (dune build -w) (#3220, @snowleopard and @aalekseyev)

Merlin 3.3.4~4.10preview1

This is a preview release that adds support for OCaml 4.10. Short-path is disabled. Other versions of OCaml are not supported.

See full changelog

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

Dune 2.3.1

See full changelog
  • Fix versioning of artifact variables (eg %{cmxa:...}), which were introduced in 2.0, not 1.11. (#3149, @nojb)

  • Fix a bug introduced in 2.3.0 where dune insists on using fswatch on linux (even when inotifywait is available). (#3162, @aalekseyev)

  • Fix a bug causing all executables to be considered as optional (#3163, @diml)

Mdx 1.6.0

See full changelog

Added

  • Add a --duniverse-mode to ocaml-mdx rule so that the generated rules work within a duniverse
  • Allow to import arbitrary files (not only .ml/.mli ones) into code blocks using the file label. (#203, #207, @voodoos)
  • Allow to set the --non-deterministic option through the MDX_RUN_NON_DETERMINISTIC env variables (#208, @NathanReb)
  • Add support for OCaml 4.10 (#204, @kit-ty-kate)
  • Infer syntax kind when --syntax is not set, and add 'markdown' as an alias to 'normal' (#222, @gpetiot)
  • Add ocaml-mdx deps command to be used by dune to compute file and dir dependencies of an mdx file. (#217, @voodoos)
  • Add new delimiters syntax using comments for partial OCaml files include (#212, @voodoos).

Changed

  • Do not unset INSIDE_DUNE when executing shell commands by default (#224, @NathanReb)

Fixed

  • Fix a bug that could cause ocaml-mdx test to crash on some include in toplevel code blocks (#202, @trefis)

Removed

  • Remove the direction option, only synchronize from .ml to .md files (#214, @gpetiot)

Dune 2.3.0

On behalf of the dune team, I'm proud to announce the 2.3.0 release of dune. This release is particularly relevant for users of coq that use dune to build their theories, developers of coq that use dune to build their favorite theorem prover. I'd like to thank @ejgallego for all the hard work to improve dune in this regard.

I'd also like to point out the (strict_package_deps) option that is now available in project files. This option will now ask dune to validate the package dependencies specified in the package stanzas in your dune-project files.

Here's the full change list, and as always, happy hacking!

See full changelog
  • Improve validation and error handling of arguments to dune init (#3103, fixes #3046, @shonfeder)

  • dune init exec NAME now uses the NAME argument for private modules (#3103, fixes #3088, @shonfeder)

  • Avoid linear walk to detect children, this should greatly improve performance when a target has a large number of dependencies (#2959, @ejgallego, @aalekseyev, @Armael)

  • [coq] Add (boot) option to (coq.theories) to enable bootstrap of Coq's stdlib (#3096, @ejgallego)

  • [coq] Deprecate public_name field in favour of package (#2087, @ejgallego)

  • Better error reporting for "data only" and "vendored" dirs. Using these with anything else than a strict subdirectory or * will raise an error. The previous behavior was to just do nothing (#3056, fixes #3019, @voodoos)

  • Fix bootstrap on bytecode only switches on windows or where -j1 is set. (#3112, @xclerc, @rgrinberg)

  • Allow enabled_if fields in executable(s) stanzas (#3137, fixes #1690 @voodoos)

  • Do not fail if ocamldep, ocamlmklib, or ocaml are absent. Wait for them to be used to fail (#3138, @rgrinberg)

  • Introduce a strict_package_deps mode that verifies that dependencies between packages in the workspace are specified correctly. (@rgrinberg, #3117)

  • Make sure the @all alias is defined when no dune file is present in a directory (#2946, fix #2927, @jeremiedimino)

Omp ocaml-migrate-parsetree-1.6.0

See full changelog
  • Preserve compiler version of binary ASTs across transformation (#79, @aantron)
  • Allow not exiting on error (#83, @aantron)

Dune 2.2.0

See full changelog
  • dune test is now a command alias for dune runtest. This is to make the CLI less idiosyncratic (#3006, @shonfeder)

  • Allow to set menhir flags in the env stanza using the menhir_flags field. (#2960, fix #2924, @bschommer)

  • By default, do not show the full command line of commands executed by dune when dune is executed inside dune. This is to make integration tests more reproducible (#3042, @diml)

  • dune subst now works even without opam files (#2955, fixes #2910, @fangyi-zhou and @diml)

  • Hint when trying to execute an executable defined in the current directory without using the ./ prefix (#3041, fixes #1094, @voodoos).

  • Extend the list of modifiers that can be nested under with-accepted-exit-codes with chdir, setenv, ignore-<outputs>, with-stdin-from and with-<outputs>-to (#3027, fixes #3014, @voodoos)

  • It is now an error to have a preprocessing dependency on a ppx rewriter library that is not marked as (kind ppx_rewriter) (#3039, @snowleopard).

  • Fix permissions of files promoted to the source tree when using the shared cache. In particular, make them writable by the user (#3043, fixes #3026, @diml)

  • Only detect internal OCaml tools with .opt extensions. Previously, this detection applied to other binaries as well (@kit-ty-kate, @rgrinberg, #3051).

  • Give the user a proper error message when they try to promote into a source directory that doesn't exist. (#3073, fix #3069, @rgrinberg)

  • Correctly build vendored packages in -p mode. These packages were incorrectly filtered out before. (#3075, @diml)

  • Do not install vendored packages (#3074, @diml)

  • make now prints a message explaining the main targets available (#3085, fix #3078, @diml)

  • Add a byte_complete executable mode to build programs as self-contained bytecode programs (#3076, fixes #1519, @diml)

Odoc 1.5.0

See full changelog

Additions

  • Add option to turn warnings into errors (#398, Jules Aguillon)

Bugs fixed

  • Emit quote before identifier in alias type expr (Fixes #391, Anton Bachin)
  • Handle generalized open statements introduced in 4.08 (#393, Jon Ludlam)
  • Refactor error reporting to avoid exiting the program in library code (#400, Jules Aguillon)
  • Build on OCaml 4.10 (#408, Jon Ludlam)

Ocamlformat 0.13.0

See full changelog

New features

  • Add an option --margin-check to emit a warning if the formatted output exceeds the margin (#1110, @gpetiot)
  • Preserve comment indentation when wrap-comments is unset (#1138, #1159, @Julow)
  • Improve error messages (#1147, @Julow)
  • Display standard output in the emacs plugin even when ocamlformat does not fail (#1189, @gpetiot)

Removed

  • Remove ocamlformat_reason (#254, #1185, @emillon). This tool has never been released to opam, has no known users, and overlaps with what refmt can do.
  • Remove ocamlformat-diff (#1205, @gpetiot). This tool has never been released to opam, has no known users, and overlaps with what merge-fmt can do.

Packaging

  • Work with base v0.13.0 (#1163, @Julow)

Bug fixes

  • Fix placement of comments just before a '|' (#1203, @Julow)
  • Fix build version detection when building in the absence of a git root (#1198, @avsm)
  • Fix wrapping of or-patterns in presence of comments with break-cases=fit (#1167, @Julow). This also fixes an unstable comment bug in or-patterns
  • Fix an unstable comment bug in variant declarations (#1108, @Julow)
  • Fix: break multiline comments (#1122, @gpetiot)
  • Fix: types on named arguments were wrapped incorrectly when preceding comments (#1124, @gpetiot)
  • Fix the indentation produced by max-indent (#1118, @gpetiot)
  • Fix break after Psig_include depending on presence of docstring (#1125, @gpetiot)
  • Remove some calls to if_newline and break_unless_newline and fix break before closing brackets (#1168, @gpetiot)
  • Fix unstable cmt in or-pattern (#1173, @gpetiot)
  • Fix location of comment attached to the underscore of an open record (#1208, @gpetiot)
  • Fix parentheses around optional module parameter (#1212, @cbarcenas)
  • Fix grouping of horizontally aligned comments (#1209, @gpetiot)
  • Fix dropped comments around module pack expressions (#1214, @Julow)
  • Fix regression of comment position in list patterns (#1141, @jberdine)
  • Fix: adjust definition of Location.is_single_line to reflect margin (#1102, @jberdine)

Documentation

  • Fix documentation of option version-check (#1135, @Wilfred)
  • Fix hint when using break-separators=after-and-docked (#1130, @gretay-js)

Dune 2.1.3

See full changelog
  • Fix building the OCaml compiler with Dune (#3038, fixes #2974, @diml)

opam 2.0.6 release

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

This new version contains some small backported fixes and build update:

As sandbox scripts have been updated, don't forget to run opam init --reinit -ni to update yours.

Note: To homogenise macOS name on system detection, we decided to keep macos, and convert darwin to macos in opam. For the moment, to not break jobs & CIs, we keep uploading darwin & macos binaries, but from the 2.1.0 release, only macos ones will be kept.


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

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

  2. From source, using opam:

    opam update; opam install opam-devel
    

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

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

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

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

Dune 2.1.2

See full changelog
  • Fix a bug in the Fiber.finalize function of the concurrency monad of Dune, causing a race condition at the user level (#3009, fix #2958, @diml)

Dune 2.1.1

See full changelog
  • Attach cinaps stanza actions to both @runtest and @cinaps aliases (#2831, @NathanReb)

  • Add variables %{lib-private...} and %{libexec-private...} for finding build paths of files in public and private libraries within the same project. (#2901, @snowleopard)

  • Add --mandir option to $ dune install. This option allows to override the installation directory for man pages. (#2915, fixes #2670, @rgrinberg)

  • Fix dune --version. The bootstrap didn't compute the version correctly. (#2929, fixes #2911, @diml)

  • Do not open the log file in dune clean. (#2965, fixes #2964 and #2921, @diml)

  • Support passing two arguments to =, <>, ... operators in package dependencies so that we can have things such as (<> :os win32) (#2965, @diml)

  • Guess foreign archives & native archives for libraries defined using the META format. (#2994, @rgrinberg, @anmonteiro)

  • Fix generation of .merlin files when depending on local libraries with more than one source directory. (#2983, @rgrinberg)

Ppxlib 0.11.0

See full changelog
  • Invariant check on locations (#107, @trefis)

Ppxlib 0.12.0

See full changelog
  • Support for OCaml 4.10 (#109, @xclerc)

Dune 2.0.1

See full changelog
  • Delay errors raised by invalid dune-package files. The error is now raised only if the invalid package is treated as a library and used to build something. (#2972, @rgrinberg)

Opam-publish 2.0.2

See full changelog
  • git related fixes:
    • github remote detection
    • not a git repository error
  • New option --packages-directory to indicate where package descriptions are stored

Mdx 1.5.0

See full changelog

Added

  • Add a --output/-o option to the test subcommand to allow specifying a different output file to write the corrected to, or to write it to the standard output (#194, @NathanReb)
  • Migrate to OCaml 4.08 AST to add support for let* bindings (#190, @gpetiot)
  • Add --syntax option to rule subcommand to allow generating rules for cram tests (#177, @craigfe)
  • Add a require-package label to explicitly declare dune package dependencies of a code block (#149, @Julow)
  • Add an unset- label to unset env variables in shell blocks (#132, @clecat)

Changed

  • Format rules generated by ocaml-mdx rule using dune format-dune-file (#184, @NathanReb)
  • Run promotion of markdown files before .ml files in generated dune rules (#140, @clecat)

Fixed

  • Use module_presence information on Env.summary to prevent fetching absent modules from the toplevel env (#186, @clecat)
  • Remove trailing whitespaces at the end of toplevel or bash evaluation lines (#166, @clecat)
  • Improve error reporting of ocaml-mdx test (#172, @Julow)
  • Rule: Pass the --section option to test (#176, @Julow)
  • Remove trailing whitespaces from shell outputs and toplevel evals (#166, @clecat)
  • Remove inappropriate empty lines in generated dune rules (#163, @Julow)
  • Fix ignored skip label in ocaml-mdx pp (#1561, @CraigFe)
  • Fix synchronization of new parts from markdown to .ml (#156, @Julow)
  • Fix ignored [@@@parts ...] markers within module definitions (#155, @Julow)
  • Fix a bug in internal OCaml version comparison that lead to crashes in some cases (#145, @gpetiot)
  • Promote to empty .ml file when using to-ml direction (#139, @clecat)
  • Apply --force-output to .ml file as well (#137, @clecat)
  • Fix a bug preventing .corrected files to be written in some cases (#136, @clecat)
  • Add compatibility with 4.09.0 (#133, @xclerc)

Removed

  • Remove the output subcommand as it was very specific to RealWorldOCaml needs (#195, @NathanReb)
  • Remove the infer-timestamp direction (#171 @Julow)

Merlin 3.3.3

See full changelog
  • backend
    • support OCaml 4.09 (#1055)
    • fix parse errors in 4.08 (#1037)
    • update 4.08 support to OCaml 4.08.1 (#1053)
    • support without_cmis
    • separate reading from caching in file-cache, use caching in Env.check_state_consistency (#1044)
    • simplify compiler state management (#1056, #1059)
    • fix creation of initial environment, improve compatibility with upstream 4.08 (#1052)
  • frontend
    • code re-organization (#1042)
    • error command: select which kind of errors to show (#995)
    • print value types in outline (#1014)
    • fix process handling in windows (#1005)
  • editor modes
    • emacs
      • bugfixes in merlin-imenu, merlin-xref (#1000, #1021, #1001)
      • show types in merlin-imenu (#1013)
      • reset buffer local configurations when resetting server (#1004)
      • remove merlin-use-tuareg-imenu
      • fix stack overflow (#1024)
      • fix merlin-occurrence (#1043)
    • vim
      • display warn-error warnings as errors (#1009)
  • testsuite
    • cover file-cache and check_state_consistency (#1044)
    • check inconsistent assumptions, test server versus single modes (#1047)

Ppxlib 0.10.0

See full changelog
  • Do not produce a suprious empty correction when deriving_inline expands into an extension that undergoes further expansion (#86, @aalekseyev)
  • Add Ppxlib.Quoter. This module allows to generate hygienic code fragments in the spirit of ppx_deriving. (#92, @rgrinberg)
  • Allow for registering derivers on module type declarations. (#94, fix #83, @rgrinberg)
  • Fix parsing long idenitifiers. (#98, @NathanReb)

Dune 2.0.0

On behalf of the dune team, I'm delighted to announce the release of dune 2.0. This release is the culmination of 4 months of hard work by the dune team and contains new features, bug fixes, and performance improvements . Here's a selection of new features that I personally find interesting:

  • New boostrap procedure that works in low memory environments
  • (deprecated_library_name ..) stanza to properly deprecate old library names
  • (foreign_library ..) stanza to define C/C++ libraries.
  • C stubs directly in OCaml executables

Refer to the change log for an exhaustive list.

We strive for a good out of the box experience that requires no configuration, so we've also tweaked a few defaults. In particular, $ dune build will now build @all instead of @install, and ocamlformat rules are setup by default.

Lastly, dune 2.0 sheds all the legacy related to jbuilder and will no longer build jbuilder projects. This change is necessary to ease maintenance and make it easier to add new features down the line. There are a few other minor breaking changes. Refer to the change log for the full list. We apologize in advance for any convenience this might cause.

Happy Hacking!

See full changelog
  • Remove existing destination files in install before installing the new ones. (#2885, fixes #2883, @bschommer)

  • The action field in the alias stanza is not available starting lang dune 2.0. The alias field in the rule stanza is a replacement. (#2846, fixes 2681, @rgrinberg)

  • Introduce alias and package fields to the rule stanza. This is the preferred way of attaching rules to aliases. (#2744, @rgrinberg)

  • Add field (optional) for executable stanzas (#2463, fixes #2433, @bobot)

  • Infer targets for rule stanzas expressed in long form (#2494, fixes #2469, @NathanReb)

  • Indicate the progress of the initial file tree loading (#2459, fixes #2374, @bobot)

  • Build .cm[ox] files for executables more eagerly. This speeds up builds at the cost of building unnecessary artifacts in some cases. Some of these extra artifacts can fail to built, so this is a breaking change. (#2268, @rgrinberg)

  • Do not put the <package>.install files in the source tree unless -p or --promote-install-files is passed on the command line (#2329, @jeremiedimino)

  • Compilation units of user defined executables are now mangled by default. This is done to prevent the accidental collision with library dependencies of the executable. (#2364, fixes #2292, @rgrinberg)

  • Enable (explicit_js_mode) by default. (#1941, @nojb)

  • Add an option to clear the console in-between builds with --terminal-persistence=clear-on-rebuild

  • Stop symlinking object files to main directory for stanzas defined jbuild files (#2440, @rgrinberg)

  • Library names are now validated in a strict fashion. Previously, invalid names would be allowed for unwrapped libraries (#2442, @rgrinberg)

  • mli only modules must now be explicitly declared. This was previously a warning and is now an error. (#2442, @rgrinberg)

  • Modules filtered out from the module list via the Ordered Set Language must now be actual modules. (#2442, @rgrinberg)

  • Actions which introduce targets where new targets are forbidden (e.g. preprocessing) are now an error instead of a warning. (#2442, @rgrinberg)

  • No longer install a jbuilder binary. (#2441, @jeremiedimino)

  • Stub names are no longer allowed relative paths. This was previously a warning and is now an error (#2443, @rgrinberg).

  • Define (paths ...) fields in (context ...) definitions in order to set or extend any PATH-like variable in the context environment. (#2426, @nojb)

  • The diff action will always normalize newlines before diffing. Perviousy, it would not do this normalization for rules defined in jbuild files. (#2457, @rgrinberg)

  • Modules may no longer belong to more than one stanza. This was previously allowed only in stanzas defined in jbuild files. (#2458, @rgrinberg)

  • Remove support for jbuild-ignore files. They have been replaced by the the dirs stanza in dune files. (#2456, @rgrinberg)

  • Add a new config option sandboxing_preference, the cli argument --sandbox, and the dep spec sandbox in dune language. These let the user control the level of sandboxing done by dune per rule and globally. The rule specification takes precedence. The global configuration merely specifies the default. (#2213, @aalekseyev, @jeremiedimino)

  • Remove support for old style subsystems. Dune will now emit a warning to reinstall the library with the old style subsystem. (#2480, @rgrinberg)

  • Add action (with-stdin-from ) to redirect input from when performing . (#2487, @nojb)

  • Change the automatically generated odoc index to only list public modules. This only affects unwrapped libraries (#2479, @rgrinberg)

  • Set up formatting rules by default. They can be configured through a new (formatting) stanza in dune-project (#2347, fixes #2315, @emillon)

  • Change default target from @install to @all. (#2449, fixes #1220, @rgrinberg)

  • Include building stubs in @check rules. (@rgrinberg, #2530)

  • Get rid of ad-hoc rules for guessing the version. Dune now only relies on the version written in the dune-project file and no longer read VERSION or similar files (#2541, @jeremiedimino)

  • In (diff? x y) action, require x to exist and register a dependency on that file. (#2486, @aalekseyev)

  • On Windows, an .exe suffix is no longer added implicitly to binary names that already end in .exe. Second, when resolving binary names, .opt variants are no longer chosen automatically. (#2543, @nojb)

  • Make (diff? x y) move the correction file (y) away from the build directory to promotion staging area. This makes corrections work with sandboxing and in general reduces build directory pollution. (#2486, @aalekseyev, fixes #2482)

  • c_flags, c_names and cxx_names are now supported in executable and executables stanzas. (#2562, @nojb) Note: this feature has been subsequently extended into a separate foreign_stubs field. (#2659, RFC #2650, @snowleopard)

  • Remove git integration from $ dune upgrade (#2565, @rgrinberg)

  • Add a --disable-promotion to disable all modification to the source directory. There's also a corresponding DUNE_DISABLE_PROMOTION environment variable. (#2588, fix #2568, @rgrinberg)

  • Add a forbidden_libraries field to prevent some library from being linked in an executable. This help detecting who accidently pulls in unix for instance (#2570, @jeremiedimino)

  • Fix incorrect error message when a variable is expanded in static context: %{lib:lib:..} when the library does not exist. (#2597, fix #1541, @rgrinberg)

  • Add --sections option to $ dune install to install subsections of .install files. This is useful for installing only the binaries in a workspace for example. (#2609, fixes #2554, @rgrinberg)

  • Drop support for jbuild and jbuild-ignore files (#2607, @jeremiedimino)

  • Add a dune-action-plugin library for describing dependencies direcly in the executable source. Programs that use this feature can be run by a new action (dynamic-run ...). (#2635, @staronj, @aalekseyev)

  • Stop installing the ocaml-syntax-shims binary. In order to use future_syntax, one now need to depend on the ocaml-syntax-shims package (#2654, @jeremiedimino)

  • Add support for dependencies that are re-exported. Such dependencies are marked withre_export and will automatically be provided to users of a library (#2605, @rgrinberg)

  • Add a deprecated_library_name stanza to redirect old names after a library has been renamed (#2528, @jeremiedimino)

  • Error out when a preprocessor_deps field is present but not preprocess field is. It is a warning with Dune 1.x projects (#2660, @Julow)

  • Dune will use -output-complete-exe instead of -custom when compiling self-contained bytecode executables whenever this options is available (OCaml version >= 4.10) (#2692, @nojb)

  • Add action (with-accepted-exit-codes <pred> <action>) to specify the set of successful exit codes of <action>. <pred> is specified using the predicate language. (#2699, @nojb)

  • Do not setup rules for disabled libraries (#2491, fixes #2272, @bobot)

  • Configurator: filter out empty flags from pkg-config (#2716, @AltGr)

  • no_keep_locs is a no-op for projects that use lang dune older than 2.0. In projects where the language is at least 2.0, the field is now forbidden. (#2752, fixes #2747, @rgrinberg)

  • Extend support for foreign sources and archives via the (foreign_library ...) stanza as well as the (foreign_stubs ...) and (foreign_archives ...) fields. (#2659, RFC #2650, @snowleopard)

  • Add (deprecated_package_names) field to (package) declaration in dune-project. The names declared here can be used in the (old_public_name) field of (deprecated_library_name) stanza. These names are interpreted as library names (not prefixed by a package name) and appropiate redirections are setup in their META files. This feaure is meant to migrate old libraries which do not follow Dune's convention of prefixing libraries with the package name. (#2696, @nojb)

  • The fields license, authors, maintainers, source, bug_reports, homepage, and documentation of dune-project can now be overriden on a per-package basis. (#2774, @nojb)

  • Change the default modes field of executables to (mode exe). If one wants to build a bytecode program, it now needs to be explicitly requested via (modes byte exe). (#2851, @jeremiedimino)

  • Allow ccomp_type as a variable for evaluating enabled_if. (#2855, @dra27, @rgrinberg)

  • Stricter validation of file names in select. The file names of conditional sources must match the prefix and the extension of the resultant filename. (#2867, @rgrinberg)

  • Add flag disable_dynamically_linked_foreign_archives to the workspace file. If the flag is set to true then: (i) when installing libraries, we do not install dynamic foreign archives dll*.so; (ii) when building executables in the byte mode, we statically link in foreign archives into the runtime system; (iii) we do not generate any dll*.so rules. (#2864, @snowleopard)

  • Reimplement the bootstrap procedure. The new procedure is faster and should no longer stack overflow (#2854, @dra27, @jeremiedimino)

  • Allow .opam.template files to be generated using rules (#2866, @rgrinberg)

Omp ocaml-migrate-parsetree-1.5.0

See full changelog
  • Add support for 4.10 (#86, @diml)
  • Infer file kind (interface or implementation) for binary ASTs that have no extension (#80, @aantron)
  • Add ?argv argument to Driver.run_main (#82, @aantron)

Ocamlformat 0.12

See full changelog

Changes

  • Set "conventional" as the default profile (#1060, @gpetiot). This new profile is made to better match the most used style and is encouraged. To continue using the previous default, use profile = ocamlformat in your .ocamlformat.
  • CLI: Allow both values of boolean options (#1062, @Julow). Now, both --opt and --no-opt` are available on the CLI for any boolean option "opt". Previously, only one of them were available depending on the default value.
  • Auto mode for break-string-literals (#1057, @gpetiot). wrap, newlines and newlines-and-wrap values of break-string-literals are removed. auto replaces them, it is equivalent to newlines-and-wrap.
  • Dock collection brackets (#1014, @gpetiot). after-and-docked value of break-separators is removed and is replaced by a new dock-collection-brackets option.
  • Preserve begin and end keywords in if-then-else (#978, @Julow). Previously, begin/end keywords around if-then-else branches were turned into parentheses.

New features

  • Give a hint when warning 50 is raised (#1111, @gpetiot)
  • Add a message when a config value is removed (#1089, @emillon). Explain what replaces removed options and avoid printing a parsing error.
  • Implement sequence-blank-line=preserve-one for let bindings (#1077, @Julow). Preserve a blank line after let .. in when sequence-blank-line set to preserve-one. Previously, only blank lines after ; could be preserved.
  • Parse toplevel directives (#1020, @Julow). Allow #directives in .ml files. Previously, files containing a directive needed to be parsed as "use file". The "use file" mode is removed and --use-file is now the same as --impl.
  • Don't require --name, require kind, forbid --inplace, allow --check, make --enable-outside-detected-project implicit when reading from stdin (#1018, @gpetiot)
  • Parse code in docstrings (#941, @gpetiot). Format OCaml code in cinaps-style comments (*$ code *) and code blocks in documentation comments (** {[ code ]} *).
  • Parse documentation comments with Odoc (#721, @Julow). Formatting of documentation comments is more robust and support newer Odoc syntaxes. Internally, Odoc replaces Octavius as the documentation parser.

Bug fixes

  • Fix unstabilizing comments on assignments (#1093, @gpetiot)
  • Fix the default value documentation for max-indent (#1105, @gpetiot)
  • Fix closing parenthesis exceeding the margin in function application (#1098, @Julow)
  • Missing break before attributes of Pmty_with (#1103, @jberdine)
  • Fix closing quote exceeding the margin (#1096, @Julow)
  • Fix break before the closing bracket of collections (exceeding the margin) (#1073, @gpetiot)
  • Fix precedence of Dot wrt Hash (#1058, @gpetiot)
  • Fix break in variant type definition to not exceed the margin (#1064, @gpetiot)
  • Fix newlines and indentation in toplevel extension points (#1054, @gpetiot)
  • Fix placement of doc comments around extensions (#1052, @Julow)
  • Inline extensions that do not break (#1050, @gpetiot)
  • Add missing cut before attributes in type declarations (#1051, @gpetiot)
  • Fix alignment of cases (#1046, @gpetiot)
  • Fix blank line after comments at the end of lists (#1045, @gpetiot)
  • Fix indexing operators precedence (#1039, @Julow)
  • Fix dropped comment after infix op (#1030, @gpetiot)
  • No newline if the input is empty (#1031, @gpetiot)
  • Fix unstable comments around attributes (#1029, @gpetiot)
  • Fix extra blank line in sequence (#1021, @Julow)
  • Check functor arguments when computing placement of doc comments (#1013, @Julow)
  • Fix indentation of labelled args (#1006, @gpetiot)
  • Fix linebreak between or-cases with comments when break-cases=all (#1002, @gpetiot)
  • Fix unstable unattached doc comment in records (#998, @Julow)
  • Fix string literal changed (#995, @Julow)
  • Fix type variable (#996, @Julow)
  • Fix crash on extension sequence (#992, @gpetiot)
  • Fix position of expressions regarding of comments in infix-op expressions (#986, @gpetiot)
  • Escape special characters in external declaration (#988, @Julow)
  • Fix parens around constrained expr with attrs (#987, @gpetiot)
  • Fix the margin, and correctly breaks comments (#957, @gpetiot)
  • Fix formatting of custom indexing operators (#975, @gpetiot)
  • Fix position of comments of labelled arrow types (#976, @gpetiot)
  • No box around inline odoc styles (#971, @gpetiot)
  • Fix boxing of collection expressions/patterns (#960, @gpetiot)
  • Fix crash on record expr with pack fields (#963, @Julow)
  • Fix letop in subexpr (#956, @hhugo)

Internal

  • Take file kind from --name when formatting stdin (#1119, @Julow)
  • Make Fmt.t abstract (#1109, @Julow)
  • Future-proof Fmt API in case Fmt.t goes abstract (#1106, @emillon)
  • Future-proof Fmt API in case Fmt.t goes abstract (#1106, @emillon)
  • Optional names for formatting boxes in debug output (#1083, @gpetiot)
  • Check ocamlformat error codes in the testsuite (#1084, @emillon)
  • Clean Translation_unit (#1078, @gpetiot)
  • Use dune file generation in test/passing/dune (#1082, @emillon)
  • CI: factorize tests and check reason build (#1079, @gpetiot)
  • Use short form for action in src/dune (#1076, @emillon)
  • Cleanup sequence_blank_line (#1075, @Julow)
  • CI: use a script travis-ci.sh to simplify .travis.yml (#1063, @gpetiot)
  • Remove utility functions from Fmt_ast (#1059, @gpetiot)
  • CI: use opam-2.0.5 in Travis (#1044, @XVilka)
  • CI: check the build with OCaml 4.07.1 and 4.08.0 (#1036, @Julow)
  • Use the same sets of options for both branches by default in test_branch.sh (#1033, @gpetiot)
  • Fix test_branch.sh and CI checking of CHANGES.md (#1032, #1034, @Julow)
  • Fix flag of git-worktree in test_branch.sh and bisect.sh (#1027, @gpetiot)
  • Remove the bisect_ppx dependency and clean the Makefile (#1005, @Julow)
  • Use a CHANGES.md log file again (#1023, @gpetiot)
  • Support OCaml 4.09.0 (add the odoc.1.4.2 dependency) (#1024, @gpetiot)
  • Update labels of issue templates (#1017, @gpetiot)
  • Update labels in CONTRIBUTING.md (#1007, @gpetiot)
  • Allow to ignore invalid options (#984, @hhugo). The --ignore-invalid-option flag is added to ignore invalid options in .ocamlformat files.
  • Improve the documentation of --doc-comments (#982, @Julow)
  • Remove symbolic links and change naming convention of tests (#980, @gpetiot)
  • Change the type of fmt_code (#974, @gpetiot)
  • Simplify Makefile (#973, @hhugo)
  • Dune should not be flagged as a build dep anymore (#954, @gpetiot)

Ocp-indent 1.8.1

See full changelog
  • tiny API change to help with the detection of top-level phrase boundaries
  • fixed a bug with end of comment detection in some cases (esp. related to cinaps)
  • tweaks for better indentation within cinaps comments
  • lowered priority of algebraic attributes in expressions ([@...]) to better match the actual meaning.

Dune 1.11.4

See full changelog
  • Allow to mark directories as data_only_dirs without including them as dirs (#2619, fix #2584, @rgrinberg)

  • Fix reading .install files generated with an external --build-dir. (#2638, fix #2629, @rgrinberg)

Dune-release 1.3.3

See full changelog

Fixed

  • Fix a bug where opam submit would fail if the opam files had no description (#165, @NathanReb)
  • Fix a bug where opam files could be improperly tempered with while building the distribution tarball (#168, @NathanReb)

Odoc 1.4.2

See full changelog

Bugs fixed

  • Build on OCaml 4.09 (#383, Anil Madhavapeddy).
  • Handle OCaml 4.08 type and module substitutions (#381, Jon Ludlam).
  • Parser: better trimming of leading whitespace in code blocks (#370, Jules Aguillon).
  • Parser: allow references to operators containing : characters (#384, reported Sylvain Le Gall).
  • HTML: emit <meta generator> again (#378, Daniel Bünzli).
  • CLI: odoc html-targets was ignoring deeply nested modules (#379, Daniel Bünzli).
  • Fix bad internal usage of List.iter2 (#376, Yotam Barnoy).

Ocp-indent 1.8.0

See full changelog
  • compatibility with OCaml 4.08.0 (new attributes, monadic lets...)
  • lots of smaller indentation fixes (module types, empty variants...)
  • more reliable "inplace" mode (preserving symlinks and permissions)
  • XDG compatibility (e.g. config file below ~/.config)
  • support for "cinaps" comments (indent as code comments that start with (*$)
  • API: IndentBlock.is_at_top now returns true for top-level expressions

Utop 2.4.2

See full changelog
  • Add support for OCaml 4.09.0 (@octachron @avsm, #299)

Dune 1.11.3

See full changelog
  • Fix a ppx hash collision in watch mode (#2546, fixes #2520, @diml)

Dune 1.11.2

See full changelog
  • Remove the optimisation of passing -nodynlink for executables when not necessary. It seems to be breaking things (see #2527, @diml)

  • Fix invalid library names in dune-package files. Only public names should exist in such files. (#2558, fix #2425, @rgrinberg)

Dune 1.11.1

See full changelog
  • Fix config file dependencies of ocamlformat (#2471, fixes #2464, @nojb)

  • Cleanup stale directories when using (source_tree ...) in the presence of directories with only sub-directories and no files (#2514, fixes #2499, @diml)

Utop 2.4.1

See full changelog

General

  • Remove camlp4 remnants (@XVilka, #290) (@kandu, #293)
  • Allow to statically link utop (@diml, #285) (@hongchangwu, #286)

Misc

  • Remove broken elisp (m-plamann, #292)
  • Add OCaml 4.08 build in Travis CI (XVilka, #291)

Ocamlformat 0.11.0

See full changelog
  • Improve: generalize API of Config_option (#952, @gpetiot)
  • Improve: new 'before' value for option 'sequence-style' (#947, @gpetiot)
  • Project: create issue templates (#950, @gpetiot)
  • Improve: tidying up Conf.ml (#951, @gpetiot)
  • Improve: parse code in comments (#934, @gpetiot)
  • Fix comments' placement (do not look at loc_stack) (#923, @gpetiot)
  • Doc: setting flags in .ocamlformat (#944, @gpetiot)
  • Doc: enable-outside-detected-project necessary for global conf file (#948, @gpetiot)
  • Fix hashbang handling (#946, @hhugo)
  • Improve: support Shell-style regular expressions in .ocamlformat-ignore and .ocamlformat-enable files (#937, @gpetiot)
  • Improve: force break after an infix op only if followed by another one (#935, @gpetiot)
  • Fix break-separators=after-and-docked for lists and arrays (#931, @gpetiot)
  • Improve: deprecate option break-string-literals and change its default value (#932, @gpetiot)
  • Improve: break with labeled arrow type (#933, @gpetiot)
  • Improve: disambiguate non-breaking matching structures (#857, @gpetiot)
  • Improve: warning 50 handled like an internal error (#930, @gpetiot)
  • Fix break-separators=after-and-docked for record patterns (#929, @gpetiot)
  • Fix closing parenthesis indentation when on separate line (#928, @gpetiot)
  • Improve: split the Conf.ml file (#920, @gpetiot)
  • Fix position of comments after anonymous functions (#919, @gpetiot)
  • Fix: comments around disabled block (#918, @hhugo)
  • Fix monadic bindings (new 4.08 syntax) (#911, @gpetiot)
  • Fix attribute when break-infix-before-func=false (#916, @gpetiot)
  • Improve: update ocamlformat_reason opam file to 2.0 format (#913, @avsm)
  • Fix attributes of modules (#910, @gpetiot)
  • Fix docstrings of exceptions (#909, @gpetiot)
  • Fix attribute location in Normalization (#908, @gpetiot)
  • Improve: add the 'ocamlformat-file-kind' argument to the emacs hook (#905, @gpetiot)
  • Improve: dunify testsuite (#881, @trRefis)
  • Improve: add trailing semicolon inside record when break-separators=after-and-docked (#899, @gpetiot)
  • Fix compilation with 4.06 and 4.07 (#898, @gpetiot)
  • Improve: add a new way to indicate multiline delimiters (#876, @trefis)
  • Fix inconsistency of break-separators=after-and-docked for record expressions (#856, @gpetiot)

Ppxlib 0.9.0

See full changelog
  • Bump AST to 4.08 (#80, @xclerc)

Dune 1.11.0

On behalf of the dune team, I'm pleased to announce the release of dune 1.11.0. This release contains quite a few new interesting features such as custom dialects: anyone can define their own OCaml based syntax. Is anyone up to revive the revised syntax? :slight_smile: I'd also like to highlight the the re-launch of variants feature in a sounder form, a new build-info library that queries build information, and that dune init can initialize an entire project. But of course, by far the most important thing is that the compiler's colours are now back :champagne:

See full changelog
  • Don't select all local implementations in dune utop. Instead, let the default implementation selection do its job. (#2327, fixes #2323, @TheLortex, review by @rgrinberg)

  • Check that selected implementations (either by variants or default implementations) are indeed implementations. (#2328, @TheLortex, review by @rgrinberg)

  • Don't reserve the Ppx toplevel module name for ppx rewriters (#2242, @jeremiedimino)

  • Redesign of the library variant feature according to the #2134 proposal. The set of variants is now computed when the virtual library is installed. Introducing a new external_variant stanza. (#2169, fixes #2134, @TheLortex, review by @jeremiedimino)

  • Add proper line directives when copying .cc and .cxx sources (#2275, @rgrinberg)

  • Fix error message for missing C++ sources. The .cc extension was always ignored before. (#2275, @rgrinberg)

  • Add $ dune init project subcommand to create project boilerplate according to a common template. (#2185, fixes #159, @shonfeder)

  • Allow to run inline tests in javascript with nodejs (#2266, @hhugo)

  • Build ppx.exe as compiling host binary. (#2286, fixes #2252, @toots, review by @rgrinberg and @jeremiedimino)

  • Add a cinaps extension and stanza for better integration with the cinaps tool tool (#2269, @jeremiedimino)

  • Allow to embed build info in executables such as version and list and version of statically linked libraries (#2224, @jeremiedimino)

  • Set version in META and dune-package files to the one read from the vcs when no other version is available (#2224, @jeremiedimino)

  • Add a variable %{target} to be used in situations where the context requires at most one word, so %{targets} can be confusing; stdout redirections and "-o" arguments of various tools are the main use case; also, introduce a separate field target that must be used instead of targets in those situations. (#2341, @aalekseyev)

  • Fix dependency graph of wrapped_compat modules. Previously, the dependency on the user written entry module was omitted. (#2305, @rgrinberg)

  • Allow to promote executables built with an executable stanza (#2379, @jeremiedimino)

  • When instantiating an implementation with a variant, make sure it matches virtual library's list of known implementations. (#2361, fixes #2322, @TheLortex, review by @rgrinberg)

  • Add a variable %{ignoring_promoted_rules} that is true when --ingore-promoted-rules is passed on the command line and false otherwise (#2382, @jeremiedimino)

  • Fix a bug in future_syntax where the characters @ and & were not distinguished in the names of binding operators (let@ was the same as let&) (#2376, @aalekseyev, @jeremiedimino)

  • Workspaces with non unique project names are now supported. (#2377, fix #2325, @rgrinberg)

  • Improve opam generation to include the dune dependencies with the minimum constraint set based on the dune language version specified in the dune-project file. (2383, @avsm)

  • The order of fields in the generated opam file now follows order preferred in opam-lib. (@avsm, #2380)

  • Fix coloring of error messages from the compiler (@jeremiedimino, #2384)

  • Add warning 66 to default set of warnings starting for dune projects with language verison >= 1.11 (@rgrinberg, @jeremiedimino, fixes #2299)

  • Add (dialect ...) stanza (@nojb, #2404)

  • Add a --context argument to dune install/uninstall (@jeremiedimino, #2412)

  • Do not warn about merlin files pre 1.9. This warning can only be disabled in 1.9 (#2421, fixes #2399, @emillon)

  • Add a new inline_tests field in the env stanza to control inline_tests framework with a variable (#2313, @mlasson, original idea by @jeremiedimino, review by @rgrinberg).

  • New binary kind js for executables in order to explicitly enable Javascript targets, and a switch (explicit_js_mode) to require this mode in order to declare JS targets corresponding to executables. (#1941, @nojb)

Ppxlib 0.8.1

See full changelog
  • Report errors according to the value of OCAML_ERROR_STYLE and OCAML_COLOR in the standalone driver (#83, @NathanReb)

Merlin 3.3.2

See full changelog
  • backend
    • ** globbing in .merlin won't look into hidden directories (starting with a '.') (by Daniel Bünzli, #990)
    • fallback to "/dev/null" configuration for findlib
    • better 4.08 support:
      • support for letop (let+, and+, ...) (#986)
      • fix parsing recovery for 4.08 constructions (#987)
      • catch an exception raised by 4.08 Printtyp trying to rename a persistent identifier (#991)
    • locate: treat local locations differently from external locations (coming from a cmi), this fixes "jump to definition" on mutually recursive bindings (#984)
    • when completing an infix operator in a sub-module, wrap with () (#992)
    • disable arity checks on externals (for Bucklescript compatibility)
    • remove parser preprocessing (simplify compilation for OCaml < 4.08) (#997)
  • editor modes
    • emacs
      • fix position computation in presence of tabs or multi-byte characters (#981)
      • log arguments in "merlin-debug-last-commands" (#981)
    • vim
      • install reason.vim file (by Hezekiah M. Carty, #974)

Dune-release 1.3.2

See full changelog

Fixed

  • Fix a bug where file presence lint check wouldn't be run for CHANGES, LICENSE and README (#161, @NathanReb)

Changed

  • Add headers to better distinguish various dune-release logs such as user prompts and informational logs

opam 2.0.5 release

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

This new version contains build update and small fixes:

Note: To homogenise macOS name on system detection, we decided to keep macos, and convert darwin to macos in opam. For the moment, to not break jobs & CIs, we keep uploading darwin & macos binaries, but from the 2.1.0 release, only macos ones will be kept.


Installation instructions (unchanged):

  1. From binaries: run

    sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
    

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

  2. From source, using opam:

    opam update; opam install opam-devel
    

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

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

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

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

Omp ocaml-migrate-parsetree-1.4.0

See full changelog
  • Initial support for 4.09, tested with 4.09+beta1 (#76, @hhugo)
  • When encoding errors into the AST, duplicate the error message for "ocaml.error" nodes for OCaml versions < 4.08 (#75, @xclerc)

Ocamlformat 0.10

See full changelog
  • Improve: align cases horizontally (#883, @gpetiot)
  • Improve: option exp-grouping (#828, @gpetiot)
  • Improve: synchronize Format with upstream stdlib (#885, @gpetiot)
  • Improve: break-string-literals=newlines-and-wrap (#896, @gpetiot)
  • Improve: specify break hint in fits_breaks (#894, @gpetiot)
  • Improve: option break-before-in (#892, @gpetiot)
  • Fix break-string-literals=newlines (#887, @gpetiot)
  • Improve: Implement break-fun-sig without Location.is_single_line (#886, @Julow)
  • Format gen_version.ml (#893, @hhugo)
  • Improve: switch to ast 4.08 (#831, @hhugo)
  • Fix formatting of arguments when break-fun-decl=fit-or-vertical (#884, @gpetiot)
  • Test: extend max_indent test (#878, @trefis)
  • Test: break_cases_normal_indent.ml is a symlink on break_cases_fit.ml (#879, @gpetiot)
  • Improve unicode text length computation (#816, @gpetiot)
  • Add an option to control the indentation of nested matches (#870, @trefis)
  • Fix: properly interpret indicate-multiline-delimiters for if-then-elses (#874, @trefis)
  • Enable warning 9 (#875, @hhugo)
  • Fix unstable comment in let%ext (#873, @gpetiot)
  • Improve: option max-indent (#841, @gpetiot)
  • Improve: option nested-match=align (#827, @gpetiot)
  • Fix dropped attributes in with_constraints (#846, @gpetiot)
  • Fix dropped comments in list patterns and module types (#866, @gpetiot)
  • Fix comment dropped in object (#849, @gpetiot)
  • Fix inconsistency of break-separators for wildcards in match cases (#855, @gpetiot)
  • Improve: new options to support 'with' and 'strict_with' (ocp-indent) (#853, @gpetiot)
  • Improve: .ocamlformat-enable files listing files to format when ocamlformat is disabled (#854, @gpetiot)
  • Check that all locations have been considered during formatting (#864, @hhugo)
  • clean Hashtbl.Poly (#862, @hhugo)
  • Fix: test.sh (#858, @hhugo)
  • cleanup Cmts.ml (#861, @hhugo)
  • Clean: Cleanup usage of Poly (#860, @hhugo)
  • Fix: rename sexp_list into list (#859, @hhugo)
  • Fix vim instructions (#852, @naartjie)
  • Improve: options extension-indent and stritem-extension-indent (#840, @gpetiot)
  • Fix comment dropped in field alias (#848, @gpetiot)
  • Fix pro position for with_constraints (#847, @gpetiot)
  • Improve: finer space-around-exp options (#837, @gpetiot)
  • Improve: preserve blank lines in conventional and sparse profiles (#838, @gpetiot)
  • Improve: don't fit tag-only comments after val declarations (#836, @Julow)
  • Improve speed with ofday_unit_tests_v1.ml (#833, @hhugo)
  • Fix exception when calling String.sub (#832, @gpetiot)
  • Improve: implement doc-comments and doc-comments-tag-only for every items (#746, @Julow)
  • Improve: Add field-space=tight-decl (#829, @Julow)
  • Improve: make Sugar.list_exp and Sugar.list_pat tail-recursive (#823, @gpetiot)
  • Improve: options 'let-binding-indent', 'type-decl-indent' and 'indent-after-in' (#822, @gpetiot)
  • Fix: performance issue with deep asts (#826, @hhugo)
  • Improve: preserve blank lines in sequences (#814, @gpetiot)
  • Improve: tidying Fmt_ast.ml (#821, @gpetiot)
  • Improve: space before type constraint in record (#819, @gpetiot)
  • Improve: break-cases=fit-or-vertical (#820, @gpetiot)
  • Improve: remove break before ending paren for anonymous functions (#818, @gpetiot)
  • Improve: preserve the position of type annotation in bindings (#815, @gpetiot)
  • Improve: preserve record type annot (#812, @gpetiot)
  • Fix break before ending paren (#801, @gpetiot)
  • Improve: better consistency between structures and signatures (#803, @gpetiot)
  • Fix let module sparse (sparse mode only for module applications) (#809, @gpetiot)
  • Improve: change formatting of newtypes (#811, @gpetiot)
  • Improve: break-cases-all shouldn't break nested patterns (#810, @gpetiot)
  • Fix: sugarized extensions (#805, @gpetiot)
  • Improve: tidying Fmt_ast (#808, @gpetiot)
  • Fix cmt in empty structure (#804, @gpetiot)
  • Remove dead link to preset profiles (#806, @andschwa)
  • Improve: break with type constraints (#797, @gpetiot)
  • Fix colon break module type functor (#802, @gpetiot)
  • Improve: K&R style for if-then-else (#787, @gpetiot)
  • Improve: new option break-fun-sig (#785, @gpetiot)
  • Improve: indentation consistency of '<-' and := (#780, @gpetiot)
  • Fix: functor application and break-struct wrap incorrectly (#786, @gpetiot)
  • Break after anonymous function arrow after infix op (#781, @gpetiot)
  • Fix: type extension (#782, @gpetiot)
  • Improve: Fmt.noop (#784, @gpetiot)
  • Fix extension of value binding (#779, @chrismamo1)
  • Improve: less sensitivity to concrete syntax (#767, @gpetiot)
  • Fix missing space before attribute on includes (#775, @Julow)
  • Improve: new option let-module (#768, @gpetiot)
  • Improve: --disable-outside-detected-project is set by default (#761, @gpetiot)
  • Fix weird parens break (#751, @gpetiot)
  • Fix: if $XDG_CONFIG_HOME is either not set or empty, use $HOME/.config (#758, @gpetiot)
  • Fix: --use-file/--impl/--intf should override file extension (#774, @gpetiot)
  • Improve: less breaks for break-cases=all but correctly breaks or-patterns (#762, @gpetiot)
  • Remove unecessary break on module pack constraints with with-constraints (#739, @Julow)
  • Fix inconsistent break before module signature (#755, @gpetiot)
  • Fix indentation of functor argument (#773, @gpetiot)
  • Tidying fmt ast (#748, @gpetiot)
  • Fix nested parens with no break infix before func (#760, @gpetiot)
  • Provide an mli for Compat (#772) (hhugo) -Fix non-wrapping asterisk prefixed cmts (#759, @gpetiot)
  • Support for OCaml 4.08 (#763, @hhugo)
  • Fix module type functor (#716, @gpetiot)
  • Small cleanup (#764, @hhugo)
  • Fix: update ocamlformat-help.txt (follow up on #752) (#756, @gpetiot)
  • Fix module pack and functor (#735, @Julow)
  • Fix grammar: it's -> its (@anmonteiro)
  • Improve: support --name with --inplace (#740, @jberdine)
  • Fix: dropped comments for pexp_record (#743, @hhugo)
  • Improve: comments arround attributes, fix #726 (#742, @hhugo)
  • Update README for new profiles (#738, @jberdine)
  • Remove deprecated 'default' profile (#736, @jberdine)
  • Fix extra parens around ext match (#733, @gpetiot)
  • Improve: factorize with compose_module (#729, @gpetiot)
  • Test: exclude gen_version.ml from test (#732, @jberdine)
  • Improve: make gen_version an ocaml script (#664, @hhugo)

Odoc 1.4.1

See full changelog

Bugs fixed

  • Messy formatting in large definitions due to lack of <span>s (#360, Thomas Refis).
  • Missing table of contents on .mld pages (#361, Rizo Isrof).
  • Missing space before polymorphic class names (#339, Kevin Ji).
  • Module type definitions printed with : instead of = (#344, Geoff Reedy).
  • Conjunctive types printed with * instead of & (#353, Florian Angeletti).
  • Type extensions (+=) printed without CSS classes found in other items (#348, reported Stéphane Lavergne).
  • High memory usage on large codebases (#361, Thomas Refis).
  • Build: double underscores in internal filenames (#357, Thomas Refis).
  • Development: test suite assumed that html5-tidy supports --mute (#345, Geoff Reedy).
  • Internal: refactored AST (#351, #364, Jules Aguillon).

Ocamlformat 0.9.1

See full changelog
  • Small cleanup (#764, @hhugo)
  • Support for OCaml 4.08 (#763, @hhugo)

Merlin 3.3.1

See full changelog
  • backend
    • catch findlib initialization failures and keep going on

Mdx 1.4.0

See full changelog
  • Add --force-output option to force generation of diff file (#118 @clecat)
  • Support OCaml 4.08.0 (#121 @xclerc)
  • README and documentation fixes (#122 #118 @andreypopp @clecat @samoht)
  • Use latest ocaml-migrate-parsetree interfaces (@avsm)

Dune-release 1.3.1

See full changelog
  • Fix a bug in documentation publication where under certain circumstances the doc would be published in a _html folder instead of being published at the root of gh-pages (#157, @NathanReb)

Dune 1.10.0

On behalf of the dune team, I'm pleased to announce the 1.10.0 release of dune. This release is packed with bug fixes, but it also introduces a few interesting features. I'll highlight one important feature that we've introduced and plan to improve in future versions:

Dune allows you to specify package metadata in the dune project file and generate an appropriate opam file. This is advantageous to writing opam files manually as dune will correctly fill in some boilerplate such as the build command:

Here's a snippet from dune's own project file as a demonstration:

(generate_opam_files true) ;; necessary to enbale the generation

(license MIT)
(maintainers "Jane Street Group, LLC <opensource@janestreet.com>")
(authors "Jane Street Group, LLC <opensource@janestreet.com>")
(source (github ocaml/dune))
(documentation "https://dune.readthedocs.io/")

(package
 (name dune)
 (depends
  (ocaml (>= 4.02))
  base-unix
  base-threads)
 (conflicts
  (jbuilder (<> "transition"))
  (odoc (< 1.3.0))
  (dune-release (< 1.3.0)))
 (synopsis "Fast, portable and opinionated build system")
 (description "<redacted>"))

Generating the opam file is done via $ dune build @check (the @install, and @all aliases will also work).

Later, we plan to have dune do some sanity checks on the depends field. In the more distant future, we might even skip the generation step altogether by having opam invoke dune to get the generated opam file directly.

See full changelog
  • Restricted the set of variables available for expansion in the destination filename of install stanza to simplify implementation and avoid dependency cycles. (#2073, @aalekseyev, @jeremiedimino)

  • [menhir] call menhir from context root build_dir (#2067, @ejgallego, review by @jeremiedimino, @rgrinberg)

  • [coq] Add coq.pp stanza to help with pre-processing of grammar files (#2054, @ejgallego, review by @rgrinberg)

  • Add a new more generic form for the promote mode: (promote (until-clean) (into <dir>)) (#2068, @jeremiedimino)

  • Allow to promote only a subset of the targets via (promote (only <pred>)). For instance: (promote (only *.mli)) (#2068, @jeremiedimino)

  • Improve the behavior when a strict subset of the targets of a rule is already in the source tree for projects using the dune language < 1.10 (#2068, fixes #2061, @jeremiedimino)

  • With lang dune >= 1.10, rules in standard mode are no longer allowed to produce targets that are present in the source tree. This has been a warning for long enough (#2068, @jeremiedimino)

  • Allow %{...} variables in pps flags (#2076, @mlasson review by @jeremiedimino and @aalekseyev).

  • Add a 'cookies' option to ppx_rewriter/deriver flags in library stanzas. This allow to specify cookie requests from variables expanded at each invocation of the preprocessor. (#2106, @mlasson @jeremiedimino)

  • Add more opam metadata and use it to generate .opam files. In particular, a package field has been added to specify package specific information. (#2017, #2091, @avsm, @jonludlam, @rgrinberg)

  • Clean up the special support for findlib.dynload. Before, Dune would simply match on the library name. Now, we only match on the findlib package name when the library doesn't come from Dune. Someone writing a library called findlib.dynload with Dune would have to add (special_builtin_support findlib_dynload) to trigger the special behavior. (#2115, @jeremiedimino)

  • Install the future_syntax preprocessor as ocaml-syntax-shims.exe (#2125, @rgrinberg)

  • Hide full command on errors and warnings in development and show them in CI. (detected using the CI environment variable). Commands for which the invocation might be omitted must output an error prefixed with File . Add an --always-show-command-line option to disable this behavior and always show the full command. (#2120, fixes #1733, @rgrinberg)

  • In dune-workspace files, add the ability to choose the host context and to create duplicates of the default context with different settings. (#2098, @TheLortex, review by @jeremiedimino, @rgrinberg and @aalekseyev)

  • Add support for hg in dune subst (#2135, @jeremiedimino)

  • Don't build documentation for implementations of virtual libraries (#2141, fixes #2138, @jonludlam)

  • Fix generation of the -pp flag in .merlin (#2142, @rgrinberg)

  • Make dune subst add a (version ...) field to the dune-project file (#2148, @jeremiedimino)

  • Add the %{os_type} variable, which is a short-hand for %{ocaml-config:os_type} (#1764, @jeremiedimino)

  • Allow enabled_if fields in library stanzas, restricted to the %{os_type}, %{model}, %{architecture}, %{system} variables (#1764, #2164 @jeremiedimino, @rgrinberg)

  • Fix chdir on external and source paths. Dune will also fail gracefully if the external or source path does not exist (#2165, fixes #2158, @rgrinberg)

  • Support the .cc extension fro C++ sources (#2195, fixes #83, @rgrinberg)

  • Run ocamlformat relative to the context root. This improves the locations of errors. (#2196, fixes #1370, @rgrinberg)

  • Fix detection of README, LICENSE, CHANGE, and HISTORY files. These would be undetected whenever the project was nested in another workspace. (#2194, @rgrinberg)

  • Fix generation of .merlin whenever there's more than one stanza with the same ppx preprocessing specification (#2209 ,fixes #2206, @rgrinberg)

  • Fix generation of .merlin in the presence of the copy_files stanza and preprocessing specifications of other stanazs. (#2211, fixes #2206, @rgrinberg)

  • Run refmt from the context's root directory. This improves error messages in case of syntax errors. (#2223, @rgrinberg)

  • In .merlin files, don't pass -dump-ast to the future_syntax preprocessor. Merlin doesn't seem to like it when binary AST is generated by a -pp preprocessor. (#2236, @aalekseyev)

  • dune install will verify that all files mentioned in all .install files exist before trying to install anything. This prevents partial installation of packages (#2230, @rgrinberg)

Merlin 3.3.0

Special thanks to Rudi Grinberg for helping us in reviewing and merging pull-requests.

See full changelog
  • backend

    • interpret -pp flag
    • backtrack warnings in all versions, not just 4.06
    • silence C compiler warnings (by David Allsopp and Bernhard Schommer)
    • remove sturgeon support
    • allow to select sections to log
    • better error message on ocaml version mismatch
    • locate:
      • handle functors and functor applications
      • do not use the location coming from the environment
    • tweaked caching policy
    • fix environment when a file disappears
    • fix -short-paths handling of classes and class types (by Leo White)
    • don't select deprecated paths in -short-paths (by Leo White)
    • return type info in outline query (by Andrey Popp)
    • properly handle new lines in the lexer
    • better tracking of errors reported by the parser and by preprocessors
    • add support for OCaml 4.08
    • tweaked the recovery strategy in presence of syntax errors
    • timing information in replies now includes wall clock time.
    • dump command can new dump the parsetree post preprocessing
  • editors modes

    • emacs

      • fix merlin-xref.el install (by Emilio Jesus Gallego Arias)
      • keep labels matching the prefix the user has typed rather than dropping them (by Mitchell Plamann)
      • remove unused merlin--overlay function (by Wilfred Hughes)
      • show the number of errors in the modline (by Wilfred Hughes)
      • call a logger on the client side if one is defined
      • allow user to disable completion inside comments and strings
      • show errors and types even when buffer is narrowed (by Wilfred Hughes)
      • make sure PATH is updated when merlin-command is 'opam
    • vim

      • better FindBinary
      • make the log buffer a scratch buffer (by Tom Johnson)
      • execute buffer switching silently (by Fabian)
      • restore view after updating merlin type buffer (by Fabian)
  • testsuite

    • Switched to mdx with cram syntax.

Dune-release 1.3.0

See full changelog
  • Add confirmation prompts in some commands. (#144, #146, @NathanReb)
  • Use github returned archive URL instead of guessing it. Fixes a bug when releasing a version with URL incompatible characters to github. (#143, @NathanReb)
  • Add logs to better describe commands behaviour. (#141, #137, #135, #150, #153, @NathanReb)
  • Fix a bug when publishing documentation to a repo for the first time (#136, @NathanReb)
  • Allow to submit package to a different opam-repository hosted on github. (#140, #152, @NathanReb)
  • Use dune subst for watermarking. (#147, @NathanReb)
  • Fix linting step so it checks for CHANGES, LICENSE and README again

Ppxlib 0.7.0

See full changelog

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

Ppxlib 0.8.0

See full changelog

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

Utop 2.4.0

See full changelog

General

  • Better support for wide and combined glyph (@kandu)
  • Added tips for simpe prompt without fancy features (Marshall Abrams, #279)
  • Correct quoting for Windows command shell (Dmitry Bely, #272)

Additions

  • 4.08 compatibility (#284)
  • module UTop: add get_load_path and set_load_path to manage the include directories (#284)

Breaking

  • module UTop: val load_path : string list ref is removed (#284)

Omp ocaml-migrate-parsetree-1.3.1

See full changelog
  • Make sure opening Ast_408 doesn't shadow Int or Misc (#71, @hhugo)
  • Fix a couple of issues related to upgrading the AST from 4.07 to 4.08 (#71, @hhugo)

Dune 1.9.2

See full changelog
  • Put back library variants in development mode. We discovered a serious unexpected issue and we might need to adjust the design of this feature before we are ready to commit to a final version. Users will need to write (using library_variants 0.1) in their dune-project file if they want to use it before the design is finalized. (#2116, @diml)

  • Forbid to attach a variant to a library that implements a virtual library outside the current project (#2104, @rgrinberg)

  • Fix a bug where dune install would install man pages to incorrect paths when compared to opam-installer. For example dune now installs (foo.1 as man1/foo.1) correctly and previously that was installed to man1/man1/foo.1. (#2105, @aalekseyev)

  • Do not fail when a findlib directory doesn't exist (#2101, fix #2099, @diml)

  • [coq] Rename (coqlib ...) to (coq.theory ...), support for coqlib will be dropped in the 1.0 version of the Coq language (#2055, @ejgallego)

  • Fix crash when calculating library dependency closure (#2090, fixes #2085, @rgrinberg)

  • Clean up the special support for findlib.dynload. Before, Dune would simply match on the library name. Now, we only match on the findlib package name when the library doesn't come from Dune. Someone writing a library called findlib.dynload with Dune would have to add (special_builton_support findlib_dynload) to trigger the special behavior. (#2115, @diml)

  • Include permissions in the digest of targets and dependencies (#2121, fix #1426, @rgrinberg, @xclerc)

Dune 1.9.3

See full changelog
  • Fix .install files not being generated (#2124, fixes #2123, @rgrinberg)

Omp ocaml-migrate-parsetree-1.3.0

See full changelog
  • Get rid of the ocamlbuild plugin. Nobody is using it in opam and it is more work to maintain (#63, @diml)
  • Set Location.input_name to the original filename when reading a binary AST (#66, @diml)
  • Add support 4.08 (#70, @xclerc)

Ppxlib 0.6.0

See full changelog
  • Set Location.input_name to the original filename when reading a binary AST (#.., @diml)

Dune 1.9.1

See full changelog
  • Fix invocation of odoc to add previously missing include paths, impacting mld files that are not in directories containing libraries (#2016, fixes #2007, @jonludlam)

opam 2.0.4 release

We are pleased to announce the release of opam 2.0.4.

This new version contains some backported fixes:

  • Sandboxing on macOS: considering the possibility that TMPDIR is unset [#3597 @herbelin - fix #3576]
  • display: Fix opam config var display, aligned on opam config list [#3723 @rjbou - rel. #3717]
  • pin:
    • update source of (version) pinned directory [#3726 @rjbou - #3651]
    • fix --ignore-pin-depends with autopin [#3736 @AltGr]
    • fix pinnings not installing/upgrading already pinned packages (introduced in 2.0.2) [#3800 @AltGr]
  • opam clean: Ignore errors trying to remove directories [#3732 @kit-ty-kate]
  • remove wrong "mismatched extra-files" warning [