diff options
| author | Paolo Bonzini <pbonzini@redhat.com> | 2025-10-04 14:21:50 +0200 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-10-16 08:51:11 -0700 |
| commit | db6b15b67023ef4173c87345f1a7d06d22536dd4 (patch) | |
| tree | e8329f4136df04ae66f53176f98f88d85bec7036 | |
| parent | 3979531f160f32453365781200302066bc2f40f9 (diff) | |
| download | meson-db6b15b67023ef4173c87345f1a7d06d22536dd4.tar.gz | |
intro: compute meson_variables for dependencies at setup time
Another place where the interpreter is accessed surreptitiously is
dependency introspection, which looks at the variables. Do that
at setup time instead while the interpreter is alive.
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
| -rw-r--r-- | mesonbuild/dependencies/base.py | 1 | ||||
| -rw-r--r-- | mesonbuild/mintro.py | 18 | ||||
| -rw-r--r-- | mesonbuild/msetup.py | 8 |
3 files changed, 14 insertions, 13 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 72dbfdf2d..01175291e 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -128,6 +128,7 @@ class Dependency(HoldableObject): self.d_features: T.DefaultDict[str, T.List[T.Any]] = collections.defaultdict(list) self.featurechecks: T.List['FeatureCheckBase'] = [] self.feature_since: T.Optional[T.Tuple[str, str]] = None + self.meson_variables: T.List[str] = [] def __eq__(self, other: object) -> bool: if not isinstance(other, Dependency): diff --git a/mesonbuild/mintro.py b/mesonbuild/mintro.py index 57805a35c..b1e0941c8 100644 --- a/mesonbuild/mintro.py +++ b/mesonbuild/mintro.py @@ -22,13 +22,14 @@ import typing as T from . import build, environment, mesonlib, options, coredata as cdata from .ast import IntrospectionInterpreter, AstConditionLevel, AstIDGenerator, AstIndentationGenerator, AstJSONPrinter from .backend import backends -from .dependencies import Dependency -from .interpreterbase import ObjectHolder, UnknownValue +from .interpreterbase import UnknownValue from .options import OptionKey if T.TYPE_CHECKING: import argparse + from .dependencies import Dependency + class IntrospectionEncoder(json.JSONEncoder): def default(self, obj: T.Any) -> T.Any: if isinstance(obj, UnknownValue): @@ -385,7 +386,7 @@ def list_deps(coredata: cdata.CoreData, backend: backends.Backend) -> T.List[T.D return [f for s in src_file.as_list() for f in _src_to_str(s)] raise mesonlib.MesonBugException(f'Invalid file type {type(src_file)}.') - def _create_result(d: Dependency, varname: T.Optional[str] = None) -> T.Dict[str, T.Any]: + def _create_result(d: Dependency) -> T.Dict[str, T.Any]: return { 'name': d.name, 'type': d.type_name, @@ -397,22 +398,13 @@ def list_deps(coredata: cdata.CoreData, backend: backends.Backend) -> T.List[T.D 'extra_files': [f for s in d.get_extra_files() for f in _src_to_str(s)], 'dependencies': [e.name for e in d.ext_deps], 'depends': [lib.get_id() for lib in getattr(d, 'libraries', [])], - 'meson_variables': [varname] if varname else [], + 'meson_variables': d.meson_variables, } for d in coredata.deps.host.values(): if d.found(): result[d.name] = _create_result(d) - for varname, holder in backend.interpreter.variables.items(): - if isinstance(holder, ObjectHolder): - d = holder.held_object - if isinstance(d, Dependency) and d.found(): - if d.name in result: - T.cast('T.List[str]', result[d.name]['meson_variables']).append(varname) - else: - result[d.name] = _create_result(d, varname) - return list(result.values()) def get_test_list(testdata: T.List[backends.TestSerialisation]) -> T.List[T.Dict[str, T.Union[str, int, T.List[str], T.Dict[str, str]]]]: diff --git a/mesonbuild/msetup.py b/mesonbuild/msetup.py index 0e579f0d9..179ff3fa2 100644 --- a/mesonbuild/msetup.py +++ b/mesonbuild/msetup.py @@ -10,7 +10,9 @@ from pathlib import Path import typing as T from . import build, coredata, environment, interpreter, mesonlib, mintro, mlog +from .dependencies import Dependency from .mesonlib import MesonException +from .interpreterbase import ObjectHolder from .options import OptionKey if T.TYPE_CHECKING: @@ -337,6 +339,12 @@ class MesonApp: return captured_compile_args def finalize_postconf_hooks(self, b: build.Build, intr: interpreter.Interpreter) -> None: + for varname, holder in intr.variables.items(): + if isinstance(holder, ObjectHolder): + d = holder.held_object + if isinstance(d, Dependency) and d.found(): + d.meson_variables.append(varname) + b.devenv.append(intr.backend.get_devenv()) for mod in intr.modules.values(): mod.postconf_hook(b) |
