qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/2] rust: prepare for multiple bindgen invocations
@ 2025-06-13 13:02 Paolo Bonzini
  2025-06-13 13:02 ` [PATCH 1/2] rust: prepare variable definitions " Paolo Bonzini
  2025-06-13 13:02 ` [PATCH 2/2] rust: move rust.bindgen to qemu-api crate Paolo Bonzini
  0 siblings, 2 replies; 5+ messages in thread
From: Paolo Bonzini @ 2025-06-13 13:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-rust, tanishdesai37

This is a preparation for the splitting of qemu-api in multiple
crates.  While I didn't do that yet, I am doing this part early
just in case it comes in handy for the Rust implementation of
tracing.

Paolo

Paolo Bonzini (2):
  rust: prepare variable definitions for multiple bindgen invocations
  rust: move rust.bindgen to qemu-api crate

 meson.build                   | 52 +++++------------------------------
 rust/{ => qemu-api}/wrapper.h |  0
 rust/meson.build              |  4 ++-
 rust/qemu-api/meson.build     | 43 ++++++++++++++++++++++++++++-
 4 files changed, 52 insertions(+), 47 deletions(-)
 rename rust/{ => qemu-api}/wrapper.h (100%)

-- 
2.49.0



^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH 1/2] rust: prepare variable definitions for multiple bindgen invocations
  2025-06-13 13:02 [PATCH 0/2] rust: prepare for multiple bindgen invocations Paolo Bonzini
@ 2025-06-13 13:02 ` Paolo Bonzini
  2025-06-20 10:07   ` Zhao Liu
  2025-06-13 13:02 ` [PATCH 2/2] rust: move rust.bindgen to qemu-api crate Paolo Bonzini
  1 sibling, 1 reply; 5+ messages in thread
From: Paolo Bonzini @ 2025-06-13 13:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-rust, tanishdesai37

When splitting the QEMU Rust bindings into multiple crates, the
bindgen-generated structs also have to be split so that it's
possible to add "impl" blocks (e.g. for Sync/Send or Default,
or even for utility methods in cases such as VMStateFlags).

Tweak various variable definitions in meson.build, to avoid naming
conflicts once there will be multiple bindgen invocations.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build               | 21 ++++++++++++---------
 rust/meson.build          |  2 +-
 rust/qemu-api/meson.build |  2 +-
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/meson.build b/meson.build
index ed60be2a2d0..d9838319dae 100644
--- a/meson.build
+++ b/meson.build
@@ -4200,10 +4200,11 @@ foreach target_base_arch, config_base_arch : config_base_arch_mak
 endforeach
 
 if have_rust
+  bindings_incdir = include_directories('.', 'include')
   # We would like to use --generate-cstr, but it is only available
   # starting with bindgen 0.66.0.  The oldest supported versions
   # is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file.
-  bindgen_args = [
+  bindgen_args_common = [
     '--disable-header-comment',
     '--raw-line', '// @generated',
     '--ctypes-prefix', 'std::os::raw',
@@ -4219,20 +4220,22 @@ if have_rust
     ]
   if not rustfmt.found()
     if bindgen.version().version_compare('<0.65.0')
-      bindgen_args += ['--no-rustfmt-bindings']
+      bindgen_args_common += ['--no-rustfmt-bindings']
     else
-      bindgen_args += ['--formatter', 'none']
+      bindgen_args_common += ['--formatter', 'none']
     endif
   endif
   if bindgen.version().version_compare('>=0.66.0')
-    bindgen_args += ['--rust-target', '1.59']
+    bindgen_args_common += ['--rust-target', '1.59']
   endif
   if bindgen.version().version_compare('<0.61.0')
     # default in 0.61+
-    bindgen_args += ['--size_t-is-usize']
+    bindgen_args_common += ['--size_t-is-usize']
   else
-    bindgen_args += ['--merge-extern-blocks']
+    bindgen_args_common += ['--merge-extern-blocks']
   endif
+
+  bindgen_args = []
   c_enums = [
     'DeviceCategory',
     'GpioPolarity',
@@ -4264,13 +4267,13 @@ if have_rust
   # this case you must pass the path to `clang` and `libclang` to your build
   # command invocation using the environment variables CLANG_PATH and
   # LIBCLANG_PATH
-  bindings_rs = rust.bindgen(
+  _qemu_api_bindings_inc_rs = rust.bindgen(
     input: 'rust/wrapper.h',
     dependencies: common_ss.all_dependencies(),
     output: 'bindings.inc.rs',
-    include_directories: include_directories('.', 'include'),
+    include_directories: bindings_incdir,
     bindgen_version: ['>=0.60.0'],
-    args: bindgen_args,
+    args: bindgen_args_common + bindgen_args,
     )
   subdir('rust')
 endif
diff --git a/rust/meson.build b/rust/meson.build
index 99ae7956cd0..e9f0879e296 100644
--- a/rust/meson.build
+++ b/rust/meson.build
@@ -33,5 +33,5 @@ if cargo.found()
     command: [config_host['MESON'], 'devenv',
               '--workdir', '@CURRENT_SOURCE_DIR@',
               cargo, 'fmt'],
-    depends: bindings_rs)
+    depends: _qemu_api_bindings_inc_rs)
 endif
diff --git a/rust/qemu-api/meson.build b/rust/qemu-api/meson.build
index 33653b4a28e..64c04dfd74b 100644
--- a/rust/qemu-api/meson.build
+++ b/rust/qemu-api/meson.build
@@ -32,7 +32,7 @@ _qemu_api_rs = static_library(
       'src/vmstate.rs',
       'src/zeroable.rs',
     ],
-    {'.' : bindings_rs},
+    {'.' : _qemu_api_bindings_inc_rs},
   ),
   override_options: ['rust_std=2021', 'build.rust_std=2021'],
   rust_abi: 'rust',
-- 
2.49.0



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH 2/2] rust: move rust.bindgen to qemu-api crate
  2025-06-13 13:02 [PATCH 0/2] rust: prepare for multiple bindgen invocations Paolo Bonzini
  2025-06-13 13:02 ` [PATCH 1/2] rust: prepare variable definitions " Paolo Bonzini
