summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2025-10-24 09:01:13 -0700
committerDylan Baker <dylan@pnwbakers.com>2025-12-17 14:47:18 -0800
commitbd39b95ae78c20f02b5c58d0ef4448d41d6cc335 (patch)
tree25838896e2674fb4f7d8cc86667974ad8c75ef30
parente1164f616db78050b935e85fbc2cdb9f731e1511 (diff)
downloadmeson-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.
-rw-r--r--mesonbuild/dependencies/base.py28
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)