sig
  type group = Cmdline.Group.t
  module type Parameter =
    sig
      type t
      val parameter : Parameter.t
      val set : Plugin.Parameter.t -> unit
      val add_set_hook :
        (Plugin.Parameter.t -> Plugin.Parameter.t -> unit) -> unit
      val add_update_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 option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : Plugin.Parameter.t -> Plugin.Parameter.t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : Plugin.Parameter.t -> unit
    end
  module type Bool =
    sig
      type t = bool
      val parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> unit
      val on : unit -> unit
      val off : unit -> unit
    end
  module type WithOutput =
    sig
      type t = bool
      val parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> unit
      val on : unit -> unit
      val off : unit -> unit
      val set_output_dependencies : State.t list -> unit
      val output : (unit -> unit) -> unit
    end
  module type Int =
    sig
      type t = int
      val parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> 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 parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> unit
      val set_possible_values : string list -> unit
      val get_possible_values : unit -> string list
    end
  module type String_collection =
    sig
      type t
      val parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> 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 fold : (string -> '-> 'a) -> '-> 'a
      val exists : (string -> bool) -> bool
      val set_possible_values : string list -> unit
      val get_possible_values : unit -> string list
    end
  module type String_set =
    sig
      type t = Datatype.String.Set.t
      val parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> 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 fold : (string -> '-> 'a) -> '-> 'a
      val exists : (string -> bool) -> bool
      val set_possible_values : string list -> unit
      val get_possible_values : unit -> string list
    end
  module type String_list =
    sig
      type t = string list
      val parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> 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 fold : (string -> '-> 'a) -> '-> 'a
      val exists : (string -> bool) -> bool
      val set_possible_values : string list -> unit
      val get_possible_values : unit -> string list
    end
  module type String_hashtbl =
    sig
      type t = Datatype.String.Set.t
      val parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> 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 fold : (string -> '-> 'a) -> '-> 'a
      val exists : (string -> bool) -> bool
      val set_possible_values : string list -> unit
      val get_possible_values : unit -> string list
      type value
      val find : string -> Plugin.String_hashtbl.value
    end
  module type Indexed_val =
    sig
      type t = string
      val parameter : Parameter.t
      val set : t -> unit
      val add_set_hook : (t -> t -> unit) -> unit
      val add_update_hook : (t -> t -> unit) -> unit
      val get : unit -> t
      val clear : unit -> unit
      val is_default : unit -> bool
      val option_name : string
      val print_help : Format.formatter -> unit
      val self : State.t
      val name : string
      val mark_as_computed : ?project:Project.t -> unit -> unit
      val is_computed : ?project:Project.t -> unit -> bool
      module Datatype : Datatype.S
      val add_hook_on_update : (Datatype.t -> unit) -> unit
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      val equal : t -> t -> bool
      val add_aliases : string list -> unit
      val add_alias : string list -> unit
      val is_set : unit -> bool
      val unsafe_set : t -> 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 end
  module type Parameter_input_with_arg =
    sig val option_name : string val help : string val arg_name : string end
  module type Indexed_val_input =
    sig
      val option_name : string
      val help : string
      val arg_name : string
      type t
      val default_val : Plugin.Indexed_val_input.t
      val default_key : string
      val ty : Plugin.Indexed_val_input.t Type.t
    end
  module type S =
    sig
      type category = private string
      val register_category : string -> category
      module Category_set :
        sig
          type elt = category
          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
      val get_category : string -> Category_set.t
      val get_all_categories : unit -> Category_set.t
      val verbose_atleast : int -> bool
      val debug_atleast : int -> bool
      val add_debug_keys : Category_set.t -> unit
      val del_debug_keys : Category_set.t -> unit
      val get_debug_keys : unit -> Category_set.t
      val is_debug_key_enabled : category -> bool
      val get_debug_keyset : unit -> category list
      val result : ?level:int -> ?dkey:category -> 'Log.pretty_printer
      val feedback : ?level:int -> ?dkey:category -> 'Log.pretty_printer
      val debug : ?level:int -> ?dkey:category -> '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 -> 'b) -> ('a, 'b) Log.pretty_aborter
      val with_warning : (Log.event -> 'b) -> ('a, 'b) Log.pretty_aborter
      val with_error : (Log.event -> 'b) -> ('a, 'b) Log.pretty_aborter
      val with_failure : (Log.event -> 'b) -> ('a, 'b) Log.pretty_aborter
      val log :
        ?kind:Log.kind -> ?verbose:int -> ?debug:int -> 'Log.pretty_printer
      val with_log :
        (Log.event -> 'b) -> ?kind:Log.kind -> ('a, 'b) 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
      module Debug_category : String_set
      module Share :
        sig
          exception No_dir
          val dir : ?error:bool -> unit -> string
          val file : ?error:bool -> string -> string
        end
      val help : Plugin.group
      val messages : Plugin.group
      val parameters : unit -> Plugin.Parameter.t list
    end
  type plugin = private {
    p_name : string;
    p_shortname : string;
    p_help : string;
    p_parameters : (string, Plugin.Parameter.t list) Hashtbl.t;
  }
  module type General_services =
    sig
      type category = private string
      val register_category : string -> category
      module Category_set :
        sig
          type elt = category
          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
      val get_category : string -> Category_set.t
      val get_all_categories : unit -> Category_set.t
      val verbose_atleast : int -> bool
      val debug_atleast : int -> bool
      val add_debug_keys : Category_set.t -> unit
      val del_debug_keys : Category_set.t -> unit
      val get_debug_keys : unit -> Category_set.t
      val is_debug_key_enabled : category -> bool
      val get_debug_keyset : unit -> category list
      val result : ?level:int -> ?dkey:category -> 'Log.pretty_printer
      val feedback : ?level:int -> ?dkey:category -> 'Log.pretty_printer
      val debug : ?level:int -> ?dkey:category -> '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 -> 'b) -> ('a, 'b) Log.pretty_aborter
      val with_warning : (Log.event -> 'b) -> ('a, 'b) Log.pretty_aborter
      val with_error : (Log.event -> 'b) -> ('a, 'b) Log.pretty_aborter
      val with_failure : (Log.event -> 'b) -> ('a, 'b) Log.pretty_aborter
      val log :
        ?kind:Log.kind -> ?verbose:int -> ?debug:int -> 'Log.pretty_printer
      val with_log :
        (Log.event -> 'b) -> ?kind:Log.kind -> ('a, 'b) 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
      module Debug_category : String_set
      module Share :
        sig
          exception No_dir
          val dir : ?error:bool -> unit -> string
          val file : ?error:bool -> string -> string
        end
      val help : group
      val messages : group
      val parameters : unit -> Parameter.t list
      module Bool :
        functor
          (X : sig
                 val option_name : string
                 val help : string
                 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 WithOutput :
        functor
          (X : sig
                 val option_name : string
                 val help : string
                 val output_by_default : bool
               end->
          WithOutput
      module Int :
        functor
          (X : sig
                 val default : int
                 val option_name : string
                 val help : string
                 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 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 FilledStringSet :
        functor
          (X : sig
                 val option_name : string
                 val help : string
                 val arg_name : string
                 val default : Datatype.String.Set.t
               end->
          String_set
      module StringList :
        functor (X : Parameter_input_with_arg-> String_list
      module IndexedVal :
        functor (V : Indexed_val_input->
          sig
            type t = string
            val parameter : Parameter.t
            val set : t -> unit
            val add_set_hook : (t -> t -> unit) -> unit
            val add_update_hook : (t -> t -> unit) -> unit
            val get : unit -> t
            val clear : unit -> unit
            val is_default : unit -> bool
            val option_name : string
            val print_help : Format.formatter -> unit
            val self : State.t
            val name : string
            val mark_as_computed : ?project:Project.t -> unit -> unit
            val is_computed : ?project:Project.t -> unit -> bool
            module Datatype : Datatype.S
            val add_hook_on_update : (Datatype.t -> unit) -> unit
            val howto_marshal :
              (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
            val equal : t -> t -> bool
            val add_aliases : string list -> unit
            val add_alias : string list -> unit
            val is_set : unit -> bool
            val unsafe_set : t -> 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 redefine_binding : string -> old:t -> t -> t
                   val no_binding : string -> t
                 end->
            sig
              type t = Datatype.String.Set.t
              val parameter : Parameter.t
              val set : t -> unit
              val add_set_hook : (t -> t -> unit) -> unit
              val add_update_hook : (t -> t -> unit) -> unit
              val get : unit -> t
              val clear : unit -> unit
              val is_default : unit -> bool
              val option_name : string
              val print_help : Format.formatter -> unit
              val self : State.t
              val name : string
              val mark_as_computed : ?project:Project.t -> unit -> unit
              val is_computed : ?project:Project.t -> unit -> bool
              module Datatype : Datatype.S
              val add_hook_on_update : (Datatype.t -> unit) -> unit
              val howto_marshal :
                (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
              val equal : t -> t -> bool
              val add_aliases : string list -> unit
              val add_alias : string list -> unit
              val is_set : unit -> bool
              val unsafe_set : t -> 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 fold : (string -> '-> 'a) -> '-> 'a
              val exists : (string -> bool) -> bool
              val set_possible_values : string list -> unit
              val get_possible_values : unit -> string list
              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 set_negative_option_name : string -> unit
  val set_negative_option_help : string -> unit
  val set_unset_option_name : string -> unit
  val set_unset_option_help : string -> unit
  val set_optional_help :
    (unit, Format.formatter, unit) Pervasives.format -> unit
  val set_group : Plugin.group -> unit
  val is_invisible : unit -> unit
  val argument_is_function_name : unit -> unit
  val do_iterate : unit -> unit
  val do_not_iterate : unit -> unit
  val register_kernel : unit -> unit
  val set_module_name : string -> unit
  module Register :
    functor
      (P : sig val name : string val shortname : string val help : string end->
      General_services
  val is_share_visible : unit -> unit
  val get_from_shortname : string -> Plugin.plugin
  val get_from_name : string -> Plugin.plugin
  val get : string -> Plugin.plugin
  val iter_on_plugins : (Plugin.plugin -> unit) -> unit
  val get_selection : ?is_set:bool -> unit -> State_selection.t
  val get_selection_context : ?is_set:bool -> unit -> State_selection.t
  val at_normal_exit : (unit -> unit) -> unit
  val run_normal_exit_hook : unit -> unit
  val positive_debug_ref : int Pervasives.ref
  val set_function_names : (unit -> string list) -> unit
  val set_ast_hook : ((Cil_types.file -> unit) -> unit) -> unit
  val init_ast_hooks : (Cil_types.file -> unit) list Pervasives.ref
end