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

[RFC] New variant proposal #2134

Closed
ghost opened this issue May 8, 2019 · 0 comments · Fixed by ocaml/opam-repository#14567
Closed

[RFC] New variant proposal #2134

ghost opened this issue May 8, 2019 · 0 comments · Fixed by ocaml/opam-repository#14567
Assignees

Comments

@ghost
Copy link

ghost commented May 8, 2019

Following recent events, this ticket describes a new proposal for variants that we discussed yesterday with @rgrinberg, @TheLortex and @aalekseyev.

Proposal

The proposal is the same as before, except that we only allow an implementation to be tagged with a variant if it is part of the same project as the virtual library it implements.

This limitation has several consequence:

  • it will avoid all the issues observed with the initial version of variants
  • it will encourage users to make their implementations part of the same repository as their virtual libraries, which should lead to a more healthy ecosystem

Implementation

This restriction simplifies the implementation a lot as we will now know all the variants of a virtual library immediately when compiling the virtual library. In particular, it will not be possible to add new variants afterwards. As a result, we can store in the metadata of a virtual library the list of variants it supports, with the corresponding implementation (as just a library name) for each variant.

This local variant index will be stored directly in the library stanza of the virtual library in the dune-package file. Dune will no longer need to scan the whole package DB to construct the variant map. In fact, it will no longer need a global variant index. Instead, when looking for an implementation for a virtual library that doesn't have one, it will simply look in the local index attached to this virtual library.

Interaction with -p

-p hides all the stanzas that are not part of the package being built. This mean that when an implementation tagged with a variant is distributed as a separate package, we will no longer see it when building the virtual library. This is a problem.

To avoid this problem, instead of completely suppressing library stanzas that are not part of the current package, we will replace them by a stanza that only declare the tagged implementation. I.e. this stanzas will contain 3 pieces of information:

  • the public name of a virtual library
  • the public name of an implementation of this virtual library
  • a variant name
    This stanza will be used to construct the variant index of the virtual library. We could make this stanza available in dune files so that users can declare external variant tagged implementations.
@TheLortex TheLortex mentioned this issue May 17, 2019
rgrinberg added a commit to rgrinberg/opam-repository that referenced this issue Jul 18, 2019
CHANGES:

- Don't select all local implementations in `dune utop`. Instead, let the
  default implementation selection do its job. (ocaml/dune#2327, fixes ocaml/dune#2323, @TheLortex,
  review by @rgrinberg)

- Check that selected implementations (either by variants or default
  implementations) are indeed implementations. (ocaml/dune#2328, @TheLortex, review by
  @rgrinberg)

- Don't reserve the `Ppx` toplevel module name for ppx rewriters (ocaml/dune#2242, @diml)

- Redesign of the library variant feature according to the ocaml/dune#2134 proposal. The
  set of variants is now computed when the virtual library is installed.
  Introducing a new `external_variant` stanza. (ocaml/dune#2169, fixes ocaml/dune#2134, @TheLortex,
  review by @diml)

- Add proper line directives when copying `.cc` and `.cxx` sources (ocaml/dune#2275,
  @rgrinberg)

- Fix error message for missing C++ sources. The `.cc` extension was always
  ignored before. (ocaml/dune#2275, @rgrinberg)

- Add `$ dune init project` subcommand to create project boilerplate according
  to a common template. (ocaml/dune#2185, fixes ocaml/dune#159, @shonfeder)

- Allow to run inline tests in javascript with nodejs (ocaml/dune#2266, @hhugo)

- Build `ppx.exe` as compiling host binary. (ocaml/dune#2286, fixes ocaml/dune#2252, @toots, review
  by @rgrinberg and @diml)

- Add a `cinaps` extension and stanza for better integration with the
  [cinaps tool](https://github.com/janestreet/cinaps) tool (ocaml/dune#2269,
  @diml)

- Allow to embed build info in executables such as version and list
  and version of statically linked libraries (ocaml/dune#2224, @diml)

- Set version in `META` and `dune-package` files to the one read from
  the vcs when no other version is available (ocaml/dune#2224, @diml)

- Add a variable `%{target}` to be used in situations where the context
  requires at most one word, so `%{targets}` can be confusing; stdout
  redirections and "-o" arguments of various tools are the main use
  case; also, introduce a separate field `target` that must be used
  instead of `targets` in those situations.  (ocaml/dune#2341, @aalekseyev)

- Fix dependency graph of wrapped_compat modules. Previously, the dependency on
  the user written entry module was omitted. (ocaml/dune#2305, @rgrinberg)

- Allow to promote executables built with an `executable` stanza
  (ocaml/dune#2379, @diml)

- When instantiating an implementation with a variant, make sure it matches
  virtual library's list of known implementations. (ocaml/dune#2361, fixes ocaml/dune#2322,
  @TheLortex, review by @rgrinberg)

- Add a variable `%{ignoring_promoted_rules}` that is `true` when
  `--ingore-promoted-rules` is passed on the command line and false
  otherwise (ocaml/dune#2382, @diml)

- Fix a bug in `future_syntax` where the characters `@` and `&` were
  not distinguished in the names of binding operators (`let@` was the
  same as `let&`) (ocaml/dune#2376, @aalekseyev, @diml)

- Workspaces with non unique project names are now supported. (ocaml/dune#2377, fix ocaml/dune#2325,
  @rgrinberg)

- Improve opam generation to include the `dune` dependncies with the minimum
  constraint set based on the dune language version specified in the
  `dune-project` file. (2383, @avsm)

- The order of fields in the generated opam file now follows order preferred in
  opam-lib. (@avsm, ocaml/dune#2380)

- Fix coloring of error messages from the compiler (@diml, ocaml/dune#2384)

- Add warning `66` to default set of warnings starting for dune projects with
  language verison >= `1.11` (@rgrinberg, @diml, fixes ocaml/dune#2299)

- Add (dialect ...) stanza
  (@nojb, ocaml/dune#2404)

- Add a `--context` argument to `dune install/uninstall` (@diml, ocaml/dune#2412)

- Do not warn about merlin files pre 1.9. This warning can only be disabled in
  1.9 (ocaml/dune#2421, fixes ocaml/dune#2399, @emillon)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
1 participant