@@ -3,36 +3,42 @@ open Import
33module Includes = struct
44 type t = Command.Args .without_targets Command.Args .t Lib_mode.Cm_kind.Map .t
55
6- let make ~project ~opaque ~requires : _ Lib_mode.Cm_kind.Map. t =
6+ let make ~project ~opaque ~direct_requires ~ hidden_requires : _ Lib_mode.Cm_kind.Map. t =
77 (* TODO : some of the requires can filtered out using [ocamldep] info *)
88 let open Resolve.Memo.O in
9- let iflags libs mode = Lib_flags.L. include_flags ~project libs mode in
9+ let iflags direct_libs hidden_libs mode =
10+ Lib_flags.L. include_flags ~project ~direct_libs ~hidden_libs mode
11+ in
1012 let make_includes_args ~mode groups =
1113 Command.Args. memo
1214 (Resolve.Memo. args
13- (let + libs = requires in
15+ (let + direct_libs = direct_requires
16+ and + hidden_libs = hidden_requires in
1417 Command.Args. S
15- [ iflags libs mode; Hidden_deps (Lib_file_deps. deps libs ~groups ) ]))
18+ [ iflags direct_libs hidden_libs mode
19+ ; Hidden_deps (Lib_file_deps. deps (direct_libs @ hidden_libs) ~groups )
20+ ]))
1621 in
1722 let cmi_includes = make_includes_args ~mode: (Ocaml Byte ) [ Ocaml Cmi ] in
1823 let cmx_includes =
1924 Command.Args. memo
2025 (Resolve.Memo. args
21- (let + libs = requires in
26+ (let + direct_libs = direct_requires
27+ and + hidden_libs = hidden_requires in
2228 Command.Args. S
23- [ iflags libs (Ocaml Native )
29+ [ iflags direct_libs hidden_libs (Ocaml Native )
2430 ; Hidden_deps
2531 (if opaque
2632 then
27- List. map libs ~f: (fun lib ->
33+ List. map (direct_libs @ hidden_libs) ~f: (fun lib ->
2834 ( lib
2935 , if Lib. is_local lib
3036 then [ Lib_file_deps.Group. Ocaml Cmi ]
3137 else [ Ocaml Cmi ; Ocaml Cmx ] ))
3238 |> Lib_file_deps. deps_with_exts
3339 else
3440 Lib_file_deps. deps
35- libs
41+ (direct_libs @ hidden_libs)
3642 ~groups: [ Lib_file_deps.Group. Ocaml Cmi ; Ocaml Cmx ])
3743 ]))
3844 in
@@ -74,6 +80,7 @@ type t =
7480 ; modules : modules
7581 ; flags : Ocaml_flags .t
7682 ; requires_compile : Lib .t list Resolve.Memo .t
83+ ; requires_hidden : Lib .t list Resolve.Memo .t
7784 ; requires_link : Lib .t list Resolve .t Memo.Lazy .t
7885 ; includes : Includes .t
7986 ; preprocessing : Pp_spec .t
@@ -99,6 +106,7 @@ let obj_dir t = t.obj_dir
99106let modules t = t.modules.modules
100107let flags t = t.flags
101108let requires_compile t = t.requires_compile
109+ let requires_hidden t = t.requires_hidden
102110let requires_link t = Memo.Lazy. force t.requires_link
103111let includes t = t.includes
104112let preprocessing t = t.preprocessing
@@ -139,10 +147,24 @@ let create
139147 =
140148 let open Memo.O in
141149 let project = Scope. project scope in
142- let requires_compile =
150+ let context = Super_context. context super_context in
151+ let * ocaml = Context. ocaml context in
152+ let direct_requires, hidden_requires =
143153 if Dune_project. implicit_transitive_deps project
144- then Memo.Lazy. force requires_link
145- else requires_compile
154+ then Memo.Lazy. force requires_link, Resolve.Memo. return []
155+ else if Version. supports_hidden_includes ocaml.version
156+ && Dune_project. dune_version project > = (3 , 17 )
157+ then (
158+ let requires_hidden =
159+ let open Resolve.Memo.O in
160+ let + requires_compile = requires_compile
161+ and + requires_link = Memo.Lazy. force requires_link in
162+ let requires_table = Table. create (module Lib ) 5 in
163+ List. iter ~f: (fun lib -> Table. set requires_table lib () ) requires_compile;
164+ List. filter requires_link ~f: (fun l -> not (Table. mem requires_table l))
165+ in
166+ requires_compile, requires_hidden)
167+ else requires_compile, Resolve.Memo. return []
146168 in
147169 let sandbox = Sandbox_config. no_special_requirements in
148170 let modes =
@@ -153,8 +175,6 @@ let create
153175 in
154176 Option. value ~default modes |> Lib_mode.Map. map ~f: Option. is_some
155177 in
156- let context = Super_context. context super_context in
157- let * ocaml = Context. ocaml context in
158178 let opaque =
159179 let profile = Context. profile context in
160180 eval_opaque ocaml profile opaque
@@ -180,9 +200,10 @@ let create
180200 ; obj_dir
181201 ; modules = { modules; dep_graphs }
182202 ; flags
183- ; requires_compile
203+ ; requires_compile = direct_requires
204+ ; requires_hidden = hidden_requires
184205 ; requires_link
185- ; includes = Includes. make ~project ~opaque ~requires: requires_compile
206+ ; includes = Includes. make ~project ~opaque ~direct_requires ~hidden_requires
186207 ; preprocessing
187208 ; opaque
188209 ; stdlib
@@ -263,8 +284,16 @@ let for_module_generated_at_link_time cctx ~requires ~module_ =
263284 their implementation must also be compiled with -opaque *)
264285 Ocaml.Version. supports_opaque_for_mli cctx.ocaml.version
265286 in
287+ let direct_requires = requires in
288+ let hidden_requires = Resolve.Memo. return [] in
266289 let modules = singleton_modules module_ in
267- let includes = Includes. make ~project: (Scope. project cctx.scope) ~opaque ~requires in
290+ let includes =
291+ Includes. make
292+ ~project: (Scope. project cctx.scope)
293+ ~opaque
294+ ~direct_requires
295+ ~hidden_requires
296+ in
268297 { cctx with
269298 opaque
270299 ; flags = Ocaml_flags. empty
0 commit comments