sig
  type 'a or_error = ('a, exn) Result.result
  type 'a lwt_or_error = 'Maki.or_error Lwt.t
  type path = string
  type program = string
  type time = float
  module Limit :
    sig
      type t
      val create : int -> Maki.Limit.t
      val acquire : Maki.Limit.t -> (unit -> 'Lwt.t) -> 'Lwt.t
      val j : unit -> Maki.Limit.t
      val set_j : int -> unit
    end
  module Value :
    sig
      type 'a ops = {
        descr : string;
        serialize :
          [ `Fast of '-> Bencode.t | `Slow of '-> Bencode.t Lwt.t ];
        unserialize : Bencode.t -> 'Maki.or_error;
      }
      val make :
        serialize:[ `Fast of '-> Bencode.t | `Slow of '-> Bencode.t Lwt.t ] ->
        unserialize:(Bencode.t -> 'Maki.or_error) ->
        string -> 'Maki.Value.ops
      val make_fast :
        serialize:('-> Bencode.t) ->
        unserialize:(Bencode.t -> 'Maki.or_error) ->
        string -> 'Maki.Value.ops
      val make_slow :
        serialize:('-> Bencode.t Lwt.t) ->
        unserialize:(Bencode.t -> 'Maki.or_error) ->
        string -> 'Maki.Value.ops
      val serialize : 'Maki.Value.ops -> '-> Bencode.t Lwt.t
      val unserialize : 'Maki.Value.ops -> Bencode.t -> 'Maki.or_error
      val to_string : 'Maki.Value.ops -> '-> string Lwt.t
      val of_string : 'Maki.Value.ops -> string -> 'Maki.or_error
      val int : int Maki.Value.ops
      val string : string Maki.Value.ops
      val bool : bool Maki.Value.ops
      val float : float Maki.Value.ops
      val list : 'Maki.Value.ops -> 'a list Maki.Value.ops
      val assoc : 'Maki.Value.ops -> (string * 'a) list Maki.Value.ops
      val map :
        ?descr:string ->
        ('-> 'b) -> ('-> 'a) -> 'Maki.Value.ops -> 'Maki.Value.ops
      val file : Maki.path Maki.Value.ops
      val program : Maki.program Maki.Value.ops
      val set : 'Maki.Value.ops -> 'a list Maki.Value.ops
      val marshal : string -> 'Maki.Value.ops
      val pair :
        'Maki.Value.ops -> 'Maki.Value.ops -> ('a * 'b) Maki.Value.ops
      val triple :
        'Maki.Value.ops ->
        'Maki.Value.ops ->
        'Maki.Value.ops -> ('a * 'b * 'c) Maki.Value.ops
      val quad :
        'Maki.Value.ops ->
        'Maki.Value.ops ->
        'Maki.Value.ops ->
        'Maki.Value.ops -> ('a * 'b * 'c * 'd) Maki.Value.ops
      type t = Value : 'Maki.Value.ops * '-> Maki.Value.t
      val argv0 : Maki.Value.t
      val pack : 'Maki.Value.ops -> '-> Maki.Value.t
      val pack_int : int -> Maki.Value.t
      val pack_string : string -> Maki.Value.t
      val pack_bool : bool -> Maki.Value.t
      val pack_file : Maki.path -> Maki.Value.t
      val pack_list : 'Maki.Value.ops -> 'a list -> Maki.Value.t
      val pack_program : Maki.program -> Maki.Value.t
      val pack_set : 'Maki.Value.ops -> 'a list -> Maki.Value.t
      val pack_assoc :
        'Maki.Value.ops -> (string * 'a) list -> Maki.Value.t
    end
  module Storage = Maki_storage
  module Time :
    sig
      type t = Maki.time
      val seconds : int -> Maki.Time.t
      val hours : int -> Maki.Time.t
      val minutes : int -> Maki.Time.t
      val days : int -> Maki.Time.t
      val now : unit -> Maki.Time.t
      val ( ++ ) : Maki.Time.t -> Maki.Time.t -> Maki.Time.t
    end
  type lifetime =
      [ `CanDrop | `Keep | `KeepFor of Maki.time | `KeepUntil of Maki.time ]
  val call :
    ?bypass:bool ->
    ?storage:Storage.t ->
    ?lifetime:Maki.lifetime ->
    ?limit:Maki.Limit.t ->
    ?tags:string list ->
    name:string ->
    deps:Maki.Value.t list ->
    op:'res Maki.Value.ops ->
    (unit -> 'res Lwt.t) -> 'res Maki.or_error Lwt.t
  val call_exn :
    ?bypass:bool ->
    ?storage:Storage.t ->
    ?lifetime:Maki.lifetime ->
    ?limit:Maki.Limit.t ->
    ?tags:string list ->
    name:string ->
    deps:Maki.Value.t list ->
    op:'res Maki.Value.ops -> (unit -> 'res Lwt.t) -> 'res Lwt.t
  type cache_value
  val cache_value_of_bencode : Bencode.t -> Maki.cache_value Maki.or_error
  val bencode_of_cache_value : Maki.cache_value -> Bencode.t
  val cache_value_lifetime : Maki.cache_value -> Maki.lifetime
  val cache_value_fun_name : Maki.cache_value -> string
  val cache_value_deps : Maki.cache_value -> string list
  val cache_value_data : Maki.cache_value -> string
  val cache_value_tags : Maki.cache_value -> string list
  type gc_stats = { gc_kept : int; gc_removed : int; }
  val string_of_gc_stats : Maki.gc_stats -> string
  val gc_storage :
    ?remove_file:bool -> Storage.t -> Maki.gc_stats Maki.or_error Lwt.t
  val last_mtime : Maki.path -> Maki.time Maki.or_error
  val sha1 : Maki.path -> Sha1.t Lwt.t
  val sha1_of_string : string -> Sha1.t
  val abspath : Maki.path -> Maki.path
  val shell :
    ?timeout:float ->
    ?stdin:string -> string -> (string * string * int) Lwt.t
  val shellf :
    ?timeout:float ->
    ?stdin:string ->
    ('a, Format.formatter, unit, (string * string * int) Lwt.t)
    Pervasives.format4 -> 'a
end