On 8/28/2024 9:08 PM, Alex Bennée wrote:
Manos Pitsidianakis <manos.pitsidiana...@linaro.org> writes:

Add rust/qemu-api, which exposes rust-bindgen generated FFI bindings and
provides some declaration macros for symbols visible to the rest of
QEMU.

As mentioned on IRC I'm hitting a compilation error that bisects to this
commit:

   [148/1010] Generating bindings for Rust rustmod-bindgen-rust_wrapper.h
   FAILED: bindings.rs
   /home/alex/.cargo/bin/bindgen ../../rust/wrapper.h --output 
/home/alex/lsrc/qemu.git/builds/rust/bindings.rs --disable-header-comment 
--raw-line '// @generated' --ctypes-prefix core::ffi --formatter rustfmt 
--generate-block --generate-cstr --impl-debug --merge-extern-blocks 
--no-doc-comments --use-core --with-derive-default --allowlist-file 
'/home/alex/lsrc/qemu.git/include/.*' --allowlist-file 
'/home/alex/lsrc/qemu.git/.*' --allowlist-file 
'/home/alex/lsrc/qemu.git/builds/rust/.*' -- -I/home/alex/lsrc/qemu.git/. 
-I/home/alex/lsrc/qemu.git/builds/rust/. -I/home/alex/lsrc/qemu.git/include 
-I/home/alex/lsrc/qemu.git/builds/rust/include -I/usr/include/capstone 
-I/usr/include/p11-kit-1 -I/usr/include/pixman-1 -I/usr/include/libpng16 
-I/usr/include/spice-server -I/usr/include/spice-1 -I/usr/include/spice-1 
-DSTRUCT_IOVEC_DEFINED -I/usr/include/libusb-1.0 -I/usr/include/SDL2 
-D_REENTRANT -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -pthread -I/usr/include/libmount 
-I/usr/include/blkid -I/usr/include/gio-unix-2.0 -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -pthread -I/usr/include/libmount 
-I/usr/include/blkid -I/usr/include/slirp -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -DNCURSES_WIDECHAR=1 
-D_DEFAULT_SOURCE -D_XOPEN_SOURCE=600 -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/gtk-3.0 
-I/usr/include/pango-1.0 -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/harfbuzz 
-I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libmount 
-I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/cairo 
-I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 
-I/usr/include/x86_64-linux-gnu -I/usr/include/gio-unix-2.0 
-I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 
-I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -pthread 
-I/usr/include/gtk-3.0 -I/usr/include/pango-1.0 -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/harfbuzz 
-I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/libmount 
-I/usr/include/blkid -I/usr/include/fribidi -I/usr/include/cairo 
-I/usr/include/pixman-1 -I/usr/include/gdk-pixbuf-2.0 
-I/usr/include/x86_64-linux-gnu -I/usr/include/gio-unix-2.0 
-I/usr/include/atk-1.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 
-I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -pthread 
-I/usr/include/vte-2.91 -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/libmount 
-I/usr/include/blkid -I/usr/include/pango-1.0 -I/usr/include/harfbuzz 
-I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/fribidi 
-I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/gtk-3.0 
-I/usr/include/gdk-pixbuf-2.0 -I/usr/include/x86_64-linux-gnu 
-I/usr/include/gio-unix-2.0 -I/usr/include/atk-1.0 
-I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 
-I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -pthread 
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include 
-I/usr/include/spice-server -I/usr/include/spice-1 -I/usr/include/cacard 
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include 
-I/usr/include/nss -I/usr/include/nspr -I/usr/include/PCSC -pthread 
-D_REENTRANT -I/usr/include/pipewire-0.3 -I/usr/include/spa-0.2 -D_REENTRANT 
-I/usr/include/p11-kit-1 -I/usr/include/fuse3 -I/usr/include/x86_64-linux-gnu 
-D_FILE_OFFSET_BITS=64 -D__USE_FILE_OFFSET64 -D__USE_LARGEFILE64 
-DUSE_POSIX_ACLS=1 -I/usr/include/uuid -I/usr/include/glib-2.0 
-I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/p11-kit-1 
-I/usr/include/p11-kit-1 -I/usr/include/p11-kit-1 -I/usr/include/p11-kit-1 
-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE 
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -std=gnu11 
-MD -MQ ../../rust/wrapper.h -MF wrapper.h.d
   /usr/include/liburing.h:296:3: error: use of undeclared identifier 
