[PATCH] meson: detect bindgen and LLVM 22 incompatibility

marcandre.lureau@redhat.com posted 1 patch 2 weeks, 4 days ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20260707202640.2099841-1-marcandre.lureau@redhat.com
Maintainers: Paolo Bonzini <pbonzini@redhat.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, "Daniel P. Berrangé" <berrange@redhat.com>, "Philippe Mathieu-Daudé" <philmd@mailo.com>, Pierrick Bouvier <pierrick.bouvier@oss.qualcomm.com>
meson.build | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
[PATCH] meson: detect bindgen and LLVM 22 incompatibility
Posted by marcandre.lureau@redhat.com 2 weeks, 4 days ago
From: Marc-André Lureau <marcandre.lureau@redhat.com>

bindgen < 0.72.1 linked against libclang >= 22 generates opaque structs
for C types declared with "typedef struct X X;" forward declarations,
common in QEMU. The struct fields are missing from the generated Rust
bindings. For example, with bindgen 0.71.x and LLVM 22, a struct like:

  typedef struct VMStateField VMStateField;
  struct VMStateField {
      const char *name;
      int version_id;
  };

produces:

  pub struct VMStateField {
      pub _address: u8,
  }

instead of:

  pub struct VMStateField {
      pub name: *const c_char,
      pub version_id: c_int,
  }

The build then fails with:
  error[E0609]: no field `version_id` on type `VMStateField`
  error[E0609]: no field `flags` on type `VMStateField`
  error[E0560]: struct `util_sys::Error` has no field named `msg`

Check the bindgen version against llvm-config at configure time. With
-Drust=enabled, error out; with -Drust=auto, disable Rust and suggest
the upgrade.

Signed-off-by: Marc-Andre Lureau <marcandre.lureau@redhat.com>
---
 meson.build | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/meson.build b/meson.build
index 164328ded83..c965cef352e 100644
--- a/meson.build
+++ b/meson.build
@@ -125,6 +125,25 @@ if have_rust
       have_rust = false
     endif
   endif
+
+  # bindgen < 0.72.1 generates opaque structs for "typedef struct X X;"
+  # patterns when linked against libclang >= 22.
+  if have_rust and bindgen.version().version_compare('<0.72.1')
+    llvm_config = find_program('llvm-config', required: false)
+    if llvm_config.found()
+      llvm_version = run_command(llvm_config, '--version',
+                                 check: true).stdout().strip()
+      if llvm_version.version_compare('>=22.0.0')
+        if get_option('rust').enabled()
+          error('bindgen ' + bindgen.version() + ' is incompatible with LLVM ' + llvm_version + '. ' +
+                'Please upgrade with "cargo install --locked bindgen-cli@0.72.1"')
+        else
+          warning('bindgen ' + bindgen.version() + ' is incompatible with LLVM ' + llvm_version + ', disabling Rust.')
+          have_rust = false
+        endif
+      endif
+    endif
+  endif
 endif
 
 if have_rust
-- 
2.55.0