diff --git a/src/dune_file.ml b/src/dune_file.ml index d1018adc..5bad3137 100644 --- a/src/dune_file.ml +++ b/src/dune_file.ml @@ -848,6 +848,17 @@ module Library = struct ] end + module Variants = struct + let syntax = + let syntax = + Syntax.create ~name:"in_development_do_not_use_variants" + ~desc:"the experimental variants feature" + [ (0, 0) ] + in + Dune_project.Extension.register syntax (Dsexp.Of_sexp.return []); + syntax + end + type t = { name : Lib_name.Local.t ; public : Public_lib.t option @@ -872,6 +883,8 @@ module Library = struct ; sub_systems : Sub_system_info.t Sub_system_name.Map.t ; no_keep_locs : bool ; dune_version : Syntax.Version.t + ; virtual_modules : Ordered_set_lang.t option + ; implements : (Loc.t * string) option } let dparse = @@ -906,6 +919,14 @@ module Library = struct Sub_system_info.record_parser () and project = Dune_project.get_exn () and dune_version = Syntax.get_exn Stanza.syntax + and virtual_modules = + field_o "virtual_modules" ( + Syntax.since Variants.syntax (0, 1) + >>= fun () -> Ordered_set_lang.dparse) + and implements = + field_o "implements" ( + Syntax.since Variants.syntax (0, 1) + >>= fun () -> (located string)) in let name = let open Syntax.Version.Infix in @@ -934,6 +955,12 @@ module Library = struct "name field is missing" ) in + Option.both virtual_modules implements + |> Option.iter ~f:(fun (virtual_modules, (_, impl)) -> + of_sexp_errorf + (Ordered_set_lang.loc virtual_modules + |> Option.value_exn) + "A library cannot be both virtual and implement %s" impl); { name ; public ; synopsis @@ -957,6 +984,8 @@ module Library = struct ; sub_systems ; no_keep_locs ; dune_version + ; virtual_modules + ; implements }) let has_stubs t = diff --git a/src/dune_file.mli b/src/dune_file.mli index c4172a94..6f17d593 100644 --- a/src/dune_file.mli +++ b/src/dune_file.mli @@ -240,6 +240,8 @@ module Library : sig ; sub_systems : Sub_system_info.t Sub_system_name.Map.t ; no_keep_locs : bool ; dune_version : Syntax.Version.t + ; virtual_modules : Ordered_set_lang.t option + ; implements : (Loc.t * string) option } val has_stubs : t -> bool diff --git a/test/blackbox-tests/dune.inc b/test/blackbox-tests/dune.inc index 9d37371e..be56c3da 100644 --- a/test/blackbox-tests/dune.inc +++ b/test/blackbox-tests/dune.inc @@ -812,6 +812,14 @@ test-cases/utop-default (progn (run %{exe:cram.exe} -test run.t) (diff? run.t run.t.corrected))))) +(alias + (name variants) + (deps (package dune) (source_tree test-cases/variants)) + (action + (chdir + test-cases/variants + (progn (run %{exe:cram.exe} -test run.t) (diff? run.t run.t.corrected))))) + (alias (name windows-diff) (deps (package dune) (source_tree test-cases/windows-diff)) @@ -928,6 +936,7 @@ (alias use-meta) (alias utop) (alias utop-default) + (alias variants) (alias windows-diff) (alias workspaces))) @@ -1018,6 +1027,7 @@ (alias too-many-parens) (alias use-meta) (alias utop-default) + (alias variants) (alias windows-diff) (alias workspaces))) diff --git a/test/blackbox-tests/test-cases/variants/run.t b/test/blackbox-tests/test-cases/variants/run.t new file mode 100644 index 00000000..376e158d --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/run.t @@ -0,0 +1,16 @@ +Variant feature is auto enabled when virtual_modules is used + + $ dune build --root variants-without-using + File "dune", line 3, characters 1-25: + (virtual_modules foobar)) + ^^^^^^^^^^^^^^^^^^^^^^^^ + Error: 'virtual_modules' is only available since version 0.1 of the experimental variants feature + [1] + + $ dune build --root variants-using + File "dune-project", line 2, characters 42-45: + 2: + Error: Version 0.1 of in_development_do_not_use_variants is not supported. + Supported versions: + - 0.0 + [1] diff --git a/test/blackbox-tests/test-cases/variants/variants-using/bar.mli b/test/blackbox-tests/test-cases/variants/variants-using/bar.mli new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/variants/variants-using/dune b/test/blackbox-tests/test-cases/variants/variants-using/dune new file mode 100644 index 00000000..b02a5978 --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/variants-using/dune @@ -0,0 +1,3 @@ +(library + (public_name foo) + (virtual_modules bar)) \ No newline at end of file diff --git a/test/blackbox-tests/test-cases/variants/variants-using/dune-project b/test/blackbox-tests/test-cases/variants/variants-using/dune-project new file mode 100644 index 00000000..a6d685cd --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/variants-using/dune-project @@ -0,0 +1,3 @@ +(lang dune 1.1) + +(using in_development_do_not_use_variants 0.1) \ No newline at end of file diff --git a/test/blackbox-tests/test-cases/variants/variants-using/foo.opam b/test/blackbox-tests/test-cases/variants/variants-using/foo.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/variants/variants-without-using/dune b/test/blackbox-tests/test-cases/variants/variants-without-using/dune new file mode 100644 index 00000000..5dc4a28f --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/variants-without-using/dune @@ -0,0 +1,3 @@ +(library + (public_name foo) + (virtual_modules foobar)) \ No newline at end of file diff --git a/test/blackbox-tests/test-cases/variants/variants-without-using/dune-project b/test/blackbox-tests/test-cases/variants/variants-without-using/dune-project new file mode 100644 index 00000000..6687faf2 --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/variants-without-using/dune-project @@ -0,0 +1 @@ +(lang dune 1.1) \ No newline at end of file diff --git a/test/blackbox-tests/test-cases/variants/variants-without-using/foo.opam b/test/blackbox-tests/test-cases/variants/variants-without-using/foo.opam new file mode 100644 index 00000000..e69de29b diff --git a/test/blackbox-tests/test-cases/variants/variants-without-using/foobar.mli b/test/blackbox-tests/test-cases/variants/variants-without-using/foobar.mli new file mode 100644 index 00000000..e69de29b