diff options
| author | Dylan Baker <dylan@pnwbakers.com> | 2025-10-24 09:01:13 -0700 |
|---|---|---|
| committer | Dylan Baker <dylan@pnwbakers.com> | 2025-12-17 14:47:18 -0800 |
| commit | bd39b95ae78c20f02b5c58d0ef4448d41d6cc335 (patch) | |
| tree | 25838896e2674fb4f7d8cc86667974ad8c75ef30 /mesonbuild | |
| parent | e1164f616db78050b935e85fbc2cdb9f731e1511 (diff) | |
| download | meson-bd39b95ae78c20f02b5c58d0ef4448d41d6cc335.tar.gz | |
dependencies: Add a wrapper class for Dependency candidates
The goal is to have a single type for candidates that replaces having a
mixture of class initializers, partials, and factories with a single
wrapper class.
Diffstat (limited to 'mesonbuild')
| -rw-r--r-- | mesonbuild/dependencies/base.py | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 5e0d871ef..47d836c2f 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -7,6 +7,7 @@ from __future__ import annotations import copy +import dataclasses import os import collections import itertools @@ -73,6 +74,8 @@ else: _MissingCompilerBase = object +DepType = T.TypeVar('DepType', bound='ExternalDependency', covariant=True) + class DependencyException(MesonException): '''Exceptions raised while trying to find dependencies''' @@ -683,3 +686,28 @@ class BuiltinDependency(ExternalDependency): @staticmethod def log_tried() -> str: return 'builtin' + + +@dataclasses.dataclass +class DependencyCandidate(T.Generic[DepType]): + + callable: T.Union[T.Type[DepType], T.Callable[[str, Environment, DependencyObjectKWs], DepType]] + name: str + method: str + modules: T.Optional[T.List[str]] = None + arguments: T.Optional[T.Tuple[Environment, DependencyObjectKWs]] = dataclasses.field(default=None) + + def __call__(self) -> DepType: + if self.arguments is None: + raise mesonlib.MesonBugException('Attempted to instantiate a candidate before setting its arguments') + env, kwargs = self.arguments + if self.modules is not None: + kwargs['modules'] = self.modules.copy() + return self.callable(self.name, env, kwargs) + + @classmethod + def from_dependency(cls, name: str, dep: T.Type[DepType], + args: T.Optional[T.Tuple[Environment, DependencyObjectKWs]] = None, + modules: T.Optional[T.List[str]] = None, + ) -> DependencyCandidate[DepType]: + return cls(dep, name, dep.log_tried(), modules, arguments=args) |
