dependencies: add custom atomic dependency

Almost exactly the same as how the dl dependency works. On certain
systems (like BSDs that use clang), stdatomic is provided by compiler-rt
and doesn't need a separate library explictly linked. On a typical
GNU/LINUX system, atomic is a separate library that must be explictly
found and linked against. So just add a builtin and system method for
these two use cases.
pull/13439/merge
Dudemanguy 2 years ago committed by Eli Schwartz
parent a004672685
commit f070670e77
  1. 10
      docs/markdown/Dependencies.md
  2. 9
      docs/markdown/snippets/atomic-dependency.md
  3. 1
      mesonbuild/dependencies/__init__.py
  4. 28
      mesonbuild/dependencies/misc.py

@ -317,6 +317,16 @@ dep = dependency('appleframeworks', modules : 'foundation')
These dependencies can never be found for non-OSX hosts.
## atomic (stdatomic)
*(added 1.7.0)*
Provides access to the atomic operations library. This first attempts
to look for a valid atomic external library before trying to fallback
to what is provided by the C runtime libraries.
`method` may be `auto`, `builtin` or `system`.
## Blocks
Enable support for Clang's blocks extension.

@ -0,0 +1,9 @@
## New custom dependency for atomic
```
dependency('atomic')
```
checks for the availability of the atomic operation library. First, it looks
for the atomic library. If that is not found, then it will try to use what is
provided by the libc.

@ -220,6 +220,7 @@ packages.defaults.update({
'shaderc': 'misc',
'iconv': 'misc',
'intl': 'misc',
'atomic': 'misc',
'dl': 'misc',
'openssl': 'misc',
'libcrypto': 'misc',

@ -51,6 +51,27 @@ def netcdf_factory(env: 'Environment',
packages['netcdf'] = netcdf_factory
class AtomicBuiltinDependency(BuiltinDependency):
def __init__(self, name: str, env: Environment, kwargs: T.Dict[str, T.Any]):
super().__init__(name, env, kwargs)
self.feature_since = ('1.7.0', "consider checking for `atomic_flag_clear` with and without `find_library('atomic')`")
if self.clib_compiler.has_function('atomic_flag_clear', '#include <stdatomic.h>', env)[0]:
self.is_found = True
class AtomicSystemDependency(SystemDependency):
def __init__(self, name: str, env: Environment, kwargs: T.Dict[str, T.Any]):
super().__init__(name, env, kwargs)
self.feature_since = ('1.7.0', "consider checking for `atomic_flag_clear` with and without `find_library('atomic')`")
h = self.clib_compiler.has_header('stdatomic.h', '', env)
self.link_args = self.clib_compiler.find_library('atomic', env, [], self.libtype)
if h[0] and self.link_args:
self.is_found = True
class DlBuiltinDependency(BuiltinDependency):
def __init__(self, name: str, env: 'Environment', kwargs: T.Dict[str, T.Any]):
super().__init__(name, env, kwargs)
@ -564,6 +585,13 @@ def shaderc_factory(env: 'Environment',
packages['shaderc'] = shaderc_factory
packages['atomic'] = atomic_factory = DependencyFactory(
'atomic',
[DependencyMethods.SYSTEM, DependencyMethods.BUILTIN],
system_class=AtomicSystemDependency,
builtin_class=AtomicBuiltinDependency,
)
packages['cups'] = cups_factory = DependencyFactory(
'cups',
[DependencyMethods.PKGCONFIG, DependencyMethods.CONFIG_TOOL, DependencyMethods.EXTRAFRAMEWORK, DependencyMethods.CMAKE],

Loading…
Cancel
Save