dependencies: extract code to get all leaf dependencies

Extract to a separate function the code that resolves dependencies
for compiler methods.  We will reuse it for add_project_dependencies().

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
pull/10347/head
Paolo Bonzini 3 years ago committed by Eli Schwartz
parent d413dedf2a
commit 06b76f7c9d
  1. 3
      mesonbuild/dependencies/__init__.py
  2. 18
      mesonbuild/dependencies/base.py
  3. 15
      mesonbuild/interpreter/compiler.py

@ -18,7 +18,7 @@ from .hdf5 import hdf5_factory
from .base import Dependency, InternalDependency, ExternalDependency, NotFoundDependency
from .base import (
ExternalLibrary, DependencyException, DependencyMethods,
BuiltinDependency, SystemDependency)
BuiltinDependency, SystemDependency, get_leaf_external_dependencies)
from .cmake import CMakeDependency
from .configtool import ConfigToolDependency
from .dub import DubDependency
@ -65,6 +65,7 @@ __all__ = [
'find_external_dependency',
'get_dep_identifier',
'get_leaf_external_dependencies',
]
"""Dependency representations and discovery logic.

@ -23,7 +23,7 @@ import itertools
import typing as T
from enum import Enum
from .. import mlog
from .. import mlog, mesonlib
from ..compilers import clib_langs
from ..mesonlib import LibType, MachineChoice, MesonException, HoldableObject
from ..mesonlib import version_compare_many
@ -461,6 +461,22 @@ class ExternalLibrary(ExternalDependency):
return new
def get_leaf_external_dependencies(deps: T.List[Dependency]) -> T.List[Dependency]:
if not deps:
# Ensure that we always return a new instance
return deps.copy()
final_deps = []
while deps:
next_deps = []
for d in mesonlib.listify(deps):
if not isinstance(d, Dependency) or d.is_built():
raise DependencyException('Dependencies must be external dependencies')
final_deps.append(d)
next_deps.extend(d.ext_deps)
deps = next_deps
return final_deps
def sort_libpaths(libpaths: T.List[str], refpaths: T.List[str]) -> T.List[str]:
"""Sort <libpaths> according to <refpaths>

@ -239,20 +239,7 @@ class CompilerHolder(ObjectHolder['Compiler']):
return args
def _determine_dependencies(self, deps: T.List['dependencies.Dependency'], endl: str = ':') -> T.Tuple[T.List['dependencies.Dependency'], str]:
if deps:
final_deps = []
while deps:
next_deps = []
for d in mesonlib.listify(deps):
if not isinstance(d, dependencies.Dependency) or d.is_built():
raise InterpreterException('Dependencies must be external dependencies')
final_deps.append(d)
next_deps.extend(d.ext_deps)
deps = next_deps
deps = final_deps
else:
# Ensure that we always return a new instance
deps = deps.copy()
deps = dependencies.get_leaf_external_dependencies(deps)
return deps, self._dep_msg(deps, endl)
@typed_pos_args('compiler.alignment', str)

Loading…
Cancel
Save