sig
  type resource_pattern
  type env
  module Resources :
    sig
      type elt = Pathname.t
      type t
      val empty : t
      val is_empty : t -> bool
      val mem : elt -> t -> bool
      val add : elt -> t -> t
      val singleton : elt -> t
      val remove : elt -> t -> t
      val union : t -> t -> t
      val inter : t -> t -> t
      val diff : t -> t -> t
      val compare : t -> t -> int
      val equal : t -> t -> bool
      val subset : t -> t -> bool
      val iter : (elt -> unit) -> t -> unit
      val fold : (elt -> '-> 'a) -> t -> '-> 'a
      val for_all : (elt -> bool) -> t -> bool
      val exists : (elt -> bool) -> t -> bool
      val filter : (elt -> bool) -> t -> t
      val partition : (elt -> bool) -> t -> t * t
      val cardinal : t -> int
      val elements : t -> elt list
      val min_elt : t -> elt
      val max_elt : t -> elt
      val choose : t -> elt
      val split : elt -> t -> t * bool * t
      val find : (elt -> bool) -> t -> elt
      val map : (elt -> elt) -> t -> t
      val of_list : elt list -> t
      val print : Format.formatter -> t -> unit
    end
  module Cache :
    sig
      type cache_entry
      type suspension
      type build_status =
          Bbuilt
        | Bcannot_be_built
        | Bnot_built_yet
        | Bsuspension of Resource.Cache.suspension
      val clean : unit -> unit
      val resource_state : Pathname.t -> Resource.Cache.build_status
      val resource_changed : Pathname.t -> unit
      val resource_has_changed : Pathname.t -> bool
      val resource_built : Pathname.t -> unit
      val resource_failed : Pathname.t -> unit
      val import_in_build_dir : Pathname.t -> unit
      val suspend_resource :
        Pathname.t -> Command.t -> (unit -> unit) -> Pathname.t list -> unit
      val resume_resource : Pathname.t -> unit
      val resume_suspension : Resource.Cache.suspension -> unit
      val get_optional_resource_suspension :
        Pathname.t -> (Command.t * (unit -> unit)) option
      val clear_resource_failed : Pathname.t -> unit
      val add_dependency : Pathname.t -> Pathname.t -> unit
      val fold_dependencies : (string -> string -> '-> 'a) -> '-> 'a
      val external_is_up_to_date : Pathname.t -> bool
      val dependencies : Pathname.t -> Resource.Resources.t
      val print_cache : Format.formatter -> unit -> unit
      val print_dependencies : Format.formatter -> unit -> unit
    end
  val digest : Pathname.t -> string
  val exists_in_source_dir : Pathname.t -> bool
  val exists_in_build_dir : Pathname.t -> bool
  val in_build_dir : Pathname.t -> Pathname.t
  val in_source_dir : Pathname.t -> Pathname.t
  val clean_up_links : bool Slurp.entry -> bool Slurp.entry
  val compare : Pathname.t -> Pathname.t -> int
  val print : Format.formatter -> Pathname.t -> unit
  val print_pattern : Format.formatter -> Resource.resource_pattern -> unit
  val clean : Pathname.t -> unit
  val import : string -> Pathname.t
  val import_pattern : string -> Resource.resource_pattern
  val matchit :
    Resource.resource_pattern -> Pathname.t -> Resource.env option
  val subst : Resource.env -> Pathname.t -> Pathname.t
  val subst_any : Resource.env -> Pathname.t -> Pathname.t
  val subst_pattern : Resource.env -> Resource.resource_pattern -> Pathname.t
  val print_env : Format.formatter -> Resource.env -> unit
end