summaryrefslogtreecommitdiff
path: root/mesonbuild/dependencies/detect.py
diff options
context:
space:
mode:
authorEli Schwartz <eschwartz@archlinux.org>2023-01-17 18:19:59 -0500
committerEli Schwartz <eschwartz@archlinux.org>2023-06-26 13:10:33 -0400
commitb1ddfabf8fbb0561a584bd7cfe2bb712b4105da2 (patch)
tree6cd7047a090608705215608940af3f7a03ee2442 /mesonbuild/dependencies/detect.py
parentc82305db0c5216f821e43bfc7ea3c8e314d0dccd (diff)
downloadmeson-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.py28
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':