aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-09-03 21:11:44 +0300
committerGitHub <noreply@github.com>2018-09-03 21:11:44 +0300
commitfb2d2b6eab7fcfc2aff08417b6abbf2ea975b3c9 (patch)
treeb9d121db75f775a649a211957d7bbc0a4ed23e6c
parentda7a3d533138387e7b801eff6b59d0fb71487807 (diff)
parentc427f8cc9ca070c82b4ca48b1acff79a308e53aa (diff)
downloadmeson-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.py81
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):
"""