mirror of
https://github.com/qemu/qemu.git
synced 2025-08-14 20:31:47 +00:00
rust: move rust.bindgen to qemu-api crate
Once qemu-api is split in multiple crates, each of them 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; it's also a much better place to list enums that need specific treatment from bindgen. Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
1548c5cdf0
commit
1ae4ca0463
41
meson.build
41
meson.build
@ -4234,47 +4234,6 @@ if have_rust
|
|||||||
else
|
else
|
||||||
bindgen_args_common += ['--merge-extern-blocks']
|
bindgen_args_common += ['--merge-extern-blocks']
|
||||||
endif
|
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')
|
subdir('rust')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -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)
|
qemuutil_rs = qemuutil.partial_dependency(link_args: true, links: true)
|
||||||
|
|
||||||
|
genrs = []
|
||||||
|
|
||||||
subdir('qemu-api-macros')
|
subdir('qemu-api-macros')
|
||||||
subdir('bits')
|
subdir('bits')
|
||||||
subdir('qemu-api')
|
subdir('qemu-api')
|
||||||
@ -33,5 +35,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: _qemu_api_bindings_inc_rs)
|
depends: genrs)
|
||||||
endif
|
endif
|
||||||
|
@ -14,7 +14,7 @@ fn main() -> Result<()> {
|
|||||||
let path = env::var("MESON_BUILD_ROOT")
|
let path = env::var("MESON_BUILD_ROOT")
|
||||||
.unwrap_or_else(|_| format!("{}/src", env!("CARGO_MANIFEST_DIR")));
|
.unwrap_or_else(|_| format!("{}/src", env!("CARGO_MANIFEST_DIR")));
|
||||||
|
|
||||||
let file = format!("{path}/bindings.inc.rs");
|
let file = format!("{path}/rust/qemu-api/bindings.inc.rs");
|
||||||
let file = Path::new(&file);
|
let file = Path::new(&file);
|
||||||
if !Path::new(&file).exists() {
|
if !Path::new(&file).exists() {
|
||||||
panic!(concat!(
|
panic!(concat!(
|
||||||
|
@ -7,6 +7,47 @@ if get_option('debug_mutex')
|
|||||||
_qemu_api_cfg += ['--cfg', 'feature="debug_cell"']
|
_qemu_api_cfg += ['--cfg', 'feature="debug_cell"']
|
||||||
endif
|
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_rs = static_library(
|
||||||
'qemu_api',
|
'qemu_api',
|
||||||
structured_sources(
|
structured_sources(
|
||||||
|
Loading…
Reference in New Issue
Block a user