rust: allow older version of bindgen

Cope with the old version that is provided in Debian 12.

--size_t-is-usize is needed on bindgen <0.61.0, and it was removed in
bindgen 0.65.0, so check for it in meson.build.

--merge-extern-blocks was added in 0.61.0.

--formatter rustfmt was added in 0.65.0 and is the default, so remove it.

Apart from Debian 12 and Ubuntu 22.04, all other supported distros have
version 0.66.x of bindgen or newer (or do not have bindgen at all).

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2024-10-15 15:00:41 +02:00
parent ce4a144cf8
commit c2988dfbb0
2 changed files with 39 additions and 4 deletions

View file

@ -100,6 +100,23 @@ if have_rust
endif
endif
if have_rust
bindgen = find_program('bindgen', required: get_option('rust'))
if not bindgen.found() or bindgen.version().version_compare('<0.60.0')
if get_option('rust').enabled()
error('bindgen version ' + bindgen.version() + ' is unsupported. You can install a new version with "cargo install bindgen-cli"')
else
if bindgen.found()
warning('bindgen version ' + bindgen.version() + ' is unsupported, disabling Rust compilation.')
else
warning('bindgen not found, disabling Rust compilation.')
endif
message('To use Rust you can install a new version with "cargo install bindgen-cli"')
have_rust = false
endif
endif
endif
dtrace = not_found
stap = not_found
if 'dtrace' in get_option('trace_backends')
@ -3963,15 +3980,13 @@ common_all = static_library('common',
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).
# is 0.60.x (Debian 12 has 0.60.1) which introduces --allowlist-file.
bindgen_args = [
'--disable-header-comment',
'--raw-line', '// @generated',
'--ctypes-prefix', 'std::os::raw',
'--formatter', 'rustfmt',
'--generate-block',
'--impl-debug',
'--merge-extern-blocks',
'--no-doc-comments',
'--with-derive-default',
'--no-layout-tests',
@ -3980,6 +3995,12 @@ if have_rust
'--allowlist-file', meson.project_source_root() + '/.*',
'--allowlist-file', meson.project_build_root() + '/.*'
]
if bindgen.version().version_compare('<0.61.0')
# default in 0.61+
bindgen_args += ['--size_t-is-usize']
else
bindgen_args += ['--merge-extern-blocks']
endif
c_enums = [
'DeviceCategory',
'GpioPolarity',
@ -4015,7 +4036,7 @@ if have_rust
dependencies: common_ss.all_dependencies(),
output: 'bindings.rs',
include_directories: include_directories('.', 'include'),
bindgen_version: ['>=0.69.4'],
bindgen_version: ['>=0.60.0'],
args: bindgen_args,
)
subdir('rust')
@ -4481,6 +4502,8 @@ if have_rust
summary_info += {'Rust target': config_host['RUST_TARGET_TRIPLE']}
summary_info += {'rustc': ' '.join(rustc.cmd_array())}
summary_info += {'rustc version': rustc.version()}
summary_info += {'bindgen': bindgen.full_path()}
summary_info += {'bindgen version': bindgen.version()}
endif
option_cflags = (get_option('debug') ? ['-g'] : [])
if get_option('optimization') != 'plain'