aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild')
-rw-r--r--mesonbuild/dependencies/base.py61
-rw-r--r--mesonbuild/interpreter.py18
2 files changed, 78 insertions, 1 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py
index 7836099..fd2a219 100644
--- a/mesonbuild/dependencies/base.py
+++ b/mesonbuild/dependencies/base.py
@@ -193,6 +193,13 @@ class Dependency:
kwargs['method'] = method
self.ext_deps.append(dep_type(env, kwargs))
+ def get_variable(self, *, cmake: typing.Optional[str] = None, pkgconfig: typing.Optional[str] = None,
+ configtool: typing.Optional[str] = None, default_value: typing.Optional[str] = None,
+ pkgconfig_define: typing.Optional[typing.List[str]] = None) -> typing.Union[str, typing.List[str]]:
+ if default_value is not None:
+ return default_value
+ raise DependencyException('No default provided for dependency {!r}, which is not pkg-config, cmake, or config-tool based.'.format(self))
+
class InternalDependency(Dependency):
def __init__(self, version, incdirs, compile_args, link_args, libraries, whole_libraries, sources, ext_deps):
@@ -518,6 +525,26 @@ class ConfigToolDependency(ExternalDependency):
def log_tried(self):
return self.type_name
+ def get_variable(self, *, cmake: typing.Optional[str] = None, pkgconfig: typing.Optional[str] = None,
+ configtool: typing.Optional[str] = None, default_value: typing.Optional[str] = None,
+ pkgconfig_define: typing.Optional[typing.List[str]] = None) -> typing.Union[str, typing.List[str]]:
+ if configtool:
+ # In the not required case '' (empty string) will be returned if the
+ # variable is not found. Since '' is a valid value to return we
+ # set required to True here to force and error, and use the
+ # finally clause to ensure it's restored.
+ restore = self.required
+ self.required = True
+ try:
+ return self.get_configtool_variable(configtool)
+ except DependencyException:
+ pass
+ finally:
+ self.required = restore
+ if default_value is not None:
+ return default_value
+ raise DependencyException('Could not get config-tool variable and no default provided for {!r}'.format(self))
+
class PkgConfigDependency(ExternalDependency):
# The class's copy of the pkg-config path. Avoids having to search for it
@@ -928,6 +955,23 @@ class PkgConfigDependency(ExternalDependency):
def log_tried(self):
return self.type_name
+ def get_variable(self, *, cmake: typing.Optional[str] = None, pkgconfig: typing.Optional[str] = None,
+ configtool: typing.Optional[str] = None, default_value: typing.Optional[str] = None,
+ pkgconfig_define: typing.Optional[typing.List[str]] = None) -> typing.Union[str, typing.List[str]]:
+ if pkgconfig:
+ kwargs = {}
+ if default_value is not None:
+ kwargs['default'] = default_value
+ if pkgconfig_define is not None:
+ kwargs['define_variable'] = pkgconfig_define
+ try:
+ return self.get_pkgconfig_variable(pkgconfig, kwargs)
+ except DependencyException:
+ pass
+ if default_value is not None:
+ return default_value
+ raise DependencyException('Could not get pkg-config variable and no default provided for {!r}'.format(self))
+
class CMakeTraceLine:
def __init__(self, file, line, func, args):
self.file = file
@@ -1784,6 +1828,23 @@ set(CMAKE_SIZEOF_VOID_P "{}")
return 'modules: ' + ', '.join(modules)
return ''
+ def get_variable(self, *, cmake: typing.Optional[str] = None, pkgconfig: typing.Optional[str] = None,
+ configtool: typing.Optional[str] = None, default_value: typing.Optional[str] = None,
+ pkgconfig_define: typing.Optional[typing.List[str]] = None) -> typing.Union[str, typing.List[str]]:
+ if cmake:
+ try:
+ v = self.vars[cmake]
+ except KeyError:
+ pass
+ else:
+ if len(v) == 1:
+ return v[0]
+ elif v:
+ return v
+ if default_value is not None:
+ return default_value
+ raise DependencyException('Could not get cmake variable and no default provided for {!r}'.format(self))
+
class DubDependency(ExternalDependency):
class_dubbin = None
diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py
index cb3aa8a..30be5ae 100644
--- a/mesonbuild/interpreter.py
+++ b/mesonbuild/interpreter.py
@@ -384,6 +384,7 @@ class DependencyHolder(InterpreterObject, ObjectHolder):
'name': self.name_method,
'get_pkgconfig_variable': self.pkgconfig_method,
'get_configtool_variable': self.configtool_method,
+ 'get_variable': self.variable_method,
'partial_dependency': self.partial_dependency_method,
})
@@ -440,13 +441,21 @@ class DependencyHolder(InterpreterObject, ObjectHolder):
pdep = self.held_object.get_partial_dependency(**kwargs)
return DependencyHolder(pdep, self.subproject)
+ @FeatureNew('dep.get_variable', '0.51.0')
+ @noPosargs
+ @permittedKwargs({'cmake', 'pkgconfig', 'configtool', 'default', 'pkgconfig_define'})
+ def variable_method(self, args, kwargs):
+ return self.held_object.get_variable(**kwargs)
+
+
class InternalDependencyHolder(InterpreterObject, ObjectHolder):
def __init__(self, dep, pv):
InterpreterObject.__init__(self)
ObjectHolder.__init__(self, dep, pv)
self.methods.update({'found': self.found_method,
- 'version': self.version_method,
+ 'get_variable': self.variable_method,
'partial_dependency': self.partial_dependency_method,
+ 'version': self.version_method,
})
@noPosargs
@@ -466,6 +475,13 @@ class InternalDependencyHolder(InterpreterObject, ObjectHolder):
pdep = self.held_object.get_partial_dependency(**kwargs)
return DependencyHolder(pdep, self.subproject)
+ @FeatureNew('dep.get_variable', '0.51.0')
+ @noPosargs
+ @permittedKwargs({'cmake', 'pkgconfig', 'configtool', 'default_variable', 'pkgconfig_define'})
+ def variable_method(self, args, kwargs):
+ return self.held_object.get_variable(**kwargs)
+
+
class ExternalProgramHolder(InterpreterObject, ObjectHolder):
def __init__(self, ep):
InterpreterObject.__init__(self)