aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Baker <dylan@pnwbakers.com>2020-01-09 11:33:06 -0800
committerDylan Baker <dylan@pnwbakers.com>2020-01-29 09:11:24 -0800
commitfbad73c939a3c7f7f27994a81d68f4a9082c06a0 (patch)
tree3e568c07a44961b5cbfa70e49859d841ba882533
parent5d630c663c125b1e62cb88bd01054f1253c92bbe (diff)
downloadmeson-fbad73c939a3c7f7f27994a81d68f4a9082c06a0.zip
meson-fbad73c939a3c7f7f27994a81d68f4a9082c06a0.tar.gz
meson-fbad73c939a3c7f7f27994a81d68f4a9082c06a0.tar.bz2
dependencies: Use a DependencyFactory for threads
This lets us make a number of uses of threads safer, because we can use the threads_factory instead of the ThreadDependency
-rw-r--r--mesonbuild/dependencies/__init__.py4
-rw-r--r--mesonbuild/dependencies/base.py6
-rw-r--r--mesonbuild/dependencies/boost.py6
-rw-r--r--mesonbuild/dependencies/dev.py18
-rw-r--r--mesonbuild/dependencies/misc.py45
-rw-r--r--mesonbuild/modules/pkgconfig.py6
6 files changed, 42 insertions, 43 deletions
diff --git a/mesonbuild/dependencies/__init__.py b/mesonbuild/dependencies/__init__.py
index 2626c24..6b91b38 100644
--- a/mesonbuild/dependencies/__init__.py
+++ b/mesonbuild/dependencies/__init__.py
@@ -24,7 +24,7 @@ from .dev import ValgrindDependency, gmock_factory, gtest_factory, llvm_factory
from .coarrays import CoarrayDependency
from .mpi import MPIDependency
from .scalapack import ScalapackDependency
-from .misc import (BlocksDependency, CursesDependency, OpenMPDependency, ThreadDependency, cups_factory, gpgme_factory, libgcrypt_factory, libwmf_factory, netcdf_factory, pcap_factory, python3_factory, shaderc_factory)
+from .misc import (BlocksDependency, CursesDependency, OpenMPDependency, cups_factory, gpgme_factory, libgcrypt_factory, libwmf_factory, netcdf_factory, pcap_factory, python3_factory, shaderc_factory, threads_factory)
from .platform import AppleFrameworks
from .ui import GnuStepDependency, Qt4Dependency, Qt5Dependency, WxDependency, gl_factory, sdl2_factory, vulkan_factory
@@ -51,7 +51,7 @@ packages.update({
'netcdf': netcdf_factory,
'openmp': OpenMPDependency,
'python3': python3_factory,
- 'threads': ThreadDependency,
+ 'threads': threads_factory,
'pcap': pcap_factory,
'cups': cups_factory,
'libwmf': libwmf_factory,
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index b6c6f19..c38786b 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -195,8 +195,8 @@ class Dependency:
return True
return False
- def _add_sub_dependency(self, dep_type: T.Type['Dependency'], env: Environment,
- kwargs: T.Dict[str, T.Any], *,
+ def _add_sub_dependency(self, dep_type: T.Type['Dependency'], name: str,
+ env: Environment, kwargs: T.Dict[str, T.Any], *,
method: DependencyMethods = DependencyMethods.AUTO) -> None:
"""Add an internal dependency of of the given type.
@@ -207,7 +207,7 @@ class Dependency:
"""
kwargs = kwargs.copy()
kwargs['method'] = method
- self.ext_deps.append(dep_type(env, kwargs))
+ self.ext_deps.append(dep_type(name, env, kwargs))
def get_variable(self, *, cmake: T.Optional[str] = None, pkgconfig: T.Optional[str] = None,
configtool: T.Optional[str] = None, internal: T.Optional[str] = None,
diff --git a/mesonbuild/dependencies/boost.py b/mesonbuild/dependencies/boost.py
index 0f7216f..6054313 100644
--- a/mesonbuild/dependencies/boost.py
+++ b/mesonbuild/dependencies/boost.py
@@ -22,7 +22,7 @@ from .. import mesonlib
from ..environment import detect_cpu_family
from .base import (DependencyException, ExternalDependency)
-from .misc import ThreadDependency
+from .misc import threads_factory
# On windows 3 directory layouts are supported:
# * The default layout (versioned) installed:
@@ -105,7 +105,9 @@ class BoostDependency(ExternalDependency):
self.requested_modules = self.get_requested(kwargs)
if 'thread' in self.requested_modules:
- self._add_sub_dependency(ThreadDependency, environment, kwargs)
+ if not self._add_sub_dependency2(threads_factory(environment, self.for_machine, {})):
+ self.is_found = False
+ return
self.boost_root = None
self.boost_roots = []
diff --git a/mesonbuild/dependencies/dev.py b/mesonbuild/dependencies/dev.py
index 649975a..9bd6e4f 100644
--- a/mesonbuild/dependencies/dev.py
+++ b/mesonbuild/dependencies/dev.py
@@ -27,7 +27,7 @@ from .base import (
DependencyException, DependencyMethods, ExternalDependency, PkgConfigDependency,
strip_system_libdirs, ConfigToolDependency, CMakeDependency, DependencyFactory,
)
-from .misc import ThreadDependency
+from .misc import threads_factory
if T.TYPE_CHECKING:
from .. environment import Environment
@@ -50,8 +50,10 @@ class GTestDependencySystem(ExternalDependency):
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']
+ if not self._add_sub_dependency2(threads_factory(environment, self.for_machine, {})):
+ self.is_found = False
+ return
self.detect()
- self._add_sub_dependency(ThreadDependency, environment, kwargs)
def detect(self):
gtest_detect = self.clib_compiler.find_library("gtest", self.env, [])
@@ -117,7 +119,9 @@ class GMockDependencySystem(ExternalDependency):
def __init__(self, name: str, environment, kwargs):
super().__init__(name, environment, kwargs, language='cpp')
self.main = kwargs.get('main', False)
- self._add_sub_dependency(ThreadDependency, environment, kwargs)
+ if not self._add_sub_dependency2(threads_factory(environment, self.for_machine, {})):
+ self.is_found = False
+ return
# If we are getting main() from GMock, we definitely
# want to avoid linking in main() from GTest
@@ -231,7 +235,9 @@ class LLVMDependencyConfigTool(ConfigToolDependency):
self._set_old_link_args()
self.link_args = strip_system_libdirs(environment, self.for_machine, self.link_args)
self.link_args = self.__fix_bogus_link_args(self.link_args)
- self._add_sub_dependency(ThreadDependency, environment, kwargs)
+ if not self._add_sub_dependency2(threads_factory(environment, self.for_machine, {})):
+ self.is_found = False
+ return
def __fix_bogus_link_args(self, args):
"""This function attempts to fix bogus link arguments that llvm-config
@@ -394,7 +400,9 @@ class LLVMDependencyCMake(CMakeDependency):
defs = self.traceparser.get_cmake_var('PACKAGE_DEFINITIONS')
temp = ['-I' + x for x in inc_dirs] + defs
self.compile_args += [x for x in temp if x not in self.compile_args]
- self._add_sub_dependency(ThreadDependency, env, kwargs)
+ if not self._add_sub_dependency2(threads_factory(env, self.for_machine, {})):
+ self.is_found = False
+ return
def _main_cmake_file(self) -> str:
# Use a custom CMakeLists.txt for LLVM
diff --git a/mesonbuild/dependencies/misc.py b/mesonbuild/dependencies/misc.py
index 6a05ef1..7eba808 100644
--- a/mesonbuild/dependencies/misc.py
+++ b/mesonbuild/dependencies/misc.py
@@ -105,33 +105,17 @@ class OpenMPDependency(ExternalDependency):
class ThreadDependency(ExternalDependency):
- def __init__(self, environment, kwargs):
- super().__init__('threads', environment, kwargs)
- self.name = 'threads'
- self.is_found = False
- methods = listify(self.methods)
- if DependencyMethods.AUTO in methods:
- self.is_found = True
- # Happens if you are using a language with threads
- # concept without C, such as plain Cuda.
- if self.clib_compiler is None:
- self.compile_args = []
- self.link_args = []
- else:
- self.compile_args = self.clib_compiler.thread_flags(environment)
- self.link_args = self.clib_compiler.thread_link_flags(environment)
- return
-
- if DependencyMethods.CMAKE in methods:
- # for unit tests and for those who simply want
- # dependency('threads', method: 'cmake')
- cmakedep = CMakeDependency('Threads', environment, kwargs)
- if cmakedep.found():
- self.compile_args = cmakedep.get_compile_args()
- self.link_args = cmakedep.get_link_args()
- self.version = cmakedep.get_version()
- self.is_found = True
- return
+ def __init__(self, name: str, environment, kwargs):
+ super().__init__(name, environment, kwargs)
+ self.is_found = True
+ # Happens if you are using a language with threads
+ # concept without C, such as plain Cuda.
+ if self.clib_compiler is None:
+ self.compile_args = []
+ self.link_args = []
+ else:
+ self.compile_args = self.clib_compiler.thread_flags(environment)
+ self.link_args = self.clib_compiler.thread_link_flags(environment)
@staticmethod
def get_methods():
@@ -508,3 +492,10 @@ python3_factory = DependencyFactory(
# Python 3 will always be in /Library
extra_kwargs={'paths': ['/Library/Frameworks']},
)
+
+threads_factory = DependencyFactory(
+ 'threads',
+ [DependencyMethods.SYSTEM, DependencyMethods.CMAKE],
+ cmake_name='Threads',
+ system_class=ThreadDependency,
+)
diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py
index dc45a5b..2341bd2 100644
--- a/mesonbuild/modules/pkgconfig.py
+++ b/mesonbuild/modules/pkgconfig.py
@@ -17,6 +17,7 @@ from pathlib import PurePath
from .. import build
from .. import dependencies
+from ..dependencies.misc import ThreadDependency
from .. import mesonlib
from .. import mlog
from . import ModuleReturnValue
@@ -94,7 +95,7 @@ class DependenciesHelper:
self.add_version_reqs(name, version_req)
elif isinstance(obj, dependencies.Dependency) and not obj.found():
pass
- elif isinstance(obj, dependencies.ThreadDependency):
+ elif isinstance(obj, ThreadDependency):
pass
else:
raise mesonlib.MesonException('requires argument not a string, '
@@ -125,9 +126,6 @@ class DependenciesHelper:
if obj.found():
processed_reqs.append(obj.name)
self.add_version_reqs(obj.name, obj.version_reqs)
- elif isinstance(obj, dependencies.ThreadDependency):
- processed_libs += obj.get_compiler().thread_link_flags(obj.env)
- processed_cflags += obj.get_compiler().thread_flags(obj.env)
elif isinstance(obj, dependencies.InternalDependency):
if obj.found():
processed_libs += obj.get_link_args()