sig
  val at_normal_exit : (unit -> unit) -> unit
  val run_normal_exit_hook : unit -> unit
  type group
  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 self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val name : string
      val equal : Plugin.Parameter.t -> Plugin.Parameter.t -> bool
      val unsafe_set : Plugin.Parameter.t -> 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 self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val name : string
      val equal : t -> t -> bool
      val unsafe_set : t -> 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 self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val name : string
      val equal : t -> t -> bool
      val unsafe_set : t -> 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 self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val name : string
      val equal : t -> t -> bool
      val unsafe_set : t -> 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 self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val name : string
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_alias : string list -> unit
      val set_set : string -> unit
      val get_set : ?sep:string -> unit -> string
      val add : string -> unit
      val add_set : string -> unit
      val iter : (string -> unit) -> unit
      val fold : (string -> '-> 'a) -> '-> 'a
    end
  module type STRING_SET =
    sig
      type t = Cilutil.StringSet.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 self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val name : string
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_alias : string list -> unit
      val set_set : string -> unit
      val get_set : ?sep:string -> unit -> string
      val add : string -> unit
      val add_set : string -> unit
      val iter : (string -> unit) -> unit
      val fold : (string -> '-> 'a) -> '-> 'a
      val is_empty : unit -> bool
      val remove : string -> unit
      val remove_set : string -> unit
    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 self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val name : string
      val equal : t -> t -> bool
      val unsafe_set : t -> unit
      val add_alias : string list -> unit
      val set_set : string -> unit
      val get_set : ?sep:string -> unit -> string
      val add : string -> unit
      val add_set : string -> unit
      val iter : (string -> unit) -> unit
      val fold : (string -> '-> 'a) -> '-> 'a
    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 self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val name : string
      val equal : t -> t -> bool
      val unsafe_set : t -> 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 descr : string end
  module type Parameter_input_with_arg =
    sig val option_name : string val descr : string val arg_name : string end
  module type COMPLEX_VALUE =
    sig
      val option_name : string
      val descr : string
      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 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 : string -> Plugin.group
      module Help : BOOL
      module Verbose : INT
      module Debug : INT
    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 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 : string -> group
      module Help : BOOL
      module Verbose : INT
      module Debug : INT
      module Bool :
        functor
          (X : sig
                 val option_name : string
                 val descr : string
                 val default : bool
               end->
          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 descr : 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 descr : 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 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 self : Project.Computation.t
            val select :
              Kind.how ->
              Project.Computation.selection -> Project.Computation.selection
            val depend : Project.Computation.t -> unit
            val mark_as_computed : ?project:Project.project -> unit -> unit
            val is_computed : ?project:Project.project -> unit -> bool
            val do_not_save : unit -> unit
            module Datatype : Project.Datatype.S
            val name : string
            val equal : t -> t -> bool
            val unsafe_set : t -> 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
    end
  val set_cmdline_stage : Cmdline.stage -> unit
  val do_not_journalize : unit -> unit
  val do_not_projectify : unit -> unit
  val register_kernel : unit -> unit
  val set_negative_option_name : string -> unit
  val set_negative_option_descr : string -> unit
  val set_optional_descr :
    (unit, Format.formatter, unit) Pervasives.format -> unit
  val set_group : Plugin.group -> unit
  val set_module_name : string -> unit
  module Register :
    functor
      (P : sig
             val name : string
             val shortname : string
             val descr : 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_descr : string;
    o_kind : Plugin.kind;
  }
  type plugin = private {
    p_name : string;
    p_descr : string;
    p_parameters : (string, Plugin.parameter list) Hashtbl.t;
  }
  val iter_on_plugins : (Plugin.plugin -> unit) -> unit
  val get_selection : unit -> Project.Selection.t
  val dynamic_funname :
    modname:string -> funname:string -> statename:string -> string
end