Allow dynamic dependencies for aliases
This commit is contained in:
parent
a55cde2969
commit
9043280160
|
@ -301,8 +301,9 @@ module Dir_status = struct
|
||||||
|
|
||||||
|
|
||||||
type alias =
|
type alias =
|
||||||
{ mutable deps : Pset.t
|
{ mutable deps : Pset.t
|
||||||
; mutable actions : alias_action list
|
; mutable dyn_deps : (unit, Path.t list) Build.t
|
||||||
|
; mutable actions : alias_action list
|
||||||
}
|
}
|
||||||
|
|
||||||
type rules_collector =
|
type rules_collector =
|
||||||
|
@ -858,7 +859,7 @@ and load_dir_step2_exn t ~dir ~collector ~lazy_generators =
|
||||||
let alias_rules, alias_stamp_files =
|
let alias_rules, alias_stamp_files =
|
||||||
let open Build.O in
|
let open Build.O in
|
||||||
String_map.foldi collector.aliases ~init:([], Pset.empty)
|
String_map.foldi collector.aliases ~init:([], Pset.empty)
|
||||||
~f:(fun name { Dir_status. deps; actions } (rules, alias_stamp_files) ->
|
~f:(fun name { Dir_status. deps; dyn_deps; actions } (rules, alias_stamp_files) ->
|
||||||
let base_path = Path.relative alias_dir name in
|
let base_path = Path.relative alias_dir name in
|
||||||
let rules, deps =
|
let rules, deps =
|
||||||
List.fold_left actions ~init:(rules, deps)
|
List.fold_left actions ~init:(rules, deps)
|
||||||
|
@ -878,11 +879,14 @@ and load_dir_step2_exn t ~dir ~collector ~lazy_generators =
|
||||||
(Pre_rule.make
|
(Pre_rule.make
|
||||||
~context:None
|
~context:None
|
||||||
(Build.path_set deps >>>
|
(Build.path_set deps >>>
|
||||||
Build.action ~targets:[path]
|
dyn_deps >>>
|
||||||
(Redirect (Stdout,
|
Build.dyn_paths (Build.arr (fun x -> x))
|
||||||
path,
|
>>^ (fun dyn_deps ->
|
||||||
Digest_files
|
let deps = Pset.union deps (Pset.of_list dyn_deps) in
|
||||||
(Path.Set.to_list deps))))
|
Action.with_stdout_to path
|
||||||
|
(Action.digest_files (Pset.to_list deps)))
|
||||||
|
>>>
|
||||||
|
Build.action_dyn () ~targets:[path])
|
||||||
:: rules,
|
:: rules,
|
||||||
Pset.add alias_stamp_files path))
|
Pset.add alias_stamp_files path))
|
||||||
in
|
in
|
||||||
|
@ -1516,14 +1520,27 @@ module Alias = struct
|
||||||
let collector = get_collector build_system ~dir:t.dir in
|
let collector = get_collector build_system ~dir:t.dir in
|
||||||
match String_map.find collector.aliases t.name with
|
match String_map.find collector.aliases t.name with
|
||||||
| None ->
|
| None ->
|
||||||
let x = { Dir_status. deps = Pset.empty; actions = [] } in
|
let x =
|
||||||
|
{ Dir_status.
|
||||||
|
deps = Pset.empty
|
||||||
|
; dyn_deps = Build.return []
|
||||||
|
; actions = []
|
||||||
|
}
|
||||||
|
in
|
||||||
collector.aliases <- String_map.add collector.aliases t.name x;
|
collector.aliases <- String_map.add collector.aliases t.name x;
|
||||||
x
|
x
|
||||||
| Some x -> x
|
| Some x -> x
|
||||||
|
|
||||||
let add_deps build_system t deps =
|
let add_deps build_system t ?dyn_deps deps =
|
||||||
let def = get_alias_def build_system t in
|
let def = get_alias_def build_system t in
|
||||||
def.deps <- Pset.union def.deps (Pset.of_list deps)
|
def.deps <- Pset.union def.deps (Pset.of_list deps);
|
||||||
|
match dyn_deps with
|
||||||
|
| None -> ()
|
||||||
|
| Some build ->
|
||||||
|
let open Build.O in
|
||||||
|
def.dyn_deps <-
|
||||||
|
Build.fanout def.dyn_deps build >>^ fun (a, b) ->
|
||||||
|
List.rev_append a b
|
||||||
|
|
||||||
let add_action build_system t ~context ?(locks=[]) ~stamp action =
|
let add_action build_system t ~context ?(locks=[]) ~stamp action =
|
||||||
let def = get_alias_def build_system t in
|
let def = get_alias_def build_system t in
|
||||||
|
|
|
@ -143,9 +143,15 @@ module Alias : sig
|
||||||
-> contexts:string list
|
-> contexts:string list
|
||||||
-> (unit, unit) Build.t
|
-> (unit, unit) Build.t
|
||||||
|
|
||||||
(** [add_deps store alias deps] arrange things so that all [deps]
|
(** [add_deps store alias ?dyn_deps deps] arrange things so that all
|
||||||
are built as part of the build of alias [alias]. *)
|
[dyn_deps] and [deps] are built as part of the build of alias
|
||||||
val add_deps : build_system -> t -> Path.t list -> unit
|
[alias]. *)
|
||||||
|
val add_deps
|
||||||
|
: build_system
|
||||||
|
-> t
|
||||||
|
-> ?dyn_deps:(unit, Path.t list) Build.t
|
||||||
|
-> Path.t list
|
||||||
|
-> unit
|
||||||
|
|
||||||
(** [add_action store alias ~stamp action] arrange things so that
|
(** [add_action store alias ~stamp action] arrange things so that
|
||||||
[action] is executed as part of the build of alias
|
[action] is executed as part of the build of alias
|
||||||
|
|
|
@ -237,8 +237,8 @@ let add_rule_get_targets t ?sandbox ?mode ?locks ?loc build =
|
||||||
let add_rules t ?sandbox builds =
|
let add_rules t ?sandbox builds =
|
||||||
List.iter builds ~f:(add_rule t ?sandbox)
|
List.iter builds ~f:(add_rule t ?sandbox)
|
||||||
|
|
||||||
let add_alias_deps t alias deps =
|
let add_alias_deps t alias ?dyn_deps deps =
|
||||||
Alias.add_deps t.build_system alias deps
|
Alias.add_deps t.build_system alias ?dyn_deps deps
|
||||||
|
|
||||||
let add_alias_action t alias ?locks ~stamp action =
|
let add_alias_action t alias ?locks ~stamp action =
|
||||||
Alias.add_action t.build_system ~context:t.context alias ?locks ~stamp action
|
Alias.add_action t.build_system ~context:t.context alias ?locks ~stamp action
|
||||||
|
|
|
@ -98,6 +98,7 @@ val add_rules
|
||||||
val add_alias_deps
|
val add_alias_deps
|
||||||
: t
|
: t
|
||||||
-> Build_system.Alias.t
|
-> Build_system.Alias.t
|
||||||
|
-> ?dyn_deps:(unit, Path.t list) Build.t
|
||||||
-> Path.t list
|
-> Path.t list
|
||||||
-> unit
|
-> unit
|
||||||
val add_alias_action
|
val add_alias_action
|
||||||
|
|
Loading…
Reference in New Issue