diff options
| author | Eli Schwartz <eschwartz@archlinux.org> | 2023-01-17 18:19:59 -0500 |
|---|---|---|
| committer | Eli Schwartz <eschwartz@archlinux.org> | 2023-06-26 13:10:33 -0400 |
| commit | b1ddfabf8fbb0561a584bd7cfe2bb712b4105da2 (patch) | |
| tree | 6cd7047a090608705215608940af3f7a03ee2442 /mesonbuild/dependencies/detect.py | |
| parent | c82305db0c5216f821e43bfc7ea3c8e314d0dccd (diff) | |
| download | meson-b1ddfabf8fbb0561a584bd7cfe2bb712b4105da2.tar.gz | |
dependencies: defer importing a custom dependency until it is used
This lessens the amount of code imported at Meson startup by mapping
each dependency to a dictionary entry and using a programmable import to
dynamically return it.
Minus 16 files and 6399 lines of code imported at startup.
Diffstat (limited to 'mesonbuild/dependencies/detect.py')
| -rw-r--r-- | mesonbuild/dependencies/detect.py | 28 |
1 files changed, 22 insertions, 6 deletions
diff --git a/mesonbuild/dependencies/detect.py b/mesonbuild/dependencies/detect.py index cdfdd13ce..a10131ddd 100644 --- a/mesonbuild/dependencies/detect.py +++ b/mesonbuild/dependencies/detect.py @@ -13,12 +13,13 @@ # limitations under the License. from __future__ import annotations +import collections, functools, importlib +import typing as T + from .base import ExternalDependency, DependencyException, DependencyMethods, NotFoundDependency from ..mesonlib import listify, MachineChoice, PerMachine from .. import mlog -import functools -import typing as T if T.TYPE_CHECKING: from ..environment import Environment @@ -26,12 +27,27 @@ if T.TYPE_CHECKING: TV_DepIDEntry = T.Union[str, bool, int, T.Tuple[str, ...]] TV_DepID = T.Tuple[T.Tuple[str, TV_DepIDEntry], ...] + PackageTypes = T.Union[T.Type[ExternalDependency], DependencyFactory, WrappedFactoryFunc] + +class DependencyPackages(collections.UserDict): + data: T.Dict[str, PackageTypes] + defaults: T.Dict[str, str] = {} + + def __missing__(self, key: str) -> PackageTypes: + if key in self.defaults: + modn, package = self.defaults[key].split(':', maxsplit=1) + mod = importlib.import_module(f'mesonbuild.dependencies.{modn}') + value = T.cast('PackageTypes', getattr(mod, package)) + self.data[key] = value + + return value + raise KeyError(key) + + def __contains__(self, key: object) -> bool: + return key in self.defaults or key in self.data # These must be defined in this file to avoid cyclical references. -packages: T.Dict[ - str, - T.Union[T.Type[ExternalDependency], 'DependencyFactory', 'WrappedFactoryFunc'] -] = {} +packages = DependencyPackages() _packages_accept_language: T.Set[str] = set() def get_dep_identifier(name: str, kwargs: T.Dict[str, T.Any]) -> 'TV_DepID': |
