[new release] dune (18 packages) (3.24.0~alpha2) - #29996
Closed
shonfeder wants to merge 1 commit into
Closed
Conversation
CHANGES: ### Fixed - Fix promotion failure when a target changes from a directory to a file between builds, causing "Is a directory" errors. (ocaml/dune#14371, fixes ocaml/dune#5647, fixes ocaml/dune#6575, @Alizter) - Make `dune build @doc` pick up an odoc installed via `dune tools install odoc` even without `DUNE_CONFIG__LOCK_DEV_TOOL=enabled`, mirroring how `dune fmt` consumes a locked ocamlformat (ocaml/dune#14426, fixes ocaml/dune#14235, @mt-caret) - Reject `(package ...)` inside a named dependency binding (`(deps (:name (package foo)))`). Previously this was silently accepted but `%{name}` would resolve to an empty path list. (ocaml/dune#14499, @Alizter) - Fix incorrect dependency in the `.cmxs` build for libraries with mode-dependent foreign stubs: the rule depended on the byte stubs archive instead of the native one, so parallel builds could fail to find `-l<lib>_stubs_native`. (ocaml/dune#14500, fixes ocaml/dune#12964, @Alizter) - Fix `dune build` failing with "No rule found" when `lock_dir` paths in `dune-workspace` contain a subdirectory (e.g. `(path sub/dune.lock)`). (ocaml/dune#14524, fixes ocaml/dune#14523, @Alizter) - Artifact substitution repairs executable bit if it's not set correctly in the workspace (ocaml/dune#14556, @rgrinberg) - Ignore `EINVAL` when accepting sockets on MacOS (ocaml/dune#14612, fixes ocaml/dune#12660, @rgrinberg) - Validate profile names. Profile names must be non-empty and can only contain letters, digits, `_` and `-`. The name `_` is reserved as a wildcard in `(env ...)` stanzas. (ocaml/dune#14657, fixes ocaml/dune#14630, @rlepigre) ### Added - Add `%{pkg:<package>:<section>:<path>}` pform for resolving package install files. Works with workspace packages, lock-file packages, and installed packages. (ocaml/dune#14200, fixes ocaml/dune#14193, fixes ocaml/dune#3378, @Alizter) - Enable the relocatable compiler by default for package management (ocaml/dune#14357, fixes ocaml/dune#14012, @Alizter) - Add changed source files to the `build-start` trace event for watch-mode restarts, showing the paths that triggered the rebuild (ocaml/dune#14396, @rgrinberg) - Add dune's rusage information in start/finish build trace events (ocaml/dune#14402, @rgrinberg) - Add a status message for RPC clients that manage to connect (ocaml/dune#14424, @rgrinberg) - Allow blang expressions in the `runtest_alias` field in the `cram` stanza (ocaml/dune#14425, @rgrinberg) - Extend the stat based cache to cache the contents of directories and not just source files (ocaml/dune#14469, @rgrinberg). - Show the number of connected RPC clients in the watch mode status line (ocaml/dune#14489, @rgrinberg) - Promote directory targets from experimental to generally available in 3.24 (ocaml/dune#14579, @rgrinberg) ### Changed - Use `/` as directory separator when appending local paths to external paths, making path construction consistent across platforms. (ocaml/dune#14278, @Alizter) - On Windows, normalise process paths to `\` before passing them to `CreateProcessW` so that programs which scan `argv[0]` (notably `cmd.exe`) do not misparse mixed separators. (ocaml/dune#14278, @Alizter) - `%{bin:NAME}` now resolves to the build artifact path rather than the install staging path. Rules with `%{bin:NAME}` deps additionally get a per-rule `.binaries` directory prepended to the action's `PATH`, containing correctly-named symlinks for each declared bin pform dep. (ocaml/dune#14432, fixes ocaml/dune#3324, @Alizter) - Replace the Rocq language field `(stdlib ...)` with the presence-only field `(no_corelib)` in Rocq language 0.14. (ocaml/dune#14452, fixes ocaml/dune#14358, @Durbatuluk1701) - Throttle sandbox creation to 250 concurrent sandboxes. (ocaml/dune#14464, @rgrinberg) - The package solver now uses cached revision store lookups for improved performance. (ocaml/dune#14494, fixes ocaml/dune#12637, @Alizter, @rgrinberg) - Remove the deprecated `(lang coq)` Coq Build Language. Use the Rocq Build Language (`(using rocq <version>)`) instead. Projects that still declare `(using coq <version>)` now get an error pointing them at Rocq. (ocaml/dune#14525, fixes ocaml/dune#12788, @Alizter)
shonfeder
marked this pull request as draft
June 5, 2026 21:20
Member
Author
|
second pre-release candidate, we will triage again for errors |
Member
Author
|
Analysis of the new errors: Errors from expected breaking changes, requiring upper bounds✅ Test failures from tests depending on internal details of the install/build layoutSee ocaml/dune#14724 lintcstubs
crunch
merlin
Regressions✅ Unintended breakage in executability of
|
Member
|
I've spot checked the errors to triage, and don't find anything particularly concerning. I tested a few locally just to be sure: Once we have the melange issue sorted, I think we are okay! |
shonfeder
added a commit
to ocaml/dune
that referenced
this pull request
Jun 11, 2026
Backport #14715 onto 3.24.0-rc. Fixes the melange build failure on OCaml 4.14 where dune emits an `I/O error: jscomp/runtime/.melange_src/X.mli: No such file or directory` against every `melange-re/melange.*-414` reverse dep (see ocaml/opam-repository#29996 — the 3.24.0~alpha2 release PR). The fix is to skip the line directive in `setup_melange_sources_copy_rules` when a module uses non-staged PPX, since the PPX pipeline now passes `-loc-filename` separately and adding the directive would double-shift diagnostics. The fix has a small precursor chain on `main`; bringing the headline `#14715` alone doesn't apply cleanly because subsequent PRs introduced the test files and machinery the fix's diff targets. Included PRs (chronological): - #14697 — test: show single context melange loses ppx snippet previews - #14698 — test: show single context reason+melange loses ppx snippet previews - #14708 — test: accept ppx loc-filename in fixtures - #14706 — **fix**: preserve original ppx source locations (introduces `-loc-filename`) - #14714 — test: reproduce reason source location regression - #14715 — **fix**: avoid line directive when passing `-loc-filename`
This was referenced Jun 11, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fast, portable, and opinionated build system
CHANGES:
Fixed
Fix promotion failure when a target changes from a directory to a file
between builds, causing "Is a directory" errors.
(fix(promote): clean up stale staging path before rename in register_intermediate dune#14371, fixes Moving a file as a previously existing directory dune#5647, fixes Clean needed when turning a directory into a file dune#6575, @Alizter)
Make
dune build @docpick up an odoc installed viadune tools install odoceven withoutDUNE_CONFIG__LOCK_DEV_TOOL=enabled, mirroring howdune fmtconsumes a locked ocamlformat (fix: check lockdir even if lock_dev_tools is disabled when invoking odoc dune#14426, fixesdune build @docfails to finddune tools install odocinstalled odoc dune#14235, @mt-caret)Reject
(package ...)inside a named dependency binding(
(deps (:name (package foo)))). Previously this was silently accepted but%{name}would resolve to an empty path list. (fix: reject (package ...) inside named dependency bindings dune#14499, @Alizter)Fix incorrect dependency in the
.cmxsbuild for libraries withmode-dependent foreign stubs: the rule depended on the byte stubs archive
instead of the native one, so parallel builds could fail to find
-l<lib>_stubs_native. (fix: .cmxs build racing native stubs archive dune#14500, fixes Possible race condition observed on FreeBSD CI dune#12964, @Alizter)Fix
dune buildfailing with "No rule found" whenlock_dirpaths indune-workspacecontain a subdirectory (e.g.(path sub/dune.lock)).(fix(pkg): lock subdirectories dune#14524, fixes lock_dir with subdirectory path is broken dune#14523, @Alizter)
Artifact substitution repairs executable bit if it's not set correctly in the workspace
(artifact-substitution: compare executable bits when replacing files dune#14556, @rgrinberg)
Ignore
EINVALwhen accepting sockets on MacOS (Handle RPC socket preparation failures dune#14612, fixes dune forwarding rpc occasionally gets EINVAL backtrace dune#12660, @rgrinberg)Validate profile names. Profile names must be non-empty and can only contain
letters, digits,
_and-. The name_is reserved as a wildcard in(env ...)stanzas. (Validate profile names. dune#14657, fixes Potential confusion around profile names and _ in the env stanza dune#14630, @rlepigre)Added
Add
%{pkg:<package>:<section>:<path>}pform for resolving package installfiles. Works with workspace packages, lock-file packages, and installed
packages. (feat: %{pkg:foo:lib:file} pforms for package install layouts dune#14200, fixes Support
%{pkg:foo:lib}variables more generally dune#14193, fixes Library variable expansion needs a library installed to work dune#3378, @Alizter)Enable the relocatable compiler by default for package management (feat(pkg): use the relocatable compiler dune#14357,
fixes Always use the relocatable compiler over the older OCaml ones. dune#14012, @Alizter)
Add changed source files to the
build-starttrace event for watch-moderestarts, showing the paths that triggered the rebuild (feature: source files changed event dune#14396, @rgrinberg)
Add dune's rusage information in start/finish build trace events (trace: include dune self rusage snapshots dune#14402, @rgrinberg)
Add a status message for RPC clients that manage to connect (Show RPC connection status in forwarded builds dune#14424, @rgrinberg)
Allow blang expressions in the
runtest_aliasfield in thecramstanza (cram: allow boolean expressions in runtest_alias dune#14425, @rgrinberg)Extend the stat based cache to cache the contents of directories and not just
source files (feature: cache directory reads dune#14469, @rgrinberg).
Show the number of connected RPC clients in the watch mode status line
(Show RPC client count in status line dune#14489, @rgrinberg)
Promote directory targets from experimental to generally available in 3.24
(Make directory targets available in Dune 3.24 dune#14579, @rgrinberg)
Changed
Use
/as directory separator when appending local paths to external paths,making path construction consistent across platforms. (path: appending local paths to external paths dune#14278, @Alizter)
On Windows, normalise process paths to
\before passing them toCreateProcessWso that programs which scanargv[0](notablycmd.exe)do not misparse mixed separators. (path: appending local paths to external paths dune#14278, @Alizter)
%{bin:NAME}now resolves to the build artifact path rather thanthe install staging path. Rules with
%{bin:NAME}deps additionallyget a per-rule
.binariesdirectory prepended to the action'sPATH, containing correctly-named symlinks for each declared binpform dep. (feat: bin-layout for %{bin:...} deps dune#14432, fixes dune build %{bin:foo} returns an error dune#3324, @Alizter)
Replace the Rocq language field
(stdlib ...)with the presence-only field(no_corelib)in Rocq language 0.14. (Rocq(no_corelib)flag dune#14452, fixes Rocq(stdlib ...)field naming changes dune#14358, @Durbatuluk1701)Throttle sandbox creation to 250 concurrent sandboxes. (fix: Throttle live sandboxes dune#14464, @rgrinberg)
The package solver now uses cached revision store lookups for improved
performance. (pkg: enable and version the rev_store cache dune#14494, fixes Version and enable the lmdb cache dune#12637, @Alizter, @rgrinberg)
Remove the deprecated
(lang coq)Coq Build Language. Use theRocq Build Language (
(using rocq <version>)) instead. Projects thatstill declare
(using coq <version>)now get an error pointing themat Rocq. (chore: remove (lang coq) Coq Build Language dune#14525, fixes [coq] Deprecation and removal of
(lang coq)for Dune 3.24 dune#12788, @Alizter)