1616
1717import typing as T
1818if 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
2630class 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:\n Use 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