diff --git a/src/build.ml b/src/build.ml index 6ec7bb14..9d34c4ff 100644 --- a/src/build.ml +++ b/src/build.ml @@ -29,6 +29,8 @@ module Repr = struct | Fanout : ('a, 'b) t * ('a, 'c) t -> ('a, 'b * 'c) t | Paths : Pset.t -> ('a, 'a) t | Paths_glob : Path.t * Re.re -> ('a, 'a) t + | Contents : Path.t -> ('a, string) t + | Lines_of : Path.t -> ('a, string list) t | Vpath : 'a Vspec.t -> (unit, 'a) t | Dyn_paths : ('a, Path.t list) t -> ('a, 'a) t | Record_lib_deps : Path.t * lib_deps -> ('a, 'a) t @@ -99,6 +101,9 @@ let paths_glob ~dir re = Paths_glob (dir, re) let vpath vp = Vpath vp let dyn_paths t = Dyn_paths t +let contents p = Contents p +let lines_of p = Lines_of p + let fail x = Fail x let files_recursively_in ~dir = diff --git a/src/build.mli b/src/build.mli index 5272c1b6..35153c1f 100644 --- a/src/build.mli +++ b/src/build.mli @@ -42,6 +42,9 @@ val vpath : 'a Vspec.t -> (unit, 'a) t val dyn_paths : ('a, Path.t list) t -> ('a, 'a) t +val contents : Path.t -> ('a, string) t +val lines_of : Path.t -> ('a, string list) t + (** Always fail when executed. We pass a function rather than an exception to get a proper backtrace *) val fail : fail -> ('a, 'a) t @@ -107,6 +110,8 @@ module Repr : sig | Fanout : ('a, 'b) t * ('a, 'c) t -> ('a, 'b * 'c) t | Paths : Path.Set.t -> ('a, 'a) t | Paths_glob : Path.t * Re.re -> ('a, 'a) t + | Contents : Path.t -> ('a, string) t + | Lines_of : Path.t -> ('a, string list) t | Vpath : 'a Vspec.t -> (unit, 'a) t | Dyn_paths : ('a, Path.t list) t -> ('a, 'a) t | Record_lib_deps : Path.t * lib_deps -> ('a, 'a) t diff --git a/src/build_interpret.ml b/src/build_interpret.ml index b016acaf..1a710b36 100644 --- a/src/build_interpret.ml +++ b/src/build_interpret.ml @@ -40,6 +40,8 @@ let deps t ~all_targets_by_dir = Re.execp re (Path.basename path)) end | Dyn_paths t -> loop t acc + | Contents p -> Pset.add p acc + | Lines_of p -> Pset.add p acc | Record_lib_deps _ -> acc | Fail _ -> acc in @@ -61,6 +63,8 @@ let lib_deps = | Vpath _ -> acc | Paths_glob _ -> acc | Dyn_paths t -> loop t acc + | Contents _ -> acc + | Lines_of _ -> acc | Record_lib_deps (dir, deps) -> let data = match Pmap.find dir acc with @@ -88,6 +92,8 @@ let targets = | Vpath _ -> acc | Paths_glob _ -> acc | Dyn_paths t -> loop t acc + | Contents _ -> acc + | Lines_of _ -> acc | Record_lib_deps _ -> acc | Fail _ -> acc in diff --git a/src/build_system.ml b/src/build_system.ml index efa78d5a..c3027730 100644 --- a/src/build_system.ml +++ b/src/build_system.ml @@ -209,6 +209,8 @@ module Build_exec = struct both (exec a x) (exec b x) | Paths _ -> return x | Paths_glob _ -> return x + | Contents p -> return (read_file (Path.to_string p)) + | Lines_of p -> return (lines_of_file (Path.to_string p)) | Vpath (Vspec.T (fn, kind)) -> let file : b File_spec.t = get_file bs fn (Sexp_file kind) in return (Option.value_exn file.data) diff --git a/src/gen_rules.ml b/src/gen_rules.ml index 3899c61d..a6c31cc2 100644 --- a/src/gen_rules.ml +++ b/src/gen_rules.ml @@ -511,10 +511,8 @@ module Gen(P : Params) = struct add_rule (Build.run (Dep ctx.ocamldep) [A "-modules"; S files] ~stdout_to:ocamldep_output); add_rule - (Build.path ocamldep_output - >>^ (fun () -> - parse_deps ~dir ~modules ~alias_module - (lines_of_file (Path.to_string ocamldep_output))) + (Build.lines_of ocamldep_output + >>^ parse_deps ~dir ~modules ~alias_module >>> Build.store_vfile vdepends); Build.vpath vdepends @@ -1652,9 +1650,7 @@ end of your list of preprocessors. Consult the manual for more details." let template = if has_meta_tmpl then let meta_templ_path = Path.relative pkg.path meta_templ_fn in - Build.path meta_templ_path - >>^ fun () -> - lines_of_file (Path.to_string meta_templ_path) + Build.lines_of meta_templ_path else Build.return ["# JBUILDER_GEN"] in