@ 2025-06-13 13:02 ` Paolo Bonzini
  2025-06-20 15:10   ` Zhao Liu
  1 sibling, 1 reply; 5+ messages in thread
From: Paolo Bonzini @ 2025-06-13 13:02 UTC (permalink / raw)
  To: qemu-devel; +Cc: qemu-rust, tanishdesai37

Once qemu-api is split in multiple crates, each of which will have
its own invocation of bindgen.  There cannot be only one, because
there are occasional "impl" blocks for the bindgen-generated
structs (e.g. VMStateFlags or QOM classes) that have to
reside in the same crate as the bindgen-generated code.

For now, prepare for this new organization by invoking bindgen
within the qemu-api crate's build definitions.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 meson.build                   | 41 -----------------------------------
 rust/{ => qemu-api}/wrapper.h |  0
 rust/meson.build              |  4 +++-
 rust/qemu-api/meson.build     | 41 +++++++++++++++++++++++++++++++++++
 4 files changed, 44 insertions(+), 42 deletions(-)
 rename rust/{ => qemu-api}/wrapper.h (100%)

diff --git a/meson.build b/meson.build
index d9838319dae..4676908dbb2 100644
--- a/meson.build
+++ b/meson.build
@@ -4234,47 +4234,6 @@ if have_rust
   else
     bindgen_args_common += ['--merge-extern-blocks']
   endif
