Dune 3.23.0

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

Along with many other fixes and improvements, some highlights include:

  • Add support for c_library_flags in foreign_stubs (#13484, @madroach)
  • Many improvements to the promotion and diffing functionality, by @rgrinberg.
  • As part of the previous, a breaking change to the promotion logic has been introduced: Dune does not automatically promote generated opam files, which must now be manually promoted with dune promote. You can trigger building .opam files with the @install, @runtest, and @opam aliases. In release mode, .opam files aren't generated at all and whatever is in the source is used (ocaml/dune#14108, @rgrinberg).
  • User rules and inline test runners are now sandboxed by default (ocaml/dune#13805 and ocaml/dune#14257, @rgrinberg).
  • The minimum OCaml version required to build dune is now 4.14.

See the full changelog for all new features and fixes, and for attribution to the contributors who made it all possible. Thank you, contributors!

If you encounter a problem with this release, please report it in our issue tracker.

See full changelog

Fixed

  • Auto-inject "menhir" {>= "20180523"} into generated opam files when the menhir extension is used. Dune's menhir rules rely on --infer-write-query and --infer-read-reply, which require at least this version; without the lower bound, builds fail with older menhir installations. (#10707, @robinbb)
  • Fix --display=quiet not suppressing "Entering directory" and "Leaving directory" messages when using --root. These messages are now deferred until there is actual output, so silent builds produce no noise. (#12974, fixes #12854, @Alizter)
  • Fix an internal error when a module is shared between a rocq.theory and rocq.extraction stanza. The error now includes a hint pointing to the conflicting stanza. (#13733, @Durbatuluk1701)
  • Fix cookies defined on ppx_rewriter being lost when that rewriter was used as a dependency of another ppx_rewriter. (#13737, fixes #3426, @Alizter)
  • Improve opam file generation for packages that set (dir ..). Such packages will now have a test target that is limited to this directory. (#13778, @rgrinberg)
  • Stop duplicating dune diagnostics to subscribers over RPC (#13816, @rgrinberg)
  • Fix dependency cycle when using the package with a library conditionally enabled via enabled_if. (#13833, @toots)
  • Fix underspecification of dependencies in the sandbox for modules with interfaces. (#13842, @anmonteiro)
  • Honor sandbox settings specified inside (:include ..) expressions in the deps field (#13898, @rgrinberg)
  • Fix dune pkg lock failing when a pin stanza contains a file:// URL with a relative path outside the workspace (#13915, fixes #10254, @shunueda)
  • Use all stat attributes to detect patch back source tree changes (#13986, @rgrinberg)
  • Use device and inode number for invalidating cached digests (#13991, @rgrinberg)
  • Stop trying to set SO_REUSEADDR on unix sockets when setting up dune rpc (#14056, @rgrinberg)
  • Fix autolocking to correctly detect changes to (depends) in watch mode (#14066, fixes #13234, @Alizter)
  • Fix incremental builds for libraries using (wrapped (transition ...)). The compat shim modules were never recompiled when the inner module's interface changed, causing "inconsistent assumptions" errors. (#14090, fixes #14089, @Alizter)
  • Fix Rocq configuration detection to use rocq c --config subcommand instead of rocq --config (#14093, fixes #13774, @Durbatuluk1701)
  • Bump dune rpc's request pending request limit 10 to 100 (#14094, @rginberg)
  • Invalidate stale cached digests in all build commands (#14126, @rgrinberg)
  • Fix root_module generating duplicate module definitions when a findlib sub-package shares a directory with its parent (e.g., logs.lwt alongside logs). (#14135, fixes #6148, @robinbb)
  • Fix dune subst prepending a duplicate version: field to opam files that already contain one, instead of replacing it in place. (#14136, fixes #878, @robinbb)
  • Fix @ocaml-index alias being generated for all contexts, causing build errors in multi-context workspaces where some libraries are disabled in non-default contexts. The alias is now only generated for the merlin context. (#14137, fixes #12007, @robinbb)
  • Remove the warning about the deprecation of the coq stanza for dune lang before 3.21 since it has been introduced in this version (#14187, @bobot)
  • $ dune init now generates projects with correct .opam files (#14192, @rgrinberg)
  • Send SIGTERM before SIGKILL when cancelling child processes in watch mode, giving cleanup handlers a chance to run before escalating. (#14224, #14170, fixes #2445, @robinbb)
  • Correctly specify dependencies for generate_runner in inline tests (#14276, @rgrinberg)
  • Fix duplicate dune version bounds in generated opam files. When users declare (dune (>= X.Y)) matching or exceeding the (lang dune X.Y) version, the generated opam depends no longer contains redundant constraints like {>= "2.7" & >= "2.7"}. (#3916, #11106, @robinbb)
  • Fix inline tests not being executed for byte-only libraries. When a library has (modes byte), the inline test runner is now linked in byte mode so the library's test code is included. (#9757, @robinbb)

Added

  • Add support for c_library_flags in foreign_stubs (#13484, @madroach)
  • Move the management of Jsoo config details out of dune (#13613, @vouillon)
  • Js_of_ocaml: share standalone runtimes (#13621, @vouillon)
  • Allow multiple (dirs ..) stanzas in the same Dune file. Starting with (lang dune 3.23), Dune takes the union of the specified directories (#13734, fixes #6249, @anmonteiro)
  • Sandboxed rules are now allowed to produce diff promotions when (corrections produce) is set on the rules. Whenever such an action produces foo.corrected, it will be automatically registered as a promotion for foo (#13813, @rgrinberg)
  • $ dune clean now accepts arguments to only remove certain targets from the _build directory (#13875, @rgrinberg)
  • $ dune promote now promotes all paths that are a prefix of the path provided. For example, $ dune promote foo will promote foo, foo/bar, foo/bar/baz (but not foobar). (#13876, @rgrinberg)
  • Allow for the diff action to diff entire directories (#13880, fixes #3567, @rgrinberg)
  • A hint is now emitted when trying to build a target inside a directory that was excluded by a (dirs ...) stanza (#13919, @mefyl).
  • Add --debug-backtraces to $ dune {promote,trace,cache} (#13933, @rgrinberg)
  • Actions are now able to observe their project directory via DUNE_PROJECT_ROOT (#13934, @rgrinberg)
  • Support hardlink sandboxing on Windows. (#13987, addresses part of #4362, @Alizter)
  • rocq.extraction: Add extracted_files field in (rocq 0.13), replacing extracted_modules, supporting extraction to languages other than OCaml (#13997, @Durbatuluk1701).
  • Infer source directories as dependencies when they're as reference directories in diff actions.
  • Add trace events for build start/stop/restarts (#14163, #14166, @rgrinberg)
  • Generate compile_commands.json for C/C++ foreign stubs when building @check with (lang dune 3.23). This enables clangd, ccls, and other tools that consume compilation databases. (#14185, fixes #3531, @Alizter)
  • Add trace events for accepting clients and shutting down RPC (#14232, @rgrinberg)
  • Back up the default trace file as trace.csexp.old before each build, preserving the previous trace for comparison. This does not apply when --trace-file is used. (#14269, @Alizter)

Changed

  • Dune digests target files and directories in background threads (#13341, @rgrinbreg)
  • Dyn.pp now prints valid OCaml literals for more constructors:
    • Char is quoted (e.g., 'a')
    • Int32/Int64/Nativeint include literal suffixes (l/L/n)
    • Float handles infinity, neg_infinity, and nan (#13394, grants #13378, @Alizter)
  • Bump the minimal OCaml version required to build Dune from 4.08 to 4.14. (#13533, @Alizter)
  • Starting from 3.23, user rules are sandboxed by default (#13805, @rgrinberg)
  • Dune will no longer stat paths in the _build directory. This was done as protection from user rules accidentally touching things in the _build directory. This is forbidden, and dune offers rule sandboxing to prevent this (#13875, @rgrinberg)
  • Improve mtime precision by no longer approximating them with floats (#13962, @rgrinberg).
  • Remove --makefile (or -m) in $ dune rules. The sexp output is the only supported way of reflecting dune rules (#14069, @rgrinberg)
  • Do not automatically promote files. Now, opam files must be manually promoted with $ dune promote. Their generation is triggered by @install, @runtest, and @opam. In release mode, .opam files aren't generated at all and whatever is in the source is used (#14108, @rgrinberg)
  • Inline test runner generation is now sandboxed (#14257, @rgrinberg)