qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH RESEND v9 7/9] rust: add crate to expose bindings and interfa


From: Manos Pitsidianakis
Subject: Re: [PATCH RESEND v9 7/9] rust: add crate to expose bindings and interfaces
Date: Fri, 30 Aug 2024 09:43:38 +0300

🎱

On Fri, 30 Aug 2024, 04:19 Junjie Mao, <junjie.mao@intel.com> wrote:
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)
>

reply via email to

[Prev in Thread] Current Thread [Next in Thread]