Skip to content

Commit 5369dd9

Browse files
committed
refactor: simplify vlib impl closure check
Use the already existing forbidden_libraries closure mechanism Signed-off-by: Rudi Grinberg <me@rgrinberg.com> ps-id: A5DF4B03-10EB-46F1-BC77-03C1D9E96A85
1 parent 8d03d74 commit 5369dd9

File tree

2 files changed

+31
-54
lines changed
  • src/dune_rules
  • test/blackbox-tests/test-cases/virtual-libraries/github2896.t

2 files changed

+31
-54
lines changed

src/dune_rules/lib.ml

+20-44
Original file line numberDiff line numberDiff line change
@@ -187,16 +187,6 @@ module Error = struct
187187
]
188188
, [] )
189189

190-
let vlib_in_closure ~loc ~impl ~vlib =
191-
let impl = Lib_info.name impl in
192-
let vlib = Lib_info.name vlib in
193-
User_error.make ~loc
194-
[ Pp.textf
195-
"Virtual library %S is used by a dependency of %S. This is not \
196-
allowed."
197-
(Lib_name.to_string vlib) (Lib_name.to_string impl)
198-
]
199-
200190
let only_ppx_deps_allowed ~loc dep =
201191
let name = Lib_info.name dep in
202192
make ~loc
@@ -322,9 +312,6 @@ module T = struct
322312
; sub_systems : Sub_system0.Instance.t Memo.Lazy.t Sub_system_name.Map.t
323313
; modules : Modules.t Memo.Lazy.t option
324314
; src_dirs : Path.Set.t Memo.Lazy.t
325-
; (* all the virtual libraries in the closure. we need this to avoid
326-
introducing impl -> lib -> vlib cycles. *)
327-
vlib_closure : t Id.Map.t Resolve.t
328315
}
329316

330317
let compare (x : t) (y : t) = Id.compare x.unique_id y.unique_id
@@ -1130,15 +1117,6 @@ end = struct
11301117
|> resolve_deps_and_add_runtime_deps db ~private_deps ~dune_version ~pps
11311118
|> Memo.Build.map ~f:Resolve.return
11321119
in
1133-
let vlib_closure_parents =
1134-
let open Resolve.O in
1135-
let* resolved = resolved in
1136-
let* requires = resolved.requires in
1137-
Resolve.List.fold_left ~init:Id.Map.empty requires
1138-
~f:(fun acc (lib : lib) ->
1139-
let+ vlib_closure = lib.vlib_closure in
1140-
Id.Map.superpose acc vlib_closure)
1141-
in
11421120
let* implements =
11431121
match Lib_info.implements info with
11441122
| None -> Memo.Build.return None
@@ -1153,29 +1131,28 @@ end = struct
11531131
in
11541132
Memo.Build.map res ~f:Option.some
11551133
in
1156-
let requires =
1157-
let open Resolve.O in
1134+
let* requires =
1135+
let requires =
1136+
let open Resolve.O in
1137+
let* resolved = resolved in
1138+
resolved.requires
1139+
in
11581140
match implements with
1159-
| None -> resolved >>= fun r -> r.requires
1141+
| None -> Memo.Build.return requires
11601142
| Some vlib ->
1161-
let* vlib = vlib in
1162-
let* vlib_closure_parents = vlib_closure_parents in
1163-
if Id.Map.mem vlib_closure_parents vlib.unique_id then
1164-
let loc = Lib_info.loc info in
1165-
Error.vlib_in_closure ~loc ~impl:info ~vlib:vlib.info |> Resolve.fail
1166-
else
1167-
let* resolved = resolved in
1168-
let+ requires = resolved.requires in
1169-
List.filter requires ~f:(fun lib -> not (equal lib vlib))
1170-
in
1171-
let vlib_closure =
1172-
let open Resolve.O in
1173-
let* vlib_closure_parents = vlib_closure_parents in
1174-
let+ requires = requires in
1175-
List.fold_left requires ~init:vlib_closure_parents ~f:(fun acc lib ->
1176-
match Lib_info.virtual_ lib.info with
1177-
| None -> acc
1178-
| Some _ -> Id.Map.set acc lib.unique_id lib)
1143+
let open Resolve.Build.O in
1144+
let* (_ : lib list) =
1145+
let* vlib = Memo.Build.return vlib in
1146+
let* requires_for_closure_check =
1147+
Memo.Build.return
1148+
(let open Resolve.O in
1149+
let+ requires = requires in
1150+
List.filter requires ~f:(fun lib -> not (equal lib vlib)))
1151+
in
1152+
linking_closure_with_overlap_checks None requires_for_closure_check
1153+
~forbidden_libraries:(Map.singleton vlib Loc.none)
1154+
in
1155+
Memo.Build.return requires
11791156
in
11801157
let resolve_impl impl_name =
11811158
let open Resolve.Build.O in
@@ -1299,7 +1276,6 @@ end = struct
12991276
~f:(fun name info ->
13001277
Memo.Lazy.create (fun () ->
13011278
Sub_system.instantiate name info (Lazy.force t) ~resolve))
1302-
; vlib_closure
13031279
})
13041280
in
13051281
let t = Lazy.force t in

test/blackbox-tests/test-cases/virtual-libraries/github2896.t/run.t

+11-10
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,22 @@ where vlib is a virtual library, and impl implements this library.
2020
> (library (name impl) (implements vlib) (libraries lib))
2121
> EOF
2222
$ dune build @all
23-
File "impl/dune", line 1, characters 0-55:
24-
1 | (library (name impl) (implements vlib) (libraries lib))
25-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
26-
Error: Virtual library "vlib" is used by a dependency of "impl". This is not
27-
allowed.
23+
Error: Library "vlib" was pulled in.
24+
-> required by library "lib" in _build/default/lib
25+
-> required by library "impl" in _build/default/impl
26+
-> required by _build/default/impl/.impl.objs/byte/vlib.cmo
27+
-> required by _build/default/impl/impl.cma
28+
-> required by alias impl/all
2829
[1]
2930

3031
The implementation impl was built, but it's not usable:
3132

3233
$ echo 'Vlib.run ()' > foo.ml
3334
$ echo "(executable (name foo) (libraries impl))" > dune
3435
$ dune exec ./foo.exe
35-
File "impl/dune", line 1, characters 0-55:
36-
1 | (library (name impl) (implements vlib) (libraries lib))
37-
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
38-
Error: Virtual library "vlib" is used by a dependency of "impl". This is not
39-
allowed.
36+
Error: Library "vlib" was pulled in.
37+
-> required by library "lib" in _build/default/lib
38+
-> required by library "impl" in _build/default/impl
39+
-> required by executable foo in dune:1
40+
-> required by _build/default/foo.exe
4041
[1]

0 commit comments

Comments
 (0)