Skip to content
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

Move default C flags to the :standard set #3875

Merged
merged 26 commits into from
Jan 13, 2021

Conversation

voodoos
Copy link
Collaborator

@voodoos voodoos commented Oct 20, 2020

This PR implements RFC #3718

ocamlc_cflags and ocamlc_cppflags from ocamlc_config are now part of the :standard set of flags (it was already the case for the first).
Moreover they are not systematically added any-more to the compiler command line, giving back entire control over c-flags to the users.

These changes may break projects which made the assumption that dune (or ocamlc) added these flags to the command line, which might be considered a bad practice. The change in this PR will activate only when the option new_foreign_flags_handling is activated in the dune-project dune lang >= 2.8 is used.

@jeremiedimino, @rgrinberg : an other compatibility path would be to add an option to the dune-project and only default this behaviour in dune 3. However I believe it might be a good thing to push users who forgot to keep the :standard flags to update their projects' configurations.

@voodoos voodoos linked an issue Oct 20, 2020 that may be closed by this pull request
@rgrinberg
Copy link
Member

an other compatibility path would be to add an option to the dune-project and only default this behaviour in dune 3. However I believe it might be a good thing to push users who forgot to keep the :standard flags to update their projects' configurations.

That might be our only option. Otherwise, users can't freely upgrade to (lang dune 2.8)

@ghost
Copy link

ghost commented Oct 21, 2020

I agree with Rudi.

However I believe it might be a good thing to push users who forgot to keep the :standard flags to update their projects' configurations.

Agreed. Perhaps we can introduce a warning for this?

src/dune_rules/super_context.ml Show resolved Hide resolved
test/blackbox-tests/test-cases/variables/var-cc.t/run.t Outdated Show resolved Hide resolved
doc/dune-files.rst Outdated Show resolved Hide resolved
src/dune_rules/foreign_rules.ml Outdated Show resolved Hide resolved
@emillon
Copy link
Collaborator

emillon commented Oct 23, 2020

Thanks for this PR.

I think that #3718 makes a good job at describing where flags are sourced from. I think a text description of this would be a nice addition to the manual.

I also second @rgrinberg 's suggestion to have a way for configurator to use the same flags.

@rgrinberg rgrinberg self-assigned this Oct 23, 2020
@rgrinberg
Copy link
Member

If we make the change to configurator, how do we version it?

If we make the change to configurator, we need to be mindful of the behavior of:

  • (always_add_cflags false), configurator >= 2.8
  • (always_add_cflags false), configurator < 2.7

It seems like our hands are tied, since the behavior is always going to be dependent on the version of configurator being used.

The simplest way is to just version people's programs. For example, change Configurator.create to:

type cflags =
  | Always_add
  | Ask_dune
val create :
     ?dest_dir:string
  -> ?ocamlc:string
  -> ?log:(string -> unit)
  -> ?cflags:cflags
  -> string (** name, such as library name *)
  -> t

That's super safe, but will mean that upgrading is going to be a long process.

@rgrinberg rgrinberg added this to the 2.8 milestone Oct 23, 2020
@ghost
Copy link

ghost commented Nov 4, 2020

@rgrinberg we just had a chat about this with @voodoos. The change you propose to confiugurator makes sense to me, however they are not straightforward. IIUC, they require Dune communicating the default C flags as customised by the user in a given directory to configurator, and Dune tracking this dependency so that it re-runs configurator if the user changes the C flags. This is something we currently don't know how to do.

Moreover, were planning to look at the more general question of "dune configure" next.

So let's skip the configurator integration for now, but we'll keep all that in mind when working on the design of "dune configure".

@voodoos
Copy link
Collaborator Author

voodoos commented Nov 4, 2020

I added a warning that triggers if all the following condition are true:

  • Dune lang is >= 2.8
  • The new always_add_cflags is not defined
  • The :standard set of flags was overriden

The goal is to raise awareness about Dune's forced c-flags and guide the users toward the new default which will be always_add_cflags false.

mato added a commit to mato/mirage-xen that referenced this pull request Nov 9, 2020
@voodoos
Copy link
Collaborator Author

voodoos commented Nov 10, 2020

I just rebased on master and renamed the option to match the choice done in the twin PR #3802 : future_c_and_cxx_flags_handling.

I feel like this PR is ready to be merged, do you agree @rgrinberg, @jeremiedimino ?
If we merge it we will need to merge #3802 before the next release.

