Il mar 12 nov 2024, 03:47 Junjie Mao <junjie....@hotmail.com> ha scritto:
> I agree that storing generated stuff in the source directory should not > be encouraged. > > Just want to mention that such changes can lead to trouble to > rust-analyzer. Today there are two ways to inform rust-analyzer of the > project structure: > > 1. Use rust/Cargo.toml. In this case we'll hit an issue in > rust-analyzer [1] that prevents it from including sources outside the > crate directory. Thus, definitions in the bindgen-generated code > cannot be found. > > 2. Use the meson-generated rust-project.json. Due to the use of > structured_sources(), that json file refers to the copied sources of > qemu-api in the build directory. Rust-analyzer can find every symbol > in the qemu-api crate but will jump to those copied files, making it a > bit more annoying when developing the crate. > Would it help to move the bindgen-generated code to a completely separate crate (e.g. qemu-api-sys), and avoid structured_sources for qemu-api? It might even help build times. Paolo We can perhaps leave it as a separate topic for another series. > > [1] https://github.com/rust-lang/rust-analyzer/issues/17040 > > -- > Best Regards > Junjie Mao > > > + let path = env::var("MESON_BUILD_ROOT") > > + .unwrap_or_else(|_| format!("{}/src", > env!("CARGO_MANIFEST_DIR"))); > > + > > + let file = format!("{}/bindings.rs.inc", path); > > + if !Path::new(&file).exists() { > > + panic!(concat!( > > + "No generated C bindings found! If you want to run `cargo`, > start a subshell\n", > > + "with `meson devenv`, or point MESON_BUILD_ROOT to the top > of the build tree." > > + )); > > } > > > > + println!("cargo:rustc-env=BINDINGS_RS_INC={}", file); > > + > > // Check for available rustc features > > if rustc::is_min_version("1.77.0").unwrap_or(false) { > > println!("cargo:rustc-cfg=has_offset_of"); > > diff --git a/rust/qemu-api/meson.build b/rust/qemu-api/meson.build > > index 6f637af7b1b..e3870e901e3 100644 > > --- a/rust/qemu-api/meson.build > > +++ b/rust/qemu-api/meson.build > > @@ -9,6 +9,7 @@ _qemu_api_rs = static_library( > > structured_sources( > > [ > > 'src/lib.rs', > > + 'src/bindings.rs', > > 'src/c_str.rs', > > 'src/definitions.rs', > > 'src/device_class.rs', > > diff --git a/rust/qemu-api/src/bindings.rs b/rust/qemu-api/src/ > bindings.rs > > new file mode 100644 > > index 00000000000..1dac310594d > > --- /dev/null > > +++ b/rust/qemu-api/src/bindings.rs > > @@ -0,0 +1,29 @@ > > +// SPDX-License-Identifier: GPL-2.0-or-later > > +#![allow( > > + dead_code, > > + improper_ctypes_definitions, > > + improper_ctypes, > > + non_camel_case_types, > > + non_snake_case, > > + non_upper_case_globals, > > + unsafe_op_in_unsafe_fn, > > + clippy::missing_const_for_fn, > > + clippy::too_many_arguments, > > + clippy::approx_constant, > > + clippy::use_self, > > + clippy::useless_transmute, > > + clippy::missing_safety_doc > > +)] > > + > > +#[cfg(MESON)] > > +include!("bindings.rs.inc"); > > + > > +#[cfg(not(MESON))] > > +include!(env!("BINDINGS_RS_INC")); > > + > > +unsafe impl Send for Property {} > > +unsafe impl Sync for Property {} > > +unsafe impl Sync for TypeInfo {} > > +unsafe impl Sync for VMStateDescription {} > > +unsafe impl Sync for VMStateField {} > > +unsafe impl Sync for VMStateInfo {} > > diff --git a/rust/qemu-api/src/lib.rs b/rust/qemu-api/src/lib.rs > > index aa8d16ec94b..440aff3817d 100644 > > --- a/rust/qemu-api/src/lib.rs > > +++ b/rust/qemu-api/src/lib.rs > > @@ -4,31 +4,9 @@ > > > > #![cfg_attr(not(MESON), doc = include_str!("../README.md"))] > > > > -#[allow( > > - dead_code, > > - improper_ctypes_definitions, > > - improper_ctypes, > > - non_camel_case_types, > > - non_snake_case, > > - non_upper_case_globals, > > - unsafe_op_in_unsafe_fn, > > - clippy::missing_const_for_fn, > > - clippy::too_many_arguments, > > - clippy::approx_constant, > > - clippy::use_self, > > - clippy::useless_transmute, > > - clippy::missing_safety_doc, > > -)] > > #[rustfmt::skip] > > pub mod bindings; > > > > -unsafe impl Send for bindings::Property {} > > -unsafe impl Sync for bindings::Property {} > > -unsafe impl Sync for bindings::TypeInfo {} > > -unsafe impl Sync for bindings::VMStateDescription {} > > -unsafe impl Sync for bindings::VMStateField {} > > -unsafe impl Sync for bindings::VMStateInfo {} > > - > > pub mod c_str; > > pub mod definitions; > > pub mod device_class; > >