aboutsummaryrefslogtreecommitdiff
path: root/rust/qemu-api/build.rs
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2024-11-12 11:52:23 +0100
committerPaolo Bonzini <pbonzini@redhat.com>2024-12-10 18:44:06 +0100
commitcb7ada5409f171dae364f206a7fe3ff30fcba7cb (patch)
tree5fc025795b5e9db9902ff0b1590b768f937c241b /rust/qemu-api/build.rs
parent8c2866750319fac3f7b641d1a097f3779952631d (diff)
downloadqemu-cb7ada5409f171dae364f206a7fe3ff30fcba7cb.zip
qemu-cb7ada5409f171dae364f206a7fe3ff30fcba7cb.tar.gz
qemu-cb7ada5409f171dae364f206a7fe3ff30fcba7cb.tar.bz2
rust: allow using build-root bindings.rs from cargo
Right now, using cargo with QEMU requires copying by hand the bindings.rs to the source tree. Instead, we can use an include file to escape the cage of cargo's mandated source directory structure. By running cargo within meson's "devenv" and adding a MESON_BUILD_ROOT environment variable, it is easy for build.rs to find the file. However, the file must be symlinked into cargo's output directory for rust-analyzer to find it. Suggested-by: Junjie Mao <junjie.mao@hotmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'rust/qemu-api/build.rs')
-rw-r--r--rust/qemu-api/build.rs34
1 files changed, 27 insertions, 7 deletions
diff --git a/rust/qemu-api/build.rs b/rust/qemu-api/build.rs
index 20f8f71..40644d5 100644
--- a/rust/qemu-api/build.rs
+++ b/rust/qemu-api/build.rs
@@ -2,17 +2,36 @@
// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
// SPDX-License-Identifier: GPL-2.0-or-later
-use std::path::Path;
+#[cfg(unix)]
+use std::os::unix::fs::symlink as symlink_file;
+#[cfg(windows)]
+use std::os::windows::fs::symlink_file;
+use std::{env, fs::remove_file, io::Result, path::Path};
use version_check as rustc;
-fn main() {
- if !Path::new("src/bindings.rs").exists() {
- panic!(
- "No generated C bindings found! Either build them manually with bindgen or with meson \
- (`ninja bindings.rs`) and copy them to src/bindings.rs, or build through meson."
- );
+fn main() -> Result<()> {
+ // Placing bindings.inc.rs 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.inc.rs", path);
+ let file = Path::new(&file);
+ 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."
+ ));
+ }
+
+ let out_dir = env::var("OUT_DIR").unwrap();
+ let dest_path = format!("{}/bindings.inc.rs", out_dir);
+ let dest_path = Path::new(&dest_path);
+ if dest_path.symlink_metadata().is_ok() {
+ remove_file(dest_path)?;
}
+ symlink_file(file, dest_path)?;
// Check for available rustc features
if rustc::is_min_version("1.77.0").unwrap_or(false) {
@@ -20,4 +39,5 @@ fn main() {
}
println!("cargo:rerun-if-changed=build.rs");
+ Ok(())
}