'memory_order_release'
   /usr/include/liburing.h:1080:11: error: use of undeclared identifier 
'memory_order_acquire'
   /usr/include/liburing.h:1116:9: error: use of undeclared identifier 
'memory_order_acquire'
   /usr/include/liburing.h:1125:9: error: use of undeclared identifier 
'memory_order_relaxed'
   /usr/include/liburing.h:1161:2: error: use of undeclared identifier 
'memory_order_relaxed'
   /usr/include/liburing.h:1197:19: error: use of undeclared identifier 
'memory_order_acquire'
   /usr/include/liburing.h:1267:10: error: use of undeclared identifier 
'memory_order_relaxed'
   /usr/include/liburing.h:1269:10: error: use of undeclared identifier 
'memory_order_acquire'
   /usr/include/liburing.h:1320:2: error: use of undeclared identifier 
'memory_order_release'
   panicked at 
/home/alex/.cargo/registry/src/index.crates.io-6f17d22bba15001f/bindgen-cli-0.69.4/main.rs:52:36:
   Unable to generate bindings: ClangDiagnostic("/usr/include/liburing.h:296:3: 
error: use of undeclared identifier 
'memory_order_release'\n/usr/include/liburing.h:1080:11: error: use of undeclared 
identifier 'memory_order_acquire'\n/usr/include/liburing.h:1116:9: error: use of 
undeclared identifier 'memory_order_acquire'\n/usr/include/liburing.h:1125:9: error: use 
of undeclared identifier 'memory_order_relaxed'\n/usr/include/liburing.h:1161:2: error: 
use of undeclared identifier 'memory_order_relaxed'\n/usr/include/liburing.h:1197:19: 
error: use of undeclared identifier 
'memory_order_acquire'\n/usr/include/liburing.h:1267:10: error: use of undeclared 
identifier 'memory_order_relaxed'\n/usr/include/liburing.h:1269:10: error: use of 
undeclared identifier 'memory_order_acquire'\n/usr/include/liburing.h:1320:2: error: use 
of undeclared identifier 'memory_order_release'\n")

Those missing identifiers should have been defined in stdatomic.h which is part of C11. You can check if that header exists under the default header search paths (which is listed by clang -E -Wp,-v -) and whether that file declares those enum constants. If so, you can further check whether there is any stdatomic.h elsewhere that shadows the standard one.


And I wasn't able to force the newer clang with:

   env CLANG_PATH=/usr/bin/clang-15 ../../configure '--disable-docs' 
--target-list=aarch64-softmmu --enable-rust

So if clang is required for bindgen we at least need:

   - to probe for clang (separately from --cc)
   - allow the user to override the default
   - pass the clang we want to use somehow to bindgen

Briefly looking at the bindgen code I see:

   fn main() {
       let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());

       let mut dst =
           File::create(Path::new(&out_dir).join("host-target.txt")).unwrap();
       dst.write_all(env::var("TARGET").unwrap().as_bytes())
           .unwrap();

       // On behalf of clang_sys, rebuild ourselves if important configuration
       // variables change, to ensure that bindings get rebuilt if the
       // underlying libclang changes.
       println!("cargo:rerun-if-env-changed=LLVM_CONFIG_PATH");
       println!("cargo:rerun-if-env-changed=LIBCLANG_PATH");
       println!("cargo:rerun-if-env-changed=LIBCLANG_STATIC_PATH");
       println!("cargo:rerun-if-env-changed=BINDGEN_EXTRA_CLANG_ARGS");
       println!(
           "cargo:rerun-if-env-changed=BINDGEN_EXTRA_CLANG_ARGS_{}",
           std::env::var("TARGET").unwrap()
       );
       println!(
           "cargo:rerun-if-env-changed=BINDGEN_EXTRA_CLANG_ARGS_{}",
           std::env::var("TARGET").unwrap().replace('-', "_")
       );
   }

This is build.rs which is a build script invoked by cargo. The entry of the bindgen executable is in the bindgen-cli crate.

---
Best Regards
Junjie Mao


So I wonder if this depends on what libclang versions can be found when
cargo builds it? Although if it does it must do so dynamically:

   $ ldd /home/alex/.cargo/bin/bindgen
           linux-vdso.so.1 (0x00007f7cb43d8000)
           libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 
(0x00007f7cb438c000)
           libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f7cb42ad000)
           libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f7cb3a1f000)
           /lib64/ld-linux-x86-64.so.2 (0x00007f7cb43da000)

Reply via email to