-
-  bindgen_args = []
-  c_enums = [
-    'DeviceCategory',
-    'GpioPolarity',
-    'MachineInitPhase',
-    'MemoryDeviceInfoKind',
-    'MigrationPolicy',
-    'MigrationPriority',
-    'QEMUChrEvent',
-    'QEMUClockType',
-    'ResetType',
-    'device_endian',
-    'module_init_type',
-  ]
-  foreach enum : c_enums
-    bindgen_args += ['--rustified-enum', enum]
-  endforeach
-  c_bitfields = [
-    'ClockEvent',
-    'VMStateFlags',
-  ]
-  foreach enum : c_bitfields
-    bindgen_args += ['--bitfield-enum', enum]
-  endforeach
-
-  # TODO: Remove this comment when the clang/libclang mismatch issue is solved.
-  #
-  # Rust bindings generation with `bindgen` might fail in some cases where the
-  # detected `libclang` does not match the expected `clang` version/target. In
-  # this case you must pass the path to `clang` and `libclang` to your build
-  # command invocation using the environment variables CLANG_PATH and
-  # LIBCLANG_PATH
-  _qemu_api_bindings_inc_rs = rust.bindgen(
-    input: 'rust/wrapper.h',
-    dependencies: common_ss.all_dependencies(),
-    output: 'bindings.inc.rs',
-    include_directories: bindings_incdir,
-    bindgen_version: ['>=0.60.0'],
-    args: bindgen_args_common + bindgen_args,
-    )
   subdir('rust')
 endif
 
diff --git a/rust/wrapper.h b/rust/qemu-api/wrapper.h
similarity index 100%
rename from rust/wrapper.h
rename to rust/qemu-api/wrapper.h
diff --git a/rust/meson.build b/rust/meson.build
index e9f0879e296..331f11b7e72 100644
--- a/rust/meson.build
+++ b/rust/meson.build
@@ -20,6 +20,8 @@ proc_macro2_rs_native = dependency('proc-macro2-1-rs', native: true)
 
 qemuutil_rs = qemuutil.partial_dependency(link_args: true, links: true)
 
+genrs = []
+
 subdir('qemu-api-macros')
 subdir('bits')
 subdir('qemu-api')
@@ -33,5 +35,5 @@ if cargo.found()
     command: [config_host['MESON'], 'devenv',
               '--workdir', '@CURRENT_SOURCE_DIR@',
               cargo, 'fmt'],
-    depends: _qemu_api_bindings_inc_rs)
+    depends: genrs)
 endif
diff --git a/rust/qemu-api/meson.build b/rust/qemu-api/meson.build
index 64c04dfd74b..05d010e094f 100644
--- a/rust/qemu-api/meson.build
+++ b/rust/qemu-api/meson.build
@@ -7,6 +7,47 @@ if get_option('debug_mutex')
   _qemu_api_cfg += ['--cfg', 'feature="debug_cell"']
 endif
 
