meson icon indicating copy to clipboard operation
meson copied to clipboard

`rust.bindgen` requires `rust` as project lanugage

Open paroga opened this issue 1 month ago • 4 comments

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

paroga avatar Dec 08 '25 15:12 paroga

While the requirement is intended, the exception obviously isn't. Thanks!

bonzini avatar Dec 08 '25 15:12 bonzini

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.

paroga avatar Dec 10 '25 06:12 paroga

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?

bonzini avatar Dec 10 '25 06:12 bonzini

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.

paroga avatar Dec 10 '25 06:12 paroga