[PATCH 19/23] rust: do not use --generate-cstr

Paolo Bonzini posted 23 patches 4 weeks, 1 day ago
[PATCH 19/23] rust: do not use --generate-cstr
Posted by Paolo Bonzini 4 weeks, 1 day ago
--generate-cstr is a good idea and generally the right thing to do,
but it is not available in Debian 12 and Ubuntu 22.04.  Work around
the absence.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build                       |  4 +++-
 rust/hw/char/pl011/src/device.rs  |  1 +
 rust/qemu-api/src/device_class.rs | 10 ++++++++++
 rust/qemu-api/tests/tests.rs      |  4 ++--
 4 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/meson.build b/meson.build
index ab0613f353c..bfd04294850 100644
--- a/meson.build
+++ b/meson.build
@@ -3941,13 +3941,15 @@ common_all = static_library('common',
                             dependencies: common_ss.all_dependencies())
 
 if have_rust
+  # We would like to use --generate-cstr, but it is only available
+  # starting with bindgen 0.66.0.  The oldest supported versions
+  # are in Ubuntu 22.04 (0.59.1) and Debian 12 (0.60.1).
   bindgen_args = [
     '--disable-header-comment',
     '--raw-line', '// @generated',
     '--ctypes-prefix', 'std::os::raw',
     '--formatter', 'rustfmt',
     '--generate-block',
-    '--generate-cstr',
     '--impl-debug',
     '--merge-extern-blocks',
     '--no-doc-comments',
diff --git a/rust/hw/char/pl011/src/device.rs b/rust/hw/char/pl011/src/device.rs
index bca727e37f0..2a85960b81f 100644
--- a/rust/hw/char/pl011/src/device.rs
+++ b/rust/hw/char/pl011/src/device.rs
@@ -12,6 +12,7 @@
     bindings::{self, *},
     c_str,
     definitions::ObjectImpl,
+    device_class::TYPE_SYS_BUS_DEVICE,
 };
 
 use crate::{
diff --git a/rust/qemu-api/src/device_class.rs b/rust/qemu-api/src/device_class.rs
index 56608c7f7fc..0ba798d3e3c 100644
--- a/rust/qemu-api/src/device_class.rs
+++ b/rust/qemu-api/src/device_class.rs
@@ -2,6 +2,10 @@
 // Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
 // SPDX-License-Identifier: GPL-2.0-or-later
 
+use std::ffi::CStr;
+
+use crate::bindings;
+
 #[macro_export]
 macro_rules! device_class_init {
     ($func:ident, props => $props:ident, realize_fn => $realize_fn:expr, legacy_reset_fn => $legacy_reset_fn:expr, vmsd => $vmsd:ident$(,)*) => {
@@ -62,3 +66,9 @@ macro_rules! declare_properties {
         ];
     };
 }
+
+// workaround until we can use --generate-cstr in bindgen.
+pub const TYPE_DEVICE: &CStr =
+    unsafe { CStr::from_bytes_with_nul_unchecked(bindings::TYPE_DEVICE) };
+pub const TYPE_SYS_BUS_DEVICE: &CStr =
+    unsafe { CStr::from_bytes_with_nul_unchecked(bindings::TYPE_SYS_BUS_DEVICE) };
diff --git a/rust/qemu-api/tests/tests.rs b/rust/qemu-api/tests/tests.rs
index 7442f695646..43a4827de12 100644
--- a/rust/qemu-api/tests/tests.rs
+++ b/rust/qemu-api/tests/tests.rs
@@ -8,7 +8,7 @@
     bindings::*,
     c_str, declare_properties, define_property,
     definitions::{Class, ObjectImpl},
-    device_class_init,
+    device_class, device_class_init,
     zeroable::Zeroable,
 };
 
