diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py index 14b7cba06..18f191513 100644 --- a/mesonbuild/dependencies/__init__.py +++ b/mesonbuild/dependencies/__init__.py @@ -20,7 +20,7 @@ from .base import ( # noqa: F401 ExternalDependency, NotFoundDependency, ExternalLibrary, ExtraFrameworkDependency, InternalDependency, PkgConfigDependency, CMakeDependency, find_external_dependency, get_dep_identifier, packages, _packages_accept_language, DependencyFactory) -from .dev import GMockDependency, GTestDependency, ValgrindDependency, llvm_factory +from .dev import GMockDependency, ValgrindDependency, gtest_factory, llvm_factory from .coarrays import CoarrayDependency from .mpi import MPIDependency from .scalapack import ScalapackDependency @@ -32,7 +32,7 @@ from .ui import GLDependency, GnuStepDependency, Qt4Dependency, Qt5Dependency, S packages.update({ # From dev: - 'gtest': GTestDependency, + 'gtest': gtest_factory, 'gmock': GMockDependency, 'llvm': llvm_factory, 'valgrind': ValgrindDependency, diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index 2cedc978e..e8d462f30 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -44,9 +44,9 @@ def get_shared_library_suffix(environment, for_machine: MachineChoice): return '.so' -class GTestDependency(ExternalDependency): - def __init__(self, environment, kwargs): - super().__init__('gtest', environment, kwargs, language='cpp') +class GTestDependencySystem(ExternalDependency): + def __init__(self, name: str, environment, kwargs): + super().__init__(name, environment, kwargs, language='cpp') self.main = kwargs.get('main', False) self.src_dirs = ['/usr/src/gtest/src', '/usr/src/googletest/googletest/src'] self.detect() @@ -98,25 +98,20 @@ class GTestDependency(ExternalDependency): def log_tried(self): return 'system' - @classmethod - def _factory(cls, environment, kwargs): - methods = process_method_kw(cls.get_methods(), kwargs) - candidates = [] - - if DependencyMethods.PKGCONFIG in methods: - pcname = 'gtest_main' if kwargs.get('main', False) else 'gtest' - candidates.append(functools.partial(PkgConfigDependency, pcname, environment, kwargs)) - - if DependencyMethods.SYSTEM in methods: - candidates.append(functools.partial(GTestDependency, environment, kwargs)) - - return candidates - @staticmethod def get_methods(): return [DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM] +class GTestDependencyPC(PkgConfigDependency): + + def __init__(self, name: str, environment: 'Environment', kwargs: T.Dict[str, T.Any]): + assert name == 'gtest' + if kwargs.get('main'): + name = 'gtest_main' + super().__init__(name, environment, kwargs) + + class GMockDependency(ExternalDependency): def __init__(self, environment, kwargs): super().__init__('gmock', environment, kwargs, language='cpp') @@ -132,11 +127,10 @@ class GMockDependency(ExternalDependency): # GMock without GTest is pretty much useless # this also mimics the structure given in WrapDB, # where GMock always pulls in GTest - gtest_dep = GTestDependency(environment, gtest_kwargs) - if not gtest_dep.is_found: + found = self._add_sub_dependency2(gtest_factory(environment, self.for_machine, gtest_kwargs)) + if not found: self.is_found = False return - self.ext_deps.append(gtest_dep) # GMock may be a library or just source. # Work with both. @@ -452,3 +446,10 @@ llvm_factory = DependencyFactory( cmake_class=LLVMDependencyCMake, configtool_class=LLVMDependencyConfigTool, ) + +gtest_factory = DependencyFactory( + 'gtest', + [DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM], + pkgconfig_class=GTestDependencyPC, + system_class=GTestDependencySystem, +)