Skip to content

Commit 32188cb

Browse files
committed
fix(melange): add .cmj include dirs for installed private libs
Signed-off-by: Antonio Nuno Monteiro <anmonteiro@gmail.com>
1 parent c2a00c9 commit 32188cb

File tree

4 files changed

+40
-22
lines changed

4 files changed

+40
-22
lines changed

src/dune_rules/lib_flags.ml

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -98,18 +98,30 @@ module L = struct
9898
| lib :: _ -> Path.Set.remove dirs (Lib.lib_config lib).stdlib_dir
9999
;;
100100

101+
type mode =
102+
{ lib_mode : Lib_mode.t
103+
; melange_emit : bool
104+
}
105+
101106
let include_paths =
102107
let add_public_dir ~visible_cmi obj_dir acc mode =
103108
match visible_cmi with
104109
| false -> acc
105110
| true ->
106-
let public_cmi_dir =
107-
(match mode with
108-
| `Byte -> Obj_dir.public_cmi_ocaml_dir
109-
| `Melange -> Obj_dir.public_cmi_melange_dir)
110-
obj_dir
111+
let public_cmi_dirs =
112+
List.map
113+
~f:(fun f -> f obj_dir)
114+
(match mode with
115+
| { lib_mode = Ocaml _; _ } -> [ Obj_dir.public_cmi_ocaml_dir ]
116+
| { lib_mode = Melange; melange_emit = false } ->
117+
[ Obj_dir.public_cmi_melange_dir ]
118+
| { lib_mode = Melange; melange_emit = true } ->
119+
(* Add the dir where `.cmj` files exist, even for installed
120+
private libraries. Melange needs to query `.cmj` files for
121+
`import` information *)
122+
[ Obj_dir.melange_dir; Obj_dir.public_cmi_melange_dir ])
111123
in
112-
Path.Set.add acc public_cmi_dir
124+
List.fold_left public_cmi_dirs ~init:acc ~f:Path.Set.add
113125
in
114126
fun ?project ts mode ->
115127
let visible_cmi =
@@ -130,11 +142,11 @@ module L = struct
130142
List.fold_left ts ~init:Path.Set.empty ~f:(fun acc t ->
131143
let obj_dir = Lib_info.obj_dir (Lib.info t) in
132144
let visible_cmi = visible_cmi t in
133-
match mode with
134-
| Lib_mode.Melange -> add_public_dir ~visible_cmi obj_dir acc `Melange
135-
| Ocaml mode ->
136-
let acc = add_public_dir ~visible_cmi obj_dir acc `Byte in
137-
(match mode with
145+
match mode.lib_mode with
146+
| Melange -> add_public_dir ~visible_cmi obj_dir acc mode
147+
| Ocaml ocaml_mode ->
148+
let acc = add_public_dir ~visible_cmi obj_dir acc mode in
149+
(match ocaml_mode with
138150
| Byte -> acc
139151
| Native ->
140152
let native_dir = Obj_dir.native_dir obj_dir in
@@ -143,7 +155,17 @@ module L = struct
143155
remove_stdlib dirs ts
144156
;;
145157

146-
let include_flags ?project ts mode = to_iflags (include_paths ?project ts mode)
158+
let include_flags ?project ts mode =
159+
to_iflags (include_paths ?project ts { lib_mode = mode; melange_emit = false })
160+
;;
161+
162+
let melange_emission_include_flags ?project ts =
163+
to_iflags (include_paths ?project ts { lib_mode = Melange; melange_emit = true })
164+
;;
165+
166+
let include_paths ?project ts mode =
167+
include_paths ?project ts { lib_mode = mode; melange_emit = false }
168+
;;
147169

148170
let c_include_paths ts =
149171
let dirs =

src/dune_rules/lib_flags.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ module L : sig
2525
val to_iflags : Path.Set.t -> _ Command.Args.t
2626
val include_paths : ?project:Dune_project.t -> t -> Lib_mode.t -> Path.Set.t
2727
val include_flags : ?project:Dune_project.t -> t -> Lib_mode.t -> _ Command.Args.t
28+
val melange_emission_include_flags : ?project:Dune_project.t -> t -> _ Command.Args.t
2829
val c_include_flags : t -> Super_context.t -> _ Command.Args.t
2930
val toplevel_ld_paths : t -> Path.Set.t
3031
val toplevel_include_paths : t -> Path.Set.t

src/dune_rules/melange/melange_rules.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,9 @@ let cmj_includes ~(requires_link : Lib.t list Resolve.t) ~scope =
109109
let+ requires_link = requires_link in
110110
let deps = List.map requires_link ~f:deps_of_lib |> Dep.Set.of_list in
111111
Command.Args.S
112-
[ Lib_flags.L.include_flags ~project requires_link Melange; Hidden_deps deps ]
112+
[ Lib_flags.L.melange_emission_include_flags ~project requires_link
113+
; Hidden_deps deps
114+
]
113115
;;
114116

115117
let compile_info ~scope (mel : Melange_stanzas.Emit.t) =

test/blackbox-tests/test-cases/melange/installed-private-lib-dep.t

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -60,16 +60,9 @@ Melange (installed) library depends on private library
6060
> let () = Js.log Foo.x
6161
> EOF
6262

63-
An issue similar to #7104 still present because the `.cmj` is not visible.
63+
Build the app that depends on `foo`, which in turn depends on a private lib
6464

65-
$ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune build @melange --root app --display=short
65+
$ OCAMLPATH=$PWD/prefix/lib/:$OCAMLPATH dune build @melange --root app
6666
Entering directory 'app'
67-
melc output/node_modules/foo.__private__.priv/priv.js
68-
melc .output.mobjs/melange/melange__Entry.{cmi,cmj,cmt}
69-
melc output/entry.js
70-
melc output/node_modules/foo/foo.js (exit 2)
71-
File "_none_", line 1:
72-
Error: Priv not found, it means either the module does not exist or it is a namespace
7367
Leaving directory 'app'
74-
[1]
7568

0 commit comments

Comments
 (0)