sig
  module type IO_FILE =
    sig
      type t
      val empty : OpamFile.IO_FILE.t
      val write : OpamTypes.filename -> OpamFile.IO_FILE.t -> unit
      val read : OpamTypes.filename -> OpamFile.IO_FILE.t
      val safe_read : OpamTypes.filename -> OpamFile.IO_FILE.t
      val read_from_channel : Pervasives.in_channel -> OpamFile.IO_FILE.t
      val write_to_channel :
        Pervasives.out_channel -> OpamFile.IO_FILE.t -> unit
    end
  module Lines :
    sig
      type t = string list list
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Config :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val create :
        OpamTypes.switch ->
        OpamTypes.repository_name list ->
        ?criteria:(OpamTypes.solver_criteria * string) list ->
        ?solver:string -> int -> int -> t
      val with_switch : t -> OpamTypes.switch -> t
      val with_repositories : t -> OpamTypes.repository_name list -> t
      val with_current_opam_version : t -> t
      val with_criteria : t -> (OpamTypes.solver_criteria * string) list -> t
      val with_solver : t -> string option -> t
      val opam_version : t -> OpamTypes.opam_version
      val repositories : t -> OpamTypes.repository_name list
      val switch : t -> OpamTypes.switch
      val jobs : t -> int
      val dl_jobs : t -> int
      val criteria : t -> (OpamTypes.solver_criteria * string) list
      val solver : t -> string option
    end
  module OPAM :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val create : OpamTypes.package -> t
      val template : OpamTypes.package -> t
      val validate : t -> string list
      val is_explicit : OpamTypes.filename -> bool
      val opam_version : t -> OpamTypes.opam_version
      val name : t -> OpamTypes.name
      val name_opt : t -> OpamTypes.name option
      val version : t -> OpamTypes.version
      val version_opt : t -> OpamTypes.version option
      val ocaml_version : t -> OpamTypes.compiler_constraint option
      val os : t -> (bool * string) OpamTypes.generic_formula
      val available : t -> OpamTypes.filter
      val maintainer : t -> string list
      val substs : t -> OpamTypes.basename list
      val build_env : t -> (string * string * string) list
      val build : t -> OpamTypes.command list
      val install : t -> OpamTypes.command list
      val remove : t -> OpamTypes.command list
      val depends : t -> OpamTypes.ext_formula
      val depopts : t -> OpamTypes.ext_formula
      val depexts : t -> OpamTypes.tags option
      val conflicts : t -> OpamTypes.formula
      val libraries : t -> (string * OpamTypes.filter option) list
      val syntax : t -> (string * OpamTypes.filter option) list
      val patches : t -> (OpamTypes.basename * OpamTypes.filter option) list
      val homepage : t -> string list
      val author : t -> string list
      val license : t -> string list
      val doc : t -> string list
      val tags : t -> string list
      val build_test : t -> OpamTypes.command list
      val build_doc : t -> OpamTypes.command list
      val messages : t -> (string * OpamTypes.filter option) list
      val post_messages : t -> (string * OpamTypes.filter option) list
      val bug_reports : t -> string list
      val flags : t -> OpamTypes.package_flag list
      val with_opam_version : t -> OpamTypes.opam_version -> t
      val dev_repo : t -> OpamTypes.pin_option option
      val with_name : t -> OpamTypes.name -> t
      val with_name_opt : t -> OpamTypes.name option -> t
      val with_version : t -> OpamTypes.version -> t
      val with_version_opt : t -> OpamTypes.version option -> t
      val with_depends : t -> OpamTypes.ext_formula -> t
      val with_depopts : t -> OpamTypes.ext_formula -> t
      val with_conflicts : t -> OpamTypes.formula -> t
      val with_build : t -> OpamTypes.command list -> t
      val with_install : t -> OpamTypes.command list -> t
      val with_remove : t -> OpamTypes.command list -> t
      val with_libraries : t -> (string * OpamTypes.filter option) list -> t
      val with_syntax : t -> (string * OpamTypes.filter option) list -> t
      val with_substs : t -> OpamTypes.basename list -> t
      val with_ocaml_version : t -> OpamTypes.compiler_constraint option -> t
      val with_os : t -> (bool * string) OpamTypes.generic_formula -> t
      val with_maintainer : t -> string list -> t
      val with_patches :
        t -> (OpamTypes.basename * OpamTypes.filter option) list -> t
      val with_bug_reports : t -> string list -> t
      val with_depexts : t -> OpamTypes.tags option -> t
      val with_flags : t -> OpamTypes.package_flag list -> t
      val with_dev_repo : t -> OpamTypes.pin_option option -> t
      val to_1_0 : OpamTypes.file -> OpamTypes.file
    end
  module Descr :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val of_string : string -> t
      val synopsis : t -> string
      val body : t -> string
      val full : t -> string
    end
  module Aliases :
    sig
      type t = OpamTypes.compiler OpamTypes.switch_map
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Export :
    sig
      type t =
          OpamTypes.package_set * OpamTypes.package_set *
          OpamTypes.pin_option OpamPackage.Name.Map.t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Installed :
    sig
      type t = OpamTypes.package_set
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Installed_roots :
    sig
      type t = OpamTypes.package_set
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Reinstall :
    sig
      type t = OpamTypes.package_set
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Comp :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val create_preinstalled :
        OpamTypes.compiler ->
        OpamTypes.compiler_version ->
        OpamTypes.name list -> (string * string * string) list -> t
      val preinstalled : t -> bool
      val opam_version : t -> OpamTypes.opam_version
      val name : t -> OpamTypes.compiler
      val version : t -> OpamTypes.compiler_version
      val src : t -> OpamTypes.address option
      val kind : t -> OpamTypes.repository_kind
      val patches : t -> OpamTypes.filename list
      val configure : t -> string list
      val make : t -> string list
      val build : t -> OpamTypes.command list
      val packages : t -> OpamTypes.formula
      val env : t -> (string * string * string) list
      val to_1_0 : OpamTypes.file -> OpamTypes.file
    end
  module Dot_install :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val bin :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val sbin :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val lib :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val toplevel :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val stublibs :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val share :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val share_root :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val etc :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val doc :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val man :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.basename option)
        list
      val misc :
        t ->
        (OpamTypes.basename OpamTypes.optional * OpamTypes.filename) list
    end
  module Dot_config :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val create :
        (OpamTypes.variable * OpamTypes.variable_contents) list -> t
      val variable :
        t -> OpamTypes.variable -> OpamTypes.variable_contents option
      val variables : t -> OpamTypes.variable list
    end
  module Package_index :
    sig
      type t =
          (OpamTypes.repository_name * string option) OpamTypes.package_map
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Compiler_index :
    sig
      type t =
          (OpamTypes.repository_name * string option) OpamTypes.compiler_map
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Repo_config :
    sig
      type t = OpamTypes.repository
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Pinned :
    sig
      type t = OpamTypes.pin_option OpamTypes.name_map
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Repo :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val create :
        ?browse:string ->
        ?upstream:string ->
        ?opam_version:string ->
        ?redirect:(string * OpamTypes.filter option) list -> unit -> t
      val opam_version : t -> OpamVersion.t
      val browse : t -> string option
      val upstream : t -> string option
      val redirect : t -> (string * OpamTypes.filter option) list
    end
  module Subst :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val replace :
        t -> (OpamTypes.full_variable -> OpamTypes.variable_contents) -> t
      val replace_string :
        string ->
        (OpamTypes.full_variable -> OpamTypes.variable_contents) -> string
    end
  module URL :
    sig
      type t
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
      val create :
        OpamTypes.repository_kind ->
        ?mirrors:OpamTypes.address list -> OpamTypes.address -> t
      val url : t -> OpamTypes.address
      val mirrors : t -> OpamTypes.address list
      val kind : t -> OpamTypes.repository_kind
      val checksum : t -> string option
      val with_checksum : t -> string -> t
    end
  module File_attributes :
    sig
      type t = OpamTypes.file_attribute_set
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Filenames :
    sig
      type t = OpamTypes.filename_set
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  module Prefix :
    sig
      type t = string OpamTypes.name_map
      val empty : t
      val write : OpamTypes.filename -> t -> unit
      val read : OpamTypes.filename -> t
      val safe_read : OpamTypes.filename -> t
      val read_from_channel : in_channel -> t
      val write_to_channel : out_channel -> t -> unit
    end
  val print_stats : unit -> unit
end