Skip to content

Commit cd213cd

Browse files
committed
Specifies the object directory in module
- Adds Module.Source.t for module yet without object - Remove the need to thread the obj_dir everywhere - Requires to convert the virtual modules to the implementation module Signed-off-by: François Bobot <[email protected]>
1 parent 0fccd37 commit cd213cd

39 files changed

+438
-233
lines changed

src/check_rules.ml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,13 @@ let dev_files p =
77
| ".cmi" -> true
88
| _ -> false
99

10-
let add_obj_dir sctx ~dir ~obj_dir =
10+
let add_obj_dir sctx ~obj_dir =
1111
if (Super_context.context sctx).merlin then
12-
Super_context.add_alias_deps
13-
sctx
14-
(Build_system.Alias.check ~dir)
15-
~dyn_deps:(Build.paths_matching ~loc:Loc.none ~dir:obj_dir dev_files)
16-
Path.Set.empty
12+
let f dir =
13+
Super_context.add_alias_deps
14+
sctx
15+
(Build_system.Alias.check ~dir:obj_dir.Obj_dir.dir)
16+
~dyn_deps:(Build.paths_matching ~loc:Loc.none ~dir dev_files)
17+
Path.Set.empty
18+
in
19+
List.iter ~f (Obj_dir.all_objs_dir obj_dir)

src/check_rules.mli

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
open Stdune
2-
3-
val add_obj_dir : Super_context.t -> dir:Path.t -> obj_dir:Path.t -> unit
1+
val add_obj_dir : Super_context.t -> obj_dir:Obj_dir.t -> unit

