Re: [PATCH v2] rust: warn on bindgen < 0.69.5 and libclang >= 19.1

From: Miguel Ojeda
Date: Tue Nov 12 2024 - 06:43:19 EST


On Mon, Nov 11, 2024 at 9:16 PM Miguel Ojeda <ojeda@xxxxxxxxxx> wrote:
>
> When testing a `clang` upgrade with Rust Binder, Alice encountered [1] a
> build failure caused by `bindgen` not translating some symbols related to
> tracepoints. This was caused by commit 2e770edd8ce1 ("[libclang] Compute
> the right spelling location") changing the behavior of a function exposed
> by `libclang`. `bindgen` fixed the regression in commit 600f63895f73
> ("Use clang_getFileLocation instead of clang_getSpellingLocation").
>
> However, the regression fix is only available in `bindgen` versions
> 0.69.5 or later (it was backported for 0.69.x). This means that when
> older bindgen versions are used with new versions of `libclang`, `bindgen`
> may do the wrong thing, which could lead to a build failure.
>
> Alice encountered the bug with some header files related to tracepoints,
> but it could also cause build failures in other circumstances. Thus,
> always emit a warning when using an old `bindgen` with a new `libclang`
> so that other people do not have to spend time chasing down the same
> bug.
>
> However, testing just the version is inconvenient, since distributions
> do patch their packages without changing the version, so I reduced the
> issue into the following piece of code that can trigger the issue:
>
> #define F(x) int x##x
> F(foo);
>
> In particular, an unpatched `bindgen` will ignore the macro expansion
> and thus not provide a declaration for the exported `int`.
>
> Thus add a build test to `rust_is_available.sh` using the code above
> (that is only triggered if the versions appear to be affected), following
> what we did for the 0.66.x issue.
>
> Moreover, I checked the status in the major distributions we have
> instructions for:
>
> - Fedora 41 was affected but is now OK, since it now ships `bindgen`
> 0.69.5.
>
> Thanks Ben for the quick reply on the updates that were ongoing.
>
> Fedora 40 and earlier are OK (older `libclang`, and they also now
> carry `bindgen` 0.69.5).
>
> - Debian Sid was affected but is now OK, since they now ship a patched
> `bindgen` binary (0.66.1-7+b3). The issue was reported to Debian by
> email and then as a bug report [2].
>
> Thanks NoisyCoil and Matthias for the quick replies. NoisyCoil handled
> the needed updates. Debian may upgrade to `bindgen` 0.70.x, too.
>
> Debian Testing is OK (older `libclang` so far).
>
> - Ubuntu non-LTS (oracular) is affected. The issue was reported to Ubuntu
> by email and then as a bug report [3].
>
> Ubuntu LTS is not affected (older `libclang` so far).
>
> - Arch Linux, Gentoo Linux and openSUSE should be OK (newer `bindgen` is
> provided). Nix as well (older `libclang` so far).
>
> This issue was also added to our "live list" that tracks issues around
> distributions [4].
>
> Cc: Ben Beasley <code@xxxxxxxxxxxxxxxxxx>
> Cc: NoisyCoil <noisycoil@xxxxxxxxxxxx>
> Cc: Matthias Geiger <werdahias@xxxxxxxxxx>
> Link: https://lore.kernel.org/rust-for-linux/20241030-bindgen-libclang-warn-v1-1-3a7ba9fedcfe@xxxxxxxxxx/ [1]
> Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1086510 [2]
> Link: https://bugs.launchpad.net/ubuntu/+source/rust-bindgen-cli/+bug/2086639 [3]
> Link: https://github.com/Rust-for-Linux/linux/issues/1127 [4]
> Co-developed-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
> Signed-off-by: Alice Ryhl <aliceryhl@xxxxxxxxxx>
> Signed-off-by: Miguel Ojeda <ojeda@xxxxxxxxxx>
> ---
> We would like to put this into the merge window, or ideally very soon after as a
> "fix" (it is not really a fix, but it is very convenient for people wondering
> why their toolchain may not work, especially if tracepoints land in the merge
> window as expected).
>
> v2 (based on Alice's v1):
> - Fixed libclang version number (we use a different `get_canonical_version`
> that returns one more digit).
> - Added build test -- now we can detect binaries like Debian's that are
> patched but do not change the version number.
> - Added tests.
> - Explained the current status of the distributions in the commit message.

Cc'ing Kbuild too, so that they are aware, just in case -- sorry, I
should have done that in the patch itself yesterday:

https://lore.kernel.org/rust-for-linux/20241111201607.653149-1-ojeda@xxxxxxxxxx/

Cheers,
Miguel