Copy link
Member

@rgrinberg rgrinberg left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good apart from some nits. Let's pick a better name as well.

doc/dune-files.rst Outdated Show resolved Hide resolved
src/dune_rules/foreign_rules.ml Outdated Show resolved Hide resolved
src/dune_rules/foreign_rules.ml Outdated Show resolved Hide resolved
doc/dune-files.rst Outdated Show resolved Hide resolved
@rgrinberg
Copy link
Member

We handle warnings in quite an adhoc way unfortunately. It's something that I'd like to improve when I get the chance. Feel free to work on it if you're interested

Signed-off-by: Ulysse Gérard <[email protected]>
@voodoos voodoos modified the milestones: 2.8, 2.9 Nov 25, 2020
@voodoos
Copy link
Collaborator Author

voodoos commented Nov 25, 2020

This PR is now ready however we are waiting for it's CXX sibling: #3802
I changed the target milestone to 2.9.

@voodoos voodoos merged commit 26a67bc into ocaml:master Jan 13, 2021
rgrinberg added a commit to rgrinberg/opam-repository that referenced this pull request Jan 13, 2021
…ne-action-plugin, dune-private-libs and dune-glob (2.8.0)

CHANGES:

- `dune rules` accepts aliases and other non-path rules (ocaml/dune#4063, @mrmr1993)

- Action `(diff reference test_result)` now accept `reference` to be absent and
  in that case consider that the reference is empty. Then running `dune promote`
  will create the reference file. (ocaml/dune#3795, @bobot)

- Ignore special files (BLK, CHR, FIFO, SOCKET), (ocaml/dune#3570, fixes ocaml/dune#3124, ocaml/dune#3546,
  @ejgallego)

- Experimental: Simplify loading of additional files (data or code) at runtime
  in programs by introducing specific installation sites. In particular it allow
  to define plugins to be installed in these sites. (ocaml/dune#3104, ocaml/dune#3794, fixes ocaml/dune#1185,
  @bobot)

- Move all temporary files created by dune to run actions to a single directory
  and make sure that actions executed by dune also use this directory by setting
  `TMPDIR` (or `TEMP` on Windows). (ocaml/dune#3691, fixes ocaml/dune#3422, @rgrinberg)

- Fix bootstrap script with custom configuration. (ocaml/dune#3757, fixes ocaml/dune#3774, @marsam)

- Add the `executable` field to `inline_tests` to customize the compilation
  flags of the test runner executable (ocaml/dune#3747, fixes ocaml/dune#3679, @lubegasimon)

- Add `(enabled_if ...)` to `(copy_files ...)` (ocaml/dune#3756, @nojb)

- Make sure Dune cleans up the status line before exiting (ocaml/dune#3767,
  fixes ocaml/dune#3737, @alan-j-hu)

- Add `{gitlab,bitbucket}` as options for defining project sources with `source`
  stanza `(source (<host> user/repo))` in the `dune-project` file.  (ocaml/dune#3813,
  @rgrinberg)

- Fix generation of `META` and `dune-package` files when some targets (byte,
  native, dynlink) are disabled. Previously, dune would generate all archives
  for regardless of settings. (ocaml/dune#3829, ocaml/dune#4041, @rgrinberg)

- Do not run ocamldep to for single module executables & libraries. The
  dependency graph for such artifacts is trivial (ocaml/dune#3847, @rgrinberg)

- Fix cram tests inside vendored directories not being interpreted correctly.
  (ocaml/dune#3860, fixes ocaml/dune#3843, @rgrinberg)

- Add `package` field to private libraries. This allows such libraries to be
  installed and to be usable by other public libraries in the same project
  (ocaml/dune#3655, fixes ocaml/dune#1017, @rgrinberg)

- Fix the `%{make}` variable on Windows by only checking for a `gmake` binary
  on UNIX-like systems as a unrelated `gmake` binary might exist on Windows.
  (ocaml/dune#3853, @kit-ty-kate)

- Fix `$ dune install` modifying the build directory. This made the build
  directory unusable when `$ sudo dune install` modified permissions. (fix
  ocaml/dune#3857, @rgrinberg)

- Fix handling of aliases given on the command line (using the `@` and `@@`
  syntax) so as to correctly handle relative paths. (ocaml/dune#3874, fixes ocaml/dune#3850, @nojb)

- Allow link time code generation to be used in preprocessing executable. This
  makes it possible to use the build info module inside the preprocessor.
  (ocaml/dune#3848, fix ocaml/dune#3848, @rgrinberg)

- Correctly call `git ls-tree` so unicode files are not quoted, this fixes
  problems with `dune subst` in the presence of unicode files. Fixes ocaml/dune#3219
  (ocaml/dune#3879, @ejgallego)

- `dune subst` now accepts common command-line arguments such as
  `--debug-backtraces` (ocaml/dune#3878, @ejgallego)

- `dune describe` now also includes information about executables in addition to
  that of libraries. (ocaml/dune#3892, ocaml/dune#3895, @nojb)

- instrumentation backends can now receive arguments via `(instrumentation
  (backend <name> <args>))`. (ocaml/dune#3906, ocaml/dune#3932, @nojb)

- Tweak auto-formatting of `dune` files to improve readability. (ocaml/dune#3928, @nojb)

- Add a switch argument to opam when context is not default. (ocaml/dune#3951, @tmattio)

- Avoid pager when running `$ git diff` (ocaml/dune#3912, @AltGr)

- Add `(root_module ..)` field to libraries & executables. This makes it
  possible to use library dependencies shadowed by local modules (ocaml/dune#3825,
  @rgrinberg)

- Allow `(formatting ...)` field in `(env ...)` stanza to set per-directory
  formatting specification. (ocaml/dune#3942, @nojb)

- [coq] In `coq.theory`, `:standard` for the `flags` field now uses the
  flags set in `env` profile flags (ocaml/dune#3931 , @ejgallego @rgrinberg)

- [coq] Add `-q` flag to `:standard` `coqc` flags , fixes ocaml/dune#3924, (ocaml/dune#3931 , @ejgallego)

- Add support for Coq's native compute compilation mode (@ejgallego, ocaml/dune#3210)

- Add a `SUFFIX` directive in `.merlin` files for each dialect with no
  preprocessing, to let merlin know of additional file extensions (ocaml/dune#3977,
  @vouillon)

- Stop promoting `.merlin` files. Write per-stanza Merlin configurations in
  binary form. Add a new subcommand `dune ocaml-merlin` that Merlin can use to
  query the configuration files. The `allow_approximate_merlin` option is now
  useless and deprecated. Dune now conflicts with `merlin < 3.4.0` and
  `ocaml-lsp-server < 1.3.0` (ocaml/dune#3554, @voodoos)

- Configurator: fix a bug introduced in 2.6.0 where the configurator V1 API
  doesn't work at all when used outside of dune. (ocaml/dune#4046, @aalekseyev)

- Fix `libexec` and `libexec-private` variables. In cross-compilation settings,
  they now point to the file in the host context. (ocaml/dune#4058, fixes ocaml/dune#4057,
  @TheLortex)

- When running `$ dune subst`, use project metadata as a fallback when package
  metadata is missing. We also generate a warning when `(name ..)` is missing in
  `dune-project` files to avoid failures in production builds.

- Remove support for passing `-nodynlink` for executables. It was bypassed in
  most cases and not correct in other cases in particular on arm32.
  (ocaml/dune#4085, fixes ocaml/dune#4069, fixes ocaml/dune#2527, @emillon)

- Generate archive rules compatible with 4.12. Dune longer attempt to generate
  an archive file if it's unnecessary (ocaml/dune#3973, fixes ocaml/dune#3766, @rgrinberg)

- Fix generated Merlin configurations when multiple preprocessors are defined
  for different modules in the same folder. (ocaml/dune#4092, fixes ocaml/dune#2596, ocaml/dune#1212 and
  ocaml/dune#3409, @voodoos)

- Add the option `use_standard_c_and_cxx_flags` to `dune-project` that 1.
  disables the unconditional use of the `ocamlc_cflags` and `ocamlc_cppflags`
  from `ocamlc -config` in C compiler calls, these flags will be present in the
  `:standard` set instead; and 2. enables the detection of the C compiler family
  and populates the `:standard` set of flags with common default values when
  building CXX stubs. (ocaml/dune#3875, ocaml/dune#3802, fix ocaml/dune#3718 and ocaml/dune#3528, @voodoos)
@voodoos
Copy link
Collaborator Author

voodoos commented Apr 9, 2021

@ejgallego same as #3802

@voodoos voodoos modified the milestones: 2.9, 3.0 Apr 9, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[RFC] Rationalize C compiler flags
3 participants