src/compilation_context.ml

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,8 @@ type t =
4848
{ super_context : Super_context.t
4949
; scope : Scope.t
5050
; expander : Expander.t
51-
; dir : Path.t
51+
; obj_dir : Obj_dir.t
5252
; dir_kind : Dune_lang.Syntax.t
53-
; obj_dir : Path.t
54-
; private_obj_dir : Path.t option
5553
; modules : Module.t Module.Name.Map.t
5654
; alias_module : Module.t option
5755
; lib_interface_module : Module.t option
@@ -68,10 +66,9 @@ type t =
6866
let super_context t = t.super_context
6967
let scope t = t.scope
7068
let expander t = t.expander
71-
let dir t = t.dir
69+
let dir t = t.obj_dir.dir
7270
let dir_kind t = t.dir_kind
7371
let obj_dir t = t.obj_dir
74-
let private_obj_dir t = t.private_obj_dir
7572
let modules t = t.modules
7673
let alias_module t = t.alias_module
7774
let lib_interface_module t = t.lib_interface_module
@@ -86,19 +83,17 @@ let vimpl t = t.vimpl
8683

8784
let context t = Super_context.context t.super_context
8885

89-
let create ~super_context ~scope ~expander ~dir ?private_obj_dir
86+
let create ~super_context ~scope ~expander ~obj_dir
9087
?vimpl
9188
?(dir_kind=Dune_lang.Syntax.Dune)
92-
?(obj_dir=dir) ~modules ?alias_module ?lib_interface_module ~flags
89+
~modules ?alias_module ?lib_interface_module ~flags
9390
~requires ?(preprocessing=Preprocessing.dummy) ?(no_keep_locs=false)
9491
~opaque ?stdlib () =
9592
{ super_context
9693
; scope
9794
; expander
98-
; dir
99-
; dir_kind
10095
; obj_dir
101-
; private_obj_dir
96+
; dir_kind
10297
; modules
10398
; alias_module
10499
; lib_interface_module

src/compilation_context.mli

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,9 @@ val create
1717
: super_context : Super_context.t
1818
-> scope : Scope.t
1919
-> expander : Expander.t
20-
-> dir : Path.t
21-
-> ?private_obj_dir : Path.t
20+
-> obj_dir : Obj_dir.t
2221
-> ?vimpl : Vimpl.t
2322
-> ?dir_kind : Dune_lang.Syntax.t
24-
-> ?obj_dir : Path.t
2523
-> modules : Module.t Module.Name.Map.t
2624
-> ?alias_module : Module.t
2725
-> ?lib_interface_module : Module.t
@@ -43,8 +41,7 @@ val context : t -> Context.t
4341
val scope : t -> Scope.t
4442
val dir : t -> Path.t
4543
val dir_kind : t -> Dune_lang.Syntax.t
46-
val obj_dir : t -> Path.t
47-
val private_obj_dir : t -> Path.t option
44+
val obj_dir : t -> Obj_dir.t
4845
val modules : t -> Module.t Module.Name.Map.t
4946
val alias_module : t -> Module.t option
5047
val lib_interface_module : t -> Module.t option

src/dir_contents.ml

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -151,19 +151,24 @@ let modules_of_files ~dir ~files =
151151
let impls = parse_one_set impl_files in
152152
let intfs = parse_one_set intf_files in
153153
Module.Name.Map.merge impls intfs ~f:(fun name impl intf ->
154-
Some (Module.make name ~visibility:Public ?impl ?intf))
154+
Some (Module.Source.make name ?impl ?intf))
155155

156156
let build_modules_map (d : _ Dir_with_dune.t) ~modules =
157157
let scope = d.scope in
158158
let libs, exes =
159159
List.filter_partition_map d.data ~f:(fun stanza ->
160160
match (stanza : Stanza.t) with
161161
| Library lib ->
162+
let obj_dir =
163+
Obj_dir.make_local ~dir:d.ctx_dir (snd lib.name)
164+
~has_private_modules:(Option.is_some lib.private_modules)
165+
in
162166
let { Modules_field_evaluator.
163167
all_modules = modules
164168
; virtual_modules
165169
} =
166170
Modules_field_evaluator.eval ~modules
171+
~obj_dir
167172
~buildable:lib.buildable
168173
~virtual_modules:lib.virtual_modules
169174
~private_modules:(
@@ -189,16 +194,20 @@ let build_modules_map (d : _ Dir_with_dune.t) ~modules =
189194
)
190195
in
191196
Left ( lib
192-
, Lib_modules.make lib ~dir:d.ctx_dir modules ~virtual_modules
197+
, Lib_modules.make lib ~obj_dir modules ~virtual_modules
193198
~main_module_name ~wrapped
194199
)
195200
| Executables exes
196201
| Tests { exes; _} ->
202+
let obj_dir =
203+
Obj_dir.make_exe ~dir:d.ctx_dir (List.hd exes.names |> snd)
204+
in
197205
let { Modules_field_evaluator.
198206
all_modules = modules
199207
; virtual_modules = _
200208
} =
201209
Modules_field_evaluator.eval ~modules
210+
~obj_dir
202211
~buildable:exes.buildable
203212
~virtual_modules:None
204213
~private_modules:Ordered_set_lang.standard
@@ -404,8 +413,8 @@ let rec get sctx ~dir =
404413
@\n- %a\
405414
@\n- %a"
406415
Module.Name.pp_quote name
407-
(Fmt.optional Path.pp) (Module.src_dir x)
408-
(Fmt.optional Path.pp) (Module.src_dir y)))
416+
(Fmt.optional Path.pp) (Module.Source.src_dir x)
417+
(Fmt.optional Path.pp) (Module.Source.src_dir y)))
409418
in
410419
build_modules_map d ~modules)
411420
in

src/dune_file.ml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,11 @@ module Library = struct
986986
let is_virtual t = Option.is_some t.virtual_modules
987987
let is_impl t = Option.is_some t.implements
988988

989+
let obj_dir ~dir t =
990+
Obj_dir.make_local ~dir
991+
~has_private_modules:(t.private_modules <> None)
992+
(snd t.name)
993+
989994
module Main_module_name = struct
990995
type t = Module.Name.t option Inherited.t
991996
end

src/dune_file.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ module Library : sig
228228
val best_name : t -> Lib_name.t
229229
val is_virtual : t -> bool
230230
val is_impl : t -> bool
231+
val obj_dir : dir:Path.t -> t -> Obj_dir.t
231232

