diff --git a/CHANGES.md b/CHANGES.md index a6e47b7e017..48582a2dba3 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,13 @@ unreleased ---------- +- Put back library variants in development mode. We discovered a + serious unexpected issue and we might need to adjust the design of + this feature before we are ready to commit to a final version. Users + will need to write `(using library_variants 0.1)` in their + `dune-project` file if they want to use it before the design is + finalized. (#2116, @diml) + - Restricted the set of variables available for expansion in the destination filename of `install` stanza to simplify implementation and avoid dependency cycles. (#2073, @aalekseyev, @diml) diff --git a/doc/variants.rst b/doc/variants.rst index 2ce8271517e..bc2951ad454 100644 --- a/doc/variants.rst +++ b/doc/variants.rst @@ -79,6 +79,10 @@ implementation for every virtual library that we've used: Variants ======== +This feature is still under development and may change with new dune +releases. You need to write ``(using library_variants 0.1)`` in your +``dune-project`` file to unlock it. + When building a binary, implementations can be selected using a set of variants rather than individually specifying implementations. @@ -107,6 +111,8 @@ implementation would have the following configuration: Default implementation ====================== +This feature is also guarded by ``(using library_variants ...)``. + A virtual library may select a default implementation, which is enabled after variant resolution, if no suitable implementation has been found. diff --git a/src/dune_file.ml b/src/dune_file.ml index 29cb17b02a9..c69bc69a877 100644 --- a/src/dune_file.ml +++ b/src/dune_file.ml @@ -50,9 +50,20 @@ let relative_file = else of_sexp_errorf loc "relative filename expected") + +let library_variants = + let syntax = + Syntax.create ~name:"library_variants" + ~desc:"the experimental library variants feature." + [ (0, 1) ] + in + Dune_project.Extension.register_simple ~experimental:true + syntax (Dune_lang.Decoder.return []); + syntax + let variants_field = field_o "variants" ( - let* () = Syntax.since Stanza.syntax (1, 9) in + let* () = Syntax.since library_variants (0, 1) in located (list Variant.decode >>| Variant.Set.of_list)) (* Parse and resolve "package" fields *) @@ -901,11 +912,11 @@ module Library = struct located Lib_name.decode) and+ variant = field_o "variant" ( - Syntax.since Stanza.syntax (1, 9) >>> + Syntax.since library_variants (0, 1) >>> located Variant.decode) and+ default_implementation = field_o "default_implementation" ( - Syntax.since Stanza.syntax (1, 9) >>> + Syntax.since library_variants (0, 1) >>> located Lib_name.decode) and+ private_modules = field_o "private_modules" ( diff --git a/test/blackbox-tests/test-cases/toplevel-stanza/variants/dune-project b/test/blackbox-tests/test-cases/toplevel-stanza/variants/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/toplevel-stanza/variants/dune-project +++ b/test/blackbox-tests/test-cases/toplevel-stanza/variants/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants-multi-project/prj1/dune-project b/test/blackbox-tests/test-cases/variants-multi-project/prj1/dune-project index 42c0c167431..8a603347b8d 100644 --- a/test/blackbox-tests/test-cases/variants-multi-project/prj1/dune-project +++ b/test/blackbox-tests/test-cases/variants-multi-project/prj1/dune-project @@ -1 +1,2 @@ (lang dune 1.10) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants-multi-project/prj2/dune-project b/test/blackbox-tests/test-cases/variants-multi-project/prj2/dune-project index 42c0c167431..8a603347b8d 100644 --- a/test/blackbox-tests/test-cases/variants-multi-project/prj2/dune-project +++ b/test/blackbox-tests/test-cases/variants-multi-project/prj2/dune-project @@ -1 +1,2 @@ (lang dune 1.10) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/dune-package/dune-project b/test/blackbox-tests/test-cases/variants/dune-package/dune-project index e69d192dc39..397ce6bb60c 100644 --- a/test/blackbox-tests/test-cases/variants/dune-package/dune-project +++ b/test/blackbox-tests/test-cases/variants/dune-package/dune-project @@ -1,2 +1,3 @@ (lang dune 1.9) (name a) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/external/exe/dune-project b/test/blackbox-tests/test-cases/variants/external/exe/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/variants/external/exe/dune-project +++ b/test/blackbox-tests/test-cases/variants/external/exe/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/external/lib/dune-project b/test/blackbox-tests/test-cases/variants/external/lib/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/variants/external/lib/dune-project +++ b/test/blackbox-tests/test-cases/variants/external/lib/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/multiple-implementations-for-variants/dune-project b/test/blackbox-tests/test-cases/variants/multiple-implementations-for-variants/dune-project index d8fadf8674b..9716867b11f 100644 --- a/test/blackbox-tests/test-cases/variants/multiple-implementations-for-variants/dune-project +++ b/test/blackbox-tests/test-cases/variants/multiple-implementations-for-variants/dune-project @@ -1,2 +1,3 @@ (lang dune 1.9) (using fmt 1.1) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/resolution-priority/dune-project b/test/blackbox-tests/test-cases/variants/resolution-priority/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/variants/resolution-priority/dune-project +++ b/test/blackbox-tests/test-cases/variants/resolution-priority/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune-project b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune-project +++ b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/dune-project b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/dune-project +++ b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/variant-not-implementation/dune-project b/test/blackbox-tests/test-cases/variants/variant-not-implementation/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/variants/variant-not-implementation/dune-project +++ b/test/blackbox-tests/test-cases/variants/variant-not-implementation/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/variant-with-concrete-impl/dune-project b/test/blackbox-tests/test-cases/variants/variant-with-concrete-impl/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/variants/variant-with-concrete-impl/dune-project +++ b/test/blackbox-tests/test-cases/variants/variant-with-concrete-impl/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/variants/variants-base/dune-project b/test/blackbox-tests/test-cases/variants/variants-base/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/variants/variants-base/dune-project +++ b/test/blackbox-tests/test-cases/variants/variants-base/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/vlib-default-impl/default-impl-not-virtual-lib/dune-project b/test/blackbox-tests/test-cases/vlib-default-impl/default-impl-not-virtual-lib/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/vlib-default-impl/default-impl-not-virtual-lib/dune-project +++ b/test/blackbox-tests/test-cases/vlib-default-impl/default-impl-not-virtual-lib/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/vlib-default-impl/default-impl/dune-project b/test/blackbox-tests/test-cases/vlib-default-impl/default-impl/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/vlib-default-impl/default-impl/dune-project +++ b/test/blackbox-tests/test-cases/vlib-default-impl/default-impl/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/vlib-default-impl/dependency-cycle/dune-project b/test/blackbox-tests/test-cases/vlib-default-impl/dependency-cycle/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/vlib-default-impl/dependency-cycle/dune-project +++ b/test/blackbox-tests/test-cases/vlib-default-impl/dependency-cycle/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/vlib-default-impl/dune-package/dune-project b/test/blackbox-tests/test-cases/vlib-default-impl/dune-package/dune-project index e69d192dc39..397ce6bb60c 100644 --- a/test/blackbox-tests/test-cases/vlib-default-impl/dune-package/dune-project +++ b/test/blackbox-tests/test-cases/vlib-default-impl/dune-package/dune-project @@ -1,2 +1,3 @@ (lang dune 1.9) (name a) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/vlib-default-impl/external/exe/dune-project b/test/blackbox-tests/test-cases/vlib-default-impl/external/exe/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/vlib-default-impl/external/exe/dune-project +++ b/test/blackbox-tests/test-cases/vlib-default-impl/external/exe/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1) diff --git a/test/blackbox-tests/test-cases/vlib-default-impl/external/lib/dune-project b/test/blackbox-tests/test-cases/vlib-default-impl/external/lib/dune-project index ec8c49b51b8..870dce655b0 100644 --- a/test/blackbox-tests/test-cases/vlib-default-impl/external/lib/dune-project +++ b/test/blackbox-tests/test-cases/vlib-default-impl/external/lib/dune-project @@ -1 +1,2 @@ -(lang dune 1.9) \ No newline at end of file +(lang dune 1.9) +(using library_variants 0.1)