|
11 | 11 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12 | 12 | # See the License for the specific language governing permissions and
|
13 | 13 | # limitations under the License.
|
| 14 | +from __future__ import annotations |
14 | 15 |
|
15 | 16 | from pathlib import Path
|
16 | 17 | import functools
|
|
26 | 27 | from ..build import known_shmod_kwargs
|
27 | 28 | from ..dependencies import DependencyMethods, PkgConfigDependency, NotFoundDependency, SystemDependency, ExtraFrameworkDependency
|
28 | 29 | from ..dependencies.base import process_method_kw
|
| 30 | +from ..dependencies.detect import get_dep_identifier |
29 | 31 | from ..environment import detect_cpu_family
|
30 | 32 | from ..interpreter import ExternalProgramHolder, extract_required_kwarg, permitted_dependency_kwargs
|
31 | 33 | from ..interpreter.type_checking import NoneType
|
@@ -539,31 +541,41 @@ def extension_module_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs
|
539 | 541 |
|
540 | 542 | return self.interpreter.func_shared_module(None, args, kwargs)
|
541 | 543 |
|
| 544 | + def _dependency_method_impl(self, kwargs: TYPE_kwargs) -> Dependency: |
| 545 | + for_machine = self.interpreter.machine_from_native_kwarg(kwargs) |
| 546 | + identifier = get_dep_identifier(self._full_path(), kwargs) |
| 547 | + |
| 548 | + dep = self.interpreter.coredata.deps[for_machine].get(identifier) |
| 549 | + if dep is not None: |
| 550 | + return dep |
| 551 | + |
| 552 | + new_kwargs = kwargs.copy() |
| 553 | + new_kwargs['required'] = False |
| 554 | + methods = process_method_kw({DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM}, kwargs) |
| 555 | + # it's theoretically (though not practically) possible to not bind dep, let's ensure it is. |
| 556 | + dep: Dependency = NotFoundDependency('python', self.interpreter.environment) |
| 557 | + for d in python_factory(self.interpreter.environment, for_machine, new_kwargs, methods, self): |
| 558 | + dep = d() |
| 559 | + if dep.found(): |
| 560 | + break |
| 561 | + |
| 562 | + self.interpreter.coredata.deps[for_machine].put(identifier, dep) |
| 563 | + return dep |
| 564 | + |
542 | 565 | @disablerIfNotFound
|
543 | 566 | @permittedKwargs(permitted_dependency_kwargs | {'embed'})
|
544 | 567 | @FeatureNewKwargs('python_installation.dependency', '0.53.0', ['embed'])
|
545 | 568 | @noPosargs
|
546 | 569 | def dependency_method(self, args: T.List['TYPE_var'], kwargs: 'TYPE_kwargs') -> 'Dependency':
|
547 | 570 | disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
|
548 |
| - # it's theoretically (though not practically) possible for the else clse |
549 |
| - # to not bind dep, let's ensure it is. |
550 |
| - dep: 'Dependency' = NotFoundDependency('python', self.interpreter.environment) |
551 | 571 | if disabled:
|
552 | 572 | mlog.log('Dependency', mlog.bold('python'), 'skipped: feature', mlog.bold(feature), 'disabled')
|
| 573 | + return NotFoundDependency('python', self.interpreter.environment) |
553 | 574 | else:
|
554 |
| - new_kwargs = kwargs.copy() |
555 |
| - new_kwargs['required'] = False |
556 |
| - methods = process_method_kw({DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM}, kwargs) |
557 |
| - for d in python_factory(self.interpreter.environment, |
558 |
| - MachineChoice.BUILD if kwargs.get('native', False) else MachineChoice.HOST, |
559 |
| - new_kwargs, methods, self): |
560 |
| - dep = d() |
561 |
| - if dep.found(): |
562 |
| - break |
| 575 | + dep = self._dependency_method_impl(kwargs) |
563 | 576 | if required and not dep.found():
|
564 | 577 | raise mesonlib.MesonException('Python dependency not found')
|
565 |
| - |
566 |
| - return dep |
| 578 | + return dep |
567 | 579 |
|
568 | 580 | @typed_pos_args('install_data', varargs=(str, mesonlib.File))
|
569 | 581 | @typed_kwargs('python_installation.install_sources', _PURE_KW, _SUBDIR_KW,
|
|
0 commit comments