Skip to content

Commit 229ed1c

Browse files
committed
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.
1 parent e8623f3 commit 229ed1c

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

mesonbuild/interpreter/dependencyfallbacks.py

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@
1616

1717
import typing as T
1818
if T.TYPE_CHECKING:
19+
from typing_extensions import TypeAlias
1920
from .interpreter import Interpreter
21+
from .kwargs import DoSubproject
2022
from ..interpreterbase import TYPE_nkwargs, TYPE_nvar
2123
from ..mesonlib import MachineChoice
2224
from ..options import ElementaryOptionValues
2325
from .interpreterobjects import SubprojectHolder
2426

27+
CandidateType: TypeAlias = T.Tuple[T.Callable[[TYPE_nkwargs, TYPE_nvar, DoSubproject], T.Optional[Dependency]], TYPE_nvar]
28+
2529

2630
class DependencyFallbacksHolder(MesonInterpreterObject):
2731
def __init__(self,
@@ -39,7 +43,7 @@ def __init__(self,
3943
self.allow_fallback = allow_fallback
4044
self.subproject_name: T.Optional[str] = None
4145
self.subproject_varname: T.Optional[str] = None
42-
self.subproject_kwargs = {'default_options': default_options or {}}
46+
self.default_options = default_options or {}
4347
self.names: T.List[str] = []
4448
self.forcefallback: bool = False
4549
self.nofallback: bool = False
@@ -79,14 +83,14 @@ def _subproject_impl(self, subp_name: str, varname: str) -> None:
7983
self.subproject_name = subp_name
8084
self.subproject_varname = varname
8185

82-
def _do_dependency_cache(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
86+
def _do_dependency_cache(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: DoSubproject) -> T.Optional[Dependency]:
8387
name = func_args[0]
8488
cached_dep = self._get_cached_dep(name, kwargs)
8589
if cached_dep:
8690
self._verify_fallback_consistency(cached_dep)
8791
return cached_dep
8892

89-
def _do_dependency(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
93+
def _do_dependency(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: DoSubproject) -> T.Optional[Dependency]:
9094
# Note that there is no df.dependency() method, this is called for names
9195
# given as positional arguments to dependency_fallbacks(name1, ...).
9296
# We use kwargs from the dependency() function, for things like version,
@@ -101,14 +105,14 @@ def _do_dependency(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs
101105
return dep
102106
return None
103107

104-
def _do_existing_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
108+
def _do_existing_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: DoSubproject) -> T.Optional[Dependency]:
105109
subp_name = func_args[0]
106110
varname = self.subproject_varname
107111
if subp_name and self._get_subproject(subp_name):
108112
return self._get_subproject_dep(subp_name, varname, kwargs)
109113
return None
110114

111-
def _do_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: TYPE_nkwargs) -> T.Optional[Dependency]:
115+
def _do_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs: DoSubproject) -> T.Optional[Dependency]:
112116
if self.forcefallback:
113117
mlog.log('Looking for a fallback subproject for the dependency',
114118
mlog.bold(self._display_name), 'because:\nUse of fallback dependencies is forced.')
@@ -132,7 +136,6 @@ def _do_subproject(self, kwargs: TYPE_nkwargs, func_args: TYPE_nvar, func_kwargs
132136
# Configure the subproject
133137
subp_name = self.subproject_name
134138
varname = self.subproject_varname
135-
func_kwargs.setdefault('version', [])
136139
self.interpreter.do_subproject(subp_name, func_kwargs, forced_options=forced_options)
137140
return self._get_subproject_dep(subp_name, varname, kwargs)
138141

@@ -293,29 +296,29 @@ def _check_version(wanted: T.List[str], found: str) -> bool:
293296
return True
294297
return not (found == 'undefined' or not version_compare_many(found, wanted)[0])
295298

296-
def _get_candidates(self) -> T.List[T.Tuple[T.Callable[[TYPE_nkwargs, TYPE_nvar, TYPE_nkwargs], T.Optional[Dependency]], TYPE_nvar, TYPE_nkwargs]]:
297-
candidates = []
299+
def _get_candidates(self) -> T.List[CandidateType]:
300+
candidates: T.List[CandidateType] = []
298301
# 1. check if any of the names is cached already.
299302
for name in self.names:
300-
candidates.append((self._do_dependency_cache, [name], {}))
303+
candidates.append((self._do_dependency_cache, [name]))
301304
# 2. check if the subproject fallback has already been configured.
302305
if self.subproject_name:
303-
candidates.append((self._do_existing_subproject, [self.subproject_name], self.subproject_kwargs))
306+
candidates.append((self._do_existing_subproject, [self.subproject_name]))
304307
# 3. check external dependency if we are not forced to use subproject
305308
if not self.forcefallback or not self.subproject_name:
306309
for name in self.names:
307-
candidates.append((self._do_dependency, [name], {}))
310+
candidates.append((self._do_dependency, [name]))
308311
# 4. configure the subproject
309312
if self.subproject_name:
310-
candidates.append((self._do_subproject, [self.subproject_name], self.subproject_kwargs))
313+
candidates.append((self._do_subproject, [self.subproject_name]))
311314
return candidates
312315

313316
def lookup(self, kwargs: TYPE_nkwargs, force_fallback: bool = False) -> Dependency:
314317
mods = kwargs.get('modules', [])
315318
if mods:
316319
self._display_name += ' (modules: {})'.format(', '.join(str(i) for i in mods))
317320

318-
required = kwargs.get('required', True)
321+
required = T.cast('bool', kwargs.get('required', True))
319322

320323
# Check if usage of the subproject fallback is forced
321324
wrap_mode = WrapMode.from_string(self.coredata.optstore.get_value_for(OptionKey('wrap_mode')))
@@ -351,8 +354,14 @@ def lookup(self, kwargs: TYPE_nkwargs, force_fallback: bool = False) -> Dependen
351354
# Try all candidates, only the last one is really required.
352355
last = len(candidates) - 1
353356
for i, item in enumerate(candidates):
354-
func, func_args, func_kwargs = item
355-
func_kwargs['required'] = required and (i == last)
357+
func, func_args = item
358+
func_kwargs: DoSubproject = {
359+
'required': required and (i == last),
360+
'cmake_options': [],
361+
'default_options': self.default_options,
362+
'options': None,
363+
'version': [],
364+
}
356365
kwargs['required'] = required and (i == last)
357366
dep = func(kwargs, func_args, func_kwargs)
358367
if dep and dep.found():

0 commit comments

Comments
 (0)