Re: [PATCH] rust: kbuild: set `bindgen`'s Rust target version

From: Alice Ryhl
Date: Mon Nov 25 2024 - 04:09:22 EST


On Sat, Nov 23, 2024 at 7:03 PM Miguel Ojeda <ojeda@xxxxxxxxxx> wrote:
>
> Each `bindgen` release may upgrade the list of Rust targets. For instance,
> currently, in their master branch [1], the latest ones are:
>
> Nightly => {
> vectorcall_abi: #124485,
> ptr_metadata: #81513,
> layout_for_ptr: #69835,
> },
> Stable_1_77(77) => { offset_of: #106655 },
> Stable_1_73(73) => { thiscall_abi: #42202 },
> Stable_1_71(71) => { c_unwind_abi: #106075 },
> Stable_1_68(68) => { abi_efiapi: #105795 },
>
> By default, the highest stable release in their list is used, and users
> are expected to set one if they need to support older Rust versions
> (e.g. see [2]).
>
> Thus, over time, new Rust features are used by default, and at some
> point, it is likely that `bindgen` will emit Rust code that requires a
> Rust version higher than our minimum (or perhaps enabling an unstable
> feature). Currently, there is no problem because the maximum they have,
> as seen above, is Rust 1.77.0, and our current minimum is Rust 1.78.0.
>
> Therefore, set a Rust target explicitly now to prevent going forward in
> time too much and thus getting potential build failures at some point.
>
> Since we also support a minimum `bindgen` version, and since `bindgen`
> does not support passing unknown Rust target versions, we need to use
> the list of our minimum `bindgen` version, rather than the latest. So,
> since `bindgen` 0.65.1 had this list [3], we need to use Rust 1.68.0:
>
> /// Rust stable 1.64
> /// * `core_ffi_c` ([Tracking issue](https://github.com/rust-lang/rust/issues/94501))
> => Stable_1_64 => 1.64;
> /// Rust stable 1.68
> /// * `abi_efiapi` calling convention ([Tracking issue](https://github.com/rust-lang/rust/issues/65815))
> => Stable_1_68 => 1.68;
> /// Nightly rust
> /// * `thiscall` calling convention ([Tracking issue](https://github.com/rust-lang/rust/issues/42202))
> /// * `vectorcall` calling convention (no tracking issue)
> /// * `c_unwind` calling convention ([Tracking issue](https://github.com/rust-lang/rust/issues/74990))
> => Nightly => nightly;
>
> ...
>
> /// Latest stable release of Rust
> pub const LATEST_STABLE_RUST: RustTarget = RustTarget::Stable_1_68;
>
> Thus add the `--rust-target 1.68` parameter. Add a comment as well
> explaining this.
>
> An alternative would be to use the currently running (i.e. actual) `rustc`
> and `bindgen` versions to pick a "better" Rust target version. However,
> that would introduce more moving parts depending on the user setup and
> is also more complex to implement.
>
> Cc: Christian Poveda <git@xxxxxxxxx>
> Cc: Emilio Cobos Álvarez <emilio@xxxxxxxxx>
> Link: https://github.com/rust-lang/rust-bindgen/blob/21c60f473f4e824d4aa9b2b508056320d474b110/bindgen/features.rs#L97-L105 [1]
> Link: https://github.com/rust-lang/rust-bindgen/issues/2960 [2]
> Link: https://github.com/rust-lang/rust-bindgen/blob/7d243056d335fdc4537f7bca73c06d01aae24ddc/bindgen/features.rs#L131-L150 [3]
> Signed-off-by: Miguel Ojeda <ojeda@xxxxxxxxxx>

Just to double-check, the problem is that bindgen currently doesn't
get any information about the rustc we're using, so it may generate
code invalid on the rustc we are actually using?

Alice