mesonbuild / meson

The Meson Build System
http://mesonbuild.com
Apache License 2.0
5.38k stars 1.55k forks source link

Subproject within subproject fails to receive yielded build option #12332

Open GeorgesStavracas opened 9 months ago

GeorgesStavracas commented 9 months ago

Describe the bug

The xdg-desktop-portal-gnome project has a Meson wrap for libadwaita. libadwaita has a Meson wrap for gtk4.

GTK4 has the following Meson option:

option('introspection',
       type: 'feature',
       value: 'auto',
       yield: true,
       description : 'Build introspection data (requires gobject-introspection)')

libadwaita has the following Meson option:

option('introspection', type: 'feature', value: 'auto')

Finally, xdg-desktop-portal-gnome declares dependency on libadwaita with the following declaration:

libadwaita_dep = dependency(
  'libadwaita-1',
  version: adw_min_version,
  default_options: [
    'examples=false',
    'introspection=disabled',
    'tests=false',
    'vapi=false',
  ],
)

When the Meson wrap file is used to build both libadwaita and GTK4, this results in the following error:

xdg-desktop-portal-gnome/subprojects/gtk/meson.build:1:0: ERROR: Value "<mesonbuild.coredata.UserFeatureOption object at 0x7f2ea0fa1ad0>" (of type "string") for combo option "Build introspection data (requires gobject-introspection)" is not one of the choices. Possible choices are (as string): "enabled", "disabled", "auto".

To Reproduce

Expected behavior

Meson propagates the introspection=disabled param from libadwaita to GTK4, and the build succeeds.

system parameters

xclaesse commented 9 months ago

I can't reproduce and I really don't understand the error you're getting. Do you have local changes? for combo option that seems to indicate something has option('introspection', type: 'combo').

xclaesse commented 9 months ago

Hm, feature options are subclass of combo option, that's why you can get that error message. Can you run again with MESON_FORCE_BACKTRACE=1? I see what could be happening, but not sure how you got there.

GeorgesStavracas commented 9 months ago

Sure, this is what I get with MESON_FORCE_BACKTRACE=1:

libadwaita| Using subprojects/libadwaita/subprojects/gtk.wrap
libadwaita| WARNING: Subproject gtk's revision may be out of date; its wrap file has changed since it was first configured

Executing subproject libadwaita:gtk

subprojects/gtk/meson.build:1:0: ERROR: Value "<mesonbuild.coredata.UserFeatureOption object at 0x7fc59b9daf90>" (of type "string") for combo option "Build introspection data (requires gobject-introspection)" is not one of the choices. Possible choices are (as string): "enabled", "disabled", "auto".

