@@ -30,19 +30,47 @@ let opens modules m =
3030 Command.Args. As (Modules.With_vlib. local_open modules m |> Ocaml_flags. open_flags)
3131;;
3232
33- let other_cm_files ~opaque ~cm_kind ~obj_dir =
33+ let other_cm_files ~opaque ~cm_kind ~obj_dir ~cms_cmt_dependency ~bin_annot ~bin_annot_cms
34+ ~is_ox =
3435 List. concat_map ~f: (fun m ->
3536 let cmi_kind = Lib_mode.Cm_kind. cmi cm_kind in
3637 let deps = [ Path. build (Obj_dir.Module. cm_file_exn obj_dir m ~kind: cmi_kind) ] in
37- if Module. has m ~ml_kind: Impl && cm_kind = Ocaml Cmx && not opaque
38- then (
39- let cmx = Obj_dir.Module. cm_file_exn obj_dir m ~kind: (Ocaml Cmx ) in
40- Path. build cmx :: deps)
41- else if Module. has m ~ml_kind: Impl && cm_kind = Melange Cmj
42- then (
43- let cmj = Obj_dir.Module. cm_file_exn obj_dir m ~kind: (Melange Cmj ) in
44- Path. build cmj :: deps)
45- else deps)
38+ let deps =
39+ if Module. has m ~ml_kind: Impl && cm_kind = Ocaml Cmx && not opaque
40+ then (
41+ let cmx = Obj_dir.Module. cm_file_exn obj_dir m ~kind: (Ocaml Cmx ) in
42+ Path. build cmx :: deps)
43+ else if Module. has m ~ml_kind: Impl && cm_kind = Melange Cmj
44+ then (
45+ let cmj = Obj_dir.Module. cm_file_exn obj_dir m ~kind: (Melange Cmj ) in
46+ Path. build cmj :: deps)
47+ else deps
48+ in
49+ (* Add .cms/.cmt dependencies when enabled. Like .cmx dependencies, these are
50+ skipped when -opaque is used. *)
51+ let cms_cmt_deps =
52+ let open Workspace.Context.Cms_cmt_dependency in
53+ match cms_cmt_dependency with
54+ | No_dependency -> []
55+ | Depends_on_cms when bin_annot_cms && is_ox && not opaque ->
56+ (* We pass as [cm_kind] [Ocaml Cmx/Cmi] but the specific [cm_kind]
57+ doesn't matter here: .cms/.cmt files are stored in byte_dir
58+ regardless (see [Obj_dir.Module.cms_file]). *)
59+ List. filter_opt
60+ [ Obj_dir.Module. cms_file obj_dir m ~ml_kind: Impl ~cm_kind: (Ocaml Cmx )
61+ ; Obj_dir.Module. cms_file obj_dir m ~ml_kind: Intf ~cm_kind: (Ocaml Cmi )
62+ ]
63+ |> List. map ~f: Path. build
64+ | Depends_on_cms -> []
65+ | Depends_on_cmt when bin_annot && is_ox && not opaque ->
66+ List. filter_opt
67+ [ Obj_dir.Module. cmt_file obj_dir m ~ml_kind: Impl ~cm_kind: (Ocaml Cmx )
68+ ; Obj_dir.Module. cmt_file obj_dir m ~ml_kind: Intf ~cm_kind: (Ocaml Cmi )
69+ ]
70+ |> List. map ~f: Path. build
71+ | Depends_on_cmt -> []
72+ in
73+ cms_cmt_deps @ deps)
4674;;
4775
4876let copy_interface ~sctx ~dir ~obj_dir ~cm_kind m =
@@ -230,8 +258,21 @@ let build_cm
230258 let other_cm_files =
231259 let dep_graph = Ml_kind.Dict. get (Compilation_context. dep_graphs cctx) ml_kind in
232260 let module_deps = Dep_graph. deps_of dep_graph m in
261+ let cms_cmt_dependency = Compilation_context. cms_cmt_dependency cctx in
262+ let bin_annot = Compilation_context. bin_annot cctx in
263+ let bin_annot_cms = Compilation_context. bin_annot_cms cctx in
264+ let is_ox = Ocaml_config. ox ocaml.ocaml_config in
233265 Action_builder. dyn_paths_unit
234- (Action_builder. map module_deps ~f: (other_cm_files ~opaque ~cm_kind ~obj_dir ))
266+ (Action_builder. map module_deps
267+ ~f:
268+ (other_cm_files
269+ ~opaque
270+ ~cm_kind
271+ ~obj_dir
272+ ~cms_cmt_dependency
273+ ~bin_annot
274+ ~bin_annot_cms
275+ ~is_ox ))
235276 in
236277 let cmt_args =
237278 match cm_kind with
0 commit comments