diff options
Diffstat (limited to 'mesonbuild')
-rw-r--r-- | mesonbuild/dependencies/base.py | 56 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 21 |
2 files changed, 75 insertions, 2 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 2a19544..27a5fcb 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -1,4 +1,4 @@ -# Copyright 2013-2017 The Meson development team +# Copyright 2013-2018 The Meson development team # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,6 +15,7 @@ # This file contains the detection logic for external dependencies. # Custom logic for several other packages are in separate files. +import copy import os import re import stat @@ -146,6 +147,23 @@ class Dependency: def get_configtool_variable(self, variable_name): raise DependencyException('{!r} is not a config-tool dependency'.format(self.name)) + def get_partial_dependency(self, *, compile_args=False, link_args=False, + links=False, includes=False, sources=False): + """Create a new dependency that contains part of the parent dependency. + + The following options can be inherited: + links -- all link_with arguemnts + includes -- all include_directory and -I/-isystem calls + sources -- any source, header, or generated sources + compile_args -- any compile args + link_args -- any link args + + Additionally the new dependency will have the version parameter of it's + parent (if any) and the requested values of any dependencies will be + added as well. + """ + RuntimeError('Unreachable code in partial_dependency called') + class InternalDependency(Dependency): def __init__(self, version, incdirs, compile_args, link_args, libraries, whole_libraries, sources, ext_deps): @@ -168,6 +186,21 @@ class InternalDependency(Dependency): raise DependencyException('Method "get_configtool_variable()" is ' 'invalid for an internal dependency') + def get_partial_dependency(self, *, compile_args=False, link_args=False, + links=False, includes=False, sources=False): + compile_args = self.compile_args.copy() if compile_args else [] + link_args = self.link_args.copy() if link_args else [] + libraries = self.libraries.copy() if links else [] + whole_libraries = self.whole_libraries.copy() if links else [] + sources = self.sources.copy() if sources else [] + includes = self.include_directories.copy() if includes else [] + deps = [d.get_partial_dependency( + compile_args=compile_args, link_args=link_args, links=links, + includes=includes, sources=sources) for d in self.ext_deps] + return InternalDependency( + self.version, includes, compile_args, link_args, libraries, + whole_libraries, sources, deps) + class ExternalDependency(Dependency): def __init__(self, type_name, environment, language, kwargs): @@ -211,6 +244,18 @@ class ExternalDependency(Dependency): def get_compiler(self): return self.compiler + def get_partial_dependency(self, *, compile_args=False, link_args=False, + links=False, includes=False, sources=False): + new = copy.copy(self) + if not compile_args: + new.compile_args = [] + if not link_args: + new.link_args = [] + if not sources: + new.sources = [] + + return new + class ConfigToolDependency(ExternalDependency): @@ -887,6 +932,15 @@ class ExternalLibrary(ExternalDependency): return [] return self.link_args + def get_partial_dependency(self, *, compile_args=False, link_args=False, + links=False, includes=False, sources=False): + # External library only has link_args, so ignore the rest of the + # interface. + new = copy.copy(self) + if not link_args: + new.link_args = [] + return new + class ExtraFrameworkDependency(ExternalDependency): def __init__(self, name, required, path, env, lang, kwargs): diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 4e4ba5c..c7841a8 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -275,6 +275,7 @@ class DependencyHolder(InterpreterObject, ObjectHolder): 'version': self.version_method, 'get_pkgconfig_variable': self.pkgconfig_method, 'get_configtool_variable': self.configtool_method, + 'partial_dependency': self.partial_dependency_method, }) def type_name_method(self, args, kwargs): @@ -306,12 +307,18 @@ class DependencyHolder(InterpreterObject, ObjectHolder): raise InterpreterException('Variable name must be a string.') return self.held_object.get_configtool_variable(varname) + def partial_dependency_method(self, args, kwargs): + if args: + raise InterpreterException('partial_dependency takes no positional arguments') + return DependencyHolder(self.held_object.get_partial_dependency(**kwargs)) + class InternalDependencyHolder(InterpreterObject, ObjectHolder): def __init__(self, dep): InterpreterObject.__init__(self) ObjectHolder.__init__(self, dep) self.methods.update({'found': self.found_method, 'version': self.version_method, + 'partial_dependency': self.partial_dependency_method, }) def found_method(self, args, kwargs): @@ -320,6 +327,11 @@ class InternalDependencyHolder(InterpreterObject, ObjectHolder): def version_method(self, args, kwargs): return self.held_object.get_version() + def partial_dependency_method(self, args, kwargs): + if args: + raise InterpreterException('get_partial_dependency takes no positional arguments') + return DependencyHolder(self.held_object.get_partial_dependency(**kwargs)) + class ExternalProgramHolder(InterpreterObject, ObjectHolder): def __init__(self, ep): InterpreterObject.__init__(self) @@ -346,7 +358,9 @@ class ExternalLibraryHolder(InterpreterObject, ObjectHolder): def __init__(self, el): InterpreterObject.__init__(self) ObjectHolder.__init__(self, el) - self.methods.update({'found': self.found_method}) + self.methods.update({'found': self.found_method, + 'partial_dependency': self.partial_dependency_method, + }) def found(self): return self.held_object.found() @@ -366,6 +380,11 @@ class ExternalLibraryHolder(InterpreterObject, ObjectHolder): def get_exe_args(self): return self.held_object.get_exe_args() + def partial_dependency_method(self, args, kwargs): + if args: + raise InterpreterException('partial_dependency takes no positional arguments') + return DependencyHolder(self.held_object.get_partial_dependency(**kwargs)) + class GeneratorHolder(InterpreterObject, ObjectHolder): def __init__(self, interpreter, args, kwargs): InterpreterObject.__init__(self) |