A full log can be found at /home/feaneron/Documentos/Projetos/xdg-desktop-portal-gnome/_build2/meson-logs/meson-log.txt
Traceback (most recent call last):
  File "/usr/bin/meson", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/mesonmain.py", line 294, in main
    return run(sys.argv[1:], launcher)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/mesonmain.py", line 285, in run
    return CommandLineParser().run(args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/mesonmain.py", line 196, in run
    return errorhandler(e, command)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/mesonmain.py", line 40, in errorhandler
    raise e
  File "/usr/lib/python3.11/site-packages/mesonbuild/mesonmain.py", line 194, in run
    return options.run_func(options)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/msetup.py", line 358, in run
    app.generate()
  File "/usr/lib/python3.11/site-packages/mesonbuild/msetup.py", line 183, in generate
    return self._generate(env, capture, vslite_ctx)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/msetup.py", line 228, in _generate
    intr.run()
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 3002, in run
    super().run()
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 164, in run
    self.evaluate_codeblock(self.ast, start=1)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 190, in evaluate_codeblock
    raise e
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 182, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 196, in evaluate_statement
    return self.function_call(cur)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 521, in function_call
    res = func(node, func_args, kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 277, in wrapper
    return f(*nargs, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 596, in wrapper
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 2414, in func_subdir
    self.evaluate_codeblock(codeblock)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 190, in evaluate_codeblock
    raise e
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 182, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 198, in evaluate_statement
    self.assignment(cur)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 635, in assignment
    value = self.evaluate_statement(node.value)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 196, in evaluate_statement
    return self.function_call(cur)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 521, in function_call
    res = func(node, func_args, kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 826, in wrapped
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 826, in wrapped
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 826, in wrapped
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  [Previous line repeated 4 more times]
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 109, in wrapped
    ret = f(*wrapped_args, **wrapped_kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 127, in wrapped
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 277, in wrapper
    return f(*nargs, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 596, in wrapper
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 1779, in func_dependency
    d = df.lookup(kwargs)
        ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/dependencyfallbacks.py", line 355, in lookup
    dep = func(kwargs, func_args, func_kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/dependencyfallbacks.py", line 130, in _do_subproject
    self.interpreter.do_subproject(subp_name, 'meson', func_kwargs)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 960, in do_subproject
    raise e
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 944, in do_subproject
    return self._do_subproject_meson(subp_name, subdir, default_options, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 987, in _do_subproject_meson
    subi.run()
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 3002, in run
    super().run()
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 164, in run
    self.evaluate_codeblock(self.ast, start=1)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 190, in evaluate_codeblock
    raise e
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 182, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 196, in evaluate_statement
    return self.function_call(cur)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 521, in function_call
    res = func(node, func_args, kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 277, in wrapper
    return f(*nargs, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 596, in wrapper
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 2414, in func_subdir
    self.evaluate_codeblock(codeblock)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 190, in evaluate_codeblock
    raise e
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 182, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 198, in evaluate_statement
    self.assignment(cur)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 635, in assignment
    value = self.evaluate_statement(node.value)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 196, in evaluate_statement
    return self.function_call(cur)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 521, in function_call
    res = func(node, func_args, kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 826, in wrapped
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 826, in wrapped
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 826, in wrapped
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  [Previous line repeated 4 more times]
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 109, in wrapped
    ret = f(*wrapped_args, **wrapped_kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 127, in wrapped
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 277, in wrapper
    return f(*nargs, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 596, in wrapper
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 1779, in func_dependency
    d = df.lookup(kwargs)
        ^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/dependencyfallbacks.py", line 355, in lookup
    dep = func(kwargs, func_args, func_kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/dependencyfallbacks.py", line 130, in _do_subproject
    self.interpreter.do_subproject(subp_name, 'meson', func_kwargs)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 960, in do_subproject
    raise e
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 944, in do_subproject
    return self._do_subproject_meson(subp_name, subdir, default_options, kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 971, in _do_subproject_meson
    subi = Interpreter(new_build, self.backend, subp_name, subdir, self.subproject_dir,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 331, in __init__
    self.parse_project()
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 134, in parse_project
    self.evaluate_codeblock(self.ast, end=1)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 190, in evaluate_codeblock
    raise e
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 182, in evaluate_codeblock
    self.evaluate_statement(cur)
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 196, in evaluate_statement
    return self.function_call(cur)
           ^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/interpreterbase.py", line 521, in function_call
    res = func(node, func_args, kwargs)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 277, in wrapper
    return f(*nargs, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreterbase/decorators.py", line 596, in wrapper
    return f(*wrapped_args, **wrapped_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/interpreter/interpreter.py", line 1233, in func_project
    self.coredata.set_default_options(default_options, self.subproject, self.environment)
  File "/usr/lib/python3.11/site-packages/mesonbuild/coredata.py", line 913, in set_default_options
    self.set_options(options, subproject=subproject, first_invocation=env.first_invocation)
  File "/usr/lib/python3.11/site-packages/mesonbuild/coredata.py", line 864, in set_options
    dirty |= self.set_option(k, v, first_invocation)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/coredata.py", line 718, in set_option
    changed = opt.set_value(value)
              ^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/coredata.py", line 128, in set_value
    self.value = self.validate_value(newvalue)
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/mesonbuild/coredata.py", line 244, in validate_value
    raise MesonException('Value "{}" (of type "{}") for combo option "{}" is not one of the choices.'

mesonbuild.utils.core.MesonException: Value "<mesonbuild.coredata.UserFeatureOption object at 0x7fc59b9daf90>" (of type "string") for combo option "Build introspection data (requires gobject-introspection)" is not one of the choices. Possible choices are (as string): "enabled", "disabled", "auto".
xclaesse commented 9 months ago

It's really weird, I have no idea how you end up with a UserFeatureOption object there, it is supposed to be a string value 'enabled', etc. It's pretty straightforward to fix this specific error, but I would like to understand the root cause...

One thing is you clearly have local changes, neither xdg-desktop-portal-gnome nor libadwaita upstream have gtk.wrap. If I add a wrap myself it works just fine...

xclaesse commented 9 months ago

One thing is you clearly have local changes, neither xdg-desktop-portal-gnome nor libadwaita upstream have gtk.wrap.

I mean, xdg-desktop-portal-gnome main branch has libadwaita.wrap pointing to 1.2.0 which does not have gtk.wrap. I guess you pulled manually libadwaita main?

GeorgesStavracas commented 9 months ago

Yes, sorry, that was me updating the libadwaita.wrap file to 1.4.0. The context is this commit.

xclaesse commented 9 months ago

ah! with libadwaita 1.4.0 I can reproduce, but not with libadwaita main... that's progress :D

GeorgesStavracas commented 9 months ago

\o/

xclaesse commented 9 months ago

Whaaat, 'introspection=@0@'.format(introspection_feature) somehow does not make a string... I can even reproduce that in a very simple test case.

xclaesse commented 9 months ago

Got it! it's already fixed in Meson master with https://github.com/mesonbuild/meson/pull/11834. What's super confusing here in the error you see is <mesonbuild.coredata.UserFeatureOption object at 0x7fc59b9daf90> is actually the string value it gets, because format() does str(arg) where arg is a UserFeatureOption object and python converts to a string representation...

xclaesse commented 9 months ago

Not sure it's still worth having a fix in 1.2.3, but made one just in case: https://github.com/mesonbuild/meson/pull/12334.