232233
module Main_module_name : sig
233234
type t = Module.Name.t option Inherited.t

src/dune_package.ml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,10 @@ module Lib = struct
112112
record (
113113
field_o "main_module_name" Module.Name.decode >>= fun main_module_name ->
114114
field_o "implements" (located Lib_name.decode) >>= fun implements ->
115+
field "name" Lib_name.decode >>= fun name ->
116+
let dir = Path.append_local base (dir_of_name name) in
115117
let%map synopsis = field_o "synopsis" string
116118
and loc = loc
117-
and name = field "name" Lib_name.decode
118119
and modes = field_l "modes" Mode.decode
119120
and kind = field "kind" Lib_kind.decode
120121
and archives = mode_paths "archives"
@@ -127,7 +128,7 @@ module Lib = struct
127128
and virtual_ = field_b "virtual"
128129
and sub_systems = Sub_system_info.record_parser ()
129130
and modules = field_o "modules" (Lib_modules.decode
130-
~implements:(Option.is_some implements) ~dir:base)
131+
~implements:(Option.is_some implements) ~dir)
131132
in
132133
let modes = Mode.Dict.Set.of_list modes in
133134
{ kind
@@ -146,7 +147,7 @@ module Lib = struct
146147
; main_module_name
147148
; virtual_
148149
; version = None
149-
; dir = Path.append_local base (dir_of_name name)
150+
; dir
150151
; modules
151152
; modes
152153
}

src/exe.ml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,13 @@ let link_exe
124124
let sctx = CC.super_context cctx in
125125
let ctx = SC.context sctx in
126126
let dir = CC.dir cctx in
127-
let obj_dir = CC.obj_dir cctx in
128127
let requires = CC.requires cctx in
129128
let expander = CC.expander cctx in
130129
let mode = linkage.mode in
131130
let exe = Path.relative dir (name ^ linkage.ext) in
132131
let compiler = Option.value_exn (Context.compiler ctx mode) in
133132
let artifacts ~ext modules =
134-
List.map modules ~f:(Module.obj_file ~obj_dir ~ext)
133+
List.map modules ~f:(Module.obj_file ~ext)
135134
in
136135
let modules_and_cm_files =
137136
Build.memoize "cm files"

src/exe_rules.ml

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ let executables_rules ~sctx ~dir ~dir_kind ~expander
88
(exes : Dune_file.Executables.t) =
99
(* Use "eobjs" rather than "objs" to avoid a potential conflict
1010
with a library of the same name *)
11-
let obj_dir =
12-
Utils.executable_object_directory ~dir (List.hd exes.names |> snd)
11+
let obj_dir = Obj_dir.make_exe ~dir (List.hd exes.names |> snd)
1312
in
14-
Check_rules.add_obj_dir sctx ~dir ~obj_dir;
13+
Check_rules.add_obj_dir sctx ~obj_dir;
1514
let requires = Lib.Compile.requires compile_info in
1615
let modules =
1716
Dir_contents.modules_of_executables dir_contents
@@ -87,9 +86,8 @@ let executables_rules ~sctx ~dir ~dir_kind ~expander
8786
~super_context:sctx
8887
~expander
8988
~scope
90-
~dir
91-
~dir_kind
9289
~obj_dir
90+
~dir_kind
9391
~modules
9492
~flags
9593
~requires
@@ -108,7 +106,8 @@ let executables_rules ~sctx ~dir ~dir_kind ~expander
108106
~requires:(Lib.Compile.requires compile_info)
109107
~flags:(Ocaml_flags.common flags)
110108
~preprocess:(Dune_file.Buildable.single_preprocess exes.buildable)
111-
~objs_dirs:(Path.Set.singleton obj_dir))
109+
(* only public_dir? *)
110+
~objs_dirs:(Path.Set.singleton obj_dir.Obj_dir.public_dir))
112111

113112
let rules ~sctx ~dir ~dir_contents ~scope ~expander ~dir_kind
114113
(exes : Dune_file.Executables.t) =

0 commit comments

Comments
 (0)