11open Import
22module Non_evaluated_rule = Rule
3- module Anon_rule = Rule.Anonymous_action. Rule
43open Memo.O
54
65module Rule = struct
76 type t =
87 { id : Rule.Id .t
98 ; deps : Dep.Set .t
109 ; expanded_deps : Path.Set .t
11- ; targets : Targets.Validated .t option
10+ ; targets : Targets.Validated .t
1211 ; action : Action .t
13- ; aliases : Alias_name .t list option
14- ; loc : Loc .t
1512 }
1613end
1714
1815module Rule_top_closure = Top_closure. Make (Non_evaluated_rule.Id. Set ) (Memo )
1916
2017module rec Expand : sig
21- type expanded : = Path.Set .t * Anon_rule.Set .t
22-
23- val alias : Alias .t -> expanded Memo .t
24- val deps : Dep.Set .t -> expanded Memo .t
18+ val alias : Alias .t -> Path.Set .t Memo .t
19+ val deps : Dep.Set .t -> Path.Set .t Memo .t
2520end = struct
26- let combine_both fa fb (a1 , b1 ) (a2 , b2 ) = fa a1 a2, fb b1 b2
27-
2821 let alias =
2922 let memo =
3023 Memo. create
3124 " expand-alias"
3225 ~input: (module Alias )
3326 (fun alias ->
34- let * deps, anons =
27+ let * deps =
3528 Load_rules. get_alias_definition alias
3629 >> = Memo. map_reduce
37- ~empty: ( Dep.Set. empty, Anon_rule.Set. empty)
38- ~combine: (combine_both Dep.Set. union Anon_rule.Set. union)
30+ ~empty: Dep.Set. empty
31+ ~combine: Dep.Set. union
3932 ~f: (fun (loc , definition ) ->
4033 Memo. push_stack_frame
4134 (fun () ->
42- match (definition : Rules.Dir_rules.Alias_spec.item ) with
43- | Deps x ->
44- let + () , deps = Action_builder. evaluate_and_collect_deps x in
45- deps, Anon_rule.Set. empty
46- | Action x ->
47- Memo. return (Dep.Set. empty, Anon_rule.Set. singleton x))
35+ Action_builder. evaluate_and_collect_deps
36+ (Build_system. dep_on_alias_definition definition)
37+ >> | snd)
4838 ~human_readable_description: (fun () -> Alias. describe alias ~loc ))
4939 in
50- let + expanded_deps, anons' = Expand. deps deps in
51- expanded_deps, Anon_rule.Set. union anons anons')
40+ Expand. deps deps)
5241 in
5342 Memo. exec memo
5443 ;;
5544
5645 let deps deps =
5746 Memo. map_reduce
5847 (Dep.Set. to_list deps)
59- ~empty: ( Path.Set. empty, Anon_rule.Set. empty)
60- ~combine: (combine_both Path.Set. union Anon_rule.Set. union)
48+ ~empty: Path.Set. empty
49+ ~combine: Path.Set. union
6150 ~f: (fun (dep : Dep.t ) ->
6251 match dep with
63- | File p -> Memo. return (Path.Set. singleton p, Anon_rule.Set. empty )
52+ | File p -> Memo. return (Path.Set. singleton p)
6453 | File_selector g ->
6554 let + filenames = Build_system. eval_pred g in
6655 (* Alas, we can't use filename sets here because we end up putting paths coming
6756 from different directories together. *)
68- Path.Set. of_list (Filename_set. to_list filenames), Anon_rule.Set. empty
57+ Path.Set. of_list (Filename_set. to_list filenames)
6958 | Alias a -> Expand. alias a
70- | Env _ | Universe -> Memo. return ( Path.Set. empty, Anon_rule.Set. empty) )
59+ | Env _ | Universe -> Memo. return Path.Set. empty)
7160 ;;
7261end
7362
@@ -78,71 +67,29 @@ let evaluate_rule =
7867 ~input: (module Non_evaluated_rule )
7968 (fun rule ->
8069 let * action, deps = Action_builder. evaluate_and_collect_deps rule.action in
81- let * expanded_deps, _ = Expand. deps deps in
70+ let * expanded_deps = Expand. deps deps in
8271 Memo. return
8372 { Rule. id = rule.id
8473 ; deps
8574 ; expanded_deps
86- ; targets = Some rule.targets
75+ ; targets = rule.targets
8776 ; action = action.action
88- ; aliases = None
89- ; loc = rule.loc
9077 })
9178 in
9279 Memo. exec memo
9380;;
9481
95- let evaluate_anonymous_action =
96- let memo =
97- Memo. create
98- " evaluate-anonymous-action"
99- ~input: (module Anon_rule )
100- (fun anon_action ->
101- let * action, deps =
102- Action_builder. evaluate_and_collect_deps anon_action.action
103- in
104- let * expanded_deps, _ = Expand. deps deps in
105- Memo. return
106- { Rule. id = anon_action.id
107- ; deps
108- ; expanded_deps
109- ; targets = None
110- ; action = action.action
111- ; aliases =
112- (match anon_action.aliases with
113- | [] -> None
114- | aliases -> Some aliases)
115- ; loc = anon_action.loc
116- })
117- in
118- Memo. exec memo
119- ;;
120-
121- let rules_of_dep_paths paths =
122- Path.Set. to_list paths
123- |> Memo. parallel_map ~f: (fun p ->
124- Load_rules. get_rule p
125- >> = function
126- | None -> Memo. return None
127- | Some rule -> evaluate_rule rule >> | Option. some)
128- >> | List. filter_opt
129- ;;
130-
131- let rules_of_anon_actions anons =
132- Anon_rule.Set. to_list anons |> Memo. parallel_map ~f: evaluate_anonymous_action
133- ;;
134-
135- let rules_of_deps deps =
136- let * dep_paths, anons = Expand. deps deps in
137- let + dep_rules, anon_rules =
138- Memo. fork_and_join
139- (fun () -> rules_of_dep_paths dep_paths)
140- (fun () -> rules_of_anon_actions anons)
141- in
142- dep_rules @ anon_rules
143- ;;
144-
14582let eval ~recursive ~request =
83+ let rules_of_deps deps =
84+ Expand. deps deps
85+ >> | Path.Set. to_list
86+ >> = Memo. parallel_map ~f: (fun p ->
87+ Load_rules. get_rule p
88+ >> = function
89+ | None -> Memo. return None
90+ | Some rule -> evaluate_rule rule >> | Option. some)
91+ >> | List. filter_opt
92+ in
14693 let * () , deps = Action_builder. evaluate_and_collect_deps request in
14794 let * root_rules = rules_of_deps deps in
14895 Rule_top_closure. top_closure
@@ -154,18 +101,9 @@ let eval ~recursive ~request =
154101 | Error cycle ->
155102 User_error. raise
156103 [ Pp. text " Dependency cycle detected:"
157- ; Pp. chain cycle ~f: (fun { Rule. targets; loc; _ } ->
158- match targets with
159- | Some targets ->
160- Pp. verbatim
161- (Path. to_string_maybe_quoted (Path. build (Targets.Validated. head targets)))
162- | None ->
163- (* Anonymous actions have no targets; describe them by their location instead. *)
164- if Loc. is_none loc
165- then Pp. verbatim " <anonymous action>"
166- else (
167- let start = Loc. start loc in
168- Pp. verbatim
169- (sprintf " <anonymous action at %s:%d>" start.pos_fname start.pos_lnum)))
104+ ; Pp. chain cycle ~f: (fun rule ->
105+ Pp. verbatim
106+ (Path. to_string_maybe_quoted
107+ (Path. build (Targets.Validated. head rule.targets))))
170108 ]
171109;;
0 commit comments