+c_enums = [
+  'DeviceCategory',
+  'GpioPolarity',
+  'MachineInitPhase',
+  'MemoryDeviceInfoKind',
+  'MigrationPolicy',
+  'MigrationPriority',
+  'QEMUChrEvent',
+  'QEMUClockType',
+  'ResetType',
+  'device_endian',
+  'module_init_type',
+]
+_qemu_api_bindgen_args = []
+foreach enum : c_enums
+  _qemu_api_bindgen_args += ['--rustified-enum', enum]
+endforeach
+c_bitfields = [
+  'ClockEvent',
+  'VMStateFlags',
+]
+foreach enum : c_bitfields
+  _qemu_api_bindgen_args += ['--bitfield-enum', enum]
+endforeach
+
+# TODO: Remove this comment when the clang/libclang mismatch issue is solved.
+#
+# Rust bindings generation with `bindgen` might fail in some cases where the
+# detected `libclang` does not match the expected `clang` version/target. In
+# this case you must pass the path to `clang` and `libclang` to your build
+# command invocation using the environment variables CLANG_PATH and
+# LIBCLANG_PATH
+_qemu_api_bindings_inc_rs = rust.bindgen(
+  input: 'wrapper.h',
+  dependencies: common_ss.all_dependencies(),
+  output: 'bindings.inc.rs',
+  include_directories: bindings_incdir,
+  bindgen_version: ['>=0.60.0'],
+  args: bindgen_args_common + _qemu_api_bindgen_args,
+  )
+
 _qemu_api_rs = static_library(
   'qemu_api',
   structured_sources(
-- 
2.49.0



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/2] rust: prepare variable definitions for multiple bindgen invocations
  2025-06-13 13:02 ` [PATCH 1/2] rust: prepare variable definitions " Paolo Bonzini
@ 2025-06-20 10:07   ` Zhao Liu
  0 siblings, 0 replies; 5+ messages in thread
From: Zhao Liu @ 2025-06-20 10:07 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, qemu-rust, tanishdesai37

On Fri, Jun 13, 2025 at 03:02:48PM +0200, Paolo Bonzini wrote:
> Date: Fri, 13 Jun 2025 15:02:48 +0200
> From: Paolo Bonzini <pbonzini@redhat.com>
> Subject: [PATCH 1/2] rust: prepare variable definitions for multiple
>  bindgen invocations
> X-Mailer: git-send-email 2.49.0
> 
> When splitting the QEMU Rust bindings into multiple crates, the
> bindgen-generated structs also have to be split so that it's
> possible to add "impl" blocks (e.g. for Sync/Send or Default,
> or even for utility methods in cases such as VMStateFlags).
> 
> Tweak various variable definitions in meson.build, to avoid naming
> conflicts once there will be multiple bindgen invocations.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build               | 21 ++++++++++++---------
>  rust/meson.build          |  2 +-
>  rust/qemu-api/meson.build |  2 +-
>  3 files changed, 14 insertions(+), 11 deletions(-)

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 2/2] rust: move rust.bindgen to qemu-api crate
  2025-06-13 13:02 ` [PATCH 2/2] rust: move rust.bindgen to qemu-api crate Paolo Bonzini
@ 2025-06-20 15:10   ` Zhao Liu
  0 siblings, 0 replies; 5+ messages in thread
From: Zhao Liu @ 2025-06-20 15:10 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: qemu-devel, qemu-rust, tanishdesai37

On Fri, Jun 13, 2025 at 03:02:49PM +0200, Paolo Bonzini wrote:
> Date: Fri, 13 Jun 2025 15:02:49 +0200
> From: Paolo Bonzini <pbonzini@redhat.com>
> Subject: [PATCH 2/2] rust: move rust.bindgen to qemu-api crate
> X-Mailer: git-send-email 2.49.0
> 
> Once qemu-api is split in multiple crates, each of which will have
> its own invocation of bindgen.  There cannot be only one, because
> there are occasional "impl" blocks for the bindgen-generated
> structs (e.g. VMStateFlags or QOM classes) that have to
> reside in the same crate as the bindgen-generated code.
> 
> For now, prepare for this new organization by invoking bindgen
> within the qemu-api crate's build definitions.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  meson.build                   | 41 -----------------------------------
>  rust/{ => qemu-api}/wrapper.h |  0
>  rust/meson.build              |  4 +++-
>  rust/qemu-api/meson.build     | 41 +++++++++++++++++++++++++++++++++++
>  4 files changed, 44 insertions(+), 42 deletions(-)
>  rename rust/{ => qemu-api}/wrapper.h (100%)

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>



^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2025-06-20 14:49 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-06-13 13:02 [PATCH 0/2] rust: prepare for multiple bindgen invocations Paolo Bonzini
2025-06-13 13:02 ` [PATCH 1/2] rust: prepare variable definitions " Paolo Bonzini
2025-06-20 10:07   ` Zhao Liu
2025-06-13 13:02 ` [PATCH 2/2] rust: move rust.bindgen to qemu-api crate Paolo Bonzini
2025-06-20 15:10   ` Zhao Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).