summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2025-08-05 12:46:35 -0700
committerDylan Baker <dylan@pnwbakers.com>2025-10-20 15:15:53 -0700
commit229ed1c9d467227da36eb0cafa84bbe15d92370e (patch)
tree5a3d406f17e6125954a1c605d0a49f1716f895da
parente8623f3fcbd4ed3f5863ca445fc4963ffb8176c9 (diff)
downloadmeson-229ed1c9d467227da36eb0cafa84bbe15d92370e.tar.gz
interpreter: Fix argument passing for dependencyfallbacks as subproject
We passed a DoSubproject call without half of the fields we'd agreed to fill out. Which left things running on hopes and dreams.
-rw-r--r--mesonbuild/interpreter/dependencyfallbacks.py39
1 files changed, 24 insertions, 15 deletions
diff --git a/mesonbuild/interpreter/dependencyfallbacks.py b/mesonbuild/interpreter/dependencyfallbacks.py
index 4dd6802c6..b85e09e7a 100644
--- a/mesonbuild/interpreter/dependencyfallbacks.py
+++ b/mesonbuild/interpreter/dependencyfallbacks.py
@@ -16,12 +16,16 @@ from ..interpreterbase import (MesonInterpreterObject, FeatureNew,
import typing as T
if T.TYPE_CHECKING:
+ from typing_extensions import TypeAlias
from .interpreter import Interpreter
+ from .kwargs import DoSubproject
from ..interpreterbase import TYPE_nkwargs, TYPE_nvar
from ..mesonlib import MachineChoice
from ..options import ElementaryOptionValues
from .interpreterobjects import SubprojectHolder
+ CandidateType: TypeAlias = T.Tuple[T.Callable[[TYPE_nkwargs, TYPE_nvar, DoSubproject], T.Optional[Dependency]], TYPE_nvar]
+
class DependencyFallbacksHolder(MesonInterpreterObject):
def __init__(self,
@@ -39,7 +43,7 @@ class DependencyFallbacksHolder(MesonInterpreterObject):
self.allow_fallback = allow_fallback
self.subproject_name: T.Optional[str] = None
self.subproject_varname: T.Optional[str] = None
- self.subproject_kwargs = {'default_options': default_options or {}}
+ self.default_options = default_options or {}
self.names: T.List[str] = []
self.forcefallback: bool = False
self.nofallback: bool = False
@@ -79,14 +83,14 @@ class DependencyFallbacksHolder(MesonInterpreterObject):
self.subproject_name = subp_name
self.subproject_varname = varname
- def _do_dependency_cache(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
+ def _do_dependency_cache(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: DoSubproject) -> T.Optional[Dependency]:
name = func_args[0]
cached_dep = self._get_cached_dep(name, kwargs)
if cached_dep:
self._verify_fallback_consistency(cached_dep)
return cached_dep
- def _do_dependency(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
+ def _do_dependency(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: DoSubproject) -> T.Optional[Dependency]:
# Note that there is no df.dependency() method, this is called for names
# given as positional arguments to dependency_fallbacks(name1, ...).
# We use kwargs from the dependency() function, for things like version,
@@ -101,14 +105,14 @@ class DependencyFallbacksHolder(MesonInterpreterObject):
return dep
return None
- def _do_existing_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
+ def _do_existing_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: DoSubproject) -> T.Optional[Dependency]:
subp_name = func_args[0]
varname = self.subproject_varname
if subp_name and self._get_subproject(subp_name):
return self._get_subproject_dep(subp_name, varname, kwargs)
return None
- def _do_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
+ def _do_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: DoSubproject) -> T.Optional[Dependency]:
if self.forcefallback:
mlog.log('Looking for a fallback subproject for the dependency',
mlog.bold(self._display_name), 'because:\nUse of fallback dependencies is forced.')
@@ -132,7 +136,6 @@ class DependencyFallbacksHolder(MesonInterpreterObject):
# Configure the subproject
subp_name = self.subproject_name
varname = self.subproject_varname
- func_kwargs.setdefault('version', [])
self.interpreter.do_subproject(subp_name, func_kwargs, forced_options=forced_options)
return self._get_subproject_dep(subp_name, varname, kwargs)
@@ -293,21 +296,21 @@ class DependencyFallbacksHolder(MesonInterpreterObject):
return True
return not (found == 'undefined' or not version_compare_many(found, wanted)[0])
- def _get_candidates(self) -> T.List[T.Tuple[T.Callable[[TYPE_nkwargs, TYPE_nvar, TYPE_nkwargs], T.Optional[Dependency]], TYPE_nvar, TYPE_nkwargs]]:
- candidates = []
+ def _get_candidates(self) -> T.List[CandidateType]:
+ candidates: T.List[CandidateType] = []
# 1. check if any of the names is cached already.
for name in self.names:
- candidates.append((self._do_dependency_cache, [name], {}))
+ candidates.append((self._do_dependency_cache, [name]))
# 2. check if the subproject fallback has already been configured.
if self.subproject_name:
- candidates.append((self._do_existing_subproject, [self.subproject_name], self.subproject_kwargs))
+ candidates.append((self._do_existing_subproject, [self.subproject_name]))
# 3. check external dependency if we are not forced to use subproject
if not self.forcefallback or not self.subproject_name:
for name in self.names:
- candidates.append((self._do_dependency, [name], {}))
+ candidates.append((self._do_dependency, [name]))
# 4. configure the subproject
if self.subproject_name:
- candidates.append((self._do_subproject, [self.subproject_name], self.subproject_kwargs))
+ candidates.append((self._do_subproject, [self.subproject_name]))
return candidates
def lookup(self, kwargs: TYPE_nkwargs, force_fallback: bool = False) -> Dependency:
@@ -315,7 +318,7 @@ class DependencyFallbacksHolder(MesonInterpreterObject):
if mods:
self._display_name += ' (modules: {})'.format(', '.join(str(i) for i in mods))
- required = kwargs.get('required', True)
+ required = T.cast('bool', kwargs.get('required', True))
# Check if usage of the subproject fallback is forced
wrap_mode = WrapMode.from_string(self.coredata.optstore.get_value_for(OptionKey('wrap_mode')))
@@ -351,8 +354,14 @@ class DependencyFallbacksHolder(MesonInterpreterObject):
# Try all candidates, only the last one is really required.
last = len(candidates) - 1
for i, item in enumerate(candidates):
- func, func_args, func_kwargs = item
- func_kwargs['required'] = required and (i == last)
+ func, func_args = item
+ func_kwargs: DoSubproject = {
+ 'required': required and (i == last),
+ 'cmake_options': [],
+ 'default_options': self.default_options,
+ 'options': None,
+ 'version': [],
+ }
kwargs['required'] = required and (i == last)
dep = func(kwargs, func_args, func_kwargs)
if dep and dep.found():