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/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 02b688112aa..f20ad954dcd 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 = + 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 | [], [] -> 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 2171b44000a..34063c17084 100644 --- a/test/blackbox-tests/test-cases/variants/run.t +++ b/test/blackbox-tests/test-cases/variants/run.t @@ -78,3 +78,7 @@ 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' 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