sig
  type how =
      Do_Not_Select_Dependencies
    | Select_Dependencies
    | Only_Select_Dependencies
  module type SELECTION =
    sig
      type kind
      type t
      val ty : Kind.SELECTION.t Type.t
      val empty : Kind.SELECTION.t
      val is_empty : Kind.SELECTION.t -> bool
      val add :
        Kind.SELECTION.kind ->
        Kind.how -> Kind.SELECTION.t -> Kind.SELECTION.t
      val singleton : Kind.SELECTION.kind -> Kind.how -> Kind.SELECTION.t
      val remove :
        Kind.SELECTION.kind -> Kind.SELECTION.t -> Kind.SELECTION.t
      val iter :
        (Kind.SELECTION.kind -> Kind.how -> unit) -> Kind.SELECTION.t -> unit
      val fold :
        (Kind.SELECTION.kind -> Kind.how -> '-> 'a) ->
        Kind.SELECTION.t -> '-> 'a
    end
  val version : string Pervasives.ref
  module Make :
    functor
      (T : sig
             type t
             val dummy : Kind.Make.t
             val name : string
             val kind_name : Kind.Make.t -> string
           end->
      sig
        type t
        val dummy : Kind.Make.t
        val equal : Kind.Make.t -> Kind.Make.t -> bool
        val compare : Kind.Make.t -> Kind.Make.t -> int
        val hash : Kind.Make.t -> int
        module Selection :
          sig
            type kind = t
            type t
            val ty : t Type.t
            val empty : t
            val is_empty : t -> bool
            val add : kind -> how -> t -> t
            val singleton : kind -> how -> t
            val remove : kind -> t -> t
            val iter : (kind -> how -> unit) -> t -> unit
            val fold : (kind -> how -> '-> 'a) -> t -> '-> 'a
          end
        val create : T.t -> Kind.Make.t list -> Kind.Make.t
        val value : Kind.Make.t -> T.t
        val get_from_name : string -> Kind.Make.t
        exception DependencyAlreadyExists of string * string
        val add_dependency : Kind.Make.t -> Kind.Make.t -> unit
        val iter : (T.t -> '-> unit) -> '-> unit
        val apply_in_order :
          Kind.Make.Selection.t ->
          Kind.Make.Selection.t -> (Kind.Make.t -> '-> 'a) -> '-> 'a
        val iter_in_order :
          Kind.Make.Selection.t ->
          Kind.Make.Selection.t -> (T.t -> '-> unit) -> '-> unit
        val full_iter_in_order :
          Kind.Make.Selection.t ->
          Kind.Make.Selection.t -> (T.t -> '-> unit) -> '-> unit
        val fold_in_order :
          Kind.Make.Selection.t ->
          Kind.Make.Selection.t -> (T.t -> '-> 'a) -> '-> 'a
        val number_of_applicants :
          Kind.Make.Selection.t -> Kind.Make.Selection.t -> int option
        val full_number_of_applicants :
          Kind.Make.Selection.t -> Kind.Make.Selection.t -> int option
        module Dynamic :
          sig
            type kind = Kind.Make.t
            type graph
            type t = Kind.Make.Dynamic.graph Pervasives.ref
            val create : unit -> Kind.Make.Dynamic.t
            val create_graph : unit -> Kind.Make.Dynamic.graph
            val clear_graph : Kind.Make.Dynamic.graph -> unit
            val add_kind :
              Kind.Make.Dynamic.t ->
              T.t -> Kind.Make.Dynamic.kind list -> Kind.Make.Dynamic.kind
            val remove_kind :
              Kind.Make.Dynamic.t -> Kind.Make.Dynamic.kind -> unit
            val add_dependency :
              Kind.Make.Dynamic.t ->
              Kind.Make.Dynamic.kind -> Kind.Make.Dynamic.kind -> unit
            type marshalled_graph
            val marshal :
              Kind.Make.Dynamic.graph -> Kind.Make.Dynamic.marshalled_graph
            val unmarshal :
              (string -> T.t) ->
              (Kind.Make.Dynamic.kind -> unit) ->
              Kind.Make.Dynamic.marshalled_graph -> Kind.Make.Dynamic.graph
            val before_load : unit -> unit
            val after_load : unit -> unit
          end
        val dump_dependencies :
          ?only:Kind.Make.Selection.t ->
          ?except:Kind.Make.Selection.t -> string -> unit
        val dump_dynamic_dependencies :
          ?only:Kind.Make.Selection.t ->
          ?except:Kind.Make.Selection.t -> string -> unit
      end
end