aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/interpreter.py
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2018-12-06 15:03:46 -0500
committerXavier Claessens <xavier.claessens@collabora.com>2018-12-27 23:06:28 -0500
commitb6cede2928e80d6bd0512c82ad6787c03faae1e6 (patch)
tree19202bffbeef80c9c2116f5909fb9a078005ae99 /mesonbuild/interpreter.py
parentff2aa5a9ef48bc083e01d7af578799fc4eada764 (diff)
downloadmeson-b6cede2928e80d6bd0512c82ad6787c03faae1e6.zip
meson-b6cede2928e80d6bd0512c82ad6787c03faae1e6.tar.gz
meson-b6cede2928e80d6bd0512c82ad6787c03faae1e6.tar.bz2
find_library: Add 'has_headers' kwarg
A library without its headers is often useless, so it is common to check them together.
Diffstat (limited to 'mesonbuild/interpreter.py')
-rw-r--r--mesonbuild/interpreter.py70
1 files changed, 37 insertions, 33 deletions
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index 6870fc1..0571eba 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -900,6 +900,23 @@ class SubprojectHolder(InterpreterObject, ObjectHolder):
raise InvalidArguments('Requested variable "{0}" not found.'.format(varname))
return self.held_object.variables[varname]
+header_permitted_kwargs = set([
+ 'required',
+ 'prefix',
+ 'no_builtin_args',
+ 'include_directories',
+ 'args',
+ 'dependencies',
+])
+
+find_library_permitted_kwargs = set([
+ 'has_headers',
+ 'required',
+ 'dirs',
+])
+
+find_library_permitted_kwargs |= set(['header_' + k for k in header_permitted_kwargs])
+
class CompilerHolder(InterpreterObject):
def __init__(self, compiler, env, subproject):
InterpreterObject.__init__(self)
@@ -1345,14 +1362,7 @@ class CompilerHolder(InterpreterObject):
@FeatureNew('compiler.check_header', '0.47.0')
@FeatureNewKwargs('compiler.check_header', '0.50.0', ['required'])
- @permittedKwargs({
- 'required',
- 'prefix',
- 'no_builtin_args',
- 'include_directories',
- 'args',
- 'dependencies',
- })
+ @permittedKwargs(header_permitted_kwargs)
def check_header_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('check_header method takes exactly one argument.')
@@ -1380,14 +1390,7 @@ class CompilerHolder(InterpreterObject):
return haz
@FeatureNewKwargs('compiler.has_header', '0.50.0', ['required'])
- @permittedKwargs({
- 'required',
- 'prefix',
- 'no_builtin_args',
- 'include_directories',
- 'args',
- 'dependencies',
- })
+ @permittedKwargs(header_permitted_kwargs)
def has_header_method(self, args, kwargs):
if len(args) != 1:
raise InterpreterException('has_header method takes exactly one argument.')
@@ -1414,14 +1417,7 @@ class CompilerHolder(InterpreterObject):
return haz
@FeatureNewKwargs('compiler.has_header_symbol', '0.50.0', ['required'])
- @permittedKwargs({
- 'required',
- 'prefix',
- 'no_builtin_args',
- 'include_directories',
- 'args',
- 'dependencies',
- })
+ @permittedKwargs(header_permitted_kwargs)
def has_header_symbol_method(self, args, kwargs):
if len(args) != 2:
raise InterpreterException('has_header_symbol method takes exactly two arguments.')
@@ -1449,12 +1445,17 @@ class CompilerHolder(InterpreterObject):
mlog.log('Header <{0}> has symbol'.format(hname), mlog.bold(symbol, True), msg, h)
return haz
+ def notfound_library(self, libname):
+ lib = dependencies.ExternalLibrary(libname, None,
+ self.environment,
+ self.compiler.language,
+ silent=True)
+ return ExternalLibraryHolder(lib, self.subproject)
+
+ @FeatureNewKwargs('compiler.find_library', '0.50.0', ['has_headers'])
@FeatureNewKwargs('compiler.find_library', '0.49.0', ['disabler'])
@disablerIfNotFound
- @permittedKwargs({
- 'required',
- 'dirs',
- })
+ @permittedKwargs(find_library_permitted_kwargs)
def find_library_method(self, args, kwargs):
# TODO add dependencies support?
if len(args) != 1:
@@ -1466,11 +1467,14 @@ class CompilerHolder(InterpreterObject):
disabled, required, feature = extract_required_kwarg(kwargs, self.subproject)
if disabled:
mlog.log('Library', mlog.bold(libname), 'skipped: feature', mlog.bold(feature), 'disabled')
- lib = dependencies.ExternalLibrary(libname, None,
- self.environment,
- self.compiler.language,
- silent=True)
- return ExternalLibraryHolder(lib, self.subproject)
+ return self.notfound_library(libname)
+
+ has_header_kwargs = {k[7:]: v for k, v in kwargs.items() if k.startswith('header_')}
+ has_header_kwargs['required'] = required
+ headers = mesonlib.stringlistify(kwargs.get('has_headers', []))
+ for h in headers:
+ if not self.has_header_method([h], has_header_kwargs):
+ return self.notfound_library(libname)
search_dirs = mesonlib.stringlistify(kwargs.get('dirs', []))
for i in search_dirs: