Paolo Bonzini <pbonz...@redhat.com> writes:
> 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. I just noticed that rust-analyzer is able to include files under OUT_DIR. With the following changes, rust-analyzer under meson devenv works nicely: 1. Rust-analyzer refers to rust/qemu-api/src/* unless the definition is in bindings.inc.rs. 2. No manual copy / symbolic link required, neither bindings.inc.rs nor rust-project.json. The bindgen-generated file is renamed to bindings.inc.rs only because rust-analyzer seems to refuse including a file without the .rs suffix. That's at the cost of another file copy, though. --- diff starts here --- diff --git a/meson.build b/meson.build index 1239f5c48c..8cea09ffe1 100644 --- a/meson.build +++ b/meson.build @@ -4,6 +4,7 @@ project('qemu', ['c'], meson_version: '>=1.5.0', version: files('VERSION')) meson.add_devenv({ 'MESON_BUILD_ROOT' : meson.project_build_root() }) +meson.add_devenv({ 'CARGO_TARGET_DIR' : meson.project_build_root() / 'cargo' }) add_test_setup('quick', exclude_suites: ['slow', 'thorough'], is_default: true) add_test_setup('slow', exclude_suites: ['thorough'], env: ['G_TEST_SLOW=1', 'SPEED=slow']) @@ -4083,7 +4084,7 @@ if have_rust bindings_rs = rust.bindgen( input: 'rust/wrapper.h', dependencies: common_ss.all_dependencies(), - output: 'bindings.rs.inc', + output: 'bindings.inc.rs', include_directories: include_directories('.', 'include'), bindgen_version: ['>=0.60.0'], args: bindgen_args, diff --git a/rust/qemu-api/build.rs b/rust/qemu-api/build.rs index d7b6d76828..1de86c721b 100644 --- a/rust/qemu-api/build.rs +++ b/rust/qemu-api/build.rs @@ -2,17 +2,17 @@ // Author(s): Manos Pitsidianakis <manos.pitsidiana...@linaro.org> // SPDX-License-Identifier: GPL-2.0-or-later -use std::{env, path::Path}; +use std::{env, fs::copy, io::Result, path::Path}; use version_check as rustc; -fn main() { +fn main() -> Result<()> { // Placing bindings.rs.inc in the source directory is supported // but not documented or encouraged. let path = env::var("MESON_BUILD_ROOT") .unwrap_or_else(|_| format!("{}/src", env!("CARGO_MANIFEST_DIR"))); - let file = format!("{}/bindings.rs.inc", path); + let file = format!("{}/bindings.inc.rs", path); if !Path::new(&file).exists() { panic!(concat!( "\n", @@ -24,7 +24,9 @@ fn main() { )); } - println!("cargo:rustc-env=BINDINGS_RS_INC={}", file); + let out_dir = env::var("OUT_DIR").unwrap(); + let dest_path = format!("{}/bindings.inc.rs", out_dir); + copy(&file, Path::new(&dest_path))?; // Check for available rustc features if rustc::is_min_version("1.77.0").unwrap_or(false) { @@ -32,4 +34,6 @@ fn main() { } println!("cargo:rerun-if-changed=build.rs"); + + Ok(()) } diff --git a/rust/qemu-api/src/bindings.rs b/rust/qemu-api/src/bindings.rs index 972b1f1ee9..8a9b821bb9 100644 --- a/rust/qemu-api/src/bindings.rs +++ b/rust/qemu-api/src/bindings.rs @@ -16,10 +16,10 @@ )] #[cfg(MESON)] -include!("bindings.rs.inc"); +include!("bindings.inc.rs"); #[cfg(not(MESON))] -include!(env!("BINDINGS_RS_INC")); +include!(concat!(env!("OUT_DIR"), "/bindings.inc.rs")); unsafe impl Send for Property {} unsafe impl Sync for Property {} -- Best Regards Junjie Mao > > Paolo > > We can perhaps leave it as a separate topic for another series. > > [1] https://github.com/rust-lang/rust-analyzer/issues/17040 >