OCaml Changelog

RSS

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

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)

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

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)

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

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)

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

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)

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

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

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

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)

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)

opam 2.1.2

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

This opam release consists of backported fixes, including:

  • Fallback on dnf if yum does not exist on RHEL-based systems (#4825)
  • Use --no-depexts in CLI 2.0 mode. This further improves the use of opam 2.1 as a drop-in replacement for opam 2.0 in CI, for example with setup-ocaml in GitHub Actions. (#4908)

Opam installation instructions (unchanged):

  1. From binaries: run

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

    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
  • Fallback on dnf if yum does not exist on RHEL-based systems [#4825 @kit-ty-kate]
  • Use --no-depexts in CLI 2.0 mode [#4908 @dra27]
  • bootstrap: update ocaml version (fixes the compilation of opam with mingw) [#4927 @kit-ty-kate]
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)
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 occurrences 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)
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.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://opam.ocaml.org/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]

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://opam.ocaml.org/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]
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)
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)
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)

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)

Feedback on this post is welcomed on Discuss!

We are happy to announce the release of opam 2.1.0.

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

What's New in opam 2.1?

  • Integration of system dependencies (formerly the opam-depext plugin), increasing their reliability as it integrates the solving step
  • Creation of lock files for reproducible installations (formerly the opam-lock plugin)
  • Switch invariants, replacing the "base packages" in opam 2.0 and allowing for easier compiler upgrades
  • Improved options configuration (see the new option and expanded var subcommands)
  • CLI versioning, allowing cleaner deprecations for opam now and also improvements to semantics in future without breaking backwards-compatibility
  • opam root readability by newer and older versions, even if the format changed
  • Performance improvements to opam-update, conflict messages, and many other areas

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

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

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

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

opam Lock Files and Reproducibility

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

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

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

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

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

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

Switch Invariants

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

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

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

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

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

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

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

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

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

Configuring opam From the Command Line

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

For example:

  • opam option download-jobs gives the global download-jobs value (as it exists only in global configuration)
  • opam option jobs=6 --global will set the number of parallel build jobs opam is allowed to run (along with the associated jobs variable)
  • opam option depext-run-commands=false disables the use of sudo for handling system dependencies. It will be replaced by a prompt to run the installation commands
  • opam option depext-bypass=m4 --global bypasses m4 system package check globally, while opam option depext-bypass=m4 --switch myswitch will only bypass it in the selected switch.

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

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

CLI Versioning

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

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

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

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

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

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

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

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

There's even more detail on this feature in our wiki. We're hoping that this feature will make it much easier in future releases for opam to make required changes and improvements to the CLI without breaking existing setups and tools.

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

opam root Portability

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

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

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

Try It!

In case you plan a possible rollback, you may want to first backup your ~/.opam directory.

The upgrade instructions are unchanged:

  1. Either from binaries: run

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

    or download manually from the GitHub "Releases" page to your PATH.

  2. Or from source, manually: see the instructions in the README.

You should then run:

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

Feedback on this post is welcomed on Discuss!

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

This new version contains some back-ported fixes.

New features

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

Bug fixes

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

Installation instructions (unchanged):

  1. From binaries: run

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

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

  2. From source, using opam:

    opam update; opam install opam-devel
    

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

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

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

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