sig
  module Types :
    sig
      module type TYPE =
        sig
          type 'a typ
          val void : unit typ
          val char : char typ
          val schar : int typ
          val short : int typ
          val int : int typ
          val long : Signed.long typ
          val llong : Signed.llong typ
          val nativeint : nativeint typ
          val int8_t : int typ
          val int16_t : int typ
          val int32_t : int32 typ
          val int64_t : int64 typ
          module Intptr : Signed.S
          val intptr_t : Intptr.t typ
          module Ptrdiff : Signed.S
          val ptrdiff_t : Ptrdiff.t typ
          val camlint : int typ
          val uchar : Unsigned.uchar typ
          val bool : bool typ
          val uint8_t : Unsigned.uint8 typ
          val uint16_t : Unsigned.uint16 typ
          val uint32_t : Unsigned.uint32 typ
          val uint64_t : Unsigned.uint64 typ
          val size_t : Unsigned.size_t typ
          val ushort : Unsigned.ushort typ
          val sint : Signed.sint typ
          val uint : Unsigned.uint typ
          val ulong : Unsigned.ulong typ
          val ullong : Unsigned.ullong typ
          module Uintptr : Unsigned.S
          val uintptr_t : Uintptr.t typ
          val float : float typ
          val double : float typ
          val ldouble : LDouble.t typ
          val complex32 : Complex.t typ
          val complex64 : Complex.t typ
          val complexld : ComplexL.t typ
          val ptr : 'a typ -> 'Ctypes_static.ptr typ
          val ptr_opt : 'a typ -> 'Ctypes_static.ptr option typ
          val string : string typ
          val string_opt : string option typ
          val ocaml_string : string Ctypes_static.ocaml typ
          val ocaml_bytes : Bytes.t Ctypes_static.ocaml typ
          val array : int -> 'a typ -> 'Ctypes_static.carray typ
          val bigarray :
            < ba_repr : 'b; bigarray : 'bigarray; carray : 'c; dims : 'dims;
              element : 'a; layout : Bigarray.c_layout >
            Ctypes_static.bigarray_class ->
            'dims -> ('a, 'b) Bigarray.kind -> 'bigarray typ
          val fortran_bigarray :
            < ba_repr : 'b; bigarray : 'bigarray; carray : 'c; dims : 'dims;
              element : 'a; layout : Bigarray.fortran_layout >
            Ctypes_static.bigarray_class ->
            'dims -> ('a, 'b) Bigarray.kind -> 'bigarray typ
          val typ_of_bigarray_kind : ('a, 'b) Bigarray.kind -> 'a typ
          type ('a, 't) field
          val structure : string -> 'Ctypes_static.structure typ
          val union : string -> 'Ctypes_static.union typ
          val field :
            ('s, [< `Struct | `Union ] as 'b) Ctypes_static.structured typ ->
            string -> 'a typ -> ('a, ('s, 'b) Ctypes_static.structured) field
          val seal :
            ('a, [< `Struct | `Union ]) Ctypes_static.structured typ -> unit
          val view :
            ?format_typ:((Format.formatter -> unit) ->
                         Format.formatter -> unit) ->
            ?format:(Format.formatter -> '-> unit) ->
            read:('-> 'b) -> write:('-> 'a) -> 'a typ -> 'b typ
          val typedef : 'a typ -> string -> 'a typ
          val abstract :
            name:string ->
            size:int -> alignment:int -> 'Ctypes_static.abstract typ
          val lift_typ : 'Ctypes_static.typ -> 'a typ
          type 'a fn = 'Ctypes_static.fn
          val ( @-> ) : 'a typ -> 'b fn -> ('-> 'b) fn
          val returning : 'a typ -> 'a fn
          type 'a static_funptr = 'Ctypes_static.static_funptr
          val static_funptr : 'a fn -> 'Ctypes_static.static_funptr typ
          type 'a const
          val constant : string -> 'a typ -> 'Cstubs.Types.TYPE.const
          val enum :
            string ->
            ?typedef:bool ->
            ?unexpected:(int64 -> 'a) ->
            ('a * int64 Cstubs.Types.TYPE.const) list -> 'a typ
        end
      module type BINDINGS = functor (F : TYPE-> sig  end
      val write_c :
        Format.formatter -> (module Cstubs.Types.BINDINGS-> unit
    end
  module type FOREIGN = Ctypes.FOREIGN
  module type BINDINGS =
    functor
      (F : sig
             type 'a fn
             type 'a return
             val ( @-> ) : 'Ctypes.typ -> 'b fn -> ('-> 'b) fn
             val returning : 'Ctypes.typ -> 'a return fn
             type 'a result = unit
             val foreign : string -> ('-> 'b) fn -> ('-> 'b) result
             val foreign_value :
               string -> 'Ctypes.typ -> 'Ctypes.ptr result
           end->
      sig  end
  type errno_policy
  val ignore_errno : Cstubs.errno_policy
  val return_errno : Cstubs.errno_policy
  type concurrency_policy
  val sequential : Cstubs.concurrency_policy
  val unlocked : Cstubs.concurrency_policy
  val lwt_preemptive : Cstubs.concurrency_policy
  val lwt_jobs : Cstubs.concurrency_policy
  val write_c :
    ?concurrency:Cstubs.concurrency_policy ->
    ?errno:Cstubs.errno_policy ->
    Format.formatter -> prefix:string -> (module Cstubs.BINDINGS-> unit
  val write_ml :
    ?concurrency:Cstubs.concurrency_policy ->
    ?errno:Cstubs.errno_policy ->
    Format.formatter -> prefix:string -> (module Cstubs.BINDINGS-> unit
end