diff options
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/dependencies/base.py | 61 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 18 |
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) |