Skip to content

3.25.0~alpha0

Pre-release
Pre-release

Choose a tag to compare

@shonfeder shonfeder released this 02 Oct 00:25
· 332 commits to main since this release
96db197

CHANGES:

Fixed

  • Fix crashes when expanding module artifact pforms (%{cmi:...} etc.) with
    (include_subdirs qualified). Qualified modules can now be referenced by
    dotted logical paths such as %{cmi:Sub_a.Foo}.
    (#14498, #16214, fixes #14496, @Alizter, @anmonteiro)

  • dune show targets now accepts build-only directories such as
    _build/default/.simple.objs. (#14664, fixes #13782, @Alizter)

  • Reword the error raised when %{target} is used in a rule that omits the
    (target ...) (or (targets ...)) field, so it points at the missing
    field instead of mentioning "inferred rules". (#14668, fixes #12439,
    @Alizter)

  • Fix watch mode on Windows by creating the file-watcher sync directory before
    using it, avoiding open(_build/.sync\0): No such file or directory when an
    RPC client requests a build. (#14678, fixes #14632, @rgrinberg)

  • Add file watcher trace events for the Mac and Windows backends (#14722, @rgrinberg)

  • Fix decoding coalesced MacOS file notification events. (#14725, @rgrinberg)

  • Handle directory invalidations correctly in watch mode on MacOS (#14756, @rgrinberg)

  • Update ctime when restoring from the shared cache in copy mode. This prevents
    the trimmer from deleting the file. (#14777, @rgrinberg)

  • Allow the use of all the available variables in the (enabled_if) field in
    (executable ...) and (install ...) stanzas, similar to other stanzas like
    (library ...). (#14860, fixes #14789, @punchagan)

  • Linux: dune will now wait for the process group to be dead after the group
    leader is dead. This tightens dune's policy for what constitutes
    a successful action. Actions for which dune cannot be clean up the process
    group will now fail. (@rgrinberg, #14868)

  • Fix caching of package sources with symlinks by resolving symlinks after
    fetching the sources, similar to the directory symlinks resolution introduced
    in #13792 (#14871, fixes #14509, @punchagan)

  • Fixed wrong suggestion for duplicate entries in conflicts field (#14956,
    fixes #14903, @Leonidas-from-XIV)

  • Fix building Dune on Solaris/illumos by handling its wait4 semantics
    and retrying interrupted reads when spawning processes. (#14980, fixes #14182,
    @jperkin)

  • Fix dune-rpc-lwt clients so disconnecting shuts down socket output
    without invalidating pending input reads, avoiding EBADF errors. (#14983,
    fixes #7624, @rgrinberg)

  • Dune now restores dependency cutoffs concurrently when they were originally
    computed in parallel, instead of recomputing them one at a time. The
    cutoffs_that_reduce_concurrency_in_watch_mode setting, which existed to
    avoid this serialisation, is no longer needed and has been removed.
    (#15012, @snowleopard)

  • Validate project module names before creating the project directory in
    dune init project, so aborted initializations no longer leave empty
    directories behind. (#15014, fixes #9963, @rgrinberg)

  • Fix cram test output sanitization when the project path contains a space.
    Absolute paths are now rewritten to $TESTCASE_ROOT even when the path
    contains spaces, and lines with multiple paths have every path sanitized.
    (#15017, fixes #14943, @yussypu)

  • Improve the error message for private libraries that cannot be dependencies of
    public libraries by mentioning the (package ...) field as an alternative to
    giving the private library a public name (#15070, fixes #10230, @rgrinberg).

  • Clarify the module conflict error shown when a module is used in multiple
    stanzas. The message now explains implicit module ownership and lists all
    relevant stanza kinds (#15072, fixes #6598, @rgrinberg).

  • Emit relative artifact references in installed dune-package files when using
    an absolute external DUNE_BUILD_DIR, avoiding build-directory-dependent
    archive and module paths (#15077, fixes #11774, @rgrinberg).

  • Simplify away (when false _) expressions (encoded Nils) that previously
    survived inside concat and when forms, producing cleaner generated lock
    directories. (#15092, fixes #15090, @chizy7)

  • Drop (when false _) arguments from run actions in generated lock
    directories instead of keeping them as no-op entries that were re-encoded as
    (when false ""). (#15128, fixes #15099, @chizy7)

  • Make dune-configurator pass --personality to pkgconf only for
    version 1.7.0 and later. (#15142, fixes #11536, @dra27)

  • dune utop now accepts an absolute path to a workspace directory instead of
    crashing with an internal error. (#15272, fixes #15108, @chizy7)

  • Fix watch-mode status lines after source changes interrupt a build. Dune now
    shows the restart status while cancelling the current build and resumes the
    normal progress counter when the next build starts. (#15289, fixes #11134,
    @rgrinberg)

  • Short-circuit AND and OR expressions in blang. This makes their evaluation
    lazy by default.
    (#15291, @Sudha247)

  • Fix the %{ppx:ppx1+..+ppxn} form. Previously, it was just broken
    and pointed at the wrong binary (#15361, @rgrinberg)

  • Remove ppx runtime dependencies from the list of dependencies provided via
    the root_module field. If such a runtime dependency is needed, it should be
    written in the libraries field. (#15419, @rgrinberg)

  • Avoid rebuilding js_of_ocaml library archives on every invocation for
    interface-only and empty libraries. (#15427, @anmonteiro)

  • Do not crash when ~/.config/dune is a file instead of a directory. Just
    pretend it doesn't exist (#15475, fixes #15406, @rgrinberg)

  • Dune will now terminate all launched sub-processes even if it received
    SIGKILL itself (#15483, @rgrinberg)

  • Account for ctime in stat based digest cache (#15495, @rgrinberg)

  • $ dune install --dry-run now checks for non empty directories as part of its
    validation (#15501, @rgrinberg)

  • Fix a target-less rule attached to multiple aliases ((rule (aliases a b) ...)) leaking unrelated contributions between those aliases. Building one
    alias no longer pulls in actions or dependencies that were added only to
    another of the rule's aliases. (#15581, @NatKarmios)

  • Make dune pkg enabled query a running Dune RPC server, so it observes
    transient server-side --pkg enabled and --pkg disabled settings without
    trying to acquire the build lock (#15589, fixes #15587, @Alizter)

  • Make generated MDX executables inherit link_flags from env stanzas.
    (#15614, fixes #15613, @Alizter)

  • Return Unix errors from Fs_io.read_file rather than raising them. (#15641,
    @rgrinberg)

  • Correct filesystem trace metrics for file writes and directory scans.
    (#15686, @rgrinberg)

  • Preserve runtime-event ring IDs in Dune traces so consumers can distinguish
    interleaved event streams. (#15687, @rgrinberg)

  • BREAKING CHANGE: in dune-project, (warnings (duplicate_deps ..)) requires
    a dune lang version of 3.22, instead of 3.18 (#15696, @v-gb).

  • Preserve spaces in unquoted filenames when applying Git patches instead of
    truncating paths at the first space (#15781, @rgrinberg)

  • Respect enabled_if on install stanzas when adding their files and
    directories to the @all alias. (#15895, fixes #15825, @aryemans)

  • Fix Melange emission with installed libraries whose .cmj and .cmi files
    are stored in the melange object directory (#15949, fixes #14820,
    @anmonteiro)

  • Reject package dependencies in named dependency bindings while decoding
    dependency fields, including for disabled stanzas. (#15966, @rgrinberg)

  • Fix Merlin definition lookup for libraries with private modules
    (#15977, fixes #4892, @anmonteiro)

  • Fix a crash when generating install rules for a Melange-only implementation
    of an installed virtual library (#16033, @anmonteiro)

  • Prevent build cancellation from crashing Dune when macOS reports EPERM
    while signaling a process group (#16059, fixes #16053, @rgrinberg)

  • Fix dune pkg outdated so it fails early with a clear user message if it is
    run when package management is not enabled. (#16065, @shonfeder)

  • Fix watch mode builds remaining stale after the file watcher event queue
    overflows (#16068, fixes #16052, @rgrinberg)

  • Reject Windows path separators in validated filename components (#16076,
    @rgrinberg)

  • Preserve output following malformed ANSI escape sequences and erase-line
    controls (#16116, @rgrinberg).

  • Resolve relative paths passed to dune ocaml top-module from the directory
    where Dune was started, allowing use from workspace subdirectories. (#16135,
    @rgrinberg)

  • Allow dune ocaml top to accept absolute directory paths inside the
    workspace. (#16142, @rgrinberg)

  • Allow Dune promotion commands to accept absolute source paths inside the
    workspace. (#16143, @rgrinberg)

  • Allow dune describe workspace to accept absolute directory filters inside
    the workspace. (#16144, @rgrinberg)

  • Reject empty module_systems fields in melange.emit stanzas instead of
    silently producing no JavaScript files (#16162, @anmonteiro)

  • Sandbox PPX lint actions starting with Dune language 3.25 so linters cannot
    observe undeclared build targets. (#16176, @rgrinberg)

  • Prevent diagnostic source locations at compact-position field boundaries from
    being truncated (#16180, @rgrinberg)

  • Sandbox ocaml-mdx deps when using MDX extension 0.6 so dependency
    discovery cannot observe undeclared workspace inputs. (#16183, @rgrinberg)

  • Fix missing Odoc generation of OxCaml parameter implementations (#16200, @art-w)

  • Make Dune_rpc_lwt.V1.Action_plugin.read_directory_with_glob return an empty listing
    for absent directories (#16207, fixes #4445, @rgrinberg)

  • Fix compiling Melange implementations of installed virtual libraries, both
    with and without binary annotations, including transitive private module
    dependencies (#16211, #16212, #16272, @anmonteiro)

  • Run Ctypes stub generation in a sandbox and honor its declared dependencies.
    (#16223, @rgrinberg)

  • Fix @opam failing to promote a generated opam file after it is deleted
    (#16234, fixes #16233, @Alizter)

  • Rebuild generated Ctypes helpers when headers from Ctypes' implicit include
    directories change (#16243, @rgrinberg)

  • Collect action-provided trace events when an action fails instead of dropping
    them during result validation. (#16250, @rgrinberg)

  • Report the usual program-not-found error when a dynamic-run executable is
    missing instead of failing with an assertion. (#16251, @rgrinberg)

  • Prevent rules with duplicate lock declarations from deadlocking by acquiring
    each lock only once. (#16252, @rgrinberg)

  • Prevent concurrent action children from closing shared redirections before
    their siblings use them (#16257, @rgrinberg)

  • Resolve relative paths in forwarded build, runtest, and exec commands from
    the client's directory instead of the RPC server's directory (#16267,
    @rgrinberg)

  • (env (env-vars ...)) in a (context ...) stanza of dune-workspace now
    takes precedence over the root env stanza, as documented. This affects
    commands such as dune exec; rules already used the documented order.
    (#16290, @punchagan)

  • Fix a crash when an opam filter is not a boolean (#16313, @art-w)

  • Correct module paths for generated interfaces of nested qualified module
    groups. (#16322, @anmonteiro)

  • Resolve %{cmi:...}, %{cmt:...}, and %{cmti:...} against Melange
    module sets when no OCaml module is selected, while preferring OCaml for
    modules selected in both modes. (#16339, @anmonteiro)

  • Reject . and .. as melange.emit targets instead of raising an internal
    error (#16371, @anmonteiro)

  • Validate custom toplevel names as filenames, reporting an error for empty
    names and avoiding crashes for names containing paths (#16373, @anmonteiro)

  • Fix Menhir type inference with package-managed relocatable compilers on macOS
    by making the compiler standard library available in the sandbox (#16374,
    fixes #15642, @Alizter, @shonfeder)

  • Reject invalid Menhir merge_into names during parsing to prevent internal
    errors (#16387, @anmonteiro)

  • Reject conflicting module sources in unqualified directory groups,
    including generated sources, instead of silently discarding one
    (#16414, @anmonteiro)

  • fix copying of directory targets on windows (#16434, @kentookura)

  • Track local module dependencies used by Menhir's type inference so generated
    parsers and dependent modules build and rebuild correctly
    (#16447, fixes #14450, @anmonteiro)

  • Fix Menhir type inference for qualified module group interfaces while keeping
    dependency lookup in terms of logical module names (#16464, #16489, #16497,
    fixes #8989, @anmonteiro)

  • Fix intermittent crashes on Windows caused by unstable file descriptor
    hashing (#16476, fixes #16459, @Alizter)

  • Explain that forwarded build requests require a watch-mode Dune server instead
    of reporting an internal RPC error. (#16486, fixes #16219, @Alizter)

  • (deps (package ...)) now tracks installed files of lock-built packages
    and their package dependencies, rebuilding actions when they change.
    (#16507, @Alizter)

Added

  • Add (dirs ...) to (include_subdirs (mode qualified) ...), allowing
    qualified source directories to be renamed in the module path, including
    when bootstrapping. Mappings can use variables, including reads from generated
    files outside the qualified group (#13691, #16418, #16420, fixes #7605,
    @anmonteiro).

  • Add opt-in action runners via --action-runner, and add
    --sandbox-actions to run eligible process-spawning actions in a
    bubblewrap-wrapped worker. (#14240, @rgrinberg)

  • Add platform support for DragonFly BSD (#14774, fixes same issue with lev
    as seen on NetBSD in #14484, @mneumann).

  • Added command, subcommand, and flag completion in the command line.
    Supported shells are bash, zsh, and pwsh.
    See dune completion [shell] --help.
    (#14779, @ElectreAAS)

  • Add %{git-sha} variable that expands to the short git SHA of the current
    HEAD commit, or the empty string when git is unavailable or the workspace is
    not inside a git repository (#14810, @toots).

  • Add a ?static optional argumentin Configurator.V1.Pkg_config.get to instruct pkg-config to get static linking options. (#14947, @raphael-proust)

  • Only generate Melange rule for multi-mode libraries if melc is installed
    (#15021, @anmonteiro)

  • Add Configurator.V1.Pkg_config.query_variable to query package variables
    through pkg-config --variable (#15078, fixes #3332, @rgrinberg).

  • Add env_vars as an alias for the env-vars field in env stanzas
    (#15187, fixes #11424, @rgrinberg).

  • Add @rocqproject alias to generate all `_RocqProject files
    (#15221, @rlepigre-skylabs-ai).

  • Tab completion for dune promote now lists pending promotion files.
    (#15338, fixes #7254, @Alizter).

  • Add build time information to watch mode (#15384, @rgrinberg)

  • Added the missing dune tools exec utop and dune tools exec odoc options.
    (#15388, @Leonidas-from-XIV)

  • Display build parallelism in watch mode. (#15390, @rgrinberg)

  • Add process counts, system cpu, user cpu, and wall clock cpu times to trace
    events (#15401, @rgrinberg)

  • Support --sandbox-actions on macOS using sandbox-exec. (#15500,
    @rgrinberg)

  • Add fish to the shells supported by dune completion, enabling
    command, subcommand, and flag completion in the fish shell (#15515,
    fixes #15334, @chizy7)

  • Display build duration and average process parallelism in the status line for
    batch builds. (#15564, @rgrinberg)

  • Add a --split-public-names flag to dune describe workspace and dune describe external-lib-deps. When enabled, the name/names fields report
    only private names and a new public_name/public_names field reports the
    public names. (#15582, @NatKarmios)

  • Add a --include-empty flag to dune describe external-lib-deps to also
    print libraries that have no internal or external dependencies (#15585,
    @NatKarmios)

  • Support qualified module references in fields such as per_module when using
    (include_subdirs qualified) (#15633, fixes #15578, @anmonteiro)

  • Display the current build run at the end of watch-mode status lines.
    (#15673, @rgrinberg)

  • Record per-build Memo compute, restore, and cycle-detection metrics in Dune
    traces. (#15698, @rgrinberg)

  • Record discovered, validated, and failed rule counts in Dune traces.
    (#15701, @rgrinberg)

  • Add %{melange.emit:...} to reference a Melange output directory and
    depend on its emitted files (#15751, @anmonteiro)

  • Add (flags ...) to the ocamllex and ocamlyacc stanzas to pass custom
    options to parser generators. (#15907, @rgrinberg)

  • Added an opt-in sat trace category emitting a sat/solve event with
    the SAT solver's stats (variables, clauses, decisions, conflicts) and
    duration. Enable with DUNE_TRACE=+sat. (#15923, @Alizter)

  • Add dune ocaml inferred-mli to infer an interface with a module's build
    configuration and register it for promotion. (#16111, fixes #12727,
    @rgrinberg)

  • Add --no-actions and --only-actions to dune trace cat to filter
    events collected from actions. (#16245, @rgrinberg)

Changed

  • (package <pkg>) now also includes the packages owning the library closures
    of libraries in workspace and installed packages. (#14373, #16362, @Alizter)

  • Extract the structural-hash accumulator into a new Stdune.Hash
    module and route Stdune.Tuple.T2.hash, Stdune.Tuple.T3.hash,
    Stdune.List.hash, Stdune.Result.hash, and Resolve.error_hash
    through it. Hashing these structural shapes no longer allocates per
    call.
    (#14542, @robinbb)

  • Remove (using melange 0.1) in Dune 3.25 in favor of version 1.0 of the
    extension. (#14574, @anmonteiro)

  • $ dune rpc build invocations no longer queue. All build requests are built
    in parallel. Watch servers started by $ dune exec --watch can now also
    handle forwarded build and runtest requests (#14954, @rgrinberg)

  • Report rule build progress as the number of rules built against the total
    number of live rules, rather than rules executed against rules discovered
    during the current run. This affects both the status line and the progress
    reported over RPC. (#14985, @snowleopard, @pWhite)

  • With --error-reporting=twice, print an ==== Error Summary ==== separator
    before the deterministic list of errors reported at the end of the build. The
    separator is omitted when there are no errors to report.
    (#15016, fixes #14757, @yussypu)

  • Enable fuzzy patch application by default for Dune. This is similar to OPAM's
    behaviour, and this makes it easier for packages like OxCaml to build.
    (#15146, fixes #15145, @Sudha247)

  • Odoc rules are now sandboxed (#15190, @rgrinberg)

  • In watch mode, $ dune rpc build requests now complete as soon as their
    requested build finishes, instead of waiting for unrelated concurrent RPC build
    requests in the same build iteration. (#15191, fixes #13788, @rgrinberg)

  • Cleanup all build processes spawned by dune before starting a fresh build on
    Linux. (#15239, #15274, @rgrinberg)

  • Show partial output timed out cram tests (#15269, @rgrinberg)

  • In watch mode, $ dune rpc build now exits with status 1 when the
    requested build fails. (#15341, @rgrinberg)

  • Debounce file change events in watch mode (#15344, @rgrinberg)

  • Align dune's C compiler vendor detection with the OCaml compiler's own
    identifiers (msvc, icc, mingw, clang, gcc, xlc, sunc), so more C
    compilers are recognized without emitting a spurious warning. (#15423,
    fixes #14870, @chizy7)

  • Never use $ lsof for counting file descriptors, as it is not allowed
    to reap processes outside of the scheduler. We have better mechanisms
    on MacOS and Linux for counting file descriptors. So this is only an
    issue on other Unices. (#15477, @rgrinberg)

  • dune describe workspace now reports an origin field for every module,
    indicating whether its source was written by hand (source), generated by a
    rule stanza (dune, with the generating dune file), produced by ocamllex,
    ocamlyacc, or menhir, or synthesised by dune itself for wrapping
    (wrapper). Generated modules point at the responsible file. The
    --with-origin-deps and --with-origin-deps-expanded flags additionally
    report the dependencies of a rule-generated module, as declared and expanded
    to concrete files respectively.
    (#15478, @nat-karmios)

  • Numbers with unit now allow dropping the unit if the number is zero ("0").
    For example, dune cache trim --trimmed-size 0 and dune cache trim --trimmed-size 0TiB are now both accepted and equivalent. (#15498, @reynir)

  • Run artifact substitution in background workers. (#15559, @anmonteiro)

  • dune describe now reports the public name of an executable (from
    public_name/public_names) instead of its private name when one is
    available, falling back to the private name otherwise. (#15582, @NatKarmios)

  • Calculate status-line build parallelism from process CPU time rather than
    wall-clock action time; Windows continues to use wall-clock time.
    (#15685, @rgrinberg)

  • Use sha256 instead of md5 for source archives that lack a checksum
    (#15824, @shunueda)

  • Starting with Dune language 3.25, restrict sandboxed actions on Linux
    systems with Landlock ABI 3 or newer from writing outside their sandbox,
    temporary directory, action-trace directory, and /dev. Set
    DUNE_CONFIG__LANDLOCK=disabled to opt out. (#15858, @rgrinberg)

  • dune pkg lock now fails without writing a lock directory when any platform
    requested by solve_for_platforms cannot be solved, instead of producing a
    partial lock directory containing only the successful platforms. (#15981,
    @Alizter)

  • Portable lock directories now select one package version across all requested
    platforms, and fail when no common version exists. (#15982, fixes #13645,
    fixes #13647, @Alizter)

  • BREAKING CHANGE: Reject : in context names so they remain portable path
    components (#16085, @rgrinberg)

  • Keep .t suffixes in cram test names, including aliases and applies_to,
    starting with Dune language 3.25 (#16146, @rgrinberg)

  • Sandbox ocaml-mdx dune-gen when using MDX extension 0.6, available from
    Dune 3.25. (#16177, @rgrinberg)

  • Sandbox pkg-config queries starting with Dune language 3.25 so they cannot
    observe undeclared workspace inputs. (#16178, @rgrinberg)

  • Remove the experimental OCamlFDO integration, including the (fdo ...)
    workspace field (#16198, @rgrinberg)

  • BREAKING CHANGE: Generated files are now read-only even with Dune language
    versions before 2.4, regardless of whether the shared cache is enabled.
    Executable permissions are preserved. (#16388, @rgrinberg)

  • Make newly written shared-cache metadata files read-only to guard against
    accidental modification. (#16393, @rgrinberg)