🎱
On 8/28/2024 9:08 PM, Alex Bennée wrote:
> Manos Pitsidianakis <manos.pitsidianakis@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.
Indeed. These are in the compiler's own header files. I had problems on Debian when using clang-14 and clang-15 but I got rid of them after I upgraded to newer versions. If anyone can confirm/reproduce this we can add a meson warning check?
>
> 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)
>