rust: prepare variable definitions for multiple bindgen invocations

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.

Reviewed-by: Zhao Liu <zhao1.liu@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2025-06-13 14:51:54 +02:00
parent 345bef46a1
commit 1548c5cdf0
3 changed files with 14 additions and 11 deletions

View file

@ -4200,10 +4200,11 @@ foreach target_base_arch, config_base_arch : config_base_arch_mak
endforeach endforeach
if have_rust if have_rust
bindings_incdir = include_directories('.', 'include')
# We would like to use --generate-cstr, but it is only available # We would like to use --generate-cstr, but it is only available
# starting with bindgen 0.66.0. The oldest supported versions # starting with bindgen 0.66.0. The oldest supported versions
# is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file. # is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file.
bindgen_args = [ bindgen_args_common = [
'--disable-header-comment', '--disable-header-comment',
'--raw-line', '// @generated', '--raw-line', '// @generated',
'--ctypes-prefix', 'std::os::raw', '--ctypes-prefix', 'std::os::raw',
@ -4219,20 +4220,22 @@ if have_rust
] ]
if not rustfmt.found() if not rustfmt.found()
if bindgen.version().version_compare('<0.65.0') if bindgen.version().version_compare('<0.65.0')
bindgen_args += ['--no-rustfmt-bindings'] bindgen_args_common += ['--no-rustfmt-bindings']
else else
bindgen_args += ['--formatter', 'none'] bindgen_args_common += ['--formatter', 'none']
endif endif
endif endif
if bindgen.version().version_compare('>=0.66.0') if bindgen.version().version_compare('>=0.66.0')
bindgen_args += ['--rust-target', '1.59'] bindgen_args_common += ['--rust-target', '1.59']
endif endif
if bindgen.version().version_compare('<0.61.0') if bindgen.version().version_compare('<0.61.0')
# default in 0.61+ # default in 0.61+
bindgen_args += ['--size_t-is-usize'] bindgen_args_common += ['--size_t-is-usize']
else else
bindgen_args += ['--merge-extern-blocks'] bindgen_args_common += ['--merge-extern-blocks']
endif endif
bindgen_args = []
c_enums = [ c_enums = [
'DeviceCategory', 'DeviceCategory',
'GpioPolarity', 'GpioPolarity',
@ -4264,13 +4267,13 @@ if have_rust
# this case you must pass the path to `clang` and `libclang` to your build # this case you must pass the path to `clang` and `libclang` to your build
# command invocation using the environment variables CLANG_PATH and # command invocation using the environment variables CLANG_PATH and
# LIBCLANG_PATH # LIBCLANG_PATH
bindings_rs = rust.bindgen( _qemu_api_bindings_inc_rs = rust.bindgen(
input: 'rust/wrapper.h', input: 'rust/wrapper.h',
dependencies: common_ss.all_dependencies(), dependencies: common_ss.all_dependencies(),
output: 'bindings.inc.rs', output: 'bindings.inc.rs',
include_directories: include_directories('.', 'include'), include_directories: bindings_incdir,
bindgen_version: ['>=0.60.0'], bindgen_version: ['>=0.60.0'],
args: bindgen_args, args: bindgen_args_common + bindgen_args,
) )
subdir('rust') subdir('rust')
endif endif

View file

@ -33,5 +33,5 @@ if cargo.found()
command: [config_host['MESON'], 'devenv', command: [config_host['MESON'], 'devenv',
'--workdir', '@CURRENT_SOURCE_DIR@', '--workdir', '@CURRENT_SOURCE_DIR@',
cargo, 'fmt'], cargo, 'fmt'],
depends: bindings_rs) depends: _qemu_api_bindings_inc_rs)
endif endif

View file

@ -32,7 +32,7 @@ _qemu_api_rs = static_library(
'src/vmstate.rs', 'src/vmstate.rs',
'src/zeroable.rs', 'src/zeroable.rs',
], ],
{'.' : bindings_rs}, {'.' : _qemu_api_bindings_inc_rs},
), ),
override_options: ['rust_std=2021', 'build.rust_std=2021'], override_options: ['rust_std=2021', 'build.rust_std=2021'],
rust_abi: 'rust', rust_abi: 'rust',