summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaolo Bonzini <pbonzini@redhat.com>2025-10-04 14:21:50 +0200
committerDylan Baker <dylan@pnwbakers.com>2025-10-16 08:51:11 -0700
commitdb6b15b67023ef4173c87345f1a7d06d22536dd4 (patch)
treee8329f4136df04ae66f53176f98f88d85bec7036
parent3979531f160f32453365781200302066bc2f40f9 (diff)
downloadmeson-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.py1
-rw-r--r--mesonbuild/mintro.py18
-rw-r--r--mesonbuild/msetup.py8
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)