diff options
author | Jussi Pakkanen <jpakkane@gmail.com> | 2018-09-03 21:11:44 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-09-03 21:11:44 +0300 |
commit | fb2d2b6eab7fcfc2aff08417b6abbf2ea975b3c9 (patch) | |
tree | b9d121db75f775a649a211957d7bbc0a4ed23e6c | |
parent | da7a3d533138387e7b801eff6b59d0fb71487807 (diff) | |
parent | c427f8cc9ca070c82b4ca48b1acff79a308e53aa (diff) | |
download | meson-fb2d2b6eab7fcfc2aff08417b6abbf2ea975b3c9.zip meson-fb2d2b6eab7fcfc2aff08417b6abbf2ea975b3c9.tar.gz meson-fb2d2b6eab7fcfc2aff08417b6abbf2ea975b3c9.tar.bz2 |
Merge pull request #4114 from SoapGentoo/gtest-pkgconfig
GTest & GMock pkgconfig fallback
-rw-r--r-- | mesonbuild/dependencies/dev.py | 81 |
1 files changed, 70 insertions, 11 deletions
diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py index 0876391..f90422e 100644 --- a/mesonbuild/dependencies/dev.py +++ b/mesonbuild/dependencies/dev.py @@ -15,14 +15,14 @@ # This file contains the detection logic for external dependencies useful for # development purposes, such as testing, debugging, etc.. +import functools import os import re -from .. import mlog from .. import mesonlib from ..mesonlib import version_compare, stringlistify, extract_as_list from .base import ( - DependencyException, ExternalDependency, PkgConfigDependency, + DependencyException, DependencyMethods, ExternalDependency, PkgConfigDependency, strip_system_libdirs, ConfigToolDependency, ) @@ -80,18 +80,57 @@ class GTestDependency(ExternalDependency): else: return 'building self' + @classmethod + def _factory(cls, environment, kwargs): + methods = cls._process_method_kw(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 GMockDependency(ExternalDependency): def __init__(self, environment, kwargs): super().__init__('gmock', environment, 'cpp', kwargs) + self.main = kwargs.get('main', False) + + # If we are getting main() from GMock, we definitely + # want to avoid linking in main() from GTest + gtest_kwargs = kwargs.copy() + if self.main: + gtest_kwargs['main'] = False + + # 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: + self.is_found = False + return + + self.compile_args = gtest_dep.compile_args + self.link_args = gtest_dep.link_args + self.sources = gtest_dep.sources + # GMock may be a library or just source. # Work with both. gmock_detect = self.clib_compiler.find_library("gmock", self.env, []) - if gmock_detect: + gmock_main_detect = self.clib_compiler.find_library("gmock_main", self.env, []) + if gmock_detect and (not self.main or gmock_main_detect): self.is_found = True - self.compile_args = [] - self.link_args = gmock_detect - self.sources = [] + self.link_args += gmock_detect + if self.main: + self.link_args += gmock_main_detect self.prebuilt = True return @@ -101,25 +140,45 @@ class GMockDependency(ExternalDependency): # Yes, we need both because there are multiple # versions of gmock that do different things. d2 = os.path.normpath(os.path.join(d, '..')) - self.compile_args = ['-I' + d, '-I' + d2, '-I' + os.path.join(d2, 'include')] - self.link_args = [] + self.compile_args += ['-I' + d, '-I' + d2, '-I' + os.path.join(d2, 'include')] all_src = mesonlib.File.from_absolute_file(os.path.join(d, 'gmock-all.cc')) main_src = mesonlib.File.from_absolute_file(os.path.join(d, 'gmock_main.cc')) - if kwargs.get('main', False): - self.sources = [all_src, main_src] + if self.main: + self.sources += [all_src, main_src] else: - self.sources = [all_src] + self.sources += [all_src] self.prebuilt = False return self.is_found = False + def need_threads(self): + return True + def log_info(self): if self.prebuilt: return 'prebuilt' else: return 'building self' + @classmethod + def _factory(cls, environment, kwargs): + methods = cls._process_method_kw(kwargs) + candidates = [] + + if DependencyMethods.PKGCONFIG in methods: + pcname = 'gmock_main' if kwargs.get('main', False) else 'gmock' + candidates.append(functools.partial(PkgConfigDependency, pcname, environment, kwargs)) + + if DependencyMethods.SYSTEM in methods: + candidates.append(functools.partial(GMockDependency, environment, kwargs)) + + return candidates + + @staticmethod + def get_methods(): + return [DependencyMethods.PKGCONFIG, DependencyMethods.SYSTEM] + class LLVMDependency(ConfigToolDependency): """ |