| //! Declarations and setter methods for `bindgen` options. |
| //! |
| //! The main entry point of this module is the `options` macro. |
| #[macro_use] |
| mod helpers; |
| mod as_args; |
| |
| use crate::callbacks::ParseCallbacks; |
| use crate::codegen::{ |
| AliasVariation, EnumVariation, MacroTypeVariation, NonCopyUnionStyle, |
| }; |
| use crate::deps::DepfileSpec; |
| use crate::features::{RustFeatures, RustTarget}; |
| use crate::regex_set::RegexSet; |
| use crate::Abi; |
| use crate::Builder; |
| use crate::CodegenConfig; |
| use crate::FieldVisibilityKind; |
| use crate::Formatter; |
| use crate::HashMap; |
| use crate::DEFAULT_ANON_FIELDS_PREFIX; |
| |
| use std::env; |
| #[cfg(feature = "experimental")] |
| use std::path::Path; |
| use std::path::PathBuf; |
| use std::rc::Rc; |
| |
| use as_args::AsArgs; |
| use helpers::ignore; |
| |
| /// Macro used to generate the [`BindgenOptions`] type and the [`Builder`] setter methods for each |
| /// one of the fields of `BindgenOptions`. |
| /// |
| /// The input format of this macro resembles a `struct` pattern. Each field of the `BindgenOptions` |
| /// type is declared by adding the name of the field and its type using the `name: type` syntax and |
| /// a block of code with the following items: |
| /// |
| /// - `default`: The default value for the field. If this item is omitted, `Default::default()` is |
| /// used instead, meaning that the type of the field must implement `Default`. |
| /// - `methods`: A block of code containing methods for the `Builder` type. These methods should be |
| /// related to the field being declared. |
| /// - `as_args`: This item declares how the field should be converted into a valid CLI argument for |
| /// `bindgen` and is used in the [`Builder::command_line_flags`] method which is used to do a |
| /// roundtrip test of the CLI args in the `bindgen-test` crate. This item can take one of the |
| /// following: |
| /// - A string literal with the flag if the type of the field implements the [`AsArgs`] trait. |
| /// - A closure with the signature `|field, args: &mut Vec<String>| -> ()` that pushes arguments |
| /// into the `args` buffer based on the value of the field. This is used if the field does not |
| /// implement `AsArgs` or if the implementation of the trait is not logically correct for the |
| /// option and a custom behavior must be taken into account. |
| /// - The `ignore` literal, which does not emit any CLI arguments for this field. This is useful |
| /// if the field cannot be used from the `bindgen` CLI. |
| /// |
| /// As an example, this would be the declaration of a `bool` field called `be_fun` whose default |
| /// value is `false` (the `Default` value for `bool`): |
| /// ```rust,ignore |
| /// be_fun: bool { |
| /// methods: { |
| /// /// Ask `bindgen` to be fun. This option is disabled by default. |
| /// fn be_fun(mut self) -> Self { |
| /// self.options.be_fun = true; |
| /// self |
| /// } |
| /// }, |
| /// as_args: "--be-fun", |
| /// } |
| /// ``` |
| /// |
| /// However, we could also set the `be_fun` field to `true` by default and use a `--not-fun` flag |
| /// instead. This means that we have to add the `default` item and use a closure in the `as_args` |
| /// item: |
| /// ```rust,ignore |
| /// be_fun: bool { |
| /// default: true, |
| /// methods: { |
| /// /// Ask `bindgen` to not be fun. `bindgen` is fun by default. |
| /// fn not_fun(mut self) -> Self { |
| /// self.options.be_fun = false; |
| /// self |
| /// } |
| /// }, |
| /// as_args: |be_fun, args| (!be_fun).as_args(args, "--not-fun"), |
| /// } |
| /// ``` |
| /// More complex examples can be found in the sole invocation of this macro. |
| macro_rules! options { |
| ($( |
| $(#[doc = $docs:literal])+ |
| $field:ident: $ty:ty { |
| $(default: $default:expr,)? |
| methods: {$($methods_tokens:tt)*}$(,)? |
| as_args: $as_args:expr$(,)? |
| }$(,)? |
| )*) => { |
| #[derive(Debug, Clone)] |
| pub(crate) struct BindgenOptions { |
| $($(#[doc = $docs])* pub(crate) $field: $ty,)* |
| } |
| |
| impl Default for BindgenOptions { |
| fn default() -> Self { |
| Self { |
| $($field: default!($($default)*),)* |
| } |
| } |
| } |
| |
| impl Builder { |
| /// Generates the command line flags used to create this [`Builder`]. |
| pub fn command_line_flags(&self) -> Vec<String> { |
| let mut args = vec![]; |
| |
| let headers = match self.options.input_headers.split_last() { |
| Some((header, headers)) => { |
| // The last input header is passed as an argument in the first position. |
| args.push(header.clone().into()); |
| headers |
| }, |
| None => &[] |
| }; |
| |
| $({ |
| let func: fn(&$ty, &mut Vec<String>) = as_args!($as_args); |
| func(&self.options.$field, &mut args); |
| })* |
| |
| // Add the `--experimental` flag if `bindgen` is built with the `experimental` |
| // feature. |
| if cfg!(feature = "experimental") { |
| args.push("--experimental".to_owned()); |
| } |
| |
| // Add all the clang arguments. |
| args.push("--".to_owned()); |
| |
| if !self.options.clang_args.is_empty() { |
| args.extend(self.options.clang_args.iter().map(|s| s.clone().into())); |
| } |
| |
| // We need to pass all but the last header via the `-include` clang argument. |
| for header in headers { |
| args.push("-include".to_owned()); |
| args.push(header.clone().into()); |
| } |
| |
| args |
| } |
| |
| $($($methods_tokens)*)* |
| } |
| }; |
| } |
| |
| options! { |
| /// Types that have been blocklisted and should not appear anywhere in the generated code. |
| blocklisted_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not generate any bindings for the given type. |
| /// |
| /// This option is not recursive, meaning that it will only block types whose names |
| /// explicitly match the argument of this method. |
| pub fn blocklist_type<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.blocklisted_types.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--blocklist-type", |
| }, |
| /// Functions that have been blocklisted and should not appear in the generated code. |
| blocklisted_functions: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not generate any bindings for the given function. |
| /// |
| /// This option is not recursive, meaning that it will only block functions whose |
| /// names explicitly match the argument of this method. |
| pub fn blocklist_function<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.blocklisted_functions.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--blocklist-function", |
| }, |
| /// Items that have been blocklisted and should not appear in the generated code. |
| blocklisted_items: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not generate any bindings for the given item, regardless of whether it is a |
| /// type, function, module, etc. |
| /// |
| /// This option is not recursive, meaning that it will only block items whose names |
| /// explicitly match the argument of this method. |
| pub fn blocklist_item<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.blocklisted_items.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--blocklist-item", |
| }, |
| /// Files whose contents should be blocklisted and should not appear in the generated code. |
| blocklisted_files: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not generate any bindings for the contents of the given file, regardless of |
| /// whether the contents of the file are types, functions, modules, etc. |
| /// |
| /// This option is not recursive, meaning that it will only block files whose names |
| /// explicitly match the argument of this method. |
| /// |
| /// This method will use the argument to match the complete path of the file |
| /// instead of a section of it. |
| pub fn blocklist_file<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.blocklisted_files.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--blocklist-file", |
| }, |
| /// Variables that have been blocklisted and should not appear in the generated code. |
| blocklisted_vars: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not generate any bindings for the given variable. |
| /// |
| /// This option is not recursive, meaning that it will only block variables whose |
| /// names explicitly match the argument of this method. |
| pub fn blocklist_var<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.blocklisted_vars.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--blocklist-var", |
| }, |
| /// Types that should be treated as opaque structures in the generated code. |
| opaque_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Treat the given type as opaque in the generated bindings. |
| /// |
| /// Opaque in this context means that none of the generated bindings will contain |
| /// information about the inner representation of the type and the type itself will |
| /// be represented as a chunk of bytes with the alignment and size of the type. |
| pub fn opaque_type<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.opaque_types.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--opaque-type", |
| }, |
| /// The explicit `rustfmt` path. |
| rustfmt_path: Option<PathBuf> { |
| methods: { |
| /// Set an explicit path to the `rustfmt` binary. |
| /// |
| /// This option only comes into effect if `rustfmt` is set to be the formatter used by |
| /// `bindgen`. Check the documentation of the [`Builder::formatter`] method for more |
| /// information. |
| pub fn with_rustfmt<P: Into<PathBuf>>(mut self, path: P) -> Self { |
| self.options.rustfmt_path = Some(path.into()); |
| self |
| } |
| }, |
| // This option cannot be set from the CLI. |
| as_args: ignore, |
| }, |
| /// The path to which we should write a Makefile-syntax depfile (if any). |
| depfile: Option<DepfileSpec> { |
| methods: { |
| /// Add a depfile output which will be written alongside the generated bindings. |
| pub fn depfile<H: Into<String>, D: Into<PathBuf>>( |
| mut self, |
| output_module: H, |
| depfile: D, |
| ) -> Builder { |
| self.options.depfile = Some(DepfileSpec { |
| output_module: output_module.into(), |
| depfile_path: depfile.into(), |
| }); |
| self |
| } |
| }, |
| as_args: |depfile, args| { |
| if let Some(depfile) = depfile { |
| args.push("--depfile".into()); |
| args.push(depfile.depfile_path.display().to_string()); |
| } |
| }, |
| }, |
| /// Types that have been allowlisted and should appear in the generated code. |
| allowlisted_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Generate bindings for the given type. |
| /// |
| /// This option is transitive by default. Check the documentation of the |
| /// [`Builder::allowlist_recursively`] method for further information. |
| pub fn allowlist_type<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.allowlisted_types.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--allowlist-type", |
| }, |
| /// Functions that have been allowlisted and should appear in the generated code. |
| allowlisted_functions: RegexSet { |
| methods: { |
| regex_option! { |
| /// Generate bindings for the given function. |
| /// |
| /// This option is transitive by default. Check the documentation of the |
| /// [`Builder::allowlist_recursively`] method for further information. |
| pub fn allowlist_function<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.allowlisted_functions.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--allowlist-function", |
| }, |
| /// Variables that have been allowlisted and should appear in the generated code. |
| allowlisted_vars: RegexSet { |
| methods: { |
| regex_option! { |
| /// Generate bindings for the given variable. |
| /// |
| /// This option is transitive by default. Check the documentation of the |
| /// [`Builder::allowlist_recursively`] method for further information. |
| pub fn allowlist_var<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.allowlisted_vars.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--allowlist-var", |
| }, |
| /// Files whose contents have been allowlisted and should appear in the generated code. |
| allowlisted_files: RegexSet { |
| methods: { |
| regex_option! { |
| /// Generate bindings for the content of the given file. |
| /// |
| /// This option is transitive by default. Check the documentation of the |
| /// [`Builder::allowlist_recursively`] method for further information. |
| /// |
| /// This method will use the argument to match the complete path of the file |
| /// instead of a section of it. |
| pub fn allowlist_file<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.allowlisted_files.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--allowlist-file", |
| }, |
| /// Items that have been allowlisted and should appear in the generated code. |
| allowlisted_items: RegexSet { |
| methods: { |
| regex_option! { |
| /// Generate bindings for the given item, regardless of whether it is a type, |
| /// function, module, etc. |
| /// |
| /// This option is transitive by default. Check the documentation of the |
| /// [`Builder::allowlist_recursively`] method for further information. |
| pub fn allowlist_item<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.allowlisted_items.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--allowlist-item", |
| }, |
| /// The default style of for generated `enum`s. |
| default_enum_style: EnumVariation { |
| methods: { |
| /// Set the default style for generated `enum`s. |
| /// |
| /// If this method is not called, the [`EnumVariation::Consts`] style will be used by |
| /// default. |
| /// |
| /// To set the style for individual `enum`s, use [`Builder::bitfield_enum`], |
| /// [`Builder::newtype_enum`], [`Builder::newtype_global_enum`], |
| /// [`Builder::rustified_enum`], [`Builder::rustified_non_exhaustive_enum`], |
| /// [`Builder::constified_enum_module`] or [`Builder::constified_enum`]. |
| pub fn default_enum_style( |
| mut self, |
| arg: EnumVariation, |
| ) -> Builder { |
| self.options.default_enum_style = arg; |
| self |
| } |
| }, |
| as_args: |variation, args| { |
| if *variation != Default::default() { |
| args.push("--default-enum-style".to_owned()); |
| args.push(variation.to_string()); |
| } |
| }, |
| }, |
| /// `enum`s marked as bitfield-like. This is, newtypes with bitwise operations. |
| bitfield_enums: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `enum` as being bitfield-like. |
| /// |
| /// This is similar to the [`Builder::newtype_enum`] style, but with the bitwise |
| /// operators implemented. |
| pub fn bitfield_enum<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.bitfield_enums.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--bitfield-enum", |
| }, |
| /// `enum`s marked as newtypes. |
| newtype_enums: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `enum` as a newtype. |
| /// |
| /// This means that an integer newtype will be declared to represent the `enum` |
| /// type and its variants will be represented as constants inside of this type's |
| /// `impl` block. |
| pub fn newtype_enum<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.newtype_enums.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--newtype-enum", |
| }, |
| /// `enum`s marked as global newtypes . |
| newtype_global_enums: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `enum` as a global newtype. |
| /// |
| /// This is similar to the [`Builder::newtype_enum`] style, but the constants for |
| /// each variant are free constants instead of being declared inside an `impl` |
| /// block for the newtype. |
| pub fn newtype_global_enum<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.newtype_global_enums.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--newtype-global-enum", |
| }, |
| /// `enum`s marked as Rust `enum`s. |
| rustified_enums: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `enum` as a Rust `enum`. |
| /// |
| /// This means that each variant of the `enum` will be represented as a Rust `enum` |
| /// variant. |
| /// |
| /// **Use this with caution**, creating an instance of a Rust `enum` with an |
| /// invalid value will cause undefined behaviour. To avoid this, use the |
| /// [`Builder::newtype_enum`] style instead. |
| pub fn rustified_enum<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.rustified_enums.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--rustified-enum", |
| }, |
| /// `enum`s marked as non-exhaustive Rust `enum`s. |
| rustified_non_exhaustive_enums: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `enum` as a non-exhaustive Rust `enum`. |
| /// |
| /// This is similar to the [`Builder::rustified_enum`] style, but the `enum` is |
| /// tagged with the `#[non_exhaustive]` attribute. |
| pub fn rustified_non_exhaustive_enum<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.rustified_non_exhaustive_enums.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--rustified-non-exhaustive-enums", |
| }, |
| /// `enum`s marked as modules of constants. |
| constified_enum_modules: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `enum` as a module with a set of integer constants. |
| pub fn constified_enum_module<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.constified_enum_modules.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--constified-enum-module", |
| }, |
| /// `enum`s marked as a set of constants. |
| constified_enums: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `enum` as a set o integer constants. |
| /// |
| /// This is similar to the [`Builder::constified_enum_module`] style, but the |
| /// constants are generated in the current module instead of in a new module. |
| pub fn constified_enum<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.constified_enums.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--constified-enum", |
| }, |
| /// The default type signedness for C macro constants. |
| default_macro_constant_type: MacroTypeVariation { |
| methods: { |
| /// Set the default type signedness to be used for macro constants. |
| /// |
| /// If this method is not called, [`MacroTypeVariation::Unsigned`] is used by default. |
| /// |
| /// To set the type for individual macro constants, use the |
| /// [`ParseCallbacks::int_macro`] method. |
| pub fn default_macro_constant_type(mut self, arg: MacroTypeVariation) -> Builder { |
| self.options.default_macro_constant_type = arg; |
| self |
| } |
| |
| }, |
| as_args: |variation, args| { |
| if *variation != Default::default() { |
| args.push("--default-macro-constant-type".to_owned()); |
| args.push(variation.to_string()); |
| } |
| }, |
| }, |
| /// The default style of code generation for `typedef`s. |
| default_alias_style: AliasVariation { |
| methods: { |
| /// Set the default style of code generation for `typedef`s. |
| /// |
| /// If this method is not called, the [`AliasVariation::TypeAlias`] style is used by |
| /// default. |
| /// |
| /// To set the style for individual `typedefs`s, use [`Builder::type_alias`], |
| /// [`Builder::new_type_alias`] or [`Builder::new_type_alias_deref`]. |
| pub fn default_alias_style( |
| mut self, |
| arg: AliasVariation, |
| ) -> Builder { |
| self.options.default_alias_style = arg; |
| self |
| } |
| }, |
| as_args: |variation, args| { |
| if *variation != Default::default() { |
| args.push("--default-alias-style".to_owned()); |
| args.push(variation.to_string()); |
| } |
| }, |
| }, |
| /// `typedef` patterns that will use regular type aliasing. |
| type_alias: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `typedef` as a regular Rust `type` alias. |
| /// |
| /// This is the default behavior, meaning that this method only comes into effect |
| /// if a style different from [`AliasVariation::TypeAlias`] was passed to the |
| /// [`Builder::default_alias_style`] method. |
| pub fn type_alias<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.type_alias.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--type-alias", |
| }, |
| /// `typedef` patterns that will be aliased by creating a newtype. |
| new_type_alias: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `typedef` as a Rust newtype by having the aliased |
| /// type be wrapped in a `struct` with `#[repr(transparent)]`. |
| /// |
| /// This method can be used to enforce stricter type checking. |
| pub fn new_type_alias<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.new_type_alias.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--new-type-alias", |
| }, |
| /// `typedef` patterns that will be wrapped in a newtype implementing `Deref` and `DerefMut`. |
| new_type_alias_deref: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `typedef` to be generated as a newtype that can be dereferenced. |
| /// |
| /// This is similar to the [`Builder::new_type_alias`] style, but the newtype |
| /// implements `Deref` and `DerefMut` with the aliased type as a target. |
| pub fn new_type_alias_deref<T: AsRef<str>>(mut self, arg: T) -> Builder { |
| self.options.new_type_alias_deref.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--new-type-alias-deref", |
| }, |
| /// The default style of code to generate for `union`s containing non-`Copy` members. |
| default_non_copy_union_style: NonCopyUnionStyle { |
| methods: { |
| /// Set the default style of code to generate for `union`s with non-`Copy` members. |
| /// |
| /// If this method is not called, the [`NonCopyUnionStyle::BindgenWrapper`] style is |
| /// used by default. |
| /// |
| /// To set the style for individual `union`s, use [`Builder::bindgen_wrapper_union`] or |
| /// [`Builder::manually_drop_union`]. |
| pub fn default_non_copy_union_style(mut self, arg: NonCopyUnionStyle) -> Self { |
| self.options.default_non_copy_union_style = arg; |
| self |
| } |
| }, |
| as_args: |style, args| { |
| if *style != Default::default() { |
| args.push("--default-non-copy-union-style".to_owned()); |
| args.push(style.to_string()); |
| } |
| }, |
| }, |
| /// The patterns marking non-`Copy` `union`s as using the `bindgen` generated wrapper. |
| bindgen_wrapper_union: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `union` to use a `bindgen`-generated wrapper for its members if at |
| /// least one them is not `Copy`. |
| /// |
| /// This is the default behavior, meaning that this method only comes into effect |
| /// if a style different from [`NonCopyUnionStyle::BindgenWrapper`] was passed to |
| /// the [`Builder::default_non_copy_union_style`] method. |
| pub fn bindgen_wrapper_union<T: AsRef<str>>(mut self, arg: T) -> Self { |
| self.options.bindgen_wrapper_union.insert(arg); |
| self |
| } |
| } |
| }, |
| as_args: "--bindgen-wrapper-union", |
| }, |
| /// The patterns marking non-`Copy` `union`s as using the `ManuallyDrop` wrapper. |
| manually_drop_union: RegexSet { |
| methods: { |
| regex_option! { |
| /// Mark the given `union` to use [`::core::mem::ManuallyDrop`] for its members if |
| /// at least one of them is not `Copy`. |
| /// |
| /// The `ManuallyDrop` type was stabilized in Rust 1.20.0, do not use this option |
| /// if your target version is lower than this. |
| pub fn manually_drop_union<T: AsRef<str>>(mut self, arg: T) -> Self { |
| self.options.manually_drop_union.insert(arg); |
| self |
| } |
| } |
| |
| }, |
| as_args: "--manually-drop-union", |
| }, |
| |
| |
| /// Whether we should generate built-in definitions. |
| builtins: bool { |
| methods: { |
| /// Generate Rust bindings for built-in definitions (for example `__builtin_va_list`). |
| /// |
| /// Bindings for built-in definitions are not emitted by default. |
| pub fn emit_builtins(mut self) -> Builder { |
| self.options.builtins = true; |
| self |
| } |
| }, |
| as_args: "--builtins", |
| }, |
| /// Whether we should dump the Clang AST for debugging purposes. |
| emit_ast: bool { |
| methods: { |
| /// Emit the Clang AST to `stdout` for debugging purposes. |
| /// |
| /// The Clang AST is not emitted by default. |
| pub fn emit_clang_ast(mut self) -> Builder { |
| self.options.emit_ast = true; |
| self |
| } |
| }, |
| as_args: "--emit-clang-ast", |
| }, |
| /// Whether we should dump our IR for debugging purposes. |
| emit_ir: bool { |
| methods: { |
| /// Emit the `bindgen` internal representation to `stdout` for debugging purposes. |
| /// |
| /// This internal representation is not emitted by default. |
| pub fn emit_ir(mut self) -> Builder { |
| self.options.emit_ir = true; |
| self |
| } |
| }, |
| as_args: "--emit-ir", |
| }, |
| /// Output path for the `graphviz` DOT file. |
| emit_ir_graphviz: Option<String> { |
| methods: { |
| /// Set the path for the file where the`bindgen` internal representation will be |
| /// emitted as a graph using the `graphviz` DOT language. |
| /// |
| /// This graph representation is not emitted by default. |
| pub fn emit_ir_graphviz<T: Into<String>>(mut self, path: T) -> Builder { |
| let path = path.into(); |
| self.options.emit_ir_graphviz = Some(path); |
| self |
| } |
| }, |
| as_args: "--emit-ir-graphviz", |
| }, |
| |
| /// Whether we should emulate C++ namespaces with Rust modules. |
| enable_cxx_namespaces: bool { |
| methods: { |
| /// Emulate C++ namespaces using Rust modules in the generated bindings. |
| /// |
| /// C++ namespaces are not emulated by default. |
| pub fn enable_cxx_namespaces(mut self) -> Builder { |
| self.options.enable_cxx_namespaces = true; |
| self |
| } |
| }, |
| as_args: "--enable-cxx-namespaces", |
| }, |
| /// Whether we should try to find unexposed attributes in functions. |
| enable_function_attribute_detection: bool { |
| methods: { |
| /// Enable detecting function attributes on C functions. |
| /// |
| /// This enables the following features: |
| /// - Add `#[must_use]` attributes to Rust items whose C counterparts are marked as so. |
| /// This feature also requires that the Rust target version supports the attribute. |
| /// - Set `!` as the return type for Rust functions whose C counterparts are marked as |
| /// diverging. |
| /// |
| /// This option can be quite slow in some cases (check [#1465]), so it is disabled by |
| /// default. |
| /// |
| /// [#1465]: https://github.com/rust-lang/rust-bindgen/issues/1465 |
| pub fn enable_function_attribute_detection(mut self) -> Self { |
| self.options.enable_function_attribute_detection = true; |
| self |
| } |
| |
| }, |
| as_args: "--enable-function-attribute-detection", |
| }, |
| /// Whether we should avoid mangling names with namespaces. |
| disable_name_namespacing: bool { |
| methods: { |
| /// Disable name auto-namespacing. |
| /// |
| /// By default, `bindgen` mangles names like `foo::bar::Baz` to look like `foo_bar_Baz` |
| /// instead of just `Baz`. This method disables that behavior. |
| /// |
| /// Note that this does not change the names used for allowlisting and blocklisting, |
| /// which should still be mangled with the namespaces. Additionally, this option may |
| /// cause `bindgen` to generate duplicate names. |
| pub fn disable_name_namespacing(mut self) -> Builder { |
| self.options.disable_name_namespacing = true; |
| self |
| } |
| }, |
| as_args: "--disable-name-namespacing", |
| }, |
| /// Whether we should avoid generating nested `struct` names. |
| disable_nested_struct_naming: bool { |
| methods: { |
| /// Disable nested `struct` naming. |
| /// |
| /// The following `struct`s have different names for C and C++. In C, they are visible |
| /// as `foo` and `bar`. In C++, they are visible as `foo` and `foo::bar`. |
| /// |
| /// ```c |
| /// struct foo { |
| /// struct bar { |
| /// } b; |
| /// }; |
| /// ``` |
| /// |
| /// `bindgen` tries to avoid duplicate names by default, so it follows the C++ naming |
| /// convention and it generates `foo` and `foo_bar` instead of just `foo` and `bar`. |
| /// |
| /// This method disables this behavior and it is indented to be used only for headers |
| /// that were written in C. |
| pub fn disable_nested_struct_naming(mut self) -> Builder { |
| self.options.disable_nested_struct_naming = true; |
| self |
| } |
| }, |
| as_args: "--disable-nested-struct-naming", |
| }, |
| /// Whether we should avoid embedding version identifiers into source code. |
| disable_header_comment: bool { |
| methods: { |
| /// Do not insert the `bindgen` version identifier into the generated bindings. |
| /// |
| /// This identifier is inserted by default. |
| pub fn disable_header_comment(mut self) -> Self { |
| self.options.disable_header_comment = true; |
| self |
| } |
| |
| }, |
| as_args: "--disable-header-comment", |
| }, |
| /// Whether we should generate layout tests for generated `struct`s. |
| layout_tests: bool { |
| default: true, |
| methods: { |
| /// Set whether layout tests should be generated. |
| /// |
| /// Layout tests are generated by default. |
| pub fn layout_tests(mut self, doit: bool) -> Self { |
| self.options.layout_tests = doit; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-layout-tests"), |
| }, |
| /// Whether we should implement `Debug` for types that cannot derive it. |
| impl_debug: bool { |
| methods: { |
| /// Set whether `Debug` should be implemented for types that cannot derive it. |
| /// |
| /// This option is disabled by default. |
| pub fn impl_debug(mut self, doit: bool) -> Self { |
| self.options.impl_debug = doit; |
| self |
| } |
| |
| }, |
| as_args: "--impl-debug", |
| }, |
| /// Whether we should implement `PartialEq` types that cannot derive it. |
| impl_partialeq: bool { |
| methods: { |
| /// Set whether `PartialEq` should be implemented for types that cannot derive it. |
| /// |
| /// This option is disabled by default. |
| pub fn impl_partialeq(mut self, doit: bool) -> Self { |
| self.options.impl_partialeq = doit; |
| self |
| } |
| }, |
| as_args: "--impl-partialeq", |
| }, |
| /// Whether we should derive `Copy` when possible. |
| derive_copy: bool { |
| default: true, |
| methods: { |
| /// Set whether the `Copy` trait should be derived when possible. |
| /// |
| /// `Copy` is derived by default. |
| pub fn derive_copy(mut self, doit: bool) -> Self { |
| self.options.derive_copy = doit; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-derive-copy"), |
| }, |
| |
| /// Whether we should derive `Debug` when possible. |
| derive_debug: bool { |
| default: true, |
| methods: { |
| /// Set whether the `Debug` trait should be derived when possible. |
| /// |
| /// The [`Builder::impl_debug`] method can be used to implement `Debug` for types that |
| /// cannot derive it. |
| /// |
| /// `Debug` is derived by default. |
| pub fn derive_debug(mut self, doit: bool) -> Self { |
| self.options.derive_debug = doit; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-derive-debug"), |
| }, |
| |
| /// Whether we should derive `Default` when possible. |
| derive_default: bool { |
| methods: { |
| /// Set whether the `Default` trait should be derived when possible. |
| /// |
| /// `Default` is not derived by default. |
| pub fn derive_default(mut self, doit: bool) -> Self { |
| self.options.derive_default = doit; |
| self |
| } |
| }, |
| as_args: |&value, args| { |
| let arg = if value { |
| "--with-derive-default" |
| } else { |
| "--no-derive-default" |
| }; |
| |
| args.push(arg.to_owned()); |
| }, |
| }, |
| /// Whether we should derive `Hash` when possible. |
| derive_hash: bool { |
| methods: { |
| /// Set whether the `Hash` trait should be derived when possible. |
| /// |
| /// `Hash` is not derived by default. |
| pub fn derive_hash(mut self, doit: bool) -> Self { |
| self.options.derive_hash = doit; |
| self |
| } |
| }, |
| as_args: "--with-derive-hash", |
| }, |
| /// Whether we should derive `PartialOrd` when possible. |
| derive_partialord: bool { |
| methods: { |
| /// Set whether the `PartialOrd` trait should be derived when possible. |
| /// |
| /// Take into account that `Ord` cannot be derived for a type that does not implement |
| /// `PartialOrd`. For this reason, setting this method to `false` also sets |
| /// automatically [`Builder::derive_ord`] to `false`. |
| /// |
| /// `PartialOrd` is not derived by default. |
| pub fn derive_partialord(mut self, doit: bool) -> Self { |
| self.options.derive_partialord = doit; |
| if !doit { |
| self.options.derive_ord = false; |
| } |
| self |
| } |
| }, |
| as_args: "--with-derive-partialord", |
| }, |
| /// Whether we should derive `Ord` when possible. |
| derive_ord: bool { |
| methods: { |
| /// Set whether the `Ord` trait should be derived when possible. |
| /// |
| /// Take into account that `Ord` cannot be derived for a type that does not implement |
| /// `PartialOrd`. For this reason, the value set with this method will also be set |
| /// automatically for [`Builder::derive_partialord`]. |
| /// |
| /// `Ord` is not derived by default. |
| pub fn derive_ord(mut self, doit: bool) -> Self { |
| self.options.derive_ord = doit; |
| self.options.derive_partialord = doit; |
| self |
| } |
| }, |
| as_args: "--with-derive-ord", |
| }, |
| /// Whether we should derive `PartialEq` when possible. |
| derive_partialeq: bool { |
| methods: { |
| /// Set whether the `PartialEq` trait should be derived when possible. |
| /// |
| /// Take into account that `Eq` cannot be derived for a type that does not implement |
| /// `PartialEq`. For this reason, setting this method to `false` also sets |
| /// automatically [`Builder::derive_eq`] to `false`. |
| /// |
| /// The [`Builder::impl_partialeq`] method can be used to implement `PartialEq` for |
| /// types that cannot derive it. |
| /// |
| /// `PartialEq` is not derived by default. |
| pub fn derive_partialeq(mut self, doit: bool) -> Self { |
| self.options.derive_partialeq = doit; |
| if !doit { |
| self.options.derive_eq = false; |
| } |
| self |
| } |
| }, |
| as_args: "--with-derive-partialeq", |
| }, |
| /// Whether we should derive `Eq` when possible. |
| derive_eq: bool { |
| methods: { |
| /// Set whether the `Eq` trait should be derived when possible. |
| /// |
| /// Take into account that `Eq` cannot be derived for a type that does not implement |
| /// `PartialEq`. For this reason, the value set with this method will also be set |
| /// automatically for [`Builder::derive_partialeq`]. |
| /// |
| /// `Eq` is not derived by default. |
| pub fn derive_eq(mut self, doit: bool) -> Self { |
| self.options.derive_eq = doit; |
| if doit { |
| self.options.derive_partialeq = doit; |
| } |
| self |
| } |
| }, |
| as_args: "--with-derive-eq", |
| }, |
| /// Whether we should use `core` instead of `std`. |
| /// |
| /// If this option is enabled and the Rust target version is greater than 1.64, the prefix for |
| /// C platform-specific types will be `::core::ffi` instead of `::core::os::raw`. |
| use_core: bool { |
| methods: { |
| /// Use `core` instead of `std` in the generated bindings. |
| /// |
| /// `std` is used by default. |
| pub fn use_core(mut self) -> Builder { |
| self.options.use_core = true; |
| self |
| } |
| |
| }, |
| as_args: "--use-core", |
| }, |
| /// An optional prefix for the C platform-specific types. |
| ctypes_prefix: Option<String> { |
| methods: { |
| /// Use the given prefix for the C platform-specific types instead of `::std::os::raw`. |
| /// |
| /// Alternatively, the [`Builder::use_core`] method can be used to set the prefix to |
| /// `::core::ffi` or `::core::os::raw`. |
| pub fn ctypes_prefix<T: Into<String>>(mut self, prefix: T) -> Builder { |
| self.options.ctypes_prefix = Some(prefix.into()); |
| self |
| } |
| }, |
| as_args: "--ctypes-prefix", |
| }, |
| /// The prefix for anonymous fields. |
| anon_fields_prefix: String { |
| default: DEFAULT_ANON_FIELDS_PREFIX.into(), |
| methods: { |
| /// Use the given prefix for the anonymous fields. |
| /// |
| /// An anonymous field, is a field of a C/C++ type that does not have a name. For |
| /// example, in the following C code: |
| /// ```c |
| /// struct integer { |
| /// struct { |
| /// int inner; |
| /// }; |
| /// } |
| /// ``` |
| /// |
| /// The only field of the `integer` `struct` is an anonymous field and its Rust |
| /// representation will be named using this prefix followed by an integer identifier. |
| /// |
| /// The default prefix is `__bindgen_anon_`. |
| pub fn anon_fields_prefix<T: Into<String>>(mut self, prefix: T) -> Builder { |
| self.options.anon_fields_prefix = prefix.into(); |
| self |
| } |
| }, |
| as_args: |prefix, args| { |
| if prefix != DEFAULT_ANON_FIELDS_PREFIX { |
| args.push("--anon-fields-prefix".to_owned()); |
| args.push(prefix.clone()); |
| } |
| }, |
| }, |
| /// Whether to measure the time for each one of the `bindgen` phases. |
| time_phases: bool { |
| methods: { |
| /// Set whether to measure the elapsed time for each one of the `bindgen` phases. This |
| /// information is printed to `stderr`. |
| /// |
| /// The elapsed time is not measured by default. |
| pub fn time_phases(mut self, doit: bool) -> Self { |
| self.options.time_phases = doit; |
| self |
| } |
| }, |
| as_args: "--time-phases", |
| }, |
| /// Whether to convert C float types to `f32` and `f64`. |
| convert_floats: bool { |
| default: true, |
| methods: { |
| /// Avoid converting C float types to `f32` and `f64`. |
| pub fn no_convert_floats(mut self) -> Self { |
| self.options.convert_floats = false; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-convert-floats"), |
| }, |
| /// The set of raw lines to be prepended to the top-level module of the generated Rust code. |
| raw_lines: Vec<Box<str>> { |
| methods: { |
| /// Add a line of Rust code at the beginning of the generated bindings. The string is |
| /// passed through without any modification. |
| pub fn raw_line<T: Into<String>>(mut self, arg: T) -> Self { |
| self.options.raw_lines.push(arg.into().into_boxed_str()); |
| self |
| } |
| }, |
| as_args: |raw_lines, args| { |
| for line in raw_lines { |
| args.push("--raw-line".to_owned()); |
| args.push(line.clone().into()); |
| } |
| }, |
| }, |
| /// The set of raw lines to prepend to different modules. |
| module_lines: HashMap<Box<str>, Vec<Box<str>>> { |
| methods: { |
| /// Add a given line to the beginning of a given module. |
| /// |
| /// This option only comes into effect if the [`Builder::enable_cxx_namespaces`] method |
| /// is also being called. |
| pub fn module_raw_line<T, U>(mut self, module: T, line: U) -> Self |
| where |
| T: Into<String>, |
| U: Into<String>, |
| { |
| self.options |
| .module_lines |
| .entry(module.into().into_boxed_str()) |
| .or_default() |
| .push(line.into().into_boxed_str()); |
| self |
| } |
| }, |
| as_args: |module_lines, args| { |
| for (module, lines) in module_lines { |
| for line in lines.iter() { |
| args.push("--module-raw-line".to_owned()); |
| args.push(module.clone().into()); |
| args.push(line.clone().into()); |
| } |
| } |
| }, |
| }, |
| /// The input header files. |
| input_headers: Vec<Box<str>> { |
| methods: { |
| /// Add an input C/C++ header to generate bindings for. |
| /// |
| /// This can be used to generate bindings for a single header: |
| /// |
| /// ```ignore |
| /// let bindings = bindgen::Builder::default() |
| /// .header("input.h") |
| /// .generate() |
| /// .unwrap(); |
| /// ``` |
| /// |
| /// Or for multiple headers: |
| /// |
| /// ```ignore |
| /// let bindings = bindgen::Builder::default() |
| /// .header("first.h") |
| /// .header("second.h") |
| /// .header("third.h") |
| /// .generate() |
| /// .unwrap(); |
| /// ``` |
| pub fn header<T: Into<String>>(mut self, header: T) -> Builder { |
| self.options.input_headers.push(header.into().into_boxed_str()); |
| self |
| } |
| }, |
| // This field is handled specially inside the macro. |
| as_args: ignore, |
| }, |
| /// The set of arguments to be passed straight through to Clang. |
| clang_args: Vec<Box<str>> { |
| methods: { |
| /// Add an argument to be passed straight through to Clang. |
| pub fn clang_arg<T: Into<String>>(self, arg: T) -> Builder { |
| self.clang_args([arg.into().into_boxed_str()]) |
| } |
| |
| /// Add several arguments to be passed straight through to Clang. |
| pub fn clang_args<I: IntoIterator>(mut self, args: I) -> Builder |
| where |
| I::Item: AsRef<str>, |
| { |
| for arg in args { |
| self.options.clang_args.push(arg.as_ref().to_owned().into_boxed_str()); |
| } |
| self |
| } |
| }, |
| // This field is handled specially inside the macro. |
| as_args: ignore, |
| }, |
| /// Tuples of unsaved file contents of the form (name, contents). |
| input_header_contents: Vec<(Box<str>, Box<str>)> { |
| methods: { |
| /// Add `contents` as an input C/C++ header named `name`. |
| /// |
| /// This can be used to inject additional C/C++ code as an input without having to |
| /// create additional header files. |
| pub fn header_contents(mut self, name: &str, contents: &str) -> Builder { |
| // Apparently clang relies on having virtual FS correspondent to |
| // the real one, so we need absolute paths here |
| let absolute_path = env::current_dir() |
| .expect("Cannot retrieve current directory") |
| .join(name) |
| .to_str() |
| .expect("Cannot convert current directory name to string") |
| .into(); |
| self.options |
| .input_header_contents |
| .push((absolute_path, contents.into())); |
| self |
| } |
| }, |
| // Header contents cannot be added from the CLI. |
| as_args: ignore, |
| }, |
| /// A user-provided visitor to allow customizing different kinds of situations. |
| parse_callbacks: Vec<Rc<dyn ParseCallbacks>> { |
| methods: { |
| /// Add a new [`ParseCallbacks`] instance to configure types in different situations. |
| pub fn parse_callbacks(mut self, cb: Box<dyn ParseCallbacks>) -> Self { |
| self.options.parse_callbacks.push(Rc::from(cb)); |
| self |
| } |
| }, |
| as_args: |_callbacks, _args| { |
| #[cfg(feature = "__cli")] |
| for cb in _callbacks { |
| _args.extend(cb.cli_args()); |
| } |
| }, |
| }, |
| /// Which kind of items should we generate. We generate all of them by default. |
| codegen_config: CodegenConfig { |
| default: CodegenConfig::all(), |
| methods: { |
| /// Do not generate any functions. |
| /// |
| /// Functions are generated by default. |
| pub fn ignore_functions(mut self) -> Builder { |
| self.options.codegen_config.remove(CodegenConfig::FUNCTIONS); |
| self |
| } |
| |
| /// Do not generate any methods. |
| /// |
| /// Methods are generated by default. |
| pub fn ignore_methods(mut self) -> Builder { |
| self.options.codegen_config.remove(CodegenConfig::METHODS); |
| self |
| } |
| |
| /// Choose what to generate using a [`CodegenConfig`]. |
| /// |
| /// This option overlaps with [`Builder::ignore_functions`] and |
| /// [`Builder::ignore_methods`]. |
| /// |
| /// All the items in `CodegenConfig` are generated by default. |
| pub fn with_codegen_config(mut self, config: CodegenConfig) -> Self { |
| self.options.codegen_config = config; |
| self |
| } |
| }, |
| as_args: |codegen_config, args| { |
| if !codegen_config.functions() { |
| args.push("--ignore-functions".to_owned()); |
| } |
| |
| args.push("--generate".to_owned()); |
| |
| //Temporary placeholder for the 4 options below. |
| let mut options: Vec<String> = Vec::new(); |
| if codegen_config.functions() { |
| options.push("functions".to_owned()); |
| } |
| |
| if codegen_config.types() { |
| options.push("types".to_owned()); |
| } |
| |
| if codegen_config.vars() { |
| options.push("vars".to_owned()); |
| } |
| |
| if codegen_config.methods() { |
| options.push("methods".to_owned()); |
| } |
| |
| if codegen_config.constructors() { |
| options.push("constructors".to_owned()); |
| } |
| |
| if codegen_config.destructors() { |
| options.push("destructors".to_owned()); |
| } |
| |
| args.push(options.join(",")); |
| |
| if !codegen_config.methods() { |
| args.push("--ignore-methods".to_owned()); |
| } |
| }, |
| }, |
| /// Whether to treat inline namespaces conservatively. |
| conservative_inline_namespaces: bool { |
| methods: { |
| /// Treat inline namespaces conservatively. |
| /// |
| /// This is tricky, because in C++ is technically legal to override an item |
| /// defined in an inline namespace: |
| /// |
| /// ```cpp |
| /// inline namespace foo { |
| /// using Bar = int; |
| /// } |
| /// using Bar = long; |
| /// ``` |
| /// |
| /// Even though referencing `Bar` is a compiler error. |
| /// |
| /// We want to support this (arguably esoteric) use case, but we do not want to make |
| /// the rest of `bindgen` users pay an usability penalty for that. |
| /// |
| /// To support this, we need to keep all the inline namespaces around, but then using |
| /// `bindgen` becomes a bit more difficult, because you cannot reference paths like |
| /// `std::string` (you'd need to use the proper inline namespace). |
| /// |
| /// We could complicate a lot of the logic to detect name collisions and, in the |
| /// absence of collisions, generate a `pub use inline_ns::*` or something like that. |
| /// |
| /// That is probably something we can do to improve the usability of this option if we |
| /// realize it is needed way more often. Our guess is that this extra logic is not |
| /// going to be very useful. |
| /// |
| /// This option is disabled by default. |
| pub fn conservative_inline_namespaces(mut self) -> Builder { |
| self.options.conservative_inline_namespaces = true; |
| self |
| } |
| }, |
| as_args: "--conservative-inline-namespaces", |
| }, |
| /// Whether to keep documentation comments in the generated output. |
| generate_comments: bool { |
| default: true, |
| methods: { |
| /// Set whether the generated bindings should contain documentation comments. |
| /// |
| /// Documentation comments are included by default. |
| /// |
| /// Note that clang excludes comments from system headers by default, pass |
| /// `"-fretain-comments-from-system-headers"` to the [`Builder::clang_arg`] method to |
| /// include them. |
| /// |
| /// It is also possible to process all comments and not just documentation using the |
| /// `"-fparse-all-comments"` flag. Check [these slides on clang comment parsing]( |
| /// https://llvm.org/devmtg/2012-11/Gribenko_CommentParsing.pdf) for more information |
| /// and examples. |
| pub fn generate_comments(mut self, doit: bool) -> Self { |
| self.options.generate_comments = doit; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-doc-comments"), |
| }, |
| /// Whether to generate inline functions. |
| generate_inline_functions: bool { |
| methods: { |
| /// Set whether to generate inline functions. |
| /// |
| /// This option is disabled by default. |
| /// |
| /// Note that they will usually not work. However you can use `-fkeep-inline-functions` |
| /// or `-fno-inline-functions` if you are responsible of compiling the library to make |
| /// them callable. |
| #[cfg_attr( |
| feature = "experimental", |
| doc = "\nCheck the [`Builder::wrap_static_fns`] method for an alternative." |
| )] |
| pub fn generate_inline_functions(mut self, doit: bool) -> Self { |
| self.options.generate_inline_functions = doit; |
| self |
| } |
| }, |
| as_args: "--generate-inline-functions", |
| }, |
| /// Whether to allowlist types recursively. |
| allowlist_recursively: bool { |
| default: true, |
| methods: { |
| /// Set whether to recursively allowlist items. |
| /// |
| /// Items are allowlisted recursively by default. |
| /// |
| /// Given that we have explicitly allowlisted the `initiate_dance_party` function in |
| /// this C header: |
| /// |
| /// ```c |
| /// typedef struct MoonBoots { |
| /// int bouncy_level; |
| /// } MoonBoots; |
| /// |
| /// void initiate_dance_party(MoonBoots* boots); |
| /// ``` |
| /// |
| /// We would normally generate bindings to both the `initiate_dance_party` function and |
| /// the `MoonBoots` type that it transitively references. If `false` is passed to this |
| /// method, `bindgen` will not emit bindings for anything except the explicitly |
| /// allowlisted items, meaning that the definition for `MoonBoots` would not be |
| /// generated. However, the `initiate_dance_party` function would still reference |
| /// `MoonBoots`! |
| /// |
| /// **Disabling this feature will almost certainly cause `bindgen` to emit bindings |
| /// that will not compile!** If you disable this feature, then it is *your* |
| /// responsibility to provide definitions for every type that is referenced from an |
| /// explicitly allowlisted item. One way to provide the missing definitions is by using |
| /// the [`Builder::raw_line`] method, another would be to define them in Rust and then |
| /// `include!(...)` the bindings immediately afterwards. |
| pub fn allowlist_recursively(mut self, doit: bool) -> Self { |
| self.options.allowlist_recursively = doit; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-recursive-allowlist"), |
| }, |
| /// Whether to emit `#[macro_use] extern crate objc;` instead of `use objc;` in the prologue of |
| /// the files generated from objective-c files. |
| objc_extern_crate: bool { |
| methods: { |
| /// Emit `#[macro_use] extern crate objc;` instead of `use objc;` in the prologue of |
| /// the files generated from objective-c files. |
| /// |
| /// `use objc;` is emitted by default. |
| pub fn objc_extern_crate(mut self, doit: bool) -> Self { |
| self.options.objc_extern_crate = doit; |
| self |
| } |
| }, |
| as_args: "--objc-extern-crate", |
| }, |
| /// Whether to generate proper block signatures instead of `void` pointers. |
| generate_block: bool { |
| methods: { |
| /// Generate proper block signatures instead of `void` pointers. |
| /// |
| /// `void` pointers are used by default. |
| pub fn generate_block(mut self, doit: bool) -> Self { |
| self.options.generate_block = doit; |
| self |
| } |
| }, |
| as_args: "--generate-block", |
| }, |
| /// Whether to generate strings as `CStr`. |
| generate_cstr: bool { |
| methods: { |
| /// Set whether string constants should be generated as `&CStr` instead of `&[u8]`. |
| /// |
| /// A minimum Rust target of 1.59 is required for this to have any effect as support |
| /// for `CStr::from_bytes_with_nul_unchecked` in `const` contexts is needed. |
| /// |
| /// This option is disabled by default but will become enabled by default in a future |
| /// release, so enabling this is recommended. |
| pub fn generate_cstr(mut self, doit: bool) -> Self { |
| self.options.generate_cstr = doit; |
| self |
| } |
| }, |
| as_args: "--generate-cstr", |
| }, |
| /// Whether to emit `#[macro_use] extern crate block;` instead of `use block;` in the prologue |
| /// of the files generated from apple block files. |
| block_extern_crate: bool { |
| methods: { |
| /// Emit `#[macro_use] extern crate block;` instead of `use block;` in the prologue of |
| /// the files generated from apple block files. |
| /// |
| /// `use block;` is emitted by default. |
| pub fn block_extern_crate(mut self, doit: bool) -> Self { |
| self.options.block_extern_crate = doit; |
| self |
| } |
| }, |
| as_args: "--block-extern-crate", |
| }, |
| /// Whether to use the clang-provided name mangling. |
| enable_mangling: bool { |
| default: true, |
| methods: { |
| /// Set whether to use the clang-provided name mangling. This is probably needed for |
| /// C++ features. |
| /// |
| /// The mangling provided by clang is used by default. |
| /// |
| /// We allow disabling this option because some old `libclang` versions seem to return |
| /// incorrect results in some cases for non-mangled functions, check [#528] for more |
| /// information. |
| /// |
| /// [#528]: https://github.com/rust-lang/rust-bindgen/issues/528 |
| pub fn trust_clang_mangling(mut self, doit: bool) -> Self { |
| self.options.enable_mangling = doit; |
| self |
| } |
| |
| }, |
| as_args: |value, args| (!value).as_args(args, "--distrust-clang-mangling"), |
| }, |
| /// Whether to detect include paths using `clang_sys`. |
| detect_include_paths: bool { |
| default: true, |
| methods: { |
| /// Set whether to detect include paths using `clang_sys`. |
| /// |
| /// `clang_sys` is used to detect include paths by default. |
| pub fn detect_include_paths(mut self, doit: bool) -> Self { |
| self.options.detect_include_paths = doit; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-include-path-detection"), |
| }, |
| /// Whether we should try to fit macro constants into types smaller than `u32` and `i32`. |
| fit_macro_constants: bool { |
| methods: { |
| /// Set whether `bindgen` should try to fit macro constants into types smaller than `u32` |
| /// and `i32`. |
| /// |
| /// This option is disabled by default. |
| pub fn fit_macro_constants(mut self, doit: bool) -> Self { |
| self.options.fit_macro_constants = doit; |
| self |
| } |
| }, |
| as_args: "--fit-macro-constant-types", |
| }, |
| /// Whether to prepend the `enum` name to constant or newtype variants. |
| prepend_enum_name: bool { |
| default: true, |
| methods: { |
| /// Set whether to prepend the `enum` name to constant or newtype variants. |
| /// |
| /// The `enum` name is prepended by default. |
| pub fn prepend_enum_name(mut self, doit: bool) -> Self { |
| self.options.prepend_enum_name = doit; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-prepend-enum-name"), |
| }, |
| /// Version of the Rust compiler to target. |
| rust_target: RustTarget { |
| methods: { |
| /// Specify the Rust target version. |
| /// |
| /// The default target is the latest stable Rust version. |
| pub fn rust_target(mut self, rust_target: RustTarget) -> Self { |
| self.options.set_rust_target(rust_target); |
| self |
| } |
| }, |
| as_args: |rust_target, args| { |
| args.push("--rust-target".to_owned()); |
| args.push(rust_target.to_string()); |
| }, |
| }, |
| /// Features to be enabled. They are derived from `rust_target`. |
| rust_features: RustFeatures { |
| default: RustTarget::default().into(), |
| methods: {}, |
| // This field cannot be set from the CLI, |
| as_args: ignore, |
| }, |
| /// Enable support for native Rust unions if they are supported. |
| untagged_union: bool { |
| default: true, |
| methods: { |
| /// Disable support for native Rust unions, if supported. |
| /// |
| /// The default value of this option is set based on the value passed to |
| /// [`Builder::rust_target`]. |
| pub fn disable_untagged_union(mut self) -> Self { |
| self.options.untagged_union = false; |
| self |
| } |
| } |
| as_args: |value, args| (!value).as_args(args, "--disable-untagged-union"), |
| }, |
| /// Whether we should record which items in the regex sets did match any C items. |
| record_matches: bool { |
| default: true, |
| methods: { |
| /// Set whether we should record which items in our regex sets did match any C items. |
| /// |
| /// Matches are recorded by default. |
| pub fn record_matches(mut self, doit: bool) -> Self { |
| self.options.record_matches = doit; |
| self |
| } |
| |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-record-matches"), |
| }, |
| /// Whether `size_t` should be translated to `usize` automatically. |
| size_t_is_usize: bool { |
| default: true, |
| methods: { |
| /// Set whether `size_t` should be translated to `usize`. |
| /// |
| /// If `size_t` is translated to `usize`, type definitions for `size_t` will not be |
| /// emitted. |
| /// |
| /// `size_t` is translated to `usize` by default. |
| pub fn size_t_is_usize(mut self, is: bool) -> Self { |
| self.options.size_t_is_usize = is; |
| self |
| } |
| }, |
| as_args: |value, args| (!value).as_args(args, "--no-size_t-is-usize"), |
| }, |
| /// The tool that should be used to format the generated bindings. |
| formatter: Formatter { |
| methods: { |
| /// Set whether `rustfmt` should be used to format the generated bindings. |
| /// |
| /// `rustfmt` is used by default. |
| /// |
| /// This method overlaps in functionality with the more general [`Builder::formatter`]. |
| /// Thus, the latter should be preferred. |
| #[deprecated] |
| pub fn rustfmt_bindings(mut self, doit: bool) -> Self { |
| self.options.formatter = if doit { |
| Formatter::Rustfmt |
| } else { |
| Formatter::None |
| }; |
| self |
| } |
| |
| /// Set which tool should be used to format the generated bindings. |
| /// |
| /// The default formatter is [`Formatter::Rustfmt`]. |
| /// |
| /// To be able to use `prettyplease` as a formatter, the `"prettyplease"` feature for |
| /// `bindgen` must be enabled in the Cargo manifest. |
| pub fn formatter(mut self, formatter: Formatter) -> Self { |
| self.options.formatter = formatter; |
| self |
| } |
| }, |
| as_args: |formatter, args| { |
| if *formatter != Default::default() { |
| args.push("--formatter".to_owned()); |
| args.push(formatter.to_string()); |
| } |
| }, |
| }, |
| /// The absolute path to the `rustfmt` configuration file. |
| rustfmt_configuration_file: Option<PathBuf> { |
| methods: { |
| /// Set the absolute path to the `rustfmt` configuration file. |
| /// |
| /// The default `rustfmt` options are used if `None` is passed to this method or if |
| /// this method is not called at all. |
| /// |
| /// Calling this method will set the [`Builder::rustfmt_bindings`] option to `true` |
| /// and the [`Builder::formatter`] option to [`Formatter::Rustfmt`]. |
| pub fn rustfmt_configuration_file(mut self, path: Option<PathBuf>) -> Self { |
| self = self.formatter(Formatter::Rustfmt); |
| self.options.rustfmt_configuration_file = path; |
| self |
| } |
| }, |
| as_args: "--rustfmt-configuration-file", |
| }, |
| /// Types that should not derive `PartialEq`. |
| no_partialeq_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not derive `PartialEq` for a given type. |
| pub fn no_partialeq<T: Into<String>>(mut self, arg: T) -> Builder { |
| self.options.no_partialeq_types.insert(arg.into()); |
| self |
| } |
| } |
| }, |
| as_args: "--no-partialeq", |
| }, |
| /// Types that should not derive `Copy`. |
| no_copy_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not derive `Copy` and `Clone` for a given type. |
| pub fn no_copy<T: Into<String>>(mut self, arg: T) -> Self { |
| self.options.no_copy_types.insert(arg.into()); |
| self |
| } |
| } |
| }, |
| as_args: "--no-copy", |
| }, |
| /// Types that should not derive `Debug`. |
| no_debug_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not derive `Debug` for a given type. |
| pub fn no_debug<T: Into<String>>(mut self, arg: T) -> Self { |
| self.options.no_debug_types.insert(arg.into()); |
| self |
| } |
| } |
| }, |
| as_args: "--no-debug", |
| }, |
| /// Types that should not derive or implement `Default`. |
| no_default_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not derive or implement `Default` for a given type. |
| pub fn no_default<T: Into<String>>(mut self, arg: T) -> Self { |
| self.options.no_default_types.insert(arg.into()); |
| self |
| } |
| } |
| }, |
| as_args: "--no-default", |
| }, |
| /// Types that should not derive `Hash`. |
| no_hash_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Do not derive `Hash` for a given type. |
| pub fn no_hash<T: Into<String>>(mut self, arg: T) -> Builder { |
| self.options.no_hash_types.insert(arg.into()); |
| self |
| } |
| } |
| }, |
| as_args: "--no-hash", |
| }, |
| /// Types that should be annotated with `#[must_use]`. |
| must_use_types: RegexSet { |
| methods: { |
| regex_option! { |
| /// Annotate the given type with the `#[must_use]` attribute. |
| pub fn must_use_type<T: Into<String>>(mut self, arg: T) -> Builder { |
| self.options.must_use_types.insert(arg.into()); |
| self |
| } |
| } |
| }, |
| as_args: "--must-use-type", |
| }, |
| /// Whether C arrays should be regular pointers in rust or array pointers |
| array_pointers_in_arguments: bool { |
| methods: { |
| /// Translate arrays `T arr[size]` into array pointers `*mut [T; size]` instead of |
| /// translating them as `*mut T` which is the default. |
| /// |
| /// The same is done for `*const` pointers. |
| pub fn array_pointers_in_arguments(mut self, doit: bool) -> Self { |
| self.options.array_pointers_in_arguments = doit; |
| self |
| } |
| |
| }, |
| as_args: "--use-array-pointers-in-arguments", |
| }, |
| /// The name of the `wasm_import_module`. |
| wasm_import_module_name: Option<String> { |
| methods: { |
| /// Adds the `#[link(wasm_import_module = import_name)]` attribute to all the `extern` |
| /// blocks generated by `bindgen`. |
| /// |
| /// This attribute is not added by default. |
| pub fn wasm_import_module_name<T: Into<String>>( |
| mut self, |
| import_name: T, |
| ) -> Self { |
| self.options.wasm_import_module_name = Some(import_name.into()); |
| self |
| } |
| }, |
| as_args: "--wasm-import-module-name", |
| }, |
| /// The name of the dynamic library (if we are generating bindings for a shared library). |
| dynamic_library_name: Option<String> { |
| methods: { |
| /// Generate bindings for a shared library with the given name. |
| /// |
| /// This option is disabled by default. |
| pub fn dynamic_library_name<T: Into<String>>( |
| mut self, |
| dynamic_library_name: T, |
| ) -> Self { |
| self.options.dynamic_library_name = Some(dynamic_library_name.into()); |
| self |
| } |
| }, |
| as_args: "--dynamic-loading", |
| }, |
| /// Whether to equire successful linkage for all routines in a shared library. |
| dynamic_link_require_all: bool { |
| methods: { |
| /// Set whether to require successful linkage for all routines in a shared library. |
| /// This allows us to optimize function calls by being able to safely assume function |
| /// pointers are valid. |
| /// |
| /// This option only comes into effect if the [`Builder::dynamic_library_name`] option |
| /// is set. |
| /// |
| /// This option is disabled by default. |
| pub fn dynamic_link_require_all(mut self, req: bool) -> Self { |
| self.options.dynamic_link_require_all = req; |
| self |
| } |
| }, |
| as_args: "--dynamic-link-require-all", |
| }, |
| /// Whether to only make generated bindings `pub` if the items would be publicly accessible by |
| /// C++. |
| respect_cxx_access_specs: bool { |
| methods: { |
| /// Set whether to respect the C++ access specifications. |
| /// |
| /// Passing `true` to this method will set the visibility of the generated Rust items |
| /// as `pub` only if the corresponding C++ items are publicly accessible instead of |
| /// marking all the items as public, which is the default. |
| pub fn respect_cxx_access_specs(mut self, doit: bool) -> Self { |
| self.options.respect_cxx_access_specs = doit; |
| self |
| } |
| |
| }, |
| as_args: "--respect-cxx-access-specs", |
| }, |
| /// Whether to translate `enum` integer types to native Rust integer types. |
| translate_enum_integer_types: bool { |
| methods: { |
| /// Set whether to always translate `enum` integer types to native Rust integer types. |
| /// |
| /// Passing `true` to this method will result in `enum`s having types such as `u32` and |
| /// `i16` instead of `c_uint` and `c_short` which is the default. The `#[repr]` types |
| /// of Rust `enum`s are always translated to Rust integer types. |
| pub fn translate_enum_integer_types(mut self, doit: bool) -> Self { |
| self.options.translate_enum_integer_types = doit; |
| self |
| } |
| }, |
| as_args: "--translate-enum-integer-types", |
| }, |
| /// Whether to generate types with C style naming. |
| c_naming: bool { |
| methods: { |
| /// Set whether to generate types with C style naming. |
| /// |
| /// Passing `true` to this method will add prefixes to the generated type names. For |
| /// example, instead of a `struct` with name `A` we will generate a `struct` with |
| /// `struct_A`. Currently applies to `struct`s, `union`s, and `enum`s. |
| pub fn c_naming(mut self, doit: bool) -> Self { |
| self.options.c_naming = doit; |
| self |
| } |
| }, |
| as_args: "--c-naming", |
| }, |
| /// Wether to always emit explicit padding fields. |
| force_explicit_padding: bool { |
| methods: { |
| /// Set whether to always emit explicit padding fields. |
| /// |
| /// This option should be enabled if a `struct` needs to be serialized in its native |
| /// format (padding bytes and all). This could be required if such `struct` will be |
| /// written to a file or sent over the network, as anything reading the padding bytes |
| /// of a struct may cause undefined behavior. |
| /// |
| /// Padding fields are not emitted by default. |
| pub fn explicit_padding(mut self, doit: bool) -> Self { |
| self.options.force_explicit_padding = doit; |
| self |
| } |
| }, |
| as_args: "--explicit-padding", |
| }, |
| /// Whether to emit vtable functions. |
| vtable_generation: bool { |
| methods: { |
| /// Set whether to enable experimental support to generate virtual table functions. |
| /// |
| /// This option should mostly work, though some edge cases are likely to be broken. |
| /// |
| /// Virtual table generation is disabled by default. |
| pub fn vtable_generation(mut self, doit: bool) -> Self { |
| self.options.vtable_generation = doit; |
| self |
| } |
| }, |
| as_args: "--vtable-generation", |
| }, |
| /// Whether to sort the generated Rust items. |
| sort_semantically: bool { |
| methods: { |
| /// Set whether to sort the generated Rust items in a predefined manner. |
| /// |
| /// Items are not ordered by default. |
| pub fn sort_semantically(mut self, doit: bool) -> Self { |
| self.options.sort_semantically = doit; |
| self |
| } |
| }, |
| as_args: "--sort-semantically", |
| }, |
| /// Whether to deduplicate `extern` blocks. |
| merge_extern_blocks: bool { |
| methods: { |
| /// Merge all extern blocks under the same module into a single one. |
| /// |
| /// Extern blocks are not merged by default. |
| pub fn merge_extern_blocks(mut self, doit: bool) -> Self { |
| self.options.merge_extern_blocks = doit; |
| self |
| } |
| }, |
| as_args: "--merge-extern-blocks", |
| }, |
| /// Whether to wrap unsafe operations in unsafe blocks. |
| wrap_unsafe_ops: bool { |
| methods: { |
| /// Wrap all unsafe operations in unsafe blocks. |
| /// |
| /// Unsafe operations are not wrapped by default. |
| pub fn wrap_unsafe_ops(mut self, doit: bool) -> Self { |
| self.options.wrap_unsafe_ops = doit; |
| self |
| } |
| }, |
| as_args: "--wrap-unsafe-ops", |
| }, |
| /// Patterns for functions whose ABI should be overriden. |
| abi_overrides: HashMap<Abi, RegexSet> { |
| methods: { |
| regex_option! { |
| /// Override the ABI of a given function. |
| pub fn override_abi<T: Into<String>>(mut self, abi: Abi, arg: T) -> Self { |
| self.options |
| .abi_overrides |
| .entry(abi) |
| .or_default() |
| .insert(arg.into()); |
| self |
| } |
| } |
| }, |
| as_args: |overrides, args| { |
| for (abi, set) in overrides { |
| for item in set.get_items() { |
| args.push("--override-abi".to_owned()); |
| args.push(format!("{}={}", item, abi)); |
| } |
| } |
| }, |
| }, |
| /// Whether to generate wrappers for `static` functions. |
| wrap_static_fns: bool { |
| methods: { |
| #[cfg(feature = "experimental")] |
| /// Set whether to generate wrappers for `static`` functions. |
| /// |
| /// Passing `true` to this method will generate a C source file with non-`static` |
| /// functions that call the `static` functions found in the input headers and can be |
| /// called from Rust once the source file is compiled. |
| /// |
| /// The path of this source file can be set using the [`Builder::wrap_static_fns_path`] |
| /// method. |
| pub fn wrap_static_fns(mut self, doit: bool) -> Self { |
| self.options.wrap_static_fns = doit; |
| self |
| } |
| }, |
| as_args: "--wrap-static-fns", |
| }, |
| /// The suffix to be added to the function wrappers for `static` functions. |
| wrap_static_fns_suffix: Option<String> { |
| methods: { |
| #[cfg(feature = "experimental")] |
| /// Set the suffix added to the wrappers for `static` functions. |
| /// |
| /// This option only comes into effect if `true` is passed to the |
| /// [`Builder::wrap_static_fns`] method. |
| /// |
| /// The default suffix is `__extern`. |
| pub fn wrap_static_fns_suffix<T: AsRef<str>>(mut self, suffix: T) -> Self { |
| self.options.wrap_static_fns_suffix = Some(suffix.as_ref().to_owned()); |
| self |
| } |
| }, |
| as_args: "--wrap-static-fns-suffix", |
| }, |
| /// The path of the file where the wrappers for `static` functions will be emitted. |
| wrap_static_fns_path: Option<PathBuf> { |
| methods: { |
| #[cfg(feature = "experimental")] |
| /// Set the path for the source code file that would be created if any wrapper |
| /// functions must be generated due to the presence of `static` functions. |
| /// |
| /// `bindgen` will automatically add the right extension to the header and source code |
| /// files. |
| /// |
| /// This option only comes into effect if `true` is passed to the |
| /// [`Builder::wrap_static_fns`] method. |
| /// |
| /// The default path is `temp_dir/bindgen/extern`, where `temp_dir` is the path |
| /// returned by [`std::env::temp_dir`] . |
| pub fn wrap_static_fns_path<T: AsRef<Path>>(mut self, path: T) -> Self { |
| self.options.wrap_static_fns_path = Some(path.as_ref().to_owned()); |
| self |
| } |
| }, |
| as_args: "--wrap-static-fns-path", |
| }, |
| /// Default visibility of fields. |
| default_visibility: FieldVisibilityKind { |
| methods: { |
| /// Set the default visibility of fields, including bitfields and accessor methods for |
| /// bitfields. |
| /// |
| /// This option only comes into effect if the [`Builder::respect_cxx_access_specs`] |
| /// option is disabled. |
| pub fn default_visibility( |
| mut self, |
| visibility: FieldVisibilityKind, |
| ) -> Self { |
| self.options.default_visibility = visibility; |
| self |
| } |
| }, |
| as_args: |visibility, args| { |
| if *visibility != Default::default() { |
| args.push("--default-visibility".to_owned()); |
| args.push(visibility.to_string()); |
| } |
| }, |
| }, |
| /// Whether to emit diagnostics or not. |
| emit_diagnostics: bool { |
| methods: { |
| #[cfg(feature = "experimental")] |
| /// Emit diagnostics. |
| /// |
| /// These diagnostics are emitted to `stderr` if you are using `bindgen-cli` or printed |
| /// using `cargo:warning=` if you are using `bindgen` as a `build-dependency`. |
| /// |
| /// Diagnostics are not emitted by default. |
| /// |
| /// The layout and contents of these diagnostic messages are not covered by versioning |
| /// and can change without notice. |
| pub fn emit_diagnostics(mut self) -> Self { |
| self.options.emit_diagnostics = true; |
| self |
| } |
| }, |
| as_args: "--emit-diagnostics", |
| } |
| } |