Released YYYY/MM/DD
- TODO (or remove section if none)
- The
bindgen::Builder::{constified_enum_module,{bitfield,rustified}_enum}
builder methods and their corresponding CLI flags now compare their argument to the C/C++enum
's "canonical path", which includes leading namespaces, rather than its "canonical name", which does not. This is a breaking change that requires callers which target a namespaced C++ enum to call e.g.bitfield_enum("<namespace>::<enum_name>")
rather than e.g.bitfield_enum("<enum_name>")
. [#1162][]
- TODO (or remove section if none)
- TODO (or remove section if none)
- TODO (or remove section if none)
- TODO (or remove section if none)
Released 2017/10/27
-
🎉 A new
bindgen
reviewer: @pepyakin 🎉 You can ask @pepyakin to review all your future pull requests withr? @pepyakin
from now on 😄 -
Timers for seeing which phases
bindgen
is spending its time in. On the command line, use the--time-phases
flag. From a builder, use thebindgen::Builder::time_phases(true)
method. #938 -
You can now disable
#[derive(Copy)]
for all types with--no-derive-copy
andbindgen::Builder::derive_copy(false)
. #948 -
We now have an overview of
bindgen
's code base and architecture for newcomers inCONTRIBUTING.md
. #988 -
Derive
PartialOrd
with the--with-derive-partialord
CLI flag orbindgen::Builder::derive_partialord(true)
builder method. #882 -
Derive
Ord
with the--with-derive-ord
CLI flag orbindgen::Builder::derive_ord(true)
builder method. #884 -
When
PartialEq
cannot be derived because of an array larger than Rust's array-derive limit,bindgen
can emit animpl PartialEq for ...
block. Enable this behavior with the--impl-partialeq
CLI flag or thebindgen::Builder::impl_partialeq(true)
method. #1012 -
When deriving
PartialEq
for all types, you can now specify particular types that shouldn'tderive(PartialEq)
with the--no-partialeq <regex>
CLI flag orbindgen::Builder::no_partialeq("<regex>")
builder method. #996 -
Specify types that should not derive
Copy
with the--no-copy <regex>
CLI flag orbindgen::Builder::no_copy("<regex>")
builder method. This functionality was previously only available via comment annotations in the header sources. #1099 -
When deriving
Hash
for all types, you can now specify particular types that shouldn'tderive(Hash)
with the--no-hash <regex>
CLI flag orbindgen::Builder::no_hash("<regex>")
builder method. #1105 -
The
bindgen
users guide now has an FAQ section! If you have any FAQ suggestions to put up there, please open a pull request. [#1020][] -
Added
csmith
fuzzing infrastructure.csmith
generates random C and C++ programs, we feed those intobindgen
as headers to generate bindings to, then test that the generated bindings compile and that their layout tests pass. This infrastructure landed in many small bits.We <3 folks who help us find and fix issues via fuzzing! hint hint
-
Added experimental support for the
thiscall
ABI when targetting Rust nightly. #1065
-
If the user does not explicitly pass a
--target
argument forlibclang
,bindgen
will insert such an argument itself. See #942, #947, and #953 for details. -
C/C++
enum
s are now translated into constants by default, rather than Rustenum
s. The old behavior was a big footgun becauserustc
assumes that the only values of anenum
are its variants, whereas a lot of C/C++ code uses random values asenum
s. Put these two things and it leads to undefined behavior. Translating C/C++enum
s into Rustenum
s is still available with the--rustified-enum <regex>
CLI flag andbindgen::Builder::rustified_enum("<regex>")
builder method. #758 -
Generated bindings are now pretty printed with
rustfmt
by default. Previously, this option existed, but was off by default becausesyntex
did an OK job at pretty printing the bindings. Now that we are usingquote! { ... }
instead ofsyntex
, we lost that pretty printing, and now rely onrustfmt
. You can disablerustfmt
ing with--no-rustfmt-bindings
orbindgen::Builder::rustfmt_bindings(false)
. See #925 and #1022 for details.
-
bindgen::Builder::hide_type
is deprecated in favor ofbindgen::Builder::blacklist_type
. #987 -
bindgen::Builder::whitelisted_type
is deprecated in favor ofbindgen::Builder::whitelist_type
. #987 -
bindgen::Builder::whitelisted_function
is deprecated in favor ofbindgen::Builder::whitelist_function
. #985 -
bindgen::Builder::whitelisted_var
is deprecated in favor ofbindgen::Builder::whitelist_var
. #989
-
Removed the dependency on (unmaintained)
syntex
, and build times are cut in half!Before:
$ cargo clean; cargo build <snip> Finished dev [unoptimized + debuginfo] target(s) in 98.75 secs
After:
$ cargo clean; cargo build <snip> Finished dev [unoptimized + debuginfo] target(s) in 46.26 secs
-
The
BindgenOptions
type is no longer public. It had been deprecated in previous releases. Usebindgen::Builder
instead. #1000
-
Under certain conditions, a globally scoped
enum
could end up with bindings in the wrong namespace module. #888 -
Blacklisted types were incorrectly assumed to always be
Copy
able (and assumed to implement other traits as well).bindgen
is now conservatively pessimistic about the traits that blacklisted types implement. #944 -
When bitfields have a ridiculously large number of bits (for example,
unsigned : 632;
) thenbindgen
was incorrectly deriving traits that couldn't be derived, resulting in errors when compiling the bindings, and was also generatingstruct
s with an incorrect layout. Both issues have been fixed. #982 -
_
is a valid identifier in some C++ contexts, but can't be referenced in Rust, as it is the "throwaway identifier" (a term I just made up, if you use it now, then you owe me money).bindgen
will now translate_
into__
so that it can be used on the Rust side. #1008 -
Nested class definitions were sometimes being emitted in the wrong namespace module in the generated bindings. #1048
-
bindgen
was mis-handlingunion
s that contained bitfield members. This has been fixed. #744 -
Unsigned constants that were greater than
u32::MAX
were being mis-translated bybindgen
. This is now fixed. #1040 -
When given a directory as an input file, or a file to which we don't have read permissions, then
bindgen
will print a more useful error message now. #1029 -
bindgen
previously attempted to deriveHash
for structures with flexibly-sized array members, but knowing how many elements exist in such arrays requires program-specific knowledge thatbindgen
cannot have. #1094
Released 2017/08/28
- Explicit control over choosing which Rust version (specific stable versions or nightly Rust) to target. This defaults to the latest stable Rust version. #832
bindgen::Builder::default()
.rust_target(bindgen::RustTarget::Stable_1_19)
// or `.rust_target(bindgen::RustTarget::Nightly)` to use unstable features
or
$ bindgen --rust-target 1.19
# or `--rust-target nightly` to use unstable features
-
Started adding
derive(Copy)
for large arrays ofCopy
things, even when the array is too large toderive(Clone)
because Rust doesn't implementClone
for arrays of length greater than 32. #874 -
bindgen
can now determine which types are hashable and addderive(Hash)
to those types that support it. This is disabled by default, but can be enabled viabindgen::Builder::derive_hash
or--with-derive-hash
. #876 -
bindgen
can now generateimpl Debug for Blah
trait implementations for types that contain non-Debug
types, and therefore cannotderive(Debug)
. This behavior can be enabled withbindgen::Builder::impl_debug
and--impl-debug
. #875 -
bindgen
can now invokerustfmt
on the generated bindings. The bindings have historically been fairly pretty printed, but sometimes this is not the case, especially with the newimpl Debug for Blah
feature. Havebindgen
runrustfmt
withbindgen::Builder::rustfmt_bindings
and--rustfmt-bindings
, and use non-defaultrustfmt
configuration files withbindgen::Builder::rustfmt_configuration_file
and--rustfmt-configuration-file
. #900 -
bindgen
can now determine which types can be compared with==
and addderive(PartialEq)
to those types that support it. This is disabled by default, but can be enabled viabindgen::Builder::derive_partialeq
or--with-derive-partialeq
. #878 -
Additionally,
bindgen
can also addderive(Eq)
to those types which we determined we couldderive(PartialEq)
and do not transitively contain any floats. Enable this behavior withbindgen::Builder::derive_eq
or--with-derive-eq
. #880
-
Started emitting Rust
union
s when targeting stable Rust >= 1.19, not just unstable nightly Rust. #832 -
Emitted layout
#[test]
s no longer contain internal IDs for template instantiations including pointers and arrays. This should make generated bindings more stable across updates to unrelated parts of the input headers. #871 -
Determining whether a type can derive
Copy
or not was ported from an ad-hoc algorithm to our fix-point framework. #766 -
Determining whether a type has a destructor or not was also ported from an ad-hoc algorithm to our fix-point framework. #927
bindgen::Builder::unstable_rust
/--unstable-rust
is deprecated, in favor of targeting explicit Rust versions withbindgen::Builder::rust_target
/--rust-target
instead. #832
-
Fixed a regression in the
derive(Default)
analysis that resulted in some opaque types derivingDefault
when they shouldn't have. #889 -
Fixed a regression where template instantiation layout
#[test]
s were being generated with invalid Rust identifiers. #906
Released 2017/07/31
-
"Constified enum modules" translating C/C++
enum
s into constants within a module for namespacing, rather than mangling the name of the generated constants.For example, it turns this:
// bindgen-flags: --constified-enum-module PetKind enum PetKind { Doggo, Kitty, Hamster }; struct Pet { PetKind kind; char* noise; };
Into this:
/* automatically generated by rust-bindgen */ pub mod PetKind { pub type Type = ::std::os::raw::c_uint; pub const Doggo: Type = 0; pub const Kitty: Type = 1; pub const Hamster: Type = 2; } #[repr(C)] #[derive(Debug, Copy)] pub struct Pet { pub kind: PetKind::Type, pub noise: *mut ::std::os::raw::c_char, }
The default translation strategy for
enum
s will generate constants with names likePetKind_Hamster
instead.Use
bindgen::Builder::constified_enum_module
or--constified-enum-module
. -
You can now mark particular template instantiations as "opaque", so that
bindgen
emits a blob of bytes with the correct size and alignment rather than creating generic Rust types. This is useful as a workaround for when a template has a specialization for the given type arguments, whichbindgen
does not yet support. Previously, it was all of a templates' instantiations would be opaque or none of them would be. Usebindgen::Builder::opaque_type("SomeTemplate<Foo, Bar>")
or--opaque-type "SomeTemplate<Foo, Bar>"
. -
Added the ability to preprocess and dump the input headers given to
bindgen
to a file. This should make creating reproducible, system independent, standalone test cases much easier! Bring on the new issues! Usebindgen::Builder::dump_preprocessed_input
or--dump-preprocessed-input
. -
We now use a fix-point analysis to determine whether any given type can derive
Debug
, or whether it has an explicit virtual table pointer. Previously we were using an ad-hoc algorithm that had at various times suffered from things like going into infinite loops when coming across cycles. Hopefully those kinds of bugs are a thing of the past! #767 #765
- The
bindgen
repository has moved under therust-lang-nursery
umbrella! The new repository URL is https://github.com/rust-lang-nursery/rust-bindgen 🎉
-
No longer generating layout tests for template instantiations using type arguments that we didn't generate bindings for (which then caused compilation errors). #679
-
Fixed function name mangling when cross compiling bindings for iOS. #776
-
Don't include parent
inline namespace
s' names in types' names. Names of types from some STLs were showing up likestd___cxx11_basic_string
when they should have beenstd_basic_string
. #789 -
Fixed a bug where we wouldn't generate type definitions for some types referenced by an opaque type's methods, causing compilation errors. #807
-
Fixed function name mangling issues for win32 targets. #819
-
Fixed a bug where
bindgen
was generating a generic type alias that didn't use its type parameter, which is illegal Rust code and caused compilation errors. #820 -
The generated size, alignment, and field offset unit tests now have stable names rather than sometimes including an internal identifier which is inherently unstable. This was causing unnecessary diffs when folks were checking in new versions of bindings into their VCS. #394
-
Fixed a bug where we would try and
derive(Debug, Default)
on structs that had padding like[u8; 33]
, which is larger than the largest array length for which Rust will derive traits. This would cause compilation errors when compiling the emitted bindings. #648