bindgen/options/mod.rs
1//! Declarations and setter methods for `bindgen` options.
2//!
3//! The main entry point of this module is the `options` macro.
4#[macro_use]
5mod helpers;
6mod as_args;
7#[cfg(feature = "__cli")]
8pub(crate) mod cli;
9
10use crate::callbacks::ParseCallbacks;
11use crate::codegen::{
12 AliasVariation, EnumVariation, MacroTypeVariation, NonCopyUnionStyle,
13};
14use crate::deps::DepfileSpec;
15use crate::features::{RustEdition, RustFeatures, RustTarget};
16use crate::regex_set::RegexSet;
17use crate::Abi;
18use crate::Builder;
19use crate::CodegenConfig;
20use crate::FieldVisibilityKind;
21use crate::Formatter;
22use crate::HashMap;
23use crate::DEFAULT_ANON_FIELDS_PREFIX;
24
25use std::env;
26use std::path::{Path, PathBuf};
27use std::rc::Rc;
28
29use as_args::AsArgs;
30use helpers::ignore;
31
32/// Macro used to generate the [`BindgenOptions`] type and the [`Builder`] setter methods for each
33/// one of the fields of `BindgenOptions`.
34///
35/// The input format of this macro resembles a `struct` pattern. Each field of the `BindgenOptions`
36/// type is declared by adding the name of the field and its type using the `name: type` syntax and
37/// a block of code with the following items:
38///
39/// - `default`: The default value for the field. If this item is omitted, `Default::default()` is
40/// used instead, meaning that the type of the field must implement `Default`.
41/// - `methods`: A block of code containing methods for the `Builder` type. These methods should be
42/// related to the field being declared.
43/// - `as_args`: This item declares how the field should be converted into a valid CLI argument for
44/// `bindgen` and is used in the [`Builder::command_line_flags`] method which is used to do a
45/// roundtrip test of the CLI args in the `bindgen-test` crate. This item can take one of the
46/// following:
47/// - A string literal with the flag if the type of the field implements the [`AsArgs`] trait.
48/// - A closure with the signature `|field, args: &mut Vec<String>| -> ()` that pushes arguments
49/// into the `args` buffer based on the value of the field. This is used if the field does not
50/// implement `AsArgs` or if the implementation of the trait is not logically correct for the
51/// option and a custom behavior must be taken into account.
52/// - The `ignore` literal, which does not emit any CLI arguments for this field. This is useful
53/// if the field cannot be used from the `bindgen` CLI.
54///
55/// As an example, this would be the declaration of a `bool` field called `be_fun` whose default
56/// value is `false` (the `Default` value for `bool`):
57/// ```rust,ignore
58/// be_fun: bool {
59/// methods: {
60/// /// Ask `bindgen` to be fun. This option is disabled by default.
61/// fn be_fun(mut self) -> Self {
62/// self.options.be_fun = true;
63/// self
64/// }
65/// },
66/// as_args: "--be-fun",
67/// }
68/// ```
69///
70/// However, we could also set the `be_fun` field to `true` by default and use a `--not-fun` flag
71/// instead. This means that we have to add the `default` item and use a closure in the `as_args`
72/// item:
73/// ```rust,ignore
74/// be_fun: bool {
75/// default: true,
76/// methods: {
77/// /// Ask `bindgen` to not be fun. `bindgen` is fun by default.
78/// fn not_fun(mut self) -> Self {
79/// self.options.be_fun = false;
80/// self
81/// }
82/// },
83/// as_args: |be_fun, args| (!be_fun).as_args(args, "--not-fun"),
84/// }
85/// ```
86/// More complex examples can be found in the sole invocation of this macro.
87macro_rules! options {
88 ($(
89 $(#[doc = $docs:literal])+
90 $field:ident: $ty:ty {
91 $(default: $default:expr,)?
92 methods: {$($methods_tokens:tt)*}$(,)?
93 as_args: $as_args:expr$(,)?
94 }$(,)?
95 )*) => {
96 #[derive(Debug, Clone)]
97 pub(crate) struct BindgenOptions {
98 $($(#[doc = $docs])* pub(crate) $field: $ty,)*
99 }
100
101 impl Default for BindgenOptions {
102 fn default() -> Self {
103 Self {
104 $($field: default!($($default)*),)*
105 }
106 }
107 }
108
109 impl Builder {
110 /// Generates the command line flags used to create this [`Builder`].
111 pub fn command_line_flags(&self) -> Vec<String> {
112 let mut args = vec![];
113
114 let headers = match self.options.input_headers.split_last() {
115 Some((header, headers)) => {
116 // The last input header is passed as an argument in the first position.
117 args.push(header.clone().into());
118 headers
119 },
120 None => &[]
121 };
122
123 $({
124 let func: fn(&$ty, &mut Vec<String>) = as_args!($as_args);
125 func(&self.options.$field, &mut args);
126 })*
127
128 // Add the `--experimental` flag if `bindgen` is built with the `experimental`
129 // feature.
130 if cfg!(feature = "experimental") {
131 args.push("--experimental".to_owned());
132 }
133
134 // Add all the clang arguments.
135 args.push("--".to_owned());
136
137 if !self.options.clang_args.is_empty() {
138 args.extend(self.options.clang_args.iter().map(|s| s.clone().into()));
139 }
140
141 // We need to pass all but the last header via the `-include` clang argument.
142 for header in headers {
143 args.push("-include".to_owned());
144 args.push(header.clone().into());
145 }
146
147 args
148 }
149
150 $($($methods_tokens)*)*
151 }
152 };
153}
154
155options! {
156 /// Types that have been blocklisted and should not appear anywhere in the generated code.
157 blocklisted_types: RegexSet {
158 methods: {
159 regex_option! {
160 /// Do not generate any bindings for the given type.
161 ///
162 /// This option is not recursive, meaning that it will only block types whose names
163 /// explicitly match the argument of this method.
164 pub fn blocklist_type<T: AsRef<str>>(mut self, arg: T) -> Builder {
165 self.options.blocklisted_types.insert(arg);
166 self
167 }
168 }
169 },
170 as_args: "--blocklist-type",
171 },
172 /// Functions that have been blocklisted and should not appear in the generated code.
173 blocklisted_functions: RegexSet {
174 methods: {
175 regex_option! {
176 /// Do not generate any bindings for the given function.
177 ///
178 /// This option is not recursive, meaning that it will only block functions whose
179 /// names explicitly match the argument of this method.
180 pub fn blocklist_function<T: AsRef<str>>(mut self, arg: T) -> Builder {
181 self.options.blocklisted_functions.insert(arg);
182 self
183 }
184 }
185 },
186 as_args: "--blocklist-function",
187 },
188 /// Items that have been blocklisted and should not appear in the generated code.
189 blocklisted_items: RegexSet {
190 methods: {
191 regex_option! {
192 /// Do not generate any bindings for the given item, regardless of whether it is a
193 /// type, function, module, etc.
194 ///
195 /// This option is not recursive, meaning that it will only block items whose names
196 /// explicitly match the argument of this method.
197 pub fn blocklist_item<T: AsRef<str>>(mut self, arg: T) -> Builder {
198 self.options.blocklisted_items.insert(arg);
199 self
200 }
201 }
202 },
203 as_args: "--blocklist-item",
204 },
205 /// Files whose contents should be blocklisted and should not appear in the generated code.
206 blocklisted_files: RegexSet {
207 methods: {
208 regex_option! {
209 /// Do not generate any bindings for the contents of the given file, regardless of
210 /// whether the contents of the file are types, functions, modules, etc.
211 ///
212 /// This option is not recursive, meaning that it will only block files whose names
213 /// explicitly match the argument of this method.
214 ///
215 /// This method will use the argument to match the complete path of the file
216 /// instead of a section of it.
217 pub fn blocklist_file<T: AsRef<str>>(mut self, arg: T) -> Builder {
218 self.options.blocklisted_files.insert(arg);
219 self
220 }
221 }
222 },
223 as_args: "--blocklist-file",
224 },
225 /// Variables that have been blocklisted and should not appear in the generated code.
226 blocklisted_vars: RegexSet {
227 methods: {
228 regex_option! {
229 /// Do not generate any bindings for the given variable.
230 ///
231 /// This option is not recursive, meaning that it will only block variables whose
232 /// names explicitly match the argument of this method.
233 pub fn blocklist_var<T: AsRef<str>>(mut self, arg: T) -> Builder {
234 self.options.blocklisted_vars.insert(arg);
235 self
236 }
237 }
238 },
239 as_args: "--blocklist-var",
240 },
241 /// Types that should be treated as opaque structures in the generated code.
242 opaque_types: RegexSet {
243 methods: {
244 regex_option! {
245 /// Treat the given type as opaque in the generated bindings.
246 ///
247 /// Opaque in this context means that none of the generated bindings will contain
248 /// information about the inner representation of the type and the type itself will
249 /// be represented as a chunk of bytes with the alignment and size of the type.
250 pub fn opaque_type<T: AsRef<str>>(mut self, arg: T) -> Builder {
251 self.options.opaque_types.insert(arg);
252 self
253 }
254 }
255 },
256 as_args: "--opaque-type",
257 },
258 /// The explicit `rustfmt` path.
259 rustfmt_path: Option<PathBuf> {
260 methods: {
261 /// Set an explicit path to the `rustfmt` binary.
262 ///
263 /// This option only comes into effect if `rustfmt` is set to be the formatter used by
264 /// `bindgen`. Check the documentation of the [`Builder::formatter`] method for more
265 /// information.
266 pub fn with_rustfmt<P: Into<PathBuf>>(mut self, path: P) -> Self {
267 self.options.rustfmt_path = Some(path.into());
268 self
269 }
270 },
271 // This option cannot be set from the CLI.
272 as_args: ignore,
273 },
274 /// The path to which we should write a Makefile-syntax depfile (if any).
275 depfile: Option<DepfileSpec> {
276 methods: {
277 /// Add a depfile output which will be written alongside the generated bindings.
278 pub fn depfile<H: Into<String>, D: Into<PathBuf>>(
279 mut self,
280 output_module: H,
281 depfile: D,
282 ) -> Builder {
283 self.options.depfile = Some(DepfileSpec {
284 output_module: output_module.into(),
285 depfile_path: depfile.into(),
286 });
287 self
288 }
289 },
290 as_args: |depfile, args| {
291 if let Some(depfile) = depfile {
292 args.push("--depfile".into());
293 args.push(depfile.depfile_path.display().to_string());
294 }
295 },
296 },
297 /// Types that have been allowlisted and should appear in the generated code.
298 allowlisted_types: RegexSet {
299 methods: {
300 regex_option! {
301 /// Generate bindings for the given type.
302 ///
303 /// This option is transitive by default. Check the documentation of the
304 /// [`Builder::allowlist_recursively`] method for further information.
305 pub fn allowlist_type<T: AsRef<str>>(mut self, arg: T) -> Builder {
306 self.options.allowlisted_types.insert(arg);
307 self
308 }
309 }
310 },
311 as_args: "--allowlist-type",
312 },
313 /// Functions that have been allowlisted and should appear in the generated code.
314 allowlisted_functions: RegexSet {
315 methods: {
316 regex_option! {
317 /// Generate bindings for the given function.
318 ///
319 /// This option is transitive by default. Check the documentation of the
320 /// [`Builder::allowlist_recursively`] method for further information.
321 pub fn allowlist_function<T: AsRef<str>>(mut self, arg: T) -> Builder {
322 self.options.allowlisted_functions.insert(arg);
323 self
324 }
325 }
326 },
327 as_args: "--allowlist-function",
328 },
329 /// Variables that have been allowlisted and should appear in the generated code.
330 allowlisted_vars: RegexSet {
331 methods: {
332 regex_option! {
333 /// Generate bindings for the given variable.
334 ///
335 /// This option is transitive by default. Check the documentation of the
336 /// [`Builder::allowlist_recursively`] method for further information.
337 pub fn allowlist_var<T: AsRef<str>>(mut self, arg: T) -> Builder {
338 self.options.allowlisted_vars.insert(arg);
339 self
340 }
341 }
342 },
343 as_args: "--allowlist-var",
344 },
345 /// Files whose contents have been allowlisted and should appear in the generated code.
346 allowlisted_files: RegexSet {
347 methods: {
348 regex_option! {
349 /// Generate bindings for the content of the given file.
350 ///
351 /// This option is transitive by default. Check the documentation of the
352 /// [`Builder::allowlist_recursively`] method for further information.
353 ///
354 /// This method will use the argument to match the complete path of the file
355 /// instead of a section of it.
356 pub fn allowlist_file<T: AsRef<str>>(mut self, arg: T) -> Builder {
357 self.options.allowlisted_files.insert(arg);
358 self
359 }
360 }
361 },
362 as_args: "--allowlist-file",
363 },
364 /// Items that have been allowlisted and should appear in the generated code.
365 allowlisted_items: RegexSet {
366 methods: {
367 regex_option! {
368 /// Generate bindings for the given item, regardless of whether it is a type,
369 /// function, module, etc.
370 ///
371 /// This option is transitive by default. Check the documentation of the
372 /// [`Builder::allowlist_recursively`] method for further information.
373 pub fn allowlist_item<T: AsRef<str>>(mut self, arg: T) -> Builder {
374 self.options.allowlisted_items.insert(arg);
375 self
376 }
377 }
378 },
379 as_args: "--allowlist-item",
380 },
381 /// The default style of for generated `enum`s.
382 default_enum_style: EnumVariation {
383 methods: {
384 /// Set the default style for generated `enum`s.
385 ///
386 /// If this method is not called, the [`EnumVariation::Consts`] style will be used by
387 /// default.
388 ///
389 /// To set the style for individual `enum`s, use [`Builder::bitfield_enum`],
390 /// [`Builder::newtype_enum`], [`Builder::newtype_global_enum`],
391 /// [`Builder::rustified_enum`], [`Builder::rustified_non_exhaustive_enum`],
392 /// [`Builder::constified_enum_module`] or [`Builder::constified_enum`].
393 pub fn default_enum_style(
394 mut self,
395 arg: EnumVariation,
396 ) -> Builder {
397 self.options.default_enum_style = arg;
398 self
399 }
400 },
401 as_args: |variation, args| {
402 if *variation != Default::default() {
403 args.push("--default-enum-style".to_owned());
404 args.push(variation.to_string());
405 }
406 },
407 },
408 /// `enum`s marked as bitfield-like. This is, newtypes with bitwise operations.
409 bitfield_enums: RegexSet {
410 methods: {
411 regex_option! {
412 /// Mark the given `enum` as being bitfield-like.
413 ///
414 /// This is similar to the [`Builder::newtype_enum`] style, but with the bitwise
415 /// operators implemented.
416 pub fn bitfield_enum<T: AsRef<str>>(mut self, arg: T) -> Builder {
417 self.options.bitfield_enums.insert(arg);
418 self
419 }
420 }
421 },
422 as_args: "--bitfield-enum",
423 },
424 /// `enum`s marked as newtypes.
425 newtype_enums: RegexSet {
426 methods: {
427 regex_option! {
428 /// Mark the given `enum` as a newtype.
429 ///
430 /// This means that an integer newtype will be declared to represent the `enum`
431 /// type and its variants will be represented as constants inside of this type's
432 /// `impl` block.
433 pub fn newtype_enum<T: AsRef<str>>(mut self, arg: T) -> Builder {
434 self.options.newtype_enums.insert(arg);
435 self
436 }
437 }
438 },
439 as_args: "--newtype-enum",
440 },
441 /// `enum`s marked as global newtypes .
442 newtype_global_enums: RegexSet {
443 methods: {
444 regex_option! {
445 /// Mark the given `enum` as a global newtype.
446 ///
447 /// This is similar to the [`Builder::newtype_enum`] style, but the constants for
448 /// each variant are free constants instead of being declared inside an `impl`
449 /// block for the newtype.
450 pub fn newtype_global_enum<T: AsRef<str>>(mut self, arg: T) -> Builder {
451 self.options.newtype_global_enums.insert(arg);
452 self
453 }
454 }
455 },
456 as_args: "--newtype-global-enum",
457 },
458 /// `enum`s marked as Rust `enum`s.
459 rustified_enums: RegexSet {
460 methods: {
461 regex_option! {
462 /// Mark the given `enum` as a Rust `enum`.
463 ///
464 /// This means that each variant of the `enum` will be represented as a Rust `enum`
465 /// variant.
466 ///
467 /// **Use this with caution**, creating an instance of a Rust `enum` with an
468 /// invalid value will cause undefined behaviour. To avoid this, use the
469 /// [`Builder::newtype_enum`] style instead.
470 pub fn rustified_enum<T: AsRef<str>>(mut self, arg: T) -> Builder {
471 self.options.rustified_enums.insert(arg);
472 self
473 }
474 }
475 },
476 as_args: "--rustified-enum",
477 },
478 /// `enum`s marked as non-exhaustive Rust `enum`s.
479 rustified_non_exhaustive_enums: RegexSet {
480 methods: {
481 regex_option! {
482 /// Mark the given `enum` as a non-exhaustive Rust `enum`.
483 ///
484 /// This is similar to the [`Builder::rustified_enum`] style, but the `enum` is
485 /// tagged with the `#[non_exhaustive]` attribute.
486 pub fn rustified_non_exhaustive_enum<T: AsRef<str>>(mut self, arg: T) -> Builder {
487 self.options.rustified_non_exhaustive_enums.insert(arg);
488 self
489 }
490 }
491 },
492 as_args: "--rustified-non-exhaustive-enums",
493 },
494 /// `enum`s marked as modules of constants.
495 constified_enum_modules: RegexSet {
496 methods: {
497 regex_option! {
498 /// Mark the given `enum` as a module with a set of integer constants.
499 pub fn constified_enum_module<T: AsRef<str>>(mut self, arg: T) -> Builder {
500 self.options.constified_enum_modules.insert(arg);
501 self
502 }
503 }
504 },
505 as_args: "--constified-enum-module",
506 },
507 /// `enum`s marked as a set of constants.
508 constified_enums: RegexSet {
509 methods: {
510 regex_option! {
511 /// Mark the given `enum` as a set of integer constants.
512 ///
513 /// This is similar to the [`Builder::constified_enum_module`] style, but the
514 /// constants are generated in the current module instead of in a new module.
515 pub fn constified_enum<T: AsRef<str>>(mut self, arg: T) -> Builder {
516 self.options.constified_enums.insert(arg);
517 self
518 }
519 }
520 },
521 as_args: "--constified-enum",
522 },
523 /// The default type signedness for C macro constants.
524 default_macro_constant_type: MacroTypeVariation {
525 methods: {
526 /// Set the default type signedness to be used for macro constants.
527 ///
528 /// If this method is not called, [`MacroTypeVariation::Unsigned`] is used by default.
529 ///
530 /// To set the type for individual macro constants, use the
531 /// [`ParseCallbacks::int_macro`] method.
532 pub fn default_macro_constant_type(mut self, arg: MacroTypeVariation) -> Builder {
533 self.options.default_macro_constant_type = arg;
534 self
535 }
536
537 },
538 as_args: |variation, args| {
539 if *variation != Default::default() {
540 args.push("--default-macro-constant-type".to_owned());
541 args.push(variation.to_string());
542 }
543 },
544 },
545 /// The default style of code generation for `typedef`s.
546 default_alias_style: AliasVariation {
547 methods: {
548 /// Set the default style of code generation for `typedef`s.
549 ///
550 /// If this method is not called, the [`AliasVariation::TypeAlias`] style is used by
551 /// default.
552 ///
553 /// To set the style for individual `typedefs`s, use [`Builder::type_alias`],
554 /// [`Builder::new_type_alias`] or [`Builder::new_type_alias_deref`].
555 pub fn default_alias_style(
556 mut self,
557 arg: AliasVariation,
558 ) -> Builder {
559 self.options.default_alias_style = arg;
560 self
561 }
562 },
563 as_args: |variation, args| {
564 if *variation != Default::default() {
565 args.push("--default-alias-style".to_owned());
566 args.push(variation.to_string());
567 }
568 },
569 },
570 /// `typedef` patterns that will use regular type aliasing.
571 type_alias: RegexSet {
572 methods: {
573 regex_option! {
574 /// Mark the given `typedef` as a regular Rust `type` alias.
575 ///
576 /// This is the default behavior, meaning that this method only comes into effect
577 /// if a style different from [`AliasVariation::TypeAlias`] was passed to the
578 /// [`Builder::default_alias_style`] method.
579 pub fn type_alias<T: AsRef<str>>(mut self, arg: T) -> Builder {
580 self.options.type_alias.insert(arg);
581 self
582 }
583 }
584 },
585 as_args: "--type-alias",
586 },
587 /// `typedef` patterns that will be aliased by creating a newtype.
588 new_type_alias: RegexSet {
589 methods: {
590 regex_option! {
591 /// Mark the given `typedef` as a Rust newtype by having the aliased
592 /// type be wrapped in a `struct` with `#[repr(transparent)]`.
593 ///
594 /// This method can be used to enforce stricter type checking.
595 pub fn new_type_alias<T: AsRef<str>>(mut self, arg: T) -> Builder {
596 self.options.new_type_alias.insert(arg);
597 self
598 }
599 }
600 },
601 as_args: "--new-type-alias",
602 },
603 /// `typedef` patterns that will be wrapped in a newtype implementing `Deref` and `DerefMut`.
604 new_type_alias_deref: RegexSet {
605 methods: {
606 regex_option! {
607 /// Mark the given `typedef` to be generated as a newtype that can be dereferenced.
608 ///
609 /// This is similar to the [`Builder::new_type_alias`] style, but the newtype
610 /// implements `Deref` and `DerefMut` with the aliased type as a target.
611 pub fn new_type_alias_deref<T: AsRef<str>>(mut self, arg: T) -> Builder {
612 self.options.new_type_alias_deref.insert(arg);
613 self
614 }
615 }
616 },
617 as_args: "--new-type-alias-deref",
618 },
619 /// The default style of code to generate for `union`s containing non-`Copy` members.
620 default_non_copy_union_style: NonCopyUnionStyle {
621 methods: {
622 /// Set the default style of code to generate for `union`s with non-`Copy` members.
623 ///
624 /// If this method is not called, the [`NonCopyUnionStyle::BindgenWrapper`] style is
625 /// used by default.
626 ///
627 /// To set the style for individual `union`s, use [`Builder::bindgen_wrapper_union`] or
628 /// [`Builder::manually_drop_union`].
629 pub fn default_non_copy_union_style(mut self, arg: NonCopyUnionStyle) -> Self {
630 self.options.default_non_copy_union_style = arg;
631 self
632 }
633 },
634 as_args: |style, args| {
635 if *style != Default::default() {
636 args.push("--default-non-copy-union-style".to_owned());
637 args.push(style.to_string());
638 }
639 },
640 },
641 /// The patterns marking non-`Copy` `union`s as using the `bindgen` generated wrapper.
642 bindgen_wrapper_union: RegexSet {
643 methods: {
644 regex_option! {
645 /// Mark the given `union` to use a `bindgen`-generated wrapper for its members if at
646 /// least one them is not `Copy`.
647 ///
648 /// This is the default behavior, meaning that this method only comes into effect
649 /// if a style different from [`NonCopyUnionStyle::BindgenWrapper`] was passed to
650 /// the [`Builder::default_non_copy_union_style`] method.
651 pub fn bindgen_wrapper_union<T: AsRef<str>>(mut self, arg: T) -> Self {
652 self.options.bindgen_wrapper_union.insert(arg);
653 self
654 }
655 }
656 },
657 as_args: "--bindgen-wrapper-union",
658 },
659 /// The patterns marking non-`Copy` `union`s as using the `ManuallyDrop` wrapper.
660 manually_drop_union: RegexSet {
661 methods: {
662 regex_option! {
663 /// Mark the given `union` to use [`::core::mem::ManuallyDrop`] for its members if
664 /// at least one of them is not `Copy`.
665 ///
666 /// The `ManuallyDrop` type was stabilized in Rust 1.20.0, do not use this option
667 /// if your target version is lower than this.
668 pub fn manually_drop_union<T: AsRef<str>>(mut self, arg: T) -> Self {
669 self.options.manually_drop_union.insert(arg);
670 self
671 }
672 }
673
674 },
675 as_args: "--manually-drop-union",
676 },
677
678
679 /// Whether we should generate built-in definitions.
680 builtins: bool {
681 methods: {
682 /// Generate Rust bindings for built-in definitions (for example `__builtin_va_list`).
683 ///
684 /// Bindings for built-in definitions are not emitted by default.
685 pub fn emit_builtins(mut self) -> Builder {
686 self.options.builtins = true;
687 self
688 }
689 },
690 as_args: "--builtins",
691 },
692 /// Whether we should dump the Clang AST for debugging purposes.
693 emit_ast: bool {
694 methods: {
695 /// Emit the Clang AST to `stdout` for debugging purposes.
696 ///
697 /// The Clang AST is not emitted by default.
698 pub fn emit_clang_ast(mut self) -> Builder {
699 self.options.emit_ast = true;
700 self
701 }
702 },
703 as_args: "--emit-clang-ast",
704 },
705 /// Whether we should dump our IR for debugging purposes.
706 emit_ir: bool {
707 methods: {
708 /// Emit the `bindgen` internal representation to `stdout` for debugging purposes.
709 ///
710 /// This internal representation is not emitted by default.
711 pub fn emit_ir(mut self) -> Builder {
712 self.options.emit_ir = true;
713 self
714 }
715 },
716 as_args: "--emit-ir",
717 },
718 /// Output path for the `graphviz` DOT file.
719 emit_ir_graphviz: Option<String> {
720 methods: {
721 /// Set the path for the file where the`bindgen` internal representation will be
722 /// emitted as a graph using the `graphviz` DOT language.
723 ///
724 /// This graph representation is not emitted by default.
725 pub fn emit_ir_graphviz<T: Into<String>>(mut self, path: T) -> Builder {
726 let path = path.into();
727 self.options.emit_ir_graphviz = Some(path);
728 self
729 }
730 },
731 as_args: "--emit-ir-graphviz",
732 },
733
734 /// Whether we should emulate C++ namespaces with Rust modules.
735 enable_cxx_namespaces: bool {
736 methods: {
737 /// Emulate C++ namespaces using Rust modules in the generated bindings.
738 ///
739 /// C++ namespaces are not emulated by default.
740 pub fn enable_cxx_namespaces(mut self) -> Builder {
741 self.options.enable_cxx_namespaces = true;
742 self
743 }
744 },
745 as_args: "--enable-cxx-namespaces",
746 },
747 /// Whether we should try to find unexposed attributes in functions.
748 enable_function_attribute_detection: bool {
749 methods: {
750 /// Enable detecting function attributes on C functions.
751 ///
752 /// This enables the following features:
753 /// - Add `#[must_use]` attributes to Rust items whose C counterparts are marked as so.
754 /// This feature also requires that the Rust target version supports the attribute.
755 /// - Set `!` as the return type for Rust functions whose C counterparts are marked as
756 /// diverging.
757 ///
758 /// This option can be quite slow in some cases (check [#1465]), so it is disabled by
759 /// default.
760 ///
761 /// [#1465]: https://github.com/rust-lang/rust-bindgen/issues/1465
762 pub fn enable_function_attribute_detection(mut self) -> Self {
763 self.options.enable_function_attribute_detection = true;
764 self
765 }
766
767 },
768 as_args: "--enable-function-attribute-detection",
769 },
770 /// Whether we should avoid mangling names with namespaces.
771 disable_name_namespacing: bool {
772 methods: {
773 /// Disable name auto-namespacing.
774 ///
775 /// By default, `bindgen` mangles names like `foo::bar::Baz` to look like `foo_bar_Baz`
776 /// instead of just `Baz`. This method disables that behavior.
777 ///
778 /// Note that this does not change the names used for allowlisting and blocklisting,
779 /// which should still be mangled with the namespaces. Additionally, this option may
780 /// cause `bindgen` to generate duplicate names.
781 pub fn disable_name_namespacing(mut self) -> Builder {
782 self.options.disable_name_namespacing = true;
783 self
784 }
785 },
786 as_args: "--disable-name-namespacing",
787 },
788 /// Whether we should avoid generating nested `struct` names.
789 disable_nested_struct_naming: bool {
790 methods: {
791 /// Disable nested `struct` naming.
792 ///
793 /// The following `struct`s have different names for C and C++. In C, they are visible
794 /// as `foo` and `bar`. In C++, they are visible as `foo` and `foo::bar`.
795 ///
796 /// ```c
797 /// struct foo {
798 /// struct bar {
799 /// } b;
800 /// };
801 /// ```
802 ///
803 /// `bindgen` tries to avoid duplicate names by default, so it follows the C++ naming
804 /// convention and it generates `foo` and `foo_bar` instead of just `foo` and `bar`.
805 ///
806 /// This method disables this behavior and it is indented to be used only for headers
807 /// that were written in C.
808 pub fn disable_nested_struct_naming(mut self) -> Builder {
809 self.options.disable_nested_struct_naming = true;
810 self
811 }
812 },
813 as_args: "--disable-nested-struct-naming",
814 },
815 /// Whether we should avoid embedding version identifiers into source code.
816 disable_header_comment: bool {
817 methods: {
818 /// Do not insert the `bindgen` version identifier into the generated bindings.
819 ///
820 /// This identifier is inserted by default.
821 pub fn disable_header_comment(mut self) -> Self {
822 self.options.disable_header_comment = true;
823 self
824 }
825
826 },
827 as_args: "--disable-header-comment",
828 },
829 /// Whether we should generate layout tests for generated `struct`s.
830 layout_tests: bool {
831 default: true,
832 methods: {
833 /// Set whether layout tests should be generated.
834 ///
835 /// Layout tests are generated by default.
836 pub fn layout_tests(mut self, doit: bool) -> Self {
837 self.options.layout_tests = doit;
838 self
839 }
840 },
841 as_args: |value, args| (!value).as_args(args, "--no-layout-tests"),
842 },
843 /// Whether we should implement `Debug` for types that cannot derive it.
844 impl_debug: bool {
845 methods: {
846 /// Set whether `Debug` should be implemented for types that cannot derive it.
847 ///
848 /// This option is disabled by default.
849 pub fn impl_debug(mut self, doit: bool) -> Self {
850 self.options.impl_debug = doit;
851 self
852 }
853
854 },
855 as_args: "--impl-debug",
856 },
857 /// Whether we should implement `PartialEq` types that cannot derive it.
858 impl_partialeq: bool {
859 methods: {
860 /// Set whether `PartialEq` should be implemented for types that cannot derive it.
861 ///
862 /// This option is disabled by default.
863 pub fn impl_partialeq(mut self, doit: bool) -> Self {
864 self.options.impl_partialeq = doit;
865 self
866 }
867 },
868 as_args: "--impl-partialeq",
869 },
870 /// Whether we should derive `Copy` when possible.
871 derive_copy: bool {
872 default: true,
873 methods: {
874 /// Set whether the `Copy` trait should be derived when possible.
875 ///
876 /// `Copy` is derived by default.
877 pub fn derive_copy(mut self, doit: bool) -> Self {
878 self.options.derive_copy = doit;
879 self
880 }
881 },
882 as_args: |value, args| (!value).as_args(args, "--no-derive-copy"),
883 },
884
885 /// Whether we should derive `Debug` when possible.
886 derive_debug: bool {
887 default: true,
888 methods: {
889 /// Set whether the `Debug` trait should be derived when possible.
890 ///
891 /// The [`Builder::impl_debug`] method can be used to implement `Debug` for types that
892 /// cannot derive it.
893 ///
894 /// `Debug` is derived by default.
895 pub fn derive_debug(mut self, doit: bool) -> Self {
896 self.options.derive_debug = doit;
897 self
898 }
899 },
900 as_args: |value, args| (!value).as_args(args, "--no-derive-debug"),
901 },
902
903 /// Whether we should derive `Default` when possible.
904 derive_default: bool {
905 methods: {
906 /// Set whether the `Default` trait should be derived when possible.
907 ///
908 /// `Default` is not derived by default.
909 pub fn derive_default(mut self, doit: bool) -> Self {
910 self.options.derive_default = doit;
911 self
912 }
913 },
914 as_args: |&value, args| {
915 let arg = if value {
916 "--with-derive-default"
917 } else {
918 "--no-derive-default"
919 };
920
921 args.push(arg.to_owned());
922 },
923 },
924 /// Whether we should derive `Hash` when possible.
925 derive_hash: bool {
926 methods: {
927 /// Set whether the `Hash` trait should be derived when possible.
928 ///
929 /// `Hash` is not derived by default.
930 pub fn derive_hash(mut self, doit: bool) -> Self {
931 self.options.derive_hash = doit;
932 self
933 }
934 },
935 as_args: "--with-derive-hash",
936 },
937 /// Whether we should derive `PartialOrd` when possible.
938 derive_partialord: bool {
939 methods: {
940 /// Set whether the `PartialOrd` trait should be derived when possible.
941 ///
942 /// Take into account that `Ord` cannot be derived for a type that does not implement
943 /// `PartialOrd`. For this reason, setting this method to `false` also sets
944 /// automatically [`Builder::derive_ord`] to `false`.
945 ///
946 /// `PartialOrd` is not derived by default.
947 pub fn derive_partialord(mut self, doit: bool) -> Self {
948 self.options.derive_partialord = doit;
949 if !doit {
950 self.options.derive_ord = false;
951 }
952 self
953 }
954 },
955 as_args: "--with-derive-partialord",
956 },
957 /// Whether we should derive `Ord` when possible.
958 derive_ord: bool {
959 methods: {
960 /// Set whether the `Ord` trait should be derived when possible.
961 ///
962 /// Take into account that `Ord` cannot be derived for a type that does not implement
963 /// `PartialOrd`. For this reason, the value set with this method will also be set
964 /// automatically for [`Builder::derive_partialord`].
965 ///
966 /// `Ord` is not derived by default.
967 pub fn derive_ord(mut self, doit: bool) -> Self {
968 self.options.derive_ord = doit;
969 self.options.derive_partialord = doit;
970 self
971 }
972 },
973 as_args: "--with-derive-ord",
974 },
975 /// Whether we should derive `PartialEq` when possible.
976 derive_partialeq: bool {
977 methods: {
978 /// Set whether the `PartialEq` trait should be derived when possible.
979 ///
980 /// Take into account that `Eq` cannot be derived for a type that does not implement
981 /// `PartialEq`. For this reason, setting this method to `false` also sets
982 /// automatically [`Builder::derive_eq`] to `false`.
983 ///
984 /// The [`Builder::impl_partialeq`] method can be used to implement `PartialEq` for
985 /// types that cannot derive it.
986 ///
987 /// `PartialEq` is not derived by default.
988 pub fn derive_partialeq(mut self, doit: bool) -> Self {
989 self.options.derive_partialeq = doit;
990 if !doit {
991 self.options.derive_eq = false;
992 }
993 self
994 }
995 },
996 as_args: "--with-derive-partialeq",
997 },
998 /// Whether we should derive `Eq` when possible.
999 derive_eq: bool {
1000 methods: {
1001 /// Set whether the `Eq` trait should be derived when possible.
1002 ///
1003 /// Take into account that `Eq` cannot be derived for a type that does not implement
1004 /// `PartialEq`. For this reason, the value set with this method will also be set
1005 /// automatically for [`Builder::derive_partialeq`].
1006 ///
1007 /// `Eq` is not derived by default.
1008 pub fn derive_eq(mut self, doit: bool) -> Self {
1009 self.options.derive_eq = doit;
1010 if doit {
1011 self.options.derive_partialeq = doit;
1012 }
1013 self
1014 }
1015 },
1016 as_args: "--with-derive-eq",
1017 },
1018 /// Whether we should use `core` instead of `std`.
1019 ///
1020 /// If this option is enabled and the Rust target version is greater than 1.64, the prefix for
1021 /// C platform-specific types will be `::core::ffi` instead of `::core::os::raw`.
1022 use_core: bool {
1023 methods: {
1024 /// Use `core` instead of `std` in the generated bindings.
1025 ///
1026 /// `std` is used by default.
1027 pub fn use_core(mut self) -> Builder {
1028 self.options.use_core = true;
1029 self
1030 }
1031
1032 },
1033 as_args: "--use-core",
1034 },
1035 /// An optional prefix for the C platform-specific types.
1036 ctypes_prefix: Option<String> {
1037 methods: {
1038 /// Use the given prefix for the C platform-specific types instead of `::std::os::raw`.
1039 ///
1040 /// Alternatively, the [`Builder::use_core`] method can be used to set the prefix to
1041 /// `::core::ffi` or `::core::os::raw`.
1042 pub fn ctypes_prefix<T: Into<String>>(mut self, prefix: T) -> Builder {
1043 self.options.ctypes_prefix = Some(prefix.into());
1044 self
1045 }
1046 },
1047 as_args: "--ctypes-prefix",
1048 },
1049 /// The prefix for anonymous fields.
1050 anon_fields_prefix: String {
1051 default: DEFAULT_ANON_FIELDS_PREFIX.into(),
1052 methods: {
1053 /// Use the given prefix for the anonymous fields.
1054 ///
1055 /// An anonymous field, is a field of a C/C++ type that does not have a name. For
1056 /// example, in the following C code:
1057 /// ```c
1058 /// struct integer {
1059 /// struct {
1060 /// int inner;
1061 /// };
1062 /// }
1063 /// ```
1064 ///
1065 /// The only field of the `integer` `struct` is an anonymous field and its Rust
1066 /// representation will be named using this prefix followed by an integer identifier.
1067 ///
1068 /// The default prefix is `__bindgen_anon_`.
1069 pub fn anon_fields_prefix<T: Into<String>>(mut self, prefix: T) -> Builder {
1070 self.options.anon_fields_prefix = prefix.into();
1071 self
1072 }
1073 },
1074 as_args: |prefix, args| {
1075 if prefix != DEFAULT_ANON_FIELDS_PREFIX {
1076 args.push("--anon-fields-prefix".to_owned());
1077 args.push(prefix.clone());
1078 }
1079 },
1080 },
1081 /// Whether to measure the time for each one of the `bindgen` phases.
1082 time_phases: bool {
1083 methods: {
1084 /// Set whether to measure the elapsed time for each one of the `bindgen` phases. This
1085 /// information is printed to `stderr`.
1086 ///
1087 /// The elapsed time is not measured by default.
1088 pub fn time_phases(mut self, doit: bool) -> Self {
1089 self.options.time_phases = doit;
1090 self
1091 }
1092 },
1093 as_args: "--time-phases",
1094 },
1095 /// Whether to convert C float types to `f32` and `f64`.
1096 convert_floats: bool {
1097 default: true,
1098 methods: {
1099 /// Avoid converting C float types to `f32` and `f64`.
1100 pub fn no_convert_floats(mut self) -> Self {
1101 self.options.convert_floats = false;
1102 self
1103 }
1104 },
1105 as_args: |value, args| (!value).as_args(args, "--no-convert-floats"),
1106 },
1107 /// The set of raw lines to be prepended to the top-level module of the generated Rust code.
1108 raw_lines: Vec<Box<str>> {
1109 methods: {
1110 /// Add a line of Rust code at the beginning of the generated bindings. The string is
1111 /// passed through without any modification.
1112 pub fn raw_line<T: Into<String>>(mut self, arg: T) -> Self {
1113 self.options.raw_lines.push(arg.into().into_boxed_str());
1114 self
1115 }
1116 },
1117 as_args: |raw_lines, args| {
1118 for line in raw_lines {
1119 args.push("--raw-line".to_owned());
1120 args.push(line.clone().into());
1121 }
1122 },
1123 },
1124 /// The set of raw lines to prepend to different modules.
1125 module_lines: HashMap<Box<str>, Vec<Box<str>>> {
1126 methods: {
1127 /// Add a given line to the beginning of a given module.
1128 ///
1129 /// This option only comes into effect if the [`Builder::enable_cxx_namespaces`] method
1130 /// is also being called.
1131 pub fn module_raw_line<T, U>(mut self, module: T, line: U) -> Self
1132 where
1133 T: Into<String>,
1134 U: Into<String>,
1135 {
1136 self.options
1137 .module_lines
1138 .entry(module.into().into_boxed_str())
1139 .or_default()
1140 .push(line.into().into_boxed_str());
1141 self
1142 }
1143 },
1144 as_args: |module_lines, args| {
1145 for (module, lines) in module_lines {
1146 for line in lines {
1147 args.push("--module-raw-line".to_owned());
1148 args.push(module.clone().into());
1149 args.push(line.clone().into());
1150 }
1151 }
1152 },
1153 },
1154 /// The input header files.
1155 input_headers: Vec<Box<str>> {
1156 methods: {
1157 /// Add an input C/C++ header to generate bindings for.
1158 ///
1159 /// This can be used to generate bindings for a single header:
1160 ///
1161 /// ```ignore
1162 /// let bindings = bindgen::Builder::default()
1163 /// .header("input.h")
1164 /// .generate()
1165 /// .unwrap();
1166 /// ```
1167 ///
1168 /// Or for multiple headers:
1169 ///
1170 /// ```ignore
1171 /// let bindings = bindgen::Builder::default()
1172 /// .header("first.h")
1173 /// .header("second.h")
1174 /// .header("third.h")
1175 /// .generate()
1176 /// .unwrap();
1177 /// ```
1178 pub fn header<T: Into<String>>(mut self, header: T) -> Builder {
1179 self.options.input_headers.push(header.into().into_boxed_str());
1180 self
1181 }
1182
1183 /// Add input C/C++ header(s) to generate bindings for.
1184 ///
1185 /// This can be used to generate bindings for a single header:
1186 ///
1187 /// ```ignore
1188 /// let bindings = bindgen::Builder::default()
1189 /// .headers(["input.h"])
1190 /// .generate()
1191 /// .unwrap();
1192 /// ```
1193 ///
1194 /// Or for multiple headers:
1195 ///
1196 /// ```ignore
1197 /// let bindings = bindgen::Builder::default()
1198 /// .headers(["first.h", "second.h", "third.h"])
1199 /// .generate()
1200 /// .unwrap();
1201 /// ```
1202 pub fn headers<I: IntoIterator>(mut self, headers: I) -> Builder
1203 where
1204 I::Item: Into<String>,
1205 {
1206 self.options
1207 .input_headers
1208 .extend(headers.into_iter().map(Into::into).map(Into::into));
1209 self
1210 }
1211 },
1212 // This field is handled specially inside the macro.
1213 as_args: ignore,
1214 },
1215 /// The set of arguments to be passed straight through to Clang.
1216 clang_args: Vec<Box<str>> {
1217 methods: {
1218 /// Add an argument to be passed straight through to Clang.
1219 pub fn clang_arg<T: Into<String>>(self, arg: T) -> Builder {
1220 self.clang_args([arg.into().into_boxed_str()])
1221 }
1222
1223 /// Add several arguments to be passed straight through to Clang.
1224 pub fn clang_args<I: IntoIterator>(mut self, args: I) -> Builder
1225 where
1226 I::Item: AsRef<str>,
1227 {
1228 for arg in args {
1229 self.options.clang_args.push(arg.as_ref().to_owned().into_boxed_str());
1230 }
1231 self
1232 }
1233 },
1234 // This field is handled specially inside the macro.
1235 as_args: ignore,
1236 },
1237 /// Tuples of unsaved file contents of the form (name, contents).
1238 input_header_contents: Vec<(Box<str>, Box<str>)> {
1239 methods: {
1240 /// Add `contents` as an input C/C++ header named `name`.
1241 ///
1242 /// This can be used to inject additional C/C++ code as an input without having to
1243 /// create additional header files.
1244 pub fn header_contents(mut self, name: &str, contents: &str) -> Builder {
1245 // Apparently clang relies on having virtual FS correspondent to
1246 // the real one, so we need absolute paths here
1247 let absolute_path = env::current_dir()
1248 .expect("Cannot retrieve current directory")
1249 .join(name)
1250 .to_str()
1251 .expect("Cannot convert current directory name to string")
1252 .into();
1253 self.options
1254 .input_header_contents
1255 .push((absolute_path, contents.into()));
1256 self
1257 }
1258 },
1259 // Header contents cannot be added from the CLI.
1260 as_args: ignore,
1261 },
1262 /// A user-provided visitor to allow customizing different kinds of situations.
1263 parse_callbacks: Vec<Rc<dyn ParseCallbacks>> {
1264 methods: {
1265 /// Add a new [`ParseCallbacks`] instance to configure types in different situations.
1266 ///
1267 /// This can also be used with [`CargoCallbacks`](struct@crate::CargoCallbacks) to emit
1268 /// `cargo:rerun-if-changed=...` for all `#include`d header files.
1269 pub fn parse_callbacks(mut self, cb: Box<dyn ParseCallbacks>) -> Self {
1270 self.options.parse_callbacks.push(Rc::from(cb));
1271 self
1272 }
1273 },
1274 as_args: |_callbacks, _args| {
1275 #[cfg(feature = "__cli")]
1276 for cb in _callbacks {
1277 _args.extend(cb.cli_args());
1278 }
1279 },
1280 },
1281 /// Which kind of items should we generate. We generate all of them by default.
1282 codegen_config: CodegenConfig {
1283 default: CodegenConfig::all(),
1284 methods: {
1285 /// Do not generate any functions.
1286 ///
1287 /// Functions are generated by default.
1288 pub fn ignore_functions(mut self) -> Builder {
1289 self.options.codegen_config.remove(CodegenConfig::FUNCTIONS);
1290 self
1291 }
1292
1293 /// Do not generate any methods.
1294 ///
1295 /// Methods are generated by default.
1296 pub fn ignore_methods(mut self) -> Builder {
1297 self.options.codegen_config.remove(CodegenConfig::METHODS);
1298 self
1299 }
1300
1301 /// Choose what to generate using a [`CodegenConfig`].
1302 ///
1303 /// This option overlaps with [`Builder::ignore_functions`] and
1304 /// [`Builder::ignore_methods`].
1305 ///
1306 /// All the items in `CodegenConfig` are generated by default.
1307 pub fn with_codegen_config(mut self, config: CodegenConfig) -> Self {
1308 self.options.codegen_config = config;
1309 self
1310 }
1311 },
1312 as_args: |codegen_config, args| {
1313 if !codegen_config.functions() {
1314 args.push("--ignore-functions".to_owned());
1315 }
1316
1317 args.push("--generate".to_owned());
1318
1319 //Temporary placeholder for the 4 options below.
1320 let mut options: Vec<String> = Vec::new();
1321 if codegen_config.functions() {
1322 options.push("functions".to_owned());
1323 }
1324
1325 if codegen_config.types() {
1326 options.push("types".to_owned());
1327 }
1328
1329 if codegen_config.vars() {
1330 options.push("vars".to_owned());
1331 }
1332
1333 if codegen_config.methods() {
1334 options.push("methods".to_owned());
1335 }
1336
1337 if codegen_config.constructors() {
1338 options.push("constructors".to_owned());
1339 }
1340
1341 if codegen_config.destructors() {
1342 options.push("destructors".to_owned());
1343 }
1344
1345 args.push(options.join(","));
1346
1347 if !codegen_config.methods() {
1348 args.push("--ignore-methods".to_owned());
1349 }
1350 },
1351 },
1352 /// Whether to treat inline namespaces conservatively.
1353 conservative_inline_namespaces: bool {
1354 methods: {
1355 /// Treat inline namespaces conservatively.
1356 ///
1357 /// This is tricky, because in C++ is technically legal to override an item
1358 /// defined in an inline namespace:
1359 ///
1360 /// ```cpp
1361 /// inline namespace foo {
1362 /// using Bar = int;
1363 /// }
1364 /// using Bar = long;
1365 /// ```
1366 ///
1367 /// Even though referencing `Bar` is a compiler error.
1368 ///
1369 /// We want to support this (arguably esoteric) use case, but we do not want to make
1370 /// the rest of `bindgen` users pay an usability penalty for that.
1371 ///
1372 /// To support this, we need to keep all the inline namespaces around, but then using
1373 /// `bindgen` becomes a bit more difficult, because you cannot reference paths like
1374 /// `std::string` (you'd need to use the proper inline namespace).
1375 ///
1376 /// We could complicate a lot of the logic to detect name collisions and, in the
1377 /// absence of collisions, generate a `pub use inline_ns::*` or something like that.
1378 ///
1379 /// That is probably something we can do to improve the usability of this option if we
1380 /// realize it is needed way more often. Our guess is that this extra logic is not
1381 /// going to be very useful.
1382 ///
1383 /// This option is disabled by default.
1384 pub fn conservative_inline_namespaces(mut self) -> Builder {
1385 self.options.conservative_inline_namespaces = true;
1386 self
1387 }
1388 },
1389 as_args: "--conservative-inline-namespaces",
1390 },
1391 /// Whether to keep documentation comments in the generated output.
1392 generate_comments: bool {
1393 default: true,
1394 methods: {
1395 /// Set whether the generated bindings should contain documentation comments.
1396 ///
1397 /// Documentation comments are included by default.
1398 ///
1399 /// Note that clang excludes comments from system headers by default, pass
1400 /// `"-fretain-comments-from-system-headers"` to the [`Builder::clang_arg`] method to
1401 /// include them.
1402 ///
1403 /// It is also possible to process all comments and not just documentation using the
1404 /// `"-fparse-all-comments"` flag. Check [these slides on clang comment parsing](
1405 /// https://llvm.org/devmtg/2012-11/Gribenko_CommentParsing.pdf) for more information
1406 /// and examples.
1407 pub fn generate_comments(mut self, doit: bool) -> Self {
1408 self.options.generate_comments = doit;
1409 self
1410 }
1411 },
1412 as_args: |value, args| (!value).as_args(args, "--no-doc-comments"),
1413 },
1414 /// Whether to generate inline functions.
1415 generate_inline_functions: bool {
1416 methods: {
1417 /// Set whether to generate inline functions.
1418 ///
1419 /// This option is disabled by default.
1420 ///
1421 /// Note that they will usually not work. However you can use `-fkeep-inline-functions`
1422 /// or `-fno-inline-functions` if you are responsible of compiling the library to make
1423 /// them callable.
1424 ///
1425 /// Check the [`Builder::wrap_static_fns`] method for an alternative.
1426 pub fn generate_inline_functions(mut self, doit: bool) -> Self {
1427 self.options.generate_inline_functions = doit;
1428 self
1429 }
1430 },
1431 as_args: "--generate-inline-functions",
1432 },
1433 /// Whether to allowlist types recursively.
1434 allowlist_recursively: bool {
1435 default: true,
1436 methods: {
1437 /// Set whether to recursively allowlist items.
1438 ///
1439 /// Items are allowlisted recursively by default.
1440 ///
1441 /// Given that we have explicitly allowlisted the `initiate_dance_party` function in
1442 /// this C header:
1443 ///
1444 /// ```c
1445 /// typedef struct MoonBoots {
1446 /// int bouncy_level;
1447 /// } MoonBoots;
1448 ///
1449 /// void initiate_dance_party(MoonBoots* boots);
1450 /// ```
1451 ///
1452 /// We would normally generate bindings to both the `initiate_dance_party` function and
1453 /// the `MoonBoots` type that it transitively references. If `false` is passed to this
1454 /// method, `bindgen` will not emit bindings for anything except the explicitly
1455 /// allowlisted items, meaning that the definition for `MoonBoots` would not be
1456 /// generated. However, the `initiate_dance_party` function would still reference
1457 /// `MoonBoots`!
1458 ///
1459 /// **Disabling this feature will almost certainly cause `bindgen` to emit bindings
1460 /// that will not compile!** If you disable this feature, then it is *your*
1461 /// responsibility to provide definitions for every type that is referenced from an
1462 /// explicitly allowlisted item. One way to provide the missing definitions is by using
1463 /// the [`Builder::raw_line`] method, another would be to define them in Rust and then
1464 /// `include!(...)` the bindings immediately afterwards.
1465 pub fn allowlist_recursively(mut self, doit: bool) -> Self {
1466 self.options.allowlist_recursively = doit;
1467 self
1468 }
1469 },
1470 as_args: |value, args| (!value).as_args(args, "--no-recursive-allowlist"),
1471 },
1472 /// Whether to emit `#[macro_use] extern crate objc;` instead of `use objc;` in the prologue of
1473 /// the files generated from objective-c files.
1474 objc_extern_crate: bool {
1475 methods: {
1476 /// Emit `#[macro_use] extern crate objc;` instead of `use objc;` in the prologue of
1477 /// the files generated from objective-c files.
1478 ///
1479 /// `use objc;` is emitted by default.
1480 pub fn objc_extern_crate(mut self, doit: bool) -> Self {
1481 self.options.objc_extern_crate = doit;
1482 self
1483 }
1484 },
1485 as_args: "--objc-extern-crate",
1486 },
1487 /// Whether to generate proper block signatures instead of `void` pointers.
1488 generate_block: bool {
1489 methods: {
1490 /// Generate proper block signatures instead of `void` pointers.
1491 ///
1492 /// `void` pointers are used by default.
1493 pub fn generate_block(mut self, doit: bool) -> Self {
1494 self.options.generate_block = doit;
1495 self
1496 }
1497 },
1498 as_args: "--generate-block",
1499 },
1500 /// Whether to generate strings as `CStr`.
1501 generate_cstr: bool {
1502 methods: {
1503 /// Set whether string constants should be generated as `&CStr` instead of `&[u8]`.
1504 ///
1505 /// A minimum Rust target of 1.59 is required for this to have any effect as support
1506 /// for `CStr::from_bytes_with_nul_unchecked` in `const` contexts is needed.
1507 ///
1508 /// This option is disabled by default but will become enabled by default in a future
1509 /// release, so enabling this is recommended.
1510 pub fn generate_cstr(mut self, doit: bool) -> Self {
1511 self.options.generate_cstr = doit;
1512 self
1513 }
1514 },
1515 as_args: "--generate-cstr",
1516 },
1517 /// Whether to emit `#[macro_use] extern crate block;` instead of `use block;` in the prologue
1518 /// of the files generated from apple block files.
1519 block_extern_crate: bool {
1520 methods: {
1521 /// Emit `#[macro_use] extern crate block;` instead of `use block;` in the prologue of
1522 /// the files generated from apple block files.
1523 ///
1524 /// `use block;` is emitted by default.
1525 pub fn block_extern_crate(mut self, doit: bool) -> Self {
1526 self.options.block_extern_crate = doit;
1527 self
1528 }
1529 },
1530 as_args: "--block-extern-crate",
1531 },
1532 /// Whether to use the clang-provided name mangling.
1533 enable_mangling: bool {
1534 default: true,
1535 methods: {
1536 /// Set whether to use the clang-provided name mangling. This is probably needed for
1537 /// C++ features.
1538 ///
1539 /// The mangling provided by clang is used by default.
1540 ///
1541 /// We allow disabling this option because some old `libclang` versions seem to return
1542 /// incorrect results in some cases for non-mangled functions, check [#528] for more
1543 /// information.
1544 ///
1545 /// [#528]: https://github.com/rust-lang/rust-bindgen/issues/528
1546 pub fn trust_clang_mangling(mut self, doit: bool) -> Self {
1547 self.options.enable_mangling = doit;
1548 self
1549 }
1550
1551 },
1552 as_args: |value, args| (!value).as_args(args, "--distrust-clang-mangling"),
1553 },
1554 /// Whether to detect include paths using `clang_sys`.
1555 detect_include_paths: bool {
1556 default: true,
1557 methods: {
1558 /// Set whether to detect include paths using `clang_sys`.
1559 ///
1560 /// `clang_sys` is used to detect include paths by default.
1561 pub fn detect_include_paths(mut self, doit: bool) -> Self {
1562 self.options.detect_include_paths = doit;
1563 self
1564 }
1565 },
1566 as_args: |value, args| (!value).as_args(args, "--no-include-path-detection"),
1567 },
1568 /// Whether we should try to fit macro constants into types smaller than `u32` and `i32`.
1569 fit_macro_constants: bool {
1570 methods: {
1571 /// Set whether `bindgen` should try to fit macro constants into types smaller than `u32`
1572 /// and `i32`.
1573 ///
1574 /// This option is disabled by default.
1575 pub fn fit_macro_constants(mut self, doit: bool) -> Self {
1576 self.options.fit_macro_constants = doit;
1577 self
1578 }
1579 },
1580 as_args: "--fit-macro-constant-types",
1581 },
1582 /// Whether to prepend the `enum` name to constant or newtype variants.
1583 prepend_enum_name: bool {
1584 default: true,
1585 methods: {
1586 /// Set whether to prepend the `enum` name to constant or newtype variants.
1587 ///
1588 /// The `enum` name is prepended by default.
1589 pub fn prepend_enum_name(mut self, doit: bool) -> Self {
1590 self.options.prepend_enum_name = doit;
1591 self
1592 }
1593 },
1594 as_args: |value, args| (!value).as_args(args, "--no-prepend-enum-name"),
1595 },
1596 /// Version of the Rust compiler to target.
1597 rust_target: RustTarget {
1598 methods: {
1599 /// Specify the Rust target version.
1600 ///
1601 /// The default target is the latest stable Rust version.
1602 pub fn rust_target(mut self, rust_target: RustTarget) -> Self {
1603 self.options.set_rust_target(rust_target);
1604 self
1605 }
1606 },
1607 as_args: |rust_target, args| {
1608 args.push("--rust-target".to_owned());
1609 args.push(rust_target.to_string());
1610 },
1611 },
1612 /// The Rust edition to use for code generation.
1613 rust_edition: Option<RustEdition> {
1614 methods: {
1615 /// Specify the Rust target edition.
1616 ///
1617 /// The default edition is the latest edition supported by the chosen Rust target.
1618 pub fn rust_edition(mut self, rust_edition: RustEdition) -> Self {
1619 self.options.rust_edition = Some(rust_edition);
1620 self
1621 }
1622 }
1623 as_args: |edition, args| {
1624 if let Some(edition) = edition {
1625 args.push("--rust-edition".to_owned());
1626 args.push(edition.to_string());
1627 }
1628 },
1629 },
1630 /// Features to be enabled. They are derived from `rust_target`.
1631 rust_features: RustFeatures {
1632 methods: {},
1633 // This field cannot be set from the CLI,
1634 as_args: ignore,
1635 },
1636 /// Enable support for native Rust unions if they are supported.
1637 untagged_union: bool {
1638 default: true,
1639 methods: {
1640 /// Disable support for native Rust unions, if supported.
1641 ///
1642 /// The default value of this option is set based on the value passed to
1643 /// [`Builder::rust_target`].
1644 pub fn disable_untagged_union(mut self) -> Self {
1645 self.options.untagged_union = false;
1646 self
1647 }
1648 }
1649 as_args: |value, args| (!value).as_args(args, "--disable-untagged-union"),
1650 },
1651 /// Whether we should record which items in the regex sets did match any C items.
1652 record_matches: bool {
1653 default: true,
1654 methods: {
1655 /// Set whether we should record which items in our regex sets did match any C items.
1656 ///
1657 /// Matches are recorded by default.
1658 pub fn record_matches(mut self, doit: bool) -> Self {
1659 self.options.record_matches = doit;
1660 self
1661 }
1662
1663 },
1664 as_args: |value, args| (!value).as_args(args, "--no-record-matches"),
1665 },
1666 /// Whether `size_t` should be translated to `usize` automatically.
1667 size_t_is_usize: bool {
1668 default: true,
1669 methods: {
1670 /// Set whether `size_t` should be translated to `usize`.
1671 ///
1672 /// If `size_t` is translated to `usize`, type definitions for `size_t` will not be
1673 /// emitted.
1674 ///
1675 /// `size_t` is translated to `usize` by default.
1676 pub fn size_t_is_usize(mut self, is: bool) -> Self {
1677 self.options.size_t_is_usize = is;
1678 self
1679 }
1680 },
1681 as_args: |value, args| (!value).as_args(args, "--no-size_t-is-usize"),
1682 },
1683 /// The tool that should be used to format the generated bindings.
1684 formatter: Formatter {
1685 methods: {
1686 /// Set whether `rustfmt` should be used to format the generated bindings.
1687 ///
1688 /// `rustfmt` is used by default.
1689 ///
1690 /// This method overlaps in functionality with the more general [`Builder::formatter`].
1691 /// Thus, the latter should be preferred.
1692 #[deprecated]
1693 pub fn rustfmt_bindings(mut self, doit: bool) -> Self {
1694 self.options.formatter = if doit {
1695 Formatter::Rustfmt
1696 } else {
1697 Formatter::None
1698 };
1699 self
1700 }
1701
1702 /// Set which tool should be used to format the generated bindings.
1703 ///
1704 /// The default formatter is [`Formatter::Rustfmt`].
1705 ///
1706 /// To be able to use `prettyplease` as a formatter, the `"prettyplease"` feature for
1707 /// `bindgen` must be enabled in the Cargo manifest.
1708 pub fn formatter(mut self, formatter: Formatter) -> Self {
1709 self.options.formatter = formatter;
1710 self
1711 }
1712 },
1713 as_args: |formatter, args| {
1714 if *formatter != Default::default() {
1715 args.push("--formatter".to_owned());
1716 args.push(formatter.to_string());
1717 }
1718 },
1719 },
1720 /// The absolute path to the `rustfmt` configuration file.
1721 rustfmt_configuration_file: Option<PathBuf> {
1722 methods: {
1723 /// Set the absolute path to the `rustfmt` configuration file.
1724 ///
1725 /// The default `rustfmt` options are used if `None` is passed to this method or if
1726 /// this method is not called at all.
1727 ///
1728 /// Calling this method will set the [`Builder::rustfmt_bindings`] option to `true`
1729 /// and the [`Builder::formatter`] option to [`Formatter::Rustfmt`].
1730 pub fn rustfmt_configuration_file(mut self, path: Option<PathBuf>) -> Self {
1731 self = self.formatter(Formatter::Rustfmt);
1732 self.options.rustfmt_configuration_file = path;
1733 self
1734 }
1735 },
1736 as_args: "--rustfmt-configuration-file",
1737 },
1738 /// Types that should not derive `PartialEq`.
1739 no_partialeq_types: RegexSet {
1740 methods: {
1741 regex_option! {
1742 /// Do not derive `PartialEq` for a given type.
1743 pub fn no_partialeq<T: Into<String>>(mut self, arg: T) -> Builder {
1744 self.options.no_partialeq_types.insert(arg.into());
1745 self
1746 }
1747 }
1748 },
1749 as_args: "--no-partialeq",
1750 },
1751 /// Types that should not derive `Copy`.
1752 no_copy_types: RegexSet {
1753 methods: {
1754 regex_option! {
1755 /// Do not derive `Copy` and `Clone` for a given type.
1756 pub fn no_copy<T: Into<String>>(mut self, arg: T) -> Self {
1757 self.options.no_copy_types.insert(arg.into());
1758 self
1759 }
1760 }
1761 },
1762 as_args: "--no-copy",
1763 },
1764 /// Types that should not derive `Debug`.
1765 no_debug_types: RegexSet {
1766 methods: {
1767 regex_option! {
1768 /// Do not derive `Debug` for a given type.
1769 pub fn no_debug<T: Into<String>>(mut self, arg: T) -> Self {
1770 self.options.no_debug_types.insert(arg.into());
1771 self
1772 }
1773 }
1774 },
1775 as_args: "--no-debug",
1776 },
1777 /// Types that should not derive or implement `Default`.
1778 no_default_types: RegexSet {
1779 methods: {
1780 regex_option! {
1781 /// Do not derive or implement `Default` for a given type.
1782 pub fn no_default<T: Into<String>>(mut self, arg: T) -> Self {
1783 self.options.no_default_types.insert(arg.into());
1784 self
1785 }
1786 }
1787 },
1788 as_args: "--no-default",
1789 },
1790 /// Types that should not derive `Hash`.
1791 no_hash_types: RegexSet {
1792 methods: {
1793 regex_option! {
1794 /// Do not derive `Hash` for a given type.
1795 pub fn no_hash<T: Into<String>>(mut self, arg: T) -> Builder {
1796 self.options.no_hash_types.insert(arg.into());
1797 self
1798 }
1799 }
1800 },
1801 as_args: "--no-hash",
1802 },
1803 /// Types that should be annotated with `#[must_use]`.
1804 must_use_types: RegexSet {
1805 methods: {
1806 regex_option! {
1807 /// Annotate the given type with the `#[must_use]` attribute.
1808 pub fn must_use_type<T: Into<String>>(mut self, arg: T) -> Builder {
1809 self.options.must_use_types.insert(arg.into());
1810 self
1811 }
1812 }
1813 },
1814 as_args: "--must-use-type",
1815 },
1816 /// Whether C arrays should be regular pointers in rust or array pointers
1817 array_pointers_in_arguments: bool {
1818 methods: {
1819 /// Translate arrays `T arr[size]` into array pointers `*mut [T; size]` instead of
1820 /// translating them as `*mut T` which is the default.
1821 ///
1822 /// The same is done for `*const` pointers.
1823 pub fn array_pointers_in_arguments(mut self, doit: bool) -> Self {
1824 self.options.array_pointers_in_arguments = doit;
1825 self
1826 }
1827
1828 },
1829 as_args: "--use-array-pointers-in-arguments",
1830 },
1831 /// The name of the `wasm_import_module`.
1832 wasm_import_module_name: Option<String> {
1833 methods: {
1834 /// Adds the `#[link(wasm_import_module = import_name)]` attribute to all the `extern`
1835 /// blocks generated by `bindgen`.
1836 ///
1837 /// This attribute is not added by default.
1838 pub fn wasm_import_module_name<T: Into<String>>(
1839 mut self,
1840 import_name: T,
1841 ) -> Self {
1842 self.options.wasm_import_module_name = Some(import_name.into());
1843 self
1844 }
1845 },
1846 as_args: "--wasm-import-module-name",
1847 },
1848 /// The name of the dynamic library (if we are generating bindings for a shared library).
1849 dynamic_library_name: Option<String> {
1850 methods: {
1851 /// Generate bindings for a shared library with the given name.
1852 ///
1853 /// This option is disabled by default.
1854 pub fn dynamic_library_name<T: Into<String>>(
1855 mut self,
1856 dynamic_library_name: T,
1857 ) -> Self {
1858 self.options.dynamic_library_name = Some(dynamic_library_name.into());
1859 self
1860 }
1861 },
1862 as_args: "--dynamic-loading",
1863 },
1864 /// Whether to require successful linkage for all routines in a shared library.
1865 dynamic_link_require_all: bool {
1866 methods: {
1867 /// Set whether to require successful linkage for all routines in a shared library.
1868 /// This allows us to optimize function calls by being able to safely assume function
1869 /// pointers are valid.
1870 ///
1871 /// This option only comes into effect if the [`Builder::dynamic_library_name`] option
1872 /// is set.
1873 ///
1874 /// This option is disabled by default.
1875 pub fn dynamic_link_require_all(mut self, req: bool) -> Self {
1876 self.options.dynamic_link_require_all = req;
1877 self
1878 }
1879 },
1880 as_args: "--dynamic-link-require-all",
1881 },
1882 /// Whether to only make generated bindings `pub` if the items would be publicly accessible by
1883 /// C++.
1884 respect_cxx_access_specs: bool {
1885 methods: {
1886 /// Set whether to respect the C++ access specifications.
1887 ///
1888 /// Passing `true` to this method will set the visibility of the generated Rust items
1889 /// as `pub` only if the corresponding C++ items are publicly accessible instead of
1890 /// marking all the items as public, which is the default.
1891 pub fn respect_cxx_access_specs(mut self, doit: bool) -> Self {
1892 self.options.respect_cxx_access_specs = doit;
1893 self
1894 }
1895
1896 },
1897 as_args: "--respect-cxx-access-specs",
1898 },
1899 /// Whether to translate `enum` integer types to native Rust integer types.
1900 translate_enum_integer_types: bool {
1901 methods: {
1902 /// Set whether to always translate `enum` integer types to native Rust integer types.
1903 ///
1904 /// Passing `true` to this method will result in `enum`s having types such as `u32` and
1905 /// `i16` instead of `c_uint` and `c_short` which is the default. The `#[repr]` types
1906 /// of Rust `enum`s are always translated to Rust integer types.
1907 pub fn translate_enum_integer_types(mut self, doit: bool) -> Self {
1908 self.options.translate_enum_integer_types = doit;
1909 self
1910 }
1911 },
1912 as_args: "--translate-enum-integer-types",
1913 },
1914 /// Whether to generate types with C style naming.
1915 c_naming: bool {
1916 methods: {
1917 /// Set whether to generate types with C style naming.
1918 ///
1919 /// Passing `true` to this method will add prefixes to the generated type names. For
1920 /// example, instead of a `struct` with name `A` we will generate a `struct` with
1921 /// `struct_A`. Currently applies to `struct`s, `union`s, and `enum`s.
1922 pub fn c_naming(mut self, doit: bool) -> Self {
1923 self.options.c_naming = doit;
1924 self
1925 }
1926 },
1927 as_args: "--c-naming",
1928 },
1929 /// Whether to always emit explicit padding fields.
1930 force_explicit_padding: bool {
1931 methods: {
1932 /// Set whether to always emit explicit padding fields.
1933 ///
1934 /// This option should be enabled if a `struct` needs to be serialized in its native
1935 /// format (padding bytes and all). This could be required if such `struct` will be
1936 /// written to a file or sent over the network, as anything reading the padding bytes
1937 /// of a struct may cause undefined behavior.
1938 ///
1939 /// Padding fields are not emitted by default.
1940 pub fn explicit_padding(mut self, doit: bool) -> Self {
1941 self.options.force_explicit_padding = doit;
1942 self
1943 }
1944 },
1945 as_args: "--explicit-padding",
1946 },
1947 /// Whether to emit vtable functions.
1948 vtable_generation: bool {
1949 methods: {
1950 /// Set whether to enable experimental support to generate virtual table functions.
1951 ///
1952 /// This option should mostly work, though some edge cases are likely to be broken.
1953 ///
1954 /// Virtual table generation is disabled by default.
1955 pub fn vtable_generation(mut self, doit: bool) -> Self {
1956 self.options.vtable_generation = doit;
1957 self
1958 }
1959 },
1960 as_args: "--vtable-generation",
1961 },
1962 /// Whether to sort the generated Rust items.
1963 sort_semantically: bool {
1964 methods: {
1965 /// Set whether to sort the generated Rust items in a predefined manner.
1966 ///
1967 /// Items are not ordered by default.
1968 pub fn sort_semantically(mut self, doit: bool) -> Self {
1969 self.options.sort_semantically = doit;
1970 self
1971 }
1972 },
1973 as_args: "--sort-semantically",
1974 },
1975 /// Whether to deduplicate `extern` blocks.
1976 merge_extern_blocks: bool {
1977 methods: {
1978 /// Merge all extern blocks under the same module into a single one.
1979 ///
1980 /// Extern blocks are not merged by default.
1981 pub fn merge_extern_blocks(mut self, doit: bool) -> Self {
1982 self.options.merge_extern_blocks = doit;
1983 self
1984 }
1985 },
1986 as_args: "--merge-extern-blocks",
1987 },
1988 /// Whether to wrap unsafe operations in unsafe blocks.
1989 wrap_unsafe_ops: bool {
1990 methods: {
1991 /// Wrap all unsafe operations in unsafe blocks.
1992 ///
1993 /// Unsafe operations are not wrapped by default.
1994 pub fn wrap_unsafe_ops(mut self, doit: bool) -> Self {
1995 self.options.wrap_unsafe_ops = doit;
1996 self
1997 }
1998 },
1999 as_args: "--wrap-unsafe-ops",
2000 },
2001 /// Use DSTs to represent structures with flexible array members.
2002 flexarray_dst: bool {
2003 methods: {
2004 /// Use DSTs to represent structures with flexible array members.
2005 ///
2006 /// This option is disabled by default.
2007 pub fn flexarray_dst(mut self, doit: bool) -> Self {
2008 self.options.flexarray_dst = doit;
2009 self
2010 }
2011 },
2012 as_args: "--flexarray-dst",
2013 },
2014 /// Patterns for functions whose ABI should be overridden.
2015 abi_overrides: HashMap<Abi, RegexSet> {
2016 methods: {
2017 regex_option! {
2018 /// Override the ABI of a given function.
2019 pub fn override_abi<T: Into<String>>(mut self, abi: Abi, arg: T) -> Self {
2020 self.options
2021 .abi_overrides
2022 .entry(abi)
2023 .or_default()
2024 .insert(arg.into());
2025 self
2026 }
2027 }
2028 },
2029 as_args: |overrides, args| {
2030 for (abi, set) in overrides {
2031 for item in set.get_items() {
2032 args.push("--override-abi".to_owned());
2033 args.push(format!("{item}={abi}"));
2034 }
2035 }
2036 },
2037 },
2038 /// Whether to generate wrappers for `static` functions.
2039 wrap_static_fns: bool {
2040 methods: {
2041 /// Set whether to generate wrappers for `static`` functions.
2042 ///
2043 /// Passing `true` to this method will generate a C source file with non-`static`
2044 /// functions that call the `static` functions found in the input headers and can be
2045 /// called from Rust once the source file is compiled.
2046 ///
2047 /// The path of this source file can be set using the [`Builder::wrap_static_fns_path`]
2048 /// method.
2049 pub fn wrap_static_fns(mut self, doit: bool) -> Self {
2050 self.options.wrap_static_fns = doit;
2051 self
2052 }
2053 },
2054 as_args: "--wrap-static-fns",
2055 },
2056 /// The suffix to be added to the function wrappers for `static` functions.
2057 wrap_static_fns_suffix: Option<String> {
2058 methods: {
2059 /// Set the suffix added to the wrappers for `static` functions.
2060 ///
2061 /// This option only comes into effect if `true` is passed to the
2062 /// [`Builder::wrap_static_fns`] method.
2063 ///
2064 /// The default suffix is `__extern`.
2065 pub fn wrap_static_fns_suffix<T: AsRef<str>>(mut self, suffix: T) -> Self {
2066 self.options.wrap_static_fns_suffix = Some(suffix.as_ref().to_owned());
2067 self
2068 }
2069 },
2070 as_args: "--wrap-static-fns-suffix",
2071 },
2072 /// The path of the file where the wrappers for `static` functions will be emitted.
2073 wrap_static_fns_path: Option<PathBuf> {
2074 methods: {
2075 /// Set the path for the source code file that would be created if any wrapper
2076 /// functions must be generated due to the presence of `static` functions.
2077 ///
2078 /// `bindgen` will automatically add the right extension to the header and source code
2079 /// files.
2080 ///
2081 /// This option only comes into effect if `true` is passed to the
2082 /// [`Builder::wrap_static_fns`] method.
2083 ///
2084 /// The default path is `temp_dir/bindgen/extern`, where `temp_dir` is the path
2085 /// returned by [`std::env::temp_dir`] .
2086 pub fn wrap_static_fns_path<T: AsRef<Path>>(mut self, path: T) -> Self {
2087 self.options.wrap_static_fns_path = Some(path.as_ref().to_owned());
2088 self
2089 }
2090 },
2091 as_args: "--wrap-static-fns-path",
2092 },
2093 /// Default visibility of fields.
2094 default_visibility: FieldVisibilityKind {
2095 methods: {
2096 /// Set the default visibility of fields, including bitfields and accessor methods for
2097 /// bitfields.
2098 ///
2099 /// This option only comes into effect if the [`Builder::respect_cxx_access_specs`]
2100 /// option is disabled.
2101 pub fn default_visibility(
2102 mut self,
2103 visibility: FieldVisibilityKind,
2104 ) -> Self {
2105 self.options.default_visibility = visibility;
2106 self
2107 }
2108 },
2109 as_args: |visibility, args| {
2110 if *visibility != Default::default() {
2111 args.push("--default-visibility".to_owned());
2112 args.push(visibility.to_string());
2113 }
2114 },
2115 },
2116 /// Whether to emit diagnostics or not.
2117 emit_diagnostics: bool {
2118 methods: {
2119 #[cfg(feature = "experimental")]
2120 /// Emit diagnostics.
2121 ///
2122 /// These diagnostics are emitted to `stderr` if you are using `bindgen-cli` or printed
2123 /// using `cargo:warning=` if you are using `bindgen` as a `build-dependency`.
2124 ///
2125 /// Diagnostics are not emitted by default.
2126 ///
2127 /// The layout and contents of these diagnostic messages are not covered by versioning
2128 /// and can change without notice.
2129 pub fn emit_diagnostics(mut self) -> Self {
2130 self.options.emit_diagnostics = true;
2131 self
2132 }
2133 },
2134 as_args: "--emit-diagnostics",
2135 },
2136 /// Whether to use Clang evaluation on temporary files as a fallback for macros that fail to
2137 /// parse.
2138 clang_macro_fallback: bool {
2139 methods: {
2140 /// Use Clang as a fallback for macros that fail to parse using `CExpr`.
2141 ///
2142 /// This uses a workaround to evaluate each macro in a temporary file. Because this
2143 /// results in slower compilation, this option is opt-in.
2144 pub fn clang_macro_fallback(mut self) -> Self {
2145 self.options.clang_macro_fallback = true;
2146 self
2147 }
2148 },
2149 as_args: "--clang-macro-fallback",
2150 }
2151 /// Path to use for temporary files created by clang macro fallback code like precompiled
2152 /// headers.
2153 clang_macro_fallback_build_dir: Option<PathBuf> {
2154 methods: {
2155 /// Set a path to a directory to which `.c` and `.h.pch` files should be written for the
2156 /// purpose of using clang to evaluate macros that can't be easily parsed.
2157 ///
2158 /// The default location for `.h.pch` files is the directory that the corresponding
2159 /// `.h` file is located in. The default for the temporary `.c` file used for clang
2160 /// parsing is the current working directory. Both of these defaults are overridden
2161 /// by this option.
2162 pub fn clang_macro_fallback_build_dir<P: AsRef<Path>>(mut self, path: P) -> Self {
2163 self.options.clang_macro_fallback_build_dir = Some(path.as_ref().to_owned());
2164 self
2165 }
2166 },
2167 as_args: "--clang-macro-fallback-build-dir",
2168 }
2169}