@@ -57,7 +57,7 @@ impl ObjectImpl for DummyState {
         type Class = DummyClass;
         const TYPE_INFO: qemu_api::bindings::TypeInfo = qemu_api::type_info! { Self };
         const TYPE_NAME: &'static CStr = c_str!("dummy");
-        const PARENT_TYPE_NAME: Option<&'static CStr> = Some(TYPE_DEVICE);
+        const PARENT_TYPE_NAME: Option<&'static CStr> = Some(device_class::TYPE_DEVICE);
         const ABSTRACT: bool = false;
         const INSTANCE_INIT: Option<unsafe extern "C" fn(obj: *mut Object)> = None;
         const INSTANCE_POST_INIT: Option<unsafe extern "C" fn(obj: *mut Object)> = None;
-- 
2.47.0
Re: [PATCH 19/23] rust: do not use --generate-cstr
Posted by Michael Tokarev 4 weeks ago
25.10.2024 19:02, Paolo Bonzini wrote:
> --generate-cstr is a good idea and generally the right thing to do,
> but it is not available in Debian 12 and Ubuntu 22.04.  Work around
> the absence.

Can't we just install a more recent bindgen and use all the current
features of it, like it's done in patch 22 for ubuntu?

/mjt
Re: [PATCH 19/23] rust: do not use --generate-cstr
Posted by Paolo Bonzini 4 weeks ago
Il ven 25 ott 2024, 22:03 Michael Tokarev <mjt@tls.msk.ru> ha scritto:

> 25.10.2024 19:02, Paolo Bonzini wrote:
> > --generate-cstr is a good idea and generally the right thing to do,
> > but it is not available in Debian 12 and Ubuntu 22.04.  Work around
> > the absence.
>
> Can't we just install a more recent bindgen and use all the current
> features of it, like it's done in patch 22 for ubuntu?
>

The idea is that Ubuntu will get the memo and add an updated bindgen, since
they did update rustc to 1.75.0... so hopefully even that change in patch
22 is temporary.

This patch is only a minor nuisance and we'll only need it for about a year.

Paolo

/mjt
>
>
Re: [PATCH 19/23] rust: do not use --generate-cstr
Posted by Pierrick Bouvier 4 weeks ago
On 10/25/24 13:03, Michael Tokarev wrote:
> 25.10.2024 19:02, Paolo Bonzini wrote:
>> --generate-cstr is a good idea and generally the right thing to do,
>> but it is not available in Debian 12 and Ubuntu 22.04.  Work around
>> the absence.
> 
> Can't we just install a more recent bindgen and use all the current
> features of it, like it's done in patch 22 for ubuntu?
> 

Users yes, but distros expect to be able to use their packaged version.

> /mjt
>
Re: [PATCH 19/23] rust: do not use --generate-cstr
Posted by Michael Tokarev 4 weeks ago
25.10.2024 23:06, Pierrick Bouvier wrote:
> On 10/25/24 13:03, Michael Tokarev wrote:
>> 25.10.2024 19:02, Paolo Bonzini wrote:
>>> --generate-cstr is a good idea and generally the right thing to do,
>>> but it is not available in Debian 12 and Ubuntu 22.04.  Work around
>>> the absence.
>>
>> Can't we just install a more recent bindgen and use all the current
>> features of it, like it's done in patch 22 for ubuntu?
> 
> Users yes, but distros expect to be able to use their packaged version.

Pretty please do not target rust in qemu for *currently* supported
distros.  For debian bookworm it is already way too late, - for
bookworm as a distro, qemu with rust is hopeless, it is possible
only with trixie and up.

Users wishing to experiment can install more recent packages, for
qemu ci it is the way to go too using the way in patch 22, and that's
it.  There's no need to sacrifice qemu rust code for current debian
stable.  rust is already too volatile by its own, and targeting
that wide range of versions is insane.

/mjt


Re: [PATCH 19/23] rust: do not use --generate-cstr
Posted by Pierrick Bouvier 4 weeks ago
On 10/25/24 13:10, Michael Tokarev wrote:
> 25.10.2024 23:06, Pierrick Bouvier wrote:
>> On 10/25/24 13:03, Michael Tokarev wrote:
>>> 25.10.2024 19:02, Paolo Bonzini wrote:
>>>> --generate-cstr is a good idea and generally the right thing to do,
>>>> but it is not available in Debian 12 and Ubuntu 22.04.  Work around
>>>> the absence.
>>>
>>> Can't we just install a more recent bindgen and use all the current
>>> features of it, like it's done in patch 22 for ubuntu?
>>
>> Users yes, but distros expect to be able to use their packaged version.
> 
> Pretty please do not target rust in qemu for *currently* supported
> distros.  For debian bookworm it is already way too late, - for
> bookworm as a distro, qemu with rust is hopeless, it is possible
> only with trixie and up.
> 
> Users wishing to experiment can install more recent packages, for
> qemu ci it is the way to go too using the way in patch 22, and that's
> it.  There's no need to sacrifice qemu rust code for current debian
> stable.  rust is already too volatile by its own, and targeting
> that wide range of versions is insane.
> 

It's the goal of this series, and with changes included, it can be built 
on debian stable (with packaged rustc/bindgen).

> /mjt
>