Skip to content

Commit d3dc34d

Browse files
committed
refactor: introduce simpler env stanza db
Signed-off-by: Rudi Grinberg <[email protected]> <!-- ps-id: 29fc65d4-e525-435a-8fd5-c692f204f7b5 -->
1 parent dd63191 commit d3dc34d

File tree

10 files changed

+117
-20
lines changed

10 files changed

+117
-20
lines changed

src/dune_rules/compilation_context.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ let create
174174
and+ bin_annot =
175175
match bin_annot with
176176
| Some b -> Memo.return b
177-
| None -> Super_context.bin_annot super_context ~dir:(Obj_dir.dir obj_dir)
177+
| None -> Env_stanza_db.bin_annot ~dir:(Obj_dir.dir obj_dir)
178178
in
179179
{ super_context
180180
; scope

src/dune_rules/dune_env.ml

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ module Stanza = struct
8989
; bin_annot : bool option
9090
}
9191

92+
let dyn_of_config { bin_annot; _ } =
93+
let open Dyn in
94+
record [ "bin_annot", option bool bin_annot ]
95+
;;
96+
9297
let equal_config
9398
{ flags
9499
; foreign_flags
@@ -150,6 +155,13 @@ module Stanza = struct
150155
| Profile of Profile.t
151156
| Any
152157

158+
let dyn_of_pattern =
159+
let open Dyn in
160+
function
161+
| Any -> variant "Any" []
162+
| Profile p -> variant "Profile" [ Profile.to_dyn p ]
163+
;;
164+
153165
let equal_pattern x y =
154166
match x, y with
155167
| Profile x, Profile y -> Profile.equal x y
@@ -165,7 +177,11 @@ module Stanza = struct
165177
}
166178

167179
let hash { loc = _; rules } = List.hash (Tuple.T2.hash hash_pattern hash_config) rules
168-
let to_dyn = Dyn.opaque
180+
181+
let to_dyn { rules; loc = _ } =
182+
let open Dyn in
183+
Dyn.list (pair dyn_of_pattern dyn_of_config) rules
184+
;;
169185

170186
let equal { loc = _; rules } t =
171187
List.equal (Tuple.T2.equal equal_pattern equal_config) rules t.rules
@@ -292,14 +308,14 @@ module Stanza = struct
292308

293309
let empty = { loc = Loc.none; rules = [] }
294310

295-
let find t ~profile =
296-
Option.value ~default:empty_config
297-
@@ List.find_map t.rules ~f:(fun (pat, cfg) ->
311+
let find_opt t profile =
312+
List.find_map t.rules ~f:(fun (pat, cfg) ->
298313
match pat with
299314
| Any -> Some cfg
300315
| Profile a -> Option.some_if (a = profile) cfg)
301316
;;
302317

318+
let find t ~profile = Option.value ~default:empty_config (find_opt t profile)
303319
let map_configs t ~f = { t with rules = List.map t.rules ~f:(fun (p, c) -> p, f c) }
304320

305321
let add_error t ~message =

src/dune_rules/dune_env.mli

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ module Stanza : sig
6060

6161
val decode : t Dune_lang.Decoder.t
6262
val empty : t
63+
val find_opt : t -> Profile.t -> config option
6364
val find : t -> profile:Profile.t -> config
6465
val add_error : t -> message:User_message.t -> t
6566
val add_warning : t -> message:User_message.t -> t

src/dune_rules/env_node.ml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ type t =
2626
; js_of_ocaml : string list Action_builder.t Js_of_ocaml.Env.t Memo.Lazy.t
2727
; coq : Coq.t Action_builder.t Memo.Lazy.t
2828
; format_config : Format_config.t Memo.Lazy.t
29-
; bin_annot : bool Memo.Lazy.t
3029
}
3130

3231
let scope t = t.scope
@@ -47,7 +46,6 @@ let set_format_config t format_config =
4746

4847
let odoc t = Memo.Lazy.force t.odoc
4948
let coq t = Memo.Lazy.force t.coq
50-
let bin_annot t = Memo.Lazy.force t.bin_annot
5149

5250
let expand_str_lazy expander sw =
5351
match String_with_vars.text_only sw with
@@ -70,7 +68,6 @@ let make
7068
~default_context_flags
7169
~default_env
7270
~default_bin_artifacts
73-
~default_bin_annot
7471
=
7572
let open Memo.O in
7673
let config = Dune_env.Stanza.find config_stanza ~profile in
@@ -225,10 +222,6 @@ let make
225222
"format config should always have a default value taken from the project root"
226223
[])
227224
in
228-
let bin_annot =
229-
inherited ~field:bin_annot ~root:default_bin_annot (fun default ->
230-
Memo.return (Option.value ~default config.bin_annot))
231-
in
232225
{ scope
233226
; ocaml_flags
234227
; foreign_flags
@@ -242,6 +235,5 @@ let make
242235
; odoc
243236
; coq
244237
; format_config
245-
; bin_annot
246238
}
247239
;;

src/dune_rules/env_node.mli

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ val make
2828
-> default_context_flags:string list Action_builder.t Foreign_language.Dict.t
2929
-> default_env:Env.t
3030
-> default_bin_artifacts:Artifacts.Bin.t
31-
-> default_bin_annot:bool
3231
-> t
3332

3433
val scope : t -> Scope.t
@@ -45,4 +44,3 @@ val coq : t -> Coq.t Action_builder.t Memo.t
4544
val menhir_flags : t -> string list Action_builder.t
4645
val format_config : t -> Format_config.t Memo.t
4746
val set_format_config : t -> Format_config.t -> t
48-
val bin_annot : t -> bool Memo.t

