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