sig
  module Pathname : PATHNAME
  module Tags : TAGS
  module Command :
    sig
      type tags = Tags.t
      type pathname = Pathname.t
      type t =
          Seq of t list
        | Cmd of spec
        | Echo of string list * pathname
        | Nop
      and spec =
          N
        | S of spec list
        | A of string
        | P of pathname
        | Px of pathname
        | Sh of string
        | T of tags
        | V of string
        | Quote of spec
      val atomize : string list -> spec
      val atomize_paths : string list -> spec
      val execute : ?quiet:bool -> ?pretend:bool -> t -> unit
      val execute_many :
        ?quiet:bool -> ?pretend:bool -> t list -> (bool list * exn) option
      val setup_virtual_command_solver : string -> (unit -> spec) -> unit
      val search_in_path : string -> string
      val reduce : spec -> spec
      val print : Format.formatter -> t -> unit
      val to_string : t -> string
      val string_of_command_spec : spec -> string
    end
  module Outcome : OUTCOME
  module String : STRING
  module List : LIST
  module StringSet :
    sig
      type elt = String.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
    end
  module Options :
    sig
      type command_spec = Command.spec
      val build_dir : string ref
      val include_dirs : string list ref
      val exclude_dirs : string list ref
      val nothing_should_be_rebuilt : bool ref
      val ocamlc : command_spec ref
      val ocamlopt : command_spec ref
      val ocamldep : command_spec ref
      val ocamldoc : command_spec ref
      val ocamlyacc : command_spec ref
      val ocamllex : command_spec ref
      val ocamlrun : command_spec ref
      val ocamlmklib : command_spec ref
      val ocamlmktop : command_spec ref
      val hygiene : bool ref
      val sanitize : bool ref
      val sanitization_script : string ref
      val ignore_auto : bool ref
      val plugin : bool ref
      val just_plugin : bool ref
      val native_plugin : bool ref
      val make_links : bool ref
      val nostdlib : bool ref
      val program_to_execute : bool ref
      val must_clean : bool ref
      val catch_errors : bool ref
      val use_menhir : bool ref
      val show_documentation : bool ref
      val recursive : bool ref
      val targets : string list ref
      val ocaml_libs : string list ref
      val ocaml_cflags : string list ref
      val ocaml_lflags : string list ref
      val ocaml_ppflags : string list ref
      val ocaml_yaccflags : string list ref
      val ocaml_lexflags : string list ref
      val program_args : string list ref
      val ignore_list : string list ref
      val tags : string list ref
      val tag_lines : string list ref
      val show_tags : string list ref
      val ext_obj : string ref
      val ext_lib : string ref
      val ext_dll : string ref
    end
  module Arch : ARCH
  val opt_print :
    (Format.formatter -> '-> unit) -> Format.formatter -> 'a option -> unit
  val the : 'a option -> 'a
  val getenv : ?default:string -> string -> string
  val with_input_file : ?bin:bool -> string -> (in_channel -> 'a) -> 'a
  val with_output_file : ?bin:bool -> string -> (out_channel -> 'a) -> 'a
  val with_temp_file : string -> string -> (string -> 'a) -> 'a
  val read_file : string -> string
  val copy_chan : in_channel -> out_channel -> unit
  val copy_file : string -> string -> unit
  val print_string_list : Format.formatter -> string list -> unit
  val ( !* ) : 'Lazy.t -> 'a
  val ( & ) : ('-> 'b) -> '-> 'b
  val ( |> ) : '-> ('-> 'b) -> 'b
  val ( @:= ) : 'a list ref -> 'a list -> unit
  val memo : ('-> 'b) -> '-> 'b
  type command =
    Signatures.PLUGIN.Command.t =
      Seq of Signatures.PLUGIN.command list
    | Cmd of Signatures.PLUGIN.spec
    | Echo of string list * Pathname.t
    | Nop
  and spec =
    Signatures.PLUGIN.Command.spec =
      N
    | S of Signatures.PLUGIN.spec list
    | A of string
    | P of string
    | Px of string
    | Sh of string
    | T of Tags.t
    | V of string
    | Quote of Signatures.PLUGIN.spec
  val ( / ) : Pathname.t -> Pathname.t -> Pathname.t
  val ( -.- ) : Pathname.t -> string -> Pathname.t
  val ( ++ ) : Tags.t -> Tags.elt -> Tags.t
  val ( -- ) : Tags.t -> Tags.elt -> Tags.t
  val ( +++ ) : Tags.t -> Tags.elt option -> Tags.t
  val ( --- ) : Tags.t -> Tags.elt option -> Tags.t
  type env = Pathname.t -> Pathname.t
  type builder = Pathname.t list list -> (Pathname.t, exn) Outcome.t list
  type action =
      Signatures.PLUGIN.env ->
      Signatures.PLUGIN.builder -> Signatures.PLUGIN.Command.t
  val rule :
    string ->
    ?tags:string list ->
    ?prods:string list ->
    ?deps:string list ->
    ?prod:string ->
    ?dep:string ->
    ?stamp:string ->
    ?insert:[ `after of string | `before of string | `bottom | `top ] ->
    Signatures.PLUGIN.action -> unit
  val copy_rule :
    string ->
    ?insert:[ `after of string | `before of string | `bottom | `top ] ->
    string -> string -> unit
  val dep : Tags.elt list -> Pathname.t list -> unit
  val flag : Tags.elt list -> Signatures.PLUGIN.Command.spec -> unit
  val flag_and_dep : Tags.elt list -> Signatures.PLUGIN.Command.spec -> unit
  val non_dependency : Pathname.t -> string -> unit
  val use_lib : Pathname.t -> Pathname.t -> unit
  val ocaml_lib :
    ?extern:bool ->
    ?byte:bool ->
    ?native:bool -> ?dir:Pathname.t -> ?tag_name:string -> Pathname.t -> unit
  val expand_module :
    Pathname.t list -> Pathname.t -> string list -> Pathname.t list
  val string_list_of_file : Pathname.t -> string list
  val module_name_of_pathname : Pathname.t -> string
  val mv : Pathname.t -> Pathname.t -> Signatures.PLUGIN.Command.t
  val cp : Pathname.t -> Pathname.t -> Signatures.PLUGIN.Command.t
  val ln_f : Pathname.t -> Pathname.t -> Signatures.PLUGIN.Command.t
  val ln_s : Pathname.t -> Pathname.t -> Signatures.PLUGIN.Command.t
  val rm_f : Pathname.t -> Signatures.PLUGIN.Command.t
  val chmod :
    Signatures.PLUGIN.Command.spec ->
    Pathname.t -> Signatures.PLUGIN.Command.t
  val cmp : Pathname.t -> Pathname.t -> Signatures.PLUGIN.Command.t
  val hide_package_contents : string -> unit
  val tag_file : Pathname.t -> Tags.elt list -> unit
  val tag_any : Tags.elt list -> unit
  val tags_of_pathname : Pathname.t -> Tags.t
  type hook =
      Before_hygiene
    | After_hygiene
    | Before_options
    | After_options
    | Before_rules
    | After_rules
  val dispatch : (Signatures.PLUGIN.hook -> unit) -> unit
end