src/dune_rules/env_stanza_db.ml

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
open Import
2+
open Memo.O
3+
4+
module Node = struct
5+
type t =
6+
{ value : Dune_env.Stanza.t
7+
; parent : t option Memo.t
8+
}
9+
10+
let by_context dir =
11+
let open Memo.O in
12+
let+ context = Context.DB.by_dir dir in
13+
let { Context.Env_nodes.context; workspace } = context.env_nodes in
14+
let context = Option.some_if (not (context = Dune_env.Stanza.empty)) context in
15+
let workspace = Option.some_if (not (workspace = Dune_env.Stanza.empty)) workspace in
16+
match context, workspace with
17+
| None, None -> None
18+
| Some value, None | None, Some value -> Some { value; parent = Memo.return None }
19+
| Some context, Some workspace ->
20+
Some
21+
{ value = context
22+
; parent = Memo.return (Some { value = workspace; parent = Memo.return None })
23+
}
24+
;;
25+
26+
let in_dir ~dir =
27+
let+ stanzas = Only_packages.stanzas_in_dir dir in
28+
match stanzas with
29+
| None -> None
30+
| Some stanzas ->
31+
List.find_map stanzas.stanzas ~f:(function
32+
| Dune_env.T config -> Some config
33+
| _ -> None)
34+
;;
35+
36+
let rec by_dir dir =
37+
let parent =
38+
let* scope = Scope.DB.find_by_dir dir in
39+
if Path.Build.equal dir (Scope.root scope)
40+
then by_context dir
41+
else (
42+
match Path.Build.parent dir with
43+
| None -> by_context dir
44+
| Some parent -> by_dir parent)
45+
in
46+
in_dir ~dir
47+
>>= function
48+
| Some value -> Memo.return (Some { value; parent })
49+
| None -> parent
50+
;;
51+
end
52+
53+
let value ~default ~f =
54+
let rec loop = function
55+
| None -> Memo.return default
56+
| Some { Node.value; parent } ->
57+
let* next =
58+
f value
59+
>>| function
60+
| Some x -> `Ok x
61+
| None -> `Parent
62+
in
63+
(match next with
64+
| `Ok x -> Memo.return x
65+
| `Parent -> parent >>= loop)
66+
in
67+
fun ~dir -> Node.by_dir dir >>= loop
68+
;;
69+
70+
let profile ~dir =
71+
let name, _ = Path.Build.extract_build_context_exn dir in
72+
let context = Context_name.of_string name in
73+
Per_context.profile context
74+
;;
75+
76+
let value ~default ~dir ~f =
77+
let profile = lazy (profile ~dir) in
78+
value ~default ~dir ~f:(fun stanza ->
79+
let+ profile = Lazy.force profile in
80+
Dune_env.Stanza.find_opt stanza profile |> Option.bind ~f)
81+
;;
82+
83+
let bin_annot ~dir =
84+
value ~default:true ~dir ~f:(fun (t : Dune_env.Stanza.config) -> t.bin_annot)
85+
;;

src/dune_rules/env_stanza_db.mli

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
open Import
2+
3+
val value
4+
: default:'a
5+
-> dir:Path.Build.t
6+
-> f:(Dune_env.Stanza.config -> 'a option)
7+
-> 'a Memo.t
8+
9+
val bin_annot : dir:Path.Build.t -> bool Memo.t

src/dune_rules/install_rules.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ end = struct
267267
in
268268
let set_dir m = List.map ~f:(fun (cm_kind, p) -> cm_dir m cm_kind, p) in
269269
let+ modules_impl =
270-
let+ bin_annot = Super_context.bin_annot sctx ~dir in
270+
let+ bin_annot = Env_stanza_db.bin_annot ~dir in
271271
List.concat_map installable_modules.impl ~f:(fun m ->
272272
let cmt_files =
273273
match bin_annot with

src/dune_rules/super_context.ml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,6 @@ end = struct
173173
~default_context_flags
174174
~default_env:t.context_env
175175
~default_bin_artifacts:t.bin_artifacts
176-
~default_bin_annot:true
177176
;;
178177

179178
(* Here we jump through some hoops to construct [t] as well as create a
@@ -337,7 +336,6 @@ let link_flags t ~dir (spec : Link_flags.Spec.t) =
337336

338337
let local_binaries t ~dir = Env_tree.get_node t ~dir >>= Env_node.local_binaries
339338
let env_node = Env_tree.get_node
340-
let bin_annot t ~dir = Env_tree.get_node t ~dir >>= Env_node.bin_annot
341339

342340
let dump_env t ~dir =
343341
let ocaml_flags = Env_tree.get_node t ~dir >>= Env_node.ocaml_flags in
@@ -498,7 +496,6 @@ let create ~(context : Context.t) ~host ~packages ~stanzas =
498496
~default_context_flags
499497
~default_env:context_env
500498
~default_bin_artifacts:artifacts.bin
501-
~default_bin_annot:true
502499
in
503500
make
504501
~config_stanza:context.env_nodes.context

src/dune_rules/super_context.mli

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ val link_flags : t -> dir:Path.Build.t -> Link_flags.Spec.t -> Link_flags.t Memo
5050
val local_binaries : t -> dir:Path.Build.t -> File_binding.Expanded.t list Memo.t
5151

5252
val env_node : t -> dir:Path.Build.t -> Env_node.t Memo.t
53-
val bin_annot : t -> dir:Path.Build.t -> bool Memo.t
5453

5554
(** Dump a directory environment in a readable form *)
5655
val dump_env : t -> dir:Path.Build.t -> Dune_lang.t list Action_builder.t

0 commit comments

Comments
 (0)