`rust.bindgen` requires `rust` as project lanugage
Describe the bug
meson setup throws the following exception, if rust is not added to language of project():
Traceback (most recent call last):
File "/usr/lib/python3.13/site-packages/mesonbuild/mesonmain.py", line 193, in run
return options.run_func(options)
~~~~~~~~~~~~~~~~^^^^^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/msetup.py", line 395, in run
app.generate()
~~~~~~~~~~~~^^
File "/usr/lib/python3.13/site-packages/mesonbuild/msetup.py", line 194, in generate
return self._generate(env, capture, vslite_ctx)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/msetup.py", line 253, in _generate
intr.run()
~~~~~~~~^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreter/interpreter.py", line 3059, in run
super().run()
~~~~~~~~~~~^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 178, in run
self.evaluate_codeblock(self.ast, start=1)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 203, in evaluate_codeblock
raise e
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 195, in evaluate_codeblock
self.evaluate_statement(cur)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 209, in evaluate_statement
return self.function_call(cur)
~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 536, in function_call
res = func(node, func_args, kwargs)
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/decorators.py", line 237, in wrapper
return f(*nargs, **wrapped_kwargs)
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/decorators.py", line 556, in wrapper
return f(*wrapped_args, **wrapped_kwargs)
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreter/interpreter.py", line 2473, in func_subdir
if not self._evaluate_subdir(self.environment.get_source_dir(), subdir):
~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 742, in _evaluate_subdir
self.evaluate_codeblock(codeblock)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 203, in evaluate_codeblock
raise e
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 195, in evaluate_codeblock
self.evaluate_statement(cur)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 227, in evaluate_statement
return self.evaluate_if(cur)
~~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 317, in evaluate_if
self.evaluate_codeblock(i.block)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 203, in evaluate_codeblock
raise e
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 195, in evaluate_codeblock
self.evaluate_statement(cur)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 213, in evaluate_statement
self.assignment(cur)
~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 650, in assignment
value = self.evaluate_statement(node.value)
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 215, in evaluate_statement
return self.method_call(cur)
~~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 565, in method_call
res = obj.method_call(method_name, args, kwargs)
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreter/interpreterobjects.py", line 881, in method_call
ret = method(state, args, kwargs)
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/decorators.py", line 53, in wrapped
return f(*wrapped_args, **wrapped_kwargs)
File "/usr/lib/python3.13/site-packages/mesonbuild/interpreterbase/decorators.py", line 556, in wrapper
return f(*wrapped_args, **wrapped_kwargs)
File "/usr/lib/python3.13/site-packages/mesonbuild/modules/rust.py", line 465, in bindgen
rust_std = state.environment.coredata.optstore.get_value('rust_std')
File "/usr/lib/python3.13/site-packages/mesonbuild/options.py", line 847, in get_value
return self.get_value_for(key)
~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/options.py", line 891, in get_value_for
vobject, resolved_value = self.get_value_object_and_value_for(key)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/usr/lib/python3.13/site-packages/mesonbuild/options.py", line 872, in get_value_object_and_value_for
vobject = self.get_value_object_for(key)
File "/usr/lib/python3.13/site-packages/mesonbuild/options.py", line 863, in get_value_object_for
raise KeyError(f'Tried to access nonexistant project parent option {parent_key}.')
KeyError: 'Tried to access nonexistant project parent option rust_std.'
lib/meson.build:50:24: ERROR: Unhandled python exception
This is a Meson bug and should be reported!
To Reproduce
project('example', ['c'])
# project('example', ['c', 'rust']) would work
rust = import('rust')
rust_bindgen = rust.bindgen(
input: 'example.h', # can be an empty file
output: 'example.rs',
)
Expected behavior
No exception, similar to meson 1.7.0
system parameters
- plain native build
- Arch Linux x86_64
- Python 3.13
-
meson --version:1.9.2 -
ninja --version:1.13.2
While the requirement is intended, the exception obviously isn't. Thanks!
While the requirement is intended, the exception obviously isn't. Thanks!
The mean thing is, that i worked without any problems in 1.7.0, which feels more like a regression to me.
Since I have a C-only project, which only generates bindings for rust via bindgen (similar to any other custom target), I don't see a reason why I should need a full rustc installation to get it work.
The reason for the regression is that the generated files can be customized to use a specific edition, which is not something you can tell the compiler using (for example) an attribute. So Meson is using rust_std as the edition to use.
When generating files without the Rust language being enabled, what edition would you want to use?
When generating files without the Rust language being enabled, what edition would you want to use?
Obvious the oldest edition available. I can always just make a *-sys crate withe "old edition bindgen code" and then use it from another crate with the latest edition. I personally don't see a relevant benefit to use a newer rust edition in bindgen for 99% of the projects. For the remaining 1%, it should be fine to require rust as language for the meson project.
Background: I build a C library via meson, that later gets used by a Rust application built via cargo. Since the C compiler-defines and header-includes are tightly bound to the meson configuration, it's much easier to generate the rust bindings via meson compared to doing that in a build.rs via cargo. One crate in the cargo project just includes the bindings generated via meson and makes it available to the other crates in the project.