From 47d401e63702d127cc6f498aeedc81bedba71125 Mon Sep 17 00:00:00 2001 From: Lucas Pluvinage Date: Mon, 1 Apr 2019 12:21:44 +0200 Subject: [PATCH 1/3] Add a test that covers the error Signed-off-by: Lucas Pluvinage --- test/blackbox-tests/test-cases/variants/run.t | 13 +++++++++++++ .../variants/same-lib-in-multiple-scopes/dune | 9 +++++++++ .../same-lib-in-multiple-scopes/dune-project | 1 + .../variants/same-lib-in-multiple-scopes/exe.ml | 0 .../same-lib-in-multiple-scopes/test/dune-project | 1 + .../same-lib-in-multiple-scopes/test/test-unix.opam | 0 .../same-lib-in-multiple-scopes/test/test.opam | 0 .../same-lib-in-multiple-scopes/test/unix/dune | 5 +++++ .../same-lib-in-multiple-scopes/test/unix/foo.ml | 0 .../same-lib-in-multiple-scopes/test/virt/dune | 4 ++++ .../same-lib-in-multiple-scopes/test/virt/foo.mli | 0 11 files changed, 33 insertions(+) create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune-project create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/exe.ml create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/dune-project create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/test-unix.opam create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/test.opam create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/unix/dune create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/unix/foo.ml create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/virt/dune create mode 100644 test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/virt/foo.mli diff --git a/test/blackbox-tests/test-cases/variants/run.t b/test/blackbox-tests/test-cases/variants/run.t index 2171b44000a..3b0ddc07326 100644 --- a/test/blackbox-tests/test-cases/variants/run.t +++ b/test/blackbox-tests/test-cases/variants/run.t @@ -78,3 +78,16 @@ Solving variant ambiguity by specifying a concrete implementation. Entering directory 'variant-with-concrete-impl' bar alias default hello from lib2.default + +Don't fail when the same library is defined in multiple scopes. + $ dune build --root same-lib-in-multiple-scopes + Entering directory 'same-lib-in-multiple-scopes' + File "dune", line 3, characters 12-16: + 3 | (variants unix) + ^^^^ + Error: Multiple solutions for the implementation + of test with variants [ "unix" ] + -> test-unix ("unix") + -> test-unix ("unix") + -> required by executable exe in dune:2 + [1] diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune new file mode 100644 index 00000000000..4b37b50c790 --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune @@ -0,0 +1,9 @@ +(executable + (name exe) + (variants unix) + (libraries test)) + +(alias + (name default) + (action + (run ./exe.exe))) 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 new file mode 100644 index 00000000000..ec8c49b51b8 --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/dune-project @@ -0,0 +1 @@ +(lang dune 1.9) \ No newline at end of file diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/exe.ml b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/exe.ml new file mode 100644 index 00000000000..e69de29bb2d 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 new file mode 100644 index 00000000000..ec8c49b51b8 --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/dune-project @@ -0,0 +1 @@ +(lang dune 1.9) \ No newline at end of file diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/test-unix.opam b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/test-unix.opam new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/test.opam b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/test.opam new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/unix/dune b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/unix/dune new file mode 100644 index 00000000000..c2de3e42a6f --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/unix/dune @@ -0,0 +1,5 @@ +(library + (name test_unix) + (public_name test-unix) + (implements test) + (variant unix)) diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/unix/foo.ml b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/unix/foo.ml new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/virt/dune b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/virt/dune new file mode 100644 index 00000000000..155ccdb47b1 --- /dev/null +++ b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/virt/dune @@ -0,0 +1,4 @@ +(library + (name test) + (public_name test) + (virtual_modules foo)) diff --git a/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/virt/foo.mli b/test/blackbox-tests/test-cases/variants/same-lib-in-multiple-scopes/test/virt/foo.mli new file mode 100644 index 00000000000..e69de29bb2d From ac1e29bab46cf86b6923ac5676daedd67753b159 Mon Sep 17 00:00:00 2001 From: Lucas Pluvinage Date: Mon, 1 Apr 2019 12:20:18 +0200 Subject: [PATCH 2/3] Quick fix multiple definitions of the same library when several scopes define the same library. Signed-off-by: Lucas Pluvinage Signed-off-by: Rudi Grinberg --- src/lib.ml | 4 ++++ src/stdune/list.ml | 3 +++ src/stdune/list.mli | 1 + test/blackbox-tests/test-cases/variants/run.t | 9 --------- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/lib.ml b/src/lib.ml index 663ac43906c..1c951eeef82 100644 --- a/src/lib.ml +++ b/src/lib.ml @@ -762,6 +762,10 @@ let rec find_implementation_for db lib ~variants = ~f:(fun variant acc -> List.rev_append acc (Variant.Map.Multi.find available_implementations variant)) + |> List.sort_uniq ~compare:(fun (a:Lib_info.t) (b:Lib_info.t) -> + match Lib_name.compare a.name b.name with + | Eq -> Path.compare a.src_dir b.src_dir + | x -> x) |> fun x -> match x, db.parent with | [], None -> Ok None | [], Some db -> find_implementation_for db lib ~variants diff --git a/src/stdune/list.ml b/src/stdune/list.ml index 02b688112aa..8e1aea6436d 100644 --- a/src/stdune/list.ml +++ b/src/stdune/list.ml @@ -111,6 +111,9 @@ let sort t ~compare = let stable_sort t ~compare = stable_sort t ~cmp:(fun a b -> Ordering.to_int (compare a b)) +let sort_uniq t ~compare = + sort_uniq t ~cmp:(fun a b -> Ordering.to_int (compare a b)) + let rec compare a b ~compare:f : Ordering.t = match a, b with | [], [] -> Eq diff --git a/src/stdune/list.mli b/src/stdune/list.mli index 088f19c3f8a..5ae2cf09dee 100644 --- a/src/stdune/list.mli +++ b/src/stdune/list.mli @@ -41,6 +41,7 @@ val destruct_last : 'a t -> ('a list * 'a) option val sort : 'a t -> compare:('a -> 'a -> Ordering.t) -> 'a t val stable_sort : 'a t -> compare:('a -> 'a -> Ordering.t) -> 'a t +val sort_uniq : 'a t -> compare:('a -> 'a -> Ordering.t) -> 'a t val compare : 'a t -> 'a t -> compare:('a -> 'a -> Ordering.t) -> Ordering.t diff --git a/test/blackbox-tests/test-cases/variants/run.t b/test/blackbox-tests/test-cases/variants/run.t index 3b0ddc07326..34063c17084 100644 --- a/test/blackbox-tests/test-cases/variants/run.t +++ b/test/blackbox-tests/test-cases/variants/run.t @@ -82,12 +82,3 @@ Solving variant ambiguity by specifying a concrete implementation. Don't fail when the same library is defined in multiple scopes. $ dune build --root same-lib-in-multiple-scopes Entering directory 'same-lib-in-multiple-scopes' - File "dune", line 3, characters 12-16: - 3 | (variants unix) - ^^^^ - Error: Multiple solutions for the implementation - of test with variants [ "unix" ] - -> test-unix ("unix") - -> test-unix ("unix") - -> required by executable exe in dune:2 - [1] From 8b70d74c11105cf9ebe1873879039f789af45870 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Tue, 2 Apr 2019 11:57:56 +0700 Subject: [PATCH 3/3] Use List.sort_uniq that will work in 4.02 Signed-off-by: Rudi Grinberg --- src/stdune/caml/dune_caml.ml | 1 + src/stdune/list.ml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/stdune/caml/dune_caml.ml b/src/stdune/caml/dune_caml.ml index 50c661074bc..e0a3875dc9e 100644 --- a/src/stdune/caml/dune_caml.ml +++ b/src/stdune/caml/dune_caml.ml @@ -10,6 +10,7 @@ module Lexing = Lexing module Digest = Digest module StringLabels = StringLabels module ListLabels = ListLabels +module List = List type ('a, 'error) result = ('a, 'error) Result.t = | Ok of 'a diff --git a/src/stdune/list.ml b/src/stdune/list.ml index 8e1aea6436d..f20ad954dcd 100644 --- a/src/stdune/list.ml +++ b/src/stdune/list.ml @@ -112,7 +112,7 @@ let stable_sort t ~compare = stable_sort t ~cmp:(fun a b -> Ordering.to_int (compare a b)) let sort_uniq t ~compare = - sort_uniq t ~cmp:(fun a b -> Ordering.to_int (compare a b)) + Dune_caml.List.sort_uniq (fun a b -> Ordering.to_int (compare a b)) t let rec compare a b ~compare:f : Ordering.t = match a, b with