package b0
Install
Dune Dependency
Authors
Maintainers
Sources
sha256=dadde8cfa62be9dabd805fc190b415427b4699ffe3458c153e2f3f9cc5c9b9b4
md5=f96ac96fb0182f2b97dbe9ded452544b
doc/b0.b00/B00/Memo/index.html
Module B00.Memo
Build memoizer.
A memoizer ties together and environment, an operation cache, a guard and an executor.
Memoizer
type feedback = [
| `Fiber_exn of exn * Printexc.raw_backtrace
| `Fiber_fail of string
| `Miss_tool of Tool.t * string
| `Op_cache_error of Op.t * string
| `Op_complete of Op.t * [ `Did_not_write of B0_std.Fpath.t list ]
]
The type for memoizer feedback.
val pp_feedback : feedback B0_std.Fmt.t
pp_feedback ppf
formats feedback.
The type for memoizers. This ties together an environment, a aguard, an operation cache and an executor.
val create :
?clock:B0_std.Time.counter ->
?cpu_clock:B0_std.Time.cpu_counter ->
feedback:(feedback -> unit) ->
cwd:B0_std.Fpath.t ->
Env.t ->
Guard.t ->
Op_cache.t ->
Exec.t ->
t
val memo :
?hash_fun:(module B0_std.Hash.T) ->
?env:B0_std.Os.Env.t ->
?cwd:B0_std.Fpath.t ->
?cachedir:B0_std.Fpath.t ->
?max_spawn:int ->
?feedback:([ feedback | File_cache.feedback | Exec.feedback ] -> unit) ->
unit ->
(t, string) result
memo
is a simpler create
hash_fun
defaults toOp_cache.create
's default.max_spawn
defaults toExec.create
's default.env
defaults toOs.Env.current
cwd
defaults toOs.Dir.cwd
cachedir
defaults toFpath.(cwd / "_b0" / "cache")
feedback
defaults formats feedback on stdout.
val clock : t -> B0_std.Time.counter
clock m
is m
's clock.
val cpu_clock : t -> B0_std.Time.cpu_counter
cpu_clock m
is m
's cpu clock.
val op_cache : t -> Op_cache.t
op_cache m
is m
's operation cache.
val hash_fun : t -> (module B0_std.Hash.T)
hash_fun m
is m
's hash function.
val stir : block:bool -> t -> unit
stir ~block m
runs the memoizer a bit. If block
is true
blocks until the memoizer is stuck with no operation to perform.
val finish : t -> (unit, B0_std.Fpath.Set.t) result
finish m
finishes the memoizer. This blocks until there are no operation to execute like stir
does. If no operations are left waiting this returns Ok ()
. If there are remaining wiating operations it aborts them and returns Error fs
with fs
the files that never became ready and where not supposed to be written by the waiting operations.
Fibers
val fail : ('b, Format.formatter, unit, 'a) format4 -> 'b
fail fmt ...
fails the fiber with the given error message.
val fail_error : ('a, string) result -> 'a
fail_error
fails the fiber with the given error.
Files and directories
val file_ready : t -> B0_std.Fpath.t -> unit
ready m p
declares path p
to be ready, that is exists and is up-to-date in b
. This is typically used with source files and files external to the build (e.g. installed libraries).
val wait_files : t -> B0_std.Fpath.t list -> unit fiber
wait_files m files k
continues with k ()
when files
become ready. FIXME Unclear whether we really want this though this is kind of a reads
constraint for a pure OCaml operation, but then we got read
.
val read : t -> B0_std.Fpath.t -> string fiber
read m file k
reads the contents of file file
as s
when it becomes ready and continues with k s
.
val write :
t ->
?salt:string ->
?reads:B0_std.Fpath.t list ->
?mode:int ->
B0_std.Fpath.t ->
(unit -> (string, string) result) ->
unit
write m ~reads file w
writes file
with data w ()
and mode mode
(defaults to 0o644
) when reads
are ready. w
's result must only depend on reads
and salt
(defaults to ""
).
val mkdir : t -> B0_std.Fpath.t -> unit fiber
mkdir m dir k
creates directory dir
and continues with k ()
at which point file dir
is ready.
Memoizing tool spawns
val tool : t -> Tool.t -> B0_std.Cmd.t -> cmd
tool m t
is tool t
memoized. Use the resulting function to spawn the tool with the given arguments.
val spawn :
t ->
?reads:B0_std.Fpath.t list ->
?writes:B0_std.Fpath.t list ->
?env:B0_std.Os.Env.t ->
?cwd:B0_std.Fpath.t ->
?stdin:B0_std.Fpath.t ->
?stdout:Op.Spawn.stdo ->
?stderr:Op.Spawn.stdo ->
?success_exits:Op.Spawn.success_exits ->
?k:(int -> unit) ->
cmd ->
unit
spawn m ~reads ~writes ~env ~cwd ~stdin ~stdout ~stderr ~success_exits cmd
spawns cmd
once reads
files are ready and makes files writes
ready if the spawn succeeds and the file exists. The rest of the arguments are:
stdin
reads input from the given file. If unspecified reads from the standard input of the program running the build. Warning. The file is not automatically added toreads
, this allows for example to useOs.File.null
.stdout
andstderr
, the redirections for the standard outputs of the command, seestdo
. Warning. File redirections are not automatically added towrites
; this allows for example to useOs.File.null
.success_exits
the exit codes that determine if the build operation is successful (defaults to0
, use[]
to always succeed)env
, environment variables added to the build environment. This overrides environment variables read by the tool in the build environment except for forced one. It also allows to specify environment that may not be mentioned by the running tool's environment specification.cwd
the current working directory. Default iscwd
. In general it's better to avoid using relative file paths and tweaking thecwd
. Construct your paths using the absolute directory functions and make your invocations independent from thecwd
.k
, if specified a fiber invoked once the spawn has succesfully executed with the exit code.
TODO. More expressive power could by added by:
- Support to refine the read and write set after the operation returns.
Note. If the tool spawn acts on a sort of "main" file (e.g. a source file) it should be specified as the first element of reads
, this is interpreted specially by certain build tracer.
Future values
module Fut : sig ... end
Future values.