-
Notifications
You must be signed in to change notification settings - Fork 412
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Allow to configure link_flags in env #5215
Conversation
Implementation looks good to me. Some tests would be very useful. |
bc69d72
to
3d28dbd
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good. Do you have merge rights or do I need to merge myself?
PS: needs CHANGES + docs. |
I've updated Changes and the doc. I'd prefer to no merge myself (even if I might have permissions) |
We should also wait on the CI as there might be diffs in other tests due to this PR |
I'm not sure what are the CI failures |
I just merged another PR with small conflicting changes, could you rebase one more time before I review ? Also after a brief look I think you loosed two checks in the rebase:
This default flags are only added is the dune_project option is Some true and the current target has c++ stubs. |
rebased and fixed |
Alright, the CI seems to be happy now ! |
src/dune_rules/super_context.ml
Outdated
let open Action_builder.O in | ||
let+ default = default | ||
and+ flags = Cxx_flags.get_flags ~for_:Link (context t) in | ||
default @ List.concat_map flags ~f:(fun f -> [ "-cclib"; f ]) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I feel like this is not exactly the expected behavior: standard_cxx_flags
should be the :standard
set of flag when expanding the link_flags
field from the env
. The result of this expansion is then the :standard
set of flags for the executable stanza link_flags
field.
This way it is possible to override the defautl cxx flags from the link_flags
field in the env
stanza.
default_cxx_flags
|
└-- [`:standard` for base `env` `link_flags` field expansion]
|
└-- [`:standard` for nested `env` `link_flags` field expansion]
|
:
|
└-- [`:standard` for `executable` `link_flags` field expansion]
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The logic you added depend on properties of executables, env doesn't have access to it
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes but can't we work around that by delaying the expansion or using a placeholder ?
I think it is important to preserve the philosophy of the ordered set language that allows full control over the built-in flags with the :standard
set.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd like other dune devs to take a look at this.
Delaying evaluation seems to be a lot of work, I don't know the codebase enough to understand the implication
I'm not sure what a placeholder would look like in practice.
@rgrinberg , @jeremiedimino can you look at this ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@voodoos has been thinking about the handling of flags a lot though some of his recent work, so I trust his judgement here.
Everything is versioned in Dune, so changing things after the fact is more difficult. For this reason we should aim to do the right thing from the start, even if it is more work.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've tried something, that is duplicate link_flags and use the existing inheritance. @voodoos how does that look to you ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
gentle ping
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It looks like a reasonable solution. There is just one thing we should check: getting the default cxx flags requires that Dune run the C-compiler and preprocess a header file to create the _build/default/.dune/ccomp/ccomp
file. It should be ok with the build monad but I think we should check (via a test) that this file is not created if no cxx stubs are built.
Also we should have a test reflecting the cascading behaviour. It is a bit painful to do because the C++ flags will differ depending on the context; what I did in my tests was grepping with a or
:
$ GCC_LF_LIB=" -cclib -lstdc++ -cclib -shared-libgcc"
$ Clang_LF_LIB=" -cclib -lc++"
$ Msvc_LF_LIB=""
$ dune rules main.exe | tr -s '\n' ' ' |
> grep -ce "Main.cmx$GCC_LF_LIB)\|Main.cmx$Clang_LF_LIB)\|Main.cmx$Msvc_LF_LIB)"
1
It is a bit fragile but works reasonably.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Also it might be useful for future readers to document the reason of the split in link_flags.ml
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I've added more test, and fix an existing test at the same time.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Suggested OCaml capitalization change
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The doc/dune-files.rst changes look great!
8b37b16
to
2086508
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me. Thanks for adding the tests !
Can you rebase and sign your commits ?
2086508
to
68f1b2a
Compare
I've rebased, rearranged and signed my commits |
68f1b2a
to
c5d7a32
Compare
It is still out-of-date with |
c5d7a32
to
0c73d00
Compare
Signed-off-by: Hugo Heuzard <[email protected]>
Signed-off-by: Hugo Heuzard <[email protected]>
Signed-off-by: Hugo Heuzard <[email protected]>
Signed-off-by: Hugo Heuzard <[email protected]>
0c73d00
to
ffcc121
Compare
…e-rpc, dune-rpc-lwt, dune-private-libs, dune-glob, dune-configurator, dune-build-info and dune-action-plugin (3.0.0) CHANGES: - Remove `uchar` and `seq` dummy ocamlfind libraries from dune's builtin library database (ocaml/dune#5260, @kit-ty-kate) - Add a `DUNE_DIFF_COMMAND` environment variable to match `--diff-command` command-line parameter (@raphael-proust, fix ocaml/dune#5369, ocaml/dune#5375) - Add support for odoc-link rules (ocaml/dune#5045, @lubegasimon) - Dune will no longer generate documentation for hidden modules (ocaml/dune#5045, @lubegasimon) - Parse the `native_pack_linker` field of `ocamlc -config` (ocaml/dune#5281, @TheLortex) - Fix plugins with dot in the name (ocaml/dune#5182, @bobot, review @rgrinberg) - Don't generate the dune-site build part when not needed (ocaml/dune#4861, @bobot, review @kit-ty-kate) - Fix installation of implementations of virtual libraries (ocaml/dune#5150, fix ocaml/dune#3636, @rgrinberg) - Run tests in all modes defined. Previously, jsoo was excluded. (@hhugo, ocaml/dune#5049, fix ocaml/dune#4951) - Allow to configure the alias to run the jsoo tests (@hhugo, ocaml/dune#5049, ocaml/dune#4999) - Set jsoo compilation flags in the `env` stanza (@hhugo, ocaml/dune#5049, ocaml/dune#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, ocaml/dune#5049, fix ocaml/dune#970) - Fix build-info version in jsoo executables (@hhugo, ocaml/dune#5049, fix ocaml/dune#4444) - Pass `-no-check-prims` when building bytecode for jsoo (@hhugo, ocaml/dune#5049, ocaml/dune#4027) - Fix jsoo builds when dynamically linked foreign archives are disabled (@hhugo, ocaml/dune#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. (ocaml/dune#4867, fix ocaml/dune#2882, @kit-ty-kate, @rgrinberg) - Add `link_flags` field to the `executable` field of `inline_tests` (ocaml/dune#5088, fix ocaml/dune#1530, @jvillard) - In watch mode, use fsevents instead of fswatch on OSX (ocaml/dune#4937, ocaml/dune#4990, fixes ocaml/dune#4896 @rgrinberg) - Remove `inotifywait` watch mode backend on Linux. We now use the inotify API exclusively (ocaml/dune#4941, @rgrinberg) - Report cycles between virtual libraries and their implementation (ocaml/dune#5050, fixes ocaml/dune#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. (ocaml/dune#5040, @emillon) - Allow users to specify dynamic dependencies in rules. For example `(deps %{read:foo.gen})` (ocaml/dune#4662, fixes ocaml/dune#4089, @jeremiedimino) - Sandbox infer rules for menhir. Fixes possible "inconsistent assumptions" errors (ocaml/dune#5015, @rgrinberg) - Experimental support for ctypes stubs (ocaml/dune#3905, fixes ocaml/dune#135, @mbacarella) - Fix interpretation of `binaries` defined in the `env stanza`. Binaries defined in `x/dune` wouldn't be visible in `x/*/**/dune. (ocaml/dune#4975, fixes ocaml/dune#4976, @Leonidas-from-XIV, @rgrinberg) - Do not list private libraries in package listings (ocaml/dune#4945, fixes ocaml/dune#4799, @rgrinberg) - Allow spaces in cram test paths (ocaml/dune#4980, fixes ocaml/dune#4162, @rgrinberg) - Improve error handling of misbehaving cram scripts. (ocaml/dune#4981, fix ocaml/dune#4230, @rgrinberg) - Fix `foreign_stubs` inside a `tests` stanza. Previously, dune would crash when this field was present (ocaml/dune#4942, fix ocaml/dune#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 (ocaml/dune#4939, @rgrinberg) - Generate a `dune-project` when initializing projects with `dune init proj ...` (ocaml/dune#4881, closes ocaml/dune#4367, @shonfeder) - Allow spaces in the directory argument of the `subdir` stanza (ocaml/dune#4943, fixes ocaml/dune#4907, @rgrinberg) - Add a `%{toolchain}` expansion variable (ocaml/dune#4899, fixes ocaml/dune#3949, @rgrinberg) - Include dependencies of executables when creating toplevels (either `dune top` or `dune utop`) (ocaml/dune#4882, fixes ocaml/dune#4872, @Gopiancode) - Fixes `opam` META file requires entry for private libs (ocaml/dune#4841, fixes ocaml/dune#4839, @toots) - Fixes `dune exec` not adding .exe on Windows (ocaml/dune#4371, fixes ocaml/dune#3322, @MisterDA) - Allow multiple cinaps stanzas in the same directory (ocaml/dune#4460, @rgrinberg) - Fix `$ dune subst` in empty git repositories (ocaml/dune#4441, fixes ocaml/dune#3619, @rgrinberg) - Improve interpretation of ansi escape sequence when spawning processes (ocaml/dune#4408, fixes ocaml/dune#2665, @rgrinberg) - Allow `(package pkg)` in dependencies even if `pkg` is an installed package (ocaml/dune#4170, @bobot) - Allow `%{version:pkg}` to work for external packages (ocaml/dune#4104, @kit-ty-kate) - Add `(glob_files_rec <dir>/<glob>)` for globbing files recursively (ocaml/dune#4176, @jeremiedimino) - Automatically generate empty `.mli` files for executables and tests (ocaml/dune#3768, fixes ocaml/dune#3745, @craigfe) - Add `ocaml` command subgroup for OCaml related commands such as `utop`, `top`, and `merlin` (ocaml/dune#3936, @rgrinberg). - Detect unknown variables more eagerly (ocaml/dune#4184, @jeremiedimino) - Improve location of variables and macros in error messages (ocaml/dune#4205, @jeremiedimino) - Auto-detect `dune-project` files as `dune` files in Emacs (ocaml/dune#4222, @shonfeder) - Dune no longer automatically create or edit `dune-project` files (ocaml/dune#4239, fixes ocaml/dune#4108, @jeremiedimino) - Warn if `dune-project` is not found (fatal in release mode) (ocaml/dune#5343, @emillon) - Cleanup temporary files after running `$ dune exec`. (ocaml/dune#4260, fixes ocaml/dune#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. (ocaml/dune#4250, @voodoos) - Enable cram tests by default (ocaml/dune#4262, @rgrinberg) - Drop support for opam 1.x (ocaml/dune#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 (ocaml/dune#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 (ocaml/dune#4298, @jeremiedimino) - It is now possible to define action dependencies through a chain of aliases. (ocaml/dune#4303, @aalekseyev) - If an .ml file is not used by an executable, Dune no longer report parsing error in this file (ocaml/dune#4330, @jeremiedimino) - Add support for sandboxing using hard links (ocaml/dune#4360, Andrey Mokhov) - Fix dune crash when `subdir` is an absolute path (ocaml/dune#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. (ocaml/dune#4405, @aalekseyev) - Fix a bug that was causing Dune to re-hash generated files more often than necessary (ocaml/dune#4419, @jeremiedimino) - Fields allowed in the config file are now also allowed in the workspace file (ocaml/dune#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 (ocaml/dune#4422, ocaml/dune#4515, @jeremiedimino) - The `@all` alias no longer depends directly on copies of files from the source directory (ocaml/dune#4461, @nojb) - Allow dune-file as an alternative file name for dune files (needs to be enabled in the dune-project file) (ocaml/dune#4428, @nojb) - Drop support for upgrading jbuilder projects (ocaml/dune#4473, @jeremiedimino) - Extend the environment variable `BUILD_PATH_PREFIX_MAP` to rewrite the root of the build dir (or sandbox) to `/workspace_root` (ocaml/dune#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. (ocaml/dune#4443, ocaml/dune#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. (ocaml/dune#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 `chdir`s into. (ocaml/dune#4509, @aalekseyev) - Fix a crash when clearing temporary directories (ocaml/dune#4489, ocaml/dune#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. (ocaml/dune#4522, Andrey Mokhov) - Remove `dune compute`. It was broken and unused (ocaml/dune#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. (ocaml/dune#4607, @jeremiedimino) - Make Dune display the progress indicator in all output modes except quiet (ocaml/dune#4618, @aalekseyev) - Report accurate process timing information in trace mode (enabled with `--trace-file`) (ocaml/dune#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. (ocaml/dune#4643, @emillon) - Don't let command run by Dune observe the environment variable `INSIDE_EMACS` in order to improve reproducibility (ocaml/dune#4680, @jeremiedimino) - Fix `root_module` when used in public libraries (ocaml/dune#4685, fixes ocaml/dune#4684, @rgrinberg, @craigfe) - Fix `root_module` when used with preprocessing (ocaml/dune#4683, fixes ocaml/dune#4682, @rgrinberg, @craigfe) - Display Coq profile flags in `dune printenv` (ocaml/dune#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. (ocaml/dune#3956, ocaml/dune#5391, fixes ocaml/dune#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 (ocaml/dune#4786). - Always use 7 char hash prefix in build info version (ocaml/dune#4857, @jberdine, fixes ocaml/dune#4855) - Allow to explicitly disable/enable the use of `dune subst` by adding a new `(subst <disable|enable>)` stanza to the `dune-project` file. (ocaml/dune#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 (ocaml/dune#4921, fixes ocaml/dune#4459, @jeremiedimino) - Dune no longer reads installed META files for libraries distributed with the compiler, instead using its own internal database. (ocaml/dune#4946, @nojb) - Add support for `(empty_module_interface_if_absent)` in executable and library stanzas. (ocaml/dune#4955, @nojb) - Add support for `%{bin-available:...}` (ocaml/dune#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 (ocaml/dune#4996, @jeremiedimino) - Allow `%{read:...}` in more places such as `(enabled_if ...)` (ocaml/dune#4994, @jeremiedimino) - Run each action in its own process group so that we don't leave stray processes behind when killing actions (ocaml/dune#4998, @jeremiedimino) - Add an option `expand_aliases_in_sandbox` (ocaml/dune#5003, @jeremiedimino) - Allow to cancel the initial scan via Control+C (ocaml/dune#4460, fixes ocaml/dune#4364 @jeremiedimino) - Add experimental support for directory targets (ocaml/dune#3316, ocaml/dune#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 (ocaml/dune#5091, Andrey Mokhov). - Add link_flags in the env stanza (ocaml/dune#5215) - Bootstrap: ignore errors when trying to remove generated files. (ocaml/dune#5407, @damiendoligez)
…e-rpc, dune-rpc-lwt, dune-private-libs, dune-glob, dune-configurator, dune-build-info and dune-action-plugin (3.0.0) CHANGES: - Remove `uchar` and `seq` dummy ocamlfind libraries from dune's builtin library database (ocaml/dune#5260, @kit-ty-kate) - Add a `DUNE_DIFF_COMMAND` environment variable to match `--diff-command` command-line parameter (@raphael-proust, fix ocaml/dune#5369, ocaml/dune#5375) - Add support for odoc-link rules (ocaml/dune#5045, @lubegasimon) - Dune will no longer generate documentation for hidden modules (ocaml/dune#5045, @lubegasimon) - Parse the `native_pack_linker` field of `ocamlc -config` (ocaml/dune#5281, @TheLortex) - Fix plugins with dot in the name (ocaml/dune#5182, @bobot, review @rgrinberg) - Don't generate the dune-site build part when not needed (ocaml/dune#4861, @bobot, review @kit-ty-kate) - Fix installation of implementations of virtual libraries (ocaml/dune#5150, fix ocaml/dune#3636, @rgrinberg) - Run tests in all modes defined. Previously, jsoo was excluded. (@hhugo, ocaml/dune#5049, fix ocaml/dune#4951) - Allow to configure the alias to run the jsoo tests (@hhugo, ocaml/dune#5049, ocaml/dune#4999) - Set jsoo compilation flags in the `env` stanza (@hhugo, ocaml/dune#5049, ocaml/dune#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, ocaml/dune#5049, fix ocaml/dune#970) - Fix build-info version in jsoo executables (@hhugo, ocaml/dune#5049, fix ocaml/dune#4444) - Pass `-no-check-prims` when building bytecode for jsoo (@hhugo, ocaml/dune#5049, ocaml/dune#4027) - Fix jsoo builds when dynamically linked foreign archives are disabled (@hhugo, ocaml/dune#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. (ocaml/dune#4867, fix ocaml/dune#2882, @kit-ty-kate, @rgrinberg) - Add `link_flags` field to the `executable` field of `inline_tests` (ocaml/dune#5088, fix ocaml/dune#1530, @jvillard) - In watch mode, use fsevents instead of fswatch on OSX (ocaml/dune#4937, ocaml/dune#4990, fixes ocaml/dune#4896 @rgrinberg) - Remove `inotifywait` watch mode backend on Linux. We now use the inotify API exclusively (ocaml/dune#4941, @rgrinberg) - Report cycles between virtual libraries and their implementation (ocaml/dune#5050, fixes ocaml/dune#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. (ocaml/dune#5040, @emillon) - Allow users to specify dynamic dependencies in rules. For example `(deps %{read:foo.gen})` (ocaml/dune#4662, fixes ocaml/dune#4089, @jeremiedimino) - Sandbox infer rules for menhir. Fixes possible "inconsistent assumptions" errors (ocaml/dune#5015, @rgrinberg) - Experimental support for ctypes stubs (ocaml/dune#3905, fixes ocaml/dune#135, @mbacarella) - Fix interpretation of `binaries` defined in the `env stanza`. Binaries defined in `x/dune` wouldn't be visible in `x/*/**/dune. (ocaml/dune#4975, fixes ocaml/dune#4976, @Leonidas-from-XIV, @rgrinberg) - Do not list private libraries in package listings (ocaml/dune#4945, fixes ocaml/dune#4799, @rgrinberg) - Allow spaces in cram test paths (ocaml/dune#4980, fixes ocaml/dune#4162, @rgrinberg) - Improve error handling of misbehaving cram scripts. (ocaml/dune#4981, fix ocaml/dune#4230, @rgrinberg) - Fix `foreign_stubs` inside a `tests` stanza. Previously, dune would crash when this field was present (ocaml/dune#4942, fix ocaml/dune#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 (ocaml/dune#4939, @rgrinberg) - Generate a `dune-project` when initializing projects with `dune init proj ...` (ocaml/dune#4881, closes ocaml/dune#4367, @shonfeder) - Allow spaces in the directory argument of the `subdir` stanza (ocaml/dune#4943, fixes ocaml/dune#4907, @rgrinberg) - Add a `%{toolchain}` expansion variable (ocaml/dune#4899, fixes ocaml/dune#3949, @rgrinberg) - Include dependencies of executables when creating toplevels (either `dune top` or `dune utop`) (ocaml/dune#4882, fixes ocaml/dune#4872, @Gopiancode) - Fixes `opam` META file requires entry for private libs (ocaml/dune#4841, fixes ocaml/dune#4839, @toots) - Fixes `dune exec` not adding .exe on Windows (ocaml/dune#4371, fixes ocaml/dune#3322, @MisterDA) - Allow multiple cinaps stanzas in the same directory (ocaml/dune#4460, @rgrinberg) - Fix `$ dune subst` in empty git repositories (ocaml/dune#4441, fixes ocaml/dune#3619, @rgrinberg) - Improve interpretation of ansi escape sequence when spawning processes (ocaml/dune#4408, fixes ocaml/dune#2665, @rgrinberg) - Allow `(package pkg)` in dependencies even if `pkg` is an installed package (ocaml/dune#4170, @bobot) - Allow `%{version:pkg}` to work for external packages (ocaml/dune#4104, @kit-ty-kate) - Add `(glob_files_rec <dir>/<glob>)` for globbing files recursively (ocaml/dune#4176, @jeremiedimino) - Automatically generate empty `.mli` files for executables and tests (ocaml/dune#3768, fixes ocaml/dune#3745, @craigfe) - Add `ocaml` command subgroup for OCaml related commands such as `utop`, `top`, and `merlin` (ocaml/dune#3936, @rgrinberg). - Detect unknown variables more eagerly (ocaml/dune#4184, @jeremiedimino) - Improve location of variables and macros in error messages (ocaml/dune#4205, @jeremiedimino) - Auto-detect `dune-project` files as `dune` files in Emacs (ocaml/dune#4222, @shonfeder) - Dune no longer automatically create or edit `dune-project` files (ocaml/dune#4239, fixes ocaml/dune#4108, @jeremiedimino) - Warn if `dune-project` is not found (fatal in release mode) (ocaml/dune#5343, @emillon) - Cleanup temporary files after running `$ dune exec`. (ocaml/dune#4260, fixes ocaml/dune#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. (ocaml/dune#4250, @voodoos) - Enable cram tests by default (ocaml/dune#4262, @rgrinberg) - Drop support for opam 1.x (ocaml/dune#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 (ocaml/dune#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 (ocaml/dune#4298, @jeremiedimino) - It is now possible to define action dependencies through a chain of aliases. (ocaml/dune#4303, @aalekseyev) - If an .ml file is not used by an executable, Dune no longer report parsing error in this file (ocaml/dune#4330, @jeremiedimino) - Add support for sandboxing using hard links (ocaml/dune#4360, Andrey Mokhov) - Fix dune crash when `subdir` is an absolute path (ocaml/dune#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. (ocaml/dune#4405, @aalekseyev) - Fix a bug that was causing Dune to re-hash generated files more often than necessary (ocaml/dune#4419, @jeremiedimino) - Fields allowed in the config file are now also allowed in the workspace file (ocaml/dune#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 (ocaml/dune#4422, ocaml/dune#4515, @jeremiedimino) - The `@all` alias no longer depends directly on copies of files from the source directory (ocaml/dune#4461, @nojb) - Allow dune-file as an alternative file name for dune files (needs to be enabled in the dune-project file) (ocaml/dune#4428, @nojb) - Drop support for upgrading jbuilder projects (ocaml/dune#4473, @jeremiedimino) - Extend the environment variable `BUILD_PATH_PREFIX_MAP` to rewrite the root of the build dir (or sandbox) to `/workspace_root` (ocaml/dune#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. (ocaml/dune#4443, ocaml/dune#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. (ocaml/dune#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 `chdir`s into. (ocaml/dune#4509, @aalekseyev) - Fix a crash when clearing temporary directories (ocaml/dune#4489, ocaml/dune#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. (ocaml/dune#4522, Andrey Mokhov) - Remove `dune compute`. It was broken and unused (ocaml/dune#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. (ocaml/dune#4607, @jeremiedimino) - Make Dune display the progress indicator in all output modes except quiet (ocaml/dune#4618, @aalekseyev) - Report accurate process timing information in trace mode (enabled with `--trace-file`) (ocaml/dune#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. (ocaml/dune#4643, @emillon) - Don't let command run by Dune observe the environment variable `INSIDE_EMACS` in order to improve reproducibility (ocaml/dune#4680, @jeremiedimino) - Fix `root_module` when used in public libraries (ocaml/dune#4685, fixes ocaml/dune#4684, @rgrinberg, @craigfe) - Fix `root_module` when used with preprocessing (ocaml/dune#4683, fixes ocaml/dune#4682, @rgrinberg, @craigfe) - Display Coq profile flags in `dune printenv` (ocaml/dune#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. (ocaml/dune#3956, ocaml/dune#5391, fixes ocaml/dune#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 (ocaml/dune#4786). - Always use 7 char hash prefix in build info version (ocaml/dune#4857, @jberdine, fixes ocaml/dune#4855) - Allow to explicitly disable/enable the use of `dune subst` by adding a new `(subst <disable|enable>)` stanza to the `dune-project` file. (ocaml/dune#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 (ocaml/dune#4921, fixes ocaml/dune#4459, @jeremiedimino) - Dune no longer reads installed META files for libraries distributed with the compiler, instead using its own internal database. (ocaml/dune#4946, @nojb) - Add support for `(empty_module_interface_if_absent)` in executable and library stanzas. (ocaml/dune#4955, @nojb) - Add support for `%{bin-available:...}` (ocaml/dune#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 (ocaml/dune#4996, @jeremiedimino) - Allow `%{read:...}` in more places such as `(enabled_if ...)` (ocaml/dune#4994, @jeremiedimino) - Run each action in its own process group so that we don't leave stray processes behind when killing actions (ocaml/dune#4998, @jeremiedimino) - Add an option `expand_aliases_in_sandbox` (ocaml/dune#5003, @jeremiedimino) - Allow to cancel the initial scan via Control+C (ocaml/dune#4460, fixes ocaml/dune#4364 @jeremiedimino) - Add experimental support for directory targets (ocaml/dune#3316, ocaml/dune#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 (ocaml/dune#5091, Andrey Mokhov). - Add link_flags in the env stanza (ocaml/dune#5215) - Bootstrap: ignore errors when trying to remove generated files. (ocaml/dune#5407, @damiendoligez)
…e-rpc, dune-rpc-lwt, dune-private-libs, dune-glob, dune-configurator, dune-build-info and dune-action-plugin (3.0.0) CHANGES: - Remove `uchar` and `seq` dummy ocamlfind libraries from dune's builtin library database (ocaml/dune#5260, @kit-ty-kate) - Add a `DUNE_DIFF_COMMAND` environment variable to match `--diff-command` command-line parameter (@raphael-proust, fix ocaml/dune#5369, ocaml/dune#5375) - Add support for odoc-link rules (ocaml/dune#5045, @lubegasimon) - Dune will no longer generate documentation for hidden modules (ocaml/dune#5045, @lubegasimon) - Parse the `native_pack_linker` field of `ocamlc -config` (ocaml/dune#5281, @TheLortex) - Fix plugins with dot in the name (ocaml/dune#5182, @bobot, review @rgrinberg) - Don't generate the dune-site build part when not needed (ocaml/dune#4861, @bobot, review @kit-ty-kate) - Fix installation of implementations of virtual libraries (ocaml/dune#5150, fix ocaml/dune#3636, @rgrinberg) - Run tests in all modes defined. Previously, jsoo was excluded. (@hhugo, ocaml/dune#5049, fix ocaml/dune#4951) - Allow to configure the alias to run the jsoo tests (@hhugo, ocaml/dune#5049, ocaml/dune#4999) - Set jsoo compilation flags in the `env` stanza (@hhugo, ocaml/dune#5049, ocaml/dune#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, ocaml/dune#5049, fix ocaml/dune#970) - Fix build-info version in jsoo executables (@hhugo, ocaml/dune#5049, fix ocaml/dune#4444) - Pass `-no-check-prims` when building bytecode for jsoo (@hhugo, ocaml/dune#5049, ocaml/dune#4027) - Fix jsoo builds when dynamically linked foreign archives are disabled (@hhugo, ocaml/dune#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. (ocaml/dune#4867, fix ocaml/dune#2882, @kit-ty-kate, @rgrinberg) - Add `link_flags` field to the `executable` field of `inline_tests` (ocaml/dune#5088, fix ocaml/dune#1530, @jvillard) - In watch mode, use fsevents instead of fswatch on OSX (ocaml/dune#4937, ocaml/dune#4990, fixes ocaml/dune#4896 @rgrinberg) - Remove `inotifywait` watch mode backend on Linux. We now use the inotify API exclusively (ocaml/dune#4941, @rgrinberg) - Report cycles between virtual libraries and their implementation (ocaml/dune#5050, fixes ocaml/dune#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. (ocaml/dune#5040, @emillon) - Allow users to specify dynamic dependencies in rules. For example `(deps %{read:foo.gen})` (ocaml/dune#4662, fixes ocaml/dune#4089, @jeremiedimino) - Sandbox infer rules for menhir. Fixes possible "inconsistent assumptions" errors (ocaml/dune#5015, @rgrinberg) - Experimental support for ctypes stubs (ocaml/dune#3905, fixes ocaml/dune#135, @mbacarella) - Fix interpretation of `binaries` defined in the `env stanza`. Binaries defined in `x/dune` wouldn't be visible in `x/*/**/dune. (ocaml/dune#4975, fixes ocaml/dune#4976, @Leonidas-from-XIV, @rgrinberg) - Do not list private libraries in package listings (ocaml/dune#4945, fixes ocaml/dune#4799, @rgrinberg) - Allow spaces in cram test paths (ocaml/dune#4980, fixes ocaml/dune#4162, @rgrinberg) - Improve error handling of misbehaving cram scripts. (ocaml/dune#4981, fix ocaml/dune#4230, @rgrinberg) - Fix `foreign_stubs` inside a `tests` stanza. Previously, dune would crash when this field was present (ocaml/dune#4942, fix ocaml/dune#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 (ocaml/dune#4939, @rgrinberg) - Generate a `dune-project` when initializing projects with `dune init proj ...` (ocaml/dune#4881, closes ocaml/dune#4367, @shonfeder) - Allow spaces in the directory argument of the `subdir` stanza (ocaml/dune#4943, fixes ocaml/dune#4907, @rgrinberg) - Add a `%{toolchain}` expansion variable (ocaml/dune#4899, fixes ocaml/dune#3949, @rgrinberg) - Include dependencies of executables when creating toplevels (either `dune top` or `dune utop`) (ocaml/dune#4882, fixes ocaml/dune#4872, @Gopiancode) - Fixes `opam` META file requires entry for private libs (ocaml/dune#4841, fixes ocaml/dune#4839, @toots) - Fixes `dune exec` not adding .exe on Windows (ocaml/dune#4371, fixes ocaml/dune#3322, @MisterDA) - Allow multiple cinaps stanzas in the same directory (ocaml/dune#4460, @rgrinberg) - Fix `$ dune subst` in empty git repositories (ocaml/dune#4441, fixes ocaml/dune#3619, @rgrinberg) - Improve interpretation of ansi escape sequence when spawning processes (ocaml/dune#4408, fixes ocaml/dune#2665, @rgrinberg) - Allow `(package pkg)` in dependencies even if `pkg` is an installed package (ocaml/dune#4170, @bobot) - Allow `%{version:pkg}` to work for external packages (ocaml/dune#4104, @kit-ty-kate) - Add `(glob_files_rec <dir>/<glob>)` for globbing files recursively (ocaml/dune#4176, @jeremiedimino) - Automatically generate empty `.mli` files for executables and tests (ocaml/dune#3768, fixes ocaml/dune#3745, @craigfe) - Add `ocaml` command subgroup for OCaml related commands such as `utop`, `top`, and `merlin` (ocaml/dune#3936, @rgrinberg). - Detect unknown variables more eagerly (ocaml/dune#4184, @jeremiedimino) - Improve location of variables and macros in error messages (ocaml/dune#4205, @jeremiedimino) - Auto-detect `dune-project` files as `dune` files in Emacs (ocaml/dune#4222, @shonfeder) - Dune no longer automatically create or edit `dune-project` files (ocaml/dune#4239, fixes ocaml/dune#4108, @jeremiedimino) - Warn if `dune-project` is not found (fatal in release mode) (ocaml/dune#5343, @emillon) - Cleanup temporary files after running `$ dune exec`. (ocaml/dune#4260, fixes ocaml/dune#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. (ocaml/dune#4250, @voodoos) - Enable cram tests by default (ocaml/dune#4262, @rgrinberg) - Drop support for opam 1.x (ocaml/dune#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 (ocaml/dune#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 (ocaml/dune#4298, @jeremiedimino) - It is now possible to define action dependencies through a chain of aliases. (ocaml/dune#4303, @aalekseyev) - If an .ml file is not used by an executable, Dune no longer report parsing error in this file (ocaml/dune#4330, @jeremiedimino) - Add support for sandboxing using hard links (ocaml/dune#4360, Andrey Mokhov) - Fix dune crash when `subdir` is an absolute path (ocaml/dune#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. (ocaml/dune#4405, @aalekseyev) - Fix a bug that was causing Dune to re-hash generated files more often than necessary (ocaml/dune#4419, @jeremiedimino) - Fields allowed in the config file are now also allowed in the workspace file (ocaml/dune#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 (ocaml/dune#4422, ocaml/dune#4515, @jeremiedimino) - The `@all` alias no longer depends directly on copies of files from the source directory (ocaml/dune#4461, @nojb) - Allow dune-file as an alternative file name for dune files (needs to be enabled in the dune-project file) (ocaml/dune#4428, @nojb) - Drop support for upgrading jbuilder projects (ocaml/dune#4473, @jeremiedimino) - Extend the environment variable `BUILD_PATH_PREFIX_MAP` to rewrite the root of the build dir (or sandbox) to `/workspace_root` (ocaml/dune#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. (ocaml/dune#4443, ocaml/dune#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. (ocaml/dune#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 `chdir`s into. (ocaml/dune#4509, @aalekseyev) - Fix a crash when clearing temporary directories (ocaml/dune#4489, ocaml/dune#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. (ocaml/dune#4522, Andrey Mokhov) - Remove `dune compute`. It was broken and unused (ocaml/dune#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. (ocaml/dune#4607, @jeremiedimino) - Make Dune display the progress indicator in all output modes except quiet (ocaml/dune#4618, @aalekseyev) - Report accurate process timing information in trace mode (enabled with `--trace-file`) (ocaml/dune#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. (ocaml/dune#4643, @emillon) - Don't let command run by Dune observe the environment variable `INSIDE_EMACS` in order to improve reproducibility (ocaml/dune#4680, @jeremiedimino) - Fix `root_module` when used in public libraries (ocaml/dune#4685, fixes ocaml/dune#4684, @rgrinberg, @craigfe) - Fix `root_module` when used with preprocessing (ocaml/dune#4683, fixes ocaml/dune#4682, @rgrinberg, @craigfe) - Display Coq profile flags in `dune printenv` (ocaml/dune#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. (ocaml/dune#3956, ocaml/dune#5391, fixes ocaml/dune#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 (ocaml/dune#4786). - Always use 7 char hash prefix in build info version (ocaml/dune#4857, @jberdine, fixes ocaml/dune#4855) - Allow to explicitly disable/enable the use of `dune subst` by adding a new `(subst <disable|enable>)` stanza to the `dune-project` file. (ocaml/dune#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 (ocaml/dune#4921, fixes ocaml/dune#4459, @jeremiedimino) - Dune no longer reads installed META files for libraries distributed with the compiler, instead using its own internal database. (ocaml/dune#4946, @nojb) - Add support for `(empty_module_interface_if_absent)` in executable and library stanzas. (ocaml/dune#4955, @nojb) - Add support for `%{bin-available:...}` (ocaml/dune#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 (ocaml/dune#4996, @jeremiedimino) - Allow `%{read:...}` in more places such as `(enabled_if ...)` (ocaml/dune#4994, @jeremiedimino) - Run each action in its own process group so that we don't leave stray processes behind when killing actions (ocaml/dune#4998, @jeremiedimino) - Add an option `expand_aliases_in_sandbox` (ocaml/dune#5003, @jeremiedimino) - Allow to cancel the initial scan via Control+C (ocaml/dune#4460, fixes ocaml/dune#4364 @jeremiedimino) - Add experimental support for directory targets (ocaml/dune#3316, ocaml/dune#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 (ocaml/dune#5091, Andrey Mokhov). - Add link_flags in the env stanza (ocaml/dune#5215) - Bootstrap: ignore errors when trying to remove generated files. (ocaml/dune#5407, @damiendoligez)
The main motivation is build static binaries based on a
static
profile.And do something like
(env (static (link_flags (:standard -ccopt -static))))