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 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 -> 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 opam_version : t -> OpamTypes.opam_version
      val repositories : t -> OpamTypes.repository_name list
      val switch : t -> OpamTypes.switch
      val jobs : t -> int
    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 opam_version : t -> OpamTypes.opam_version
      val name : t -> OpamTypes.name
      val version : t -> OpamTypes.version
      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 remove : t -> OpamTypes.command list
      val depends : t -> OpamTypes.formula
      val depopts : t -> OpamTypes.formula
      val depexts : t -> OpamTypes.tags option
      val conflicts : t -> OpamTypes.formula
      val libraries : t -> OpamTypes.section list
      val syntax : t -> OpamTypes.section 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 with_name : t -> OpamTypes.name -> t
      val with_version : t -> OpamTypes.version -> t
      val with_depends : t -> OpamTypes.formula -> t
      val with_depopts : t -> OpamTypes.formula -> t
      val with_build : t -> OpamTypes.command list -> t
      val with_remove : t -> OpamTypes.command list -> t
      val with_libraries : t -> OpamTypes.section list -> t
      val with_substs : t -> OpamTypes.basename list -> t
      val with_ocaml_version : t -> OpamTypes.compiler_constraint option -> 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 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
      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 option
      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 asmlink : t -> string list
      val bytelink : t -> string list
      val bytecomp : t -> string list
      val asmcomp : t -> string list
      val requires : t -> OpamTypes.section list
      val pp : t -> OpamTypes.ppflag option
      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 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
      module type SECTION =
        sig
          val available : t -> OpamTypes.section list
          val kind : t -> OpamTypes.section -> string
          val asmcomp : t -> OpamTypes.section -> string list
          val bytecomp : t -> OpamTypes.section -> string list
          val asmlink : t -> OpamTypes.section -> string list
          val bytelink : t -> OpamTypes.section -> string list
          val requires : t -> OpamTypes.section -> OpamTypes.section list
          val variable :
            t ->
            OpamTypes.section ->
            OpamTypes.variable -> OpamTypes.variable_contents option
          val variables : t -> OpamTypes.section -> OpamTypes.variable list
        end
      module Section : SECTION
      module Library : SECTION
      module Syntax : SECTION
      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 option -> OpamTypes.address -> t
      val url : t -> OpamTypes.address
      val kind : t -> OpamTypes.repository_kind option
      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