sig
  type kind = [ `C | `OCaml | `OCaml_toplevel ]
  val pp_kind : Format.formatter -> As_part_bin.kind -> unit
  val kind : [< `Bin ] As_part.t -> As_part_bin.kind
  val byte : [< `Bin ] As_part.t -> bool
  val native : [< `Bin ] As_part.t -> bool
  val js : [< `Bin ] As_part.t -> bool
  val ocaml :
    [< As_part.kind ] As_part.t -> [< As_part.kind > `Bin ] As_part.t option
  val ocaml_toplevel :
    [< As_part.kind ] As_part.t -> [< As_part.kind > `Bin ] As_part.t option
  val c :
    [< As_part.kind ] As_part.t -> [< As_part.kind > `Bin ] As_part.t option
  val v :
    ?usage:As_part.usage ->
    ?exists:bool As_conf.value ->
    ?args:As_args.t ->
    ?byte:bool ->
    ?native:bool ->
    ?js:bool ->
    string ->
    As_part_bin.kind ->
    [< `Lib | `Pkg | `Unit ] As_part.t list ->
    [< As_part.kind > `Bin ] As_part.t
  val to_cmd :
    ?ext:As_path.ext -> [< `Bin ] As_part.t -> As_acmd.cmd As_conf.value
  val to_cmd_path :
    ?abs:bool ->
    ?ext:As_path.ext -> [< `Bin ] As_part.t -> As_path.t As_conf.value
  val exists : ?ext:As_path.ext -> [< `Bin ] As_part.t -> bool As_conf.value
  val gen :
    ?usage:As_part.usage ->
    ?exists:bool As_conf.value ->
    ?args:As_args.t ->
    ?dir:As_path.t As_conf.value ->
    ?name:string ->
    ?ext:As_path.ext ->
    ?stdin:As_path.t As_conf.value ->
    ?stdout:As_path.t As_conf.value ->
    ?stderr:As_path.t As_conf.value ->
    [< `Bin ] As_part.t ->
    string list As_conf.value -> [< As_part.kind > `Base ] As_part.t
end