[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 03/49] rust: allow using build-root bindings.rs from cargo
From: |
Paolo Bonzini |
Subject: |
[PULL 03/49] rust: allow using build-root bindings.rs from cargo |
Date: |
Wed, 11 Dec 2024 17:26:33 +0100 |
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>
---
meson.build | 4 +++-
rust/hw/char/pl011/.gitignore | 2 --
rust/qemu-api/.gitignore | 2 +-
rust/qemu-api/README.md | 4 ++--
rust/qemu-api/build.rs | 34 +++++++++++++++++++++++++++-------
rust/qemu-api/meson.build | 1 +
rust/qemu-api/src/bindings.rs | 29 +++++++++++++++++++++++++++++
rust/qemu-api/src/lib.rs | 22 ----------------------
8 files changed, 63 insertions(+), 35 deletions(-)
delete mode 100644 rust/hw/char/pl011/.gitignore
create mode 100644 rust/qemu-api/src/bindings.rs
diff --git a/meson.build b/meson.build
index c35ce64cd61..ea211c2dbb4 100644
--- a/meson.build
+++ b/meson.build
@@ -3,6 +3,8 @@ project('qemu', ['c'], meson_version: '>=1.5.0',
'b_staticpic=false', 'stdsplit=false',
'optimization=2', 'b_pie=true'],
version: files('VERSION'))
+meson.add_devenv({ 'MESON_BUILD_ROOT' : meson.project_build_root() })
+
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'])
add_test_setup('thorough', env: ['G_TEST_SLOW=1', 'SPEED=thorough'])
@@ -4090,7 +4092,7 @@ if have_rust
bindings_rs = rust.bindgen(
input: 'rust/wrapper.h',
dependencies: common_ss.all_dependencies(),
- output: 'bindings.rs',
+ output: 'bindings.inc.rs',
include_directories: include_directories('.', 'include'),
bindgen_version: ['>=0.60.0'],
args: bindgen_args,
diff --git a/rust/hw/char/pl011/.gitignore b/rust/hw/char/pl011/.gitignore
deleted file mode 100644
index 71eaff2035d..00000000000
--- a/rust/hw/char/pl011/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-# Ignore generated bindings file overrides.
-src/bindings.rs.inc
diff --git a/rust/qemu-api/.gitignore b/rust/qemu-api/.gitignore
index b9e7e004c86..df6c2163e03 100644
--- a/rust/qemu-api/.gitignore
+++ b/rust/qemu-api/.gitignore
@@ -1,2 +1,2 @@
# Ignore generated bindings file overrides.
-src/bindings.rs
+/src/bindings.inc.rs
diff --git a/rust/qemu-api/README.md b/rust/qemu-api/README.md
index 7588fa29ef3..53810f48882 100644
--- a/rust/qemu-api/README.md
+++ b/rust/qemu-api/README.md
@@ -5,7 +5,7 @@ This library exports helper Rust types, Rust macros and C FFI
bindings for inter
The C bindings can be generated with `bindgen`, using this build target:
```console
-$ ninja bindings.rs
+$ ninja bindings.inc.rs
```
## Generate Rust documentation
@@ -13,5 +13,5 @@ $ ninja bindings.rs
To generate docs for this crate, including private items:
```sh
-cargo doc --no-deps --document-private-items
+pyvenv/bin/meson devenv -w ../rust cargo doc --no-deps --document-private-items
```
diff --git a/rust/qemu-api/build.rs b/rust/qemu-api/build.rs
index 20f8f718b90..40644d5e4fe 100644
--- a/rust/qemu-api/build.rs
+++ b/rust/qemu-api/build.rs
@@ -2,22 +2,42 @@
// 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) {
println!("cargo:rustc-cfg=has_offset_of");
}
println!("cargo:rerun-if-changed=build.rs");
+ Ok(())
}
diff --git a/rust/qemu-api/meson.build b/rust/qemu-api/meson.build
index cad9ac4844e..3be7b7e5ced 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..0b76ec58bee
--- /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.inc.rs");
+
+#[cfg(not(MESON))]
+include!(concat!(env!("OUT_DIR"), "/bindings.inc.rs"));
+
+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;
--
2.47.1
- [PULL 00/49] rust, QOM, kvm changes for 2024-12-11, Paolo Bonzini, 2024/12/11
- [PULL 01/49] ci: enable rust in the Debian and Ubuntu system build job, Paolo Bonzini, 2024/12/11
- [PULL 02/49] rust: apply --cfg MESON to all crates, Paolo Bonzini, 2024/12/11
- [PULL 04/49] rust: build: move rustc_args.py invocation to qemu-api crate, Paolo Bonzini, 2024/12/11
- [PULL 05/49] rust: build: restrict --cfg generation to only required symbols, Paolo Bonzini, 2024/12/11
- [PULL 03/49] rust: allow using build-root bindings.rs from cargo,
Paolo Bonzini <=
- [PULL 06/49] rust: build: generate lint flags from Cargo.toml, Paolo Bonzini, 2024/12/11
- [PULL 07/49] rust: cargo: store desired warning levels in workspace Cargo.toml, Paolo Bonzini, 2024/12/11
- [PULL 09/49] rust: fix a couple style issues from clippy, Paolo Bonzini, 2024/12/11
- [PULL 10/49] rust: build: establish a baseline of lints across all crates, Paolo Bonzini, 2024/12/11
- [PULL 11/49] rust: build: add "make clippy", "make rustfmt", "make rustdoc", Paolo Bonzini, 2024/12/11
- [PULL 13/49] rust: fix doc test syntax, Paolo Bonzini, 2024/12/11
- [PULL 08/49] rust: build: move strict lints handling to rustc_args.py, Paolo Bonzini, 2024/12/11
- [PULL 14/49] rust/qemu-api: Fix fragment-specifiers in define_property macro, Paolo Bonzini, 2024/12/11
- [PULL 12/49] rust: ci: add job that runs Rust tools, Paolo Bonzini, 2024/12/11
- [PULL 15/49] clock: clear callback on unparent, Paolo Bonzini, 2024/12/11