sig
  val at_normal_exit : (unit -> unit) -> unit
  val run_normal_exit_hook : unit -> unit
  type group = Cmdline.Group.t
  module type Parameter =
    sig
      type t
      val set : Plugin.Parameter.t -> unit
      val add_set_hook :
        (Plugin.Parameter.t -> Plugin.Parameter.t -> unit) -> unit
      val get : unit -> Plugin.Parameter.t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : Plugin.Parameter.t -> Plugin.Parameter.t -> bool
      val unsafe_set : Plugin.Parameter.t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
    end
  module type BOOL =
    sig
      type t = bool
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val on : unit -> unit
      val off : unit -> unit
    end
  module type INT =
    sig
      type t = int
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val incr : unit -> unit
      val set_range : min:int -> max:int -> unit
      val get_range : unit -> int * int
    end
  module type STRING =
    sig
      type t = string
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val set_possible_values : string list -> unit
      val get_possible_values : unit -> string list
    end
  module type GEN_STRING_SET =
    sig
      type t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val add : string -> unit
      val remove : string -> unit
      val is_empty : unit -> bool
      val get_set : ?sep:string -> unit -> string
      val iter : (string -> unit) -> unit
      val exists : (string -> bool) -> bool
    end
  module type STRING_SET =
    sig
      type t = Datatype.String.Set.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val add : string -> unit
      val remove : string -> unit
      val is_empty : unit -> bool
      val get_set : ?sep:string -> unit -> string
      val iter : (string -> unit) -> unit
      val exists : (string -> bool) -> bool
    end
  module type STRING_LIST =
    sig
      type t = string list
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val add : string -> unit
      val remove : string -> unit
      val is_empty : unit -> bool
      val get_set : ?sep:string -> unit -> string
      val iter : (string -> unit) -> unit
      val exists : (string -> bool) -> bool
    end
  module type STRING_HASHTBL =
    sig
      type t = Datatype.String.Set.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val add : string -> unit
      val remove : string -> unit
      val is_empty : unit -> bool
      val get_set : ?sep:string -> unit -> string
      val iter : (string -> unit) -> unit
      val exists : (string -> bool) -> bool
      type value
      val find : string -> Plugin.STRING_HASHTBL.value
    end
  module type INDEXED_VAL =
    sig
      type t = string
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val is_set : unit -> bool
      val option_name : string
      val self : State.t
      val name : string
      val kind : State.kind
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val set_possible_values : string list -> unit
      val get_possible_values : unit -> string list
      type value
      val add_choice : string -> Plugin.INDEXED_VAL.value -> unit
      val get_val : unit -> Plugin.INDEXED_VAL.value
    end
  module type Parameter_input =
    sig
      val option_name : string
      val help : string
      val kind : [> `Correctness | `Irrelevant | `Tuning ]
    end
  module type Parameter_input_with_arg =
    sig
      val option_name : string
      val help : string
      val kind : [> `Correctness | `Irrelevant | `Tuning ]
      val arg_name : string
    end
  module type COMPLEX_VALUE =
    sig
      val option_name : string
      val help : string
      val kind : [> `Correctness | `Irrelevant | `Tuning ]
      val arg_name : string
      type t
      val default_val : Plugin.COMPLEX_VALUE.t
      val default_key : string
      val ty : Plugin.COMPLEX_VALUE.t Type.t
    end
  module type S =
    sig
      val verbose_atleast : int -> bool
      val debug_atleast : int -> bool
      val result : ?level:int -> 'Log.pretty_printer
      val feedback : ?level:int -> 'Log.pretty_printer
      val debug : ?level:int -> 'Log.pretty_printer
      val warning : 'Log.pretty_printer
      val error : 'Log.pretty_printer
      val abort : ('a, 'b) Log.pretty_aborter
      val failure : 'Log.pretty_printer
      val fatal : ('a, 'b) Log.pretty_aborter
      val verify : bool -> ('a, bool) Log.pretty_aborter
      val not_yet_implemented :
        ('a, Format.formatter, unit, 'b) format4 -> 'a
      val deprecated : string -> now:string -> ('-> 'b) -> '-> 'b
      val with_result : (Log.event -> 'a) -> ('b, 'a) Log.pretty_aborter
      val with_warning : (Log.event -> 'a) -> ('b, 'a) Log.pretty_aborter
      val with_error : (Log.event -> 'a) -> ('b, 'a) Log.pretty_aborter
      val with_failure : (Log.event -> 'a) -> ('b, 'a) Log.pretty_aborter
      val log :
        ?kind:Log.kind -> ?verbose:int -> ?debug:int -> 'Log.pretty_printer
      val with_log :
        (Log.event -> 'a) -> ?kind:Log.kind -> ('b, 'a) Log.pretty_aborter
      val register : Log.kind -> (Log.event -> unit) -> unit
      val register_tag_handlers :
        (string -> string) * (string -> string) -> unit
      val add_group : ?memo:bool -> string -> Plugin.group
      module Help : BOOL
      module Verbose : INT
      module Debug : INT
      val help : Plugin.group
      val messages : Plugin.group
    end
  module type General_services =
    sig
      val verbose_atleast : int -> bool
      val debug_atleast : int -> bool
      val result : ?level:int -> 'Log.pretty_printer
      val feedback : ?level:int -> 'Log.pretty_printer
      val debug : ?level:int -> 'Log.pretty_printer
      val warning : 'Log.pretty_printer
      val error : 'Log.pretty_printer
      val abort : ('a, 'b) Log.pretty_aborter
      val failure : 'Log.pretty_printer
      val fatal : ('a, 'b) Log.pretty_aborter
      val verify : bool -> ('a, bool) Log.pretty_aborter
      val not_yet_implemented :
        ('a, Format.formatter, unit, 'b) format4 -> 'a
      val deprecated : string -> now:string -> ('-> 'b) -> '-> 'b
      val with_result : (Log.event -> 'a) -> ('b, 'a) Log.pretty_aborter
      val with_warning : (Log.event -> 'a) -> ('b, 'a) Log.pretty_aborter
      val with_error : (Log.event -> 'a) -> ('b, 'a) Log.pretty_aborter
      val with_failure : (Log.event -> 'a) -> ('b, 'a) Log.pretty_aborter
      val log :
        ?kind:Log.kind -> ?verbose:int -> ?debug:int -> 'Log.pretty_printer
      val with_log :
        (Log.event -> 'a) -> ?kind:Log.kind -> ('b, 'a) Log.pretty_aborter
      val register : Log.kind -> (Log.event -> unit) -> unit
      val register_tag_handlers :
        (string -> string) * (string -> string) -> unit
      val add_group : ?memo:bool -> string -> group
      module Help : BOOL
      module Verbose : INT
      module Debug : INT
      val help : group
      val messages : group
      module Bool :
        functor
          (X : sig
                 val option_name : string
                 val help : string
                 val kind : [> `Correctness | `Irrelevant | `Tuning ]
                 val default : bool
               end->
          BOOL
      module Action : functor (X : Parameter_input-> BOOL
      module False : functor (X : Parameter_input-> BOOL
      module True : functor (X : Parameter_input-> BOOL
      module Int :
        functor
          (X : sig
                 val default : int
                 val option_name : string
                 val help : string
                 val kind : [> `Correctness | `Irrelevant | `Tuning ]
                 val arg_name : string
               end->
          INT
      module Zero : functor (X : Parameter_input_with_arg-> INT
      module String :
        functor
          (X : sig
                 val option_name : string
                 val help : string
                 val kind : [> `Correctness | `Irrelevant | `Tuning ]
                 val arg_name : string
                 val default : string
               end->
          STRING
      module EmptyString : functor (X : Parameter_input_with_arg-> STRING
      module StringSet : functor (X : Parameter_input_with_arg-> STRING_SET
      module StringList :
        functor (X : Parameter_input_with_arg-> STRING_LIST
      module IndexedVal :
        functor (V : COMPLEX_VALUE->
          sig
            type t = string
            val set : t -> unit
            val add_set_hook : (t -> t -> unit) -> unit
            val get : unit -> t
            val clear : unit -> unit
            val is_default : unit -> bool
            val is_set : unit -> bool
            val option_name : string
            val self : State.t
            val name : string
            val kind : State.kind
            val mark_as_computed : ?project:Project.t -> unit -> unit
            val is_computed : ?project:Project.t -> unit -> bool
            module Datatype : Datatype.S
            val howto_marshal :
              (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
            val equal : t -> t -> bool
            val unsafe_set : t -> unit
            val add_aliases : string list -> unit
            val add_alias : string list -> unit
            val set_possible_values : string list -> unit
            val get_possible_values : unit -> string list
            type value = V.t
            val add_choice : string -> value -> unit
            val get_val : unit -> value
          end
      module StringHashtbl :
        functor (X : Parameter_input_with_arg->
          functor
            (V : sig
                   type t
                   val ty : t Type.t
                   val name : string
                   val descr : t Descr.t
                   val packed_descr : Structural_descr.pack
                   val reprs : t list
                   val equal : t -> t -> bool
                   val compare : t -> t -> int
                   val hash : t -> int
                   val pretty_code : Format.formatter -> t -> unit
                   val internal_pretty_code :
                     Type.precedence -> Format.formatter -> t -> unit
                   val pretty : Format.formatter -> t -> unit
                   val varname : t -> string
                   val mem_project :
                     (Project_skeleton.t -> bool) -> t -> bool
                   val copy : t -> t
                   val parse : string -> string * t
                   val no_binding : string -> t
                 end->
            sig
              type t = Datatype.String.Set.t
              val set : t -> unit
              val add_set_hook : (t -> t -> unit) -> unit
              val get : unit -> t
              val clear : unit -> unit
              val is_default : unit -> bool
              val is_set : unit -> bool
              val option_name : string
              val self : State.t
              val name : string
              val kind : State.kind
              val mark_as_computed : ?project:Project.t -> unit -> unit
              val is_computed : ?project:Project.t -> unit -> bool
              module Datatype : Datatype.S
              val howto_marshal :
                (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
              val equal : t -> t -> bool
              val unsafe_set : t -> unit
              val add_aliases : string list -> unit
              val add_alias : string list -> unit
              val add : string -> unit
              val remove : string -> unit
              val is_empty : unit -> bool
              val get_set : ?sep:string -> unit -> string
              val iter : (string -> unit) -> unit
              val exists : (string -> bool) -> bool
              type value = V.t
              val find : string -> value
            end
    end
  val set_cmdline_stage : Cmdline.stage -> unit
  val do_not_journalize : unit -> unit
  val do_not_projectify : unit -> unit
  val do_not_save : unit -> unit
  val register_kernel : unit -> unit
  val set_negative_option_name : string -> unit
  val set_negative_option_help : string -> unit
  val set_optional_help :
    (unit, Format.formatter, unit) Pervasives.format -> unit
  val set_group : Plugin.group -> unit
  val set_module_name : string -> unit
  val is_visible : unit -> unit
  val is_invisible : unit -> unit
  module Register :
    functor
      (P : sig val name : string val shortname : string val help : string end->
      General_services
  type 'a option_accessor = private {
    get : unit -> 'a;
    set : '-> unit;
    is_set : unit -> bool;
  }
  type kind = private
      Bool of bool Plugin.option_accessor * string option
    | Int of int Plugin.option_accessor * (unit -> int * int)
    | String of string Plugin.option_accessor * (unit -> string list)
    | StringSet of string Plugin.option_accessor
  type parameter = private {
    o_name : string;
    o_help : string;
    o_kind : Plugin.kind;
  }
  type plugin = private {
    p_name : string;
    p_help : string;
    p_parameters : (string, Plugin.parameter list) Hashtbl.t;
  }
  val iter_on_plugins : (Plugin.plugin -> unit) -> unit
  val get_selection : unit -> State_selection.t
  val positive_debug_ref : int Pervasives.ref
  val dynamic_name : string -> string -> string -> string
end