Skip to content

Commit

Permalink
dependencies: extract code to get all leaf dependencies
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
bonzini authored and eli-schwartz committed May 3, 2022
1 parent d413ded commit 06b76f7
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 16 deletions.
3 changes: 2 additions & 1 deletion mesonbuild/dependencies/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
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
Expand Down Expand Up @@ -65,6 +65,7 @@

'find_external_dependency',
'get_dep_identifier',
'get_leaf_external_dependencies',
]

"""Dependency representations and discovery logic.
Expand Down
18 changes: 17 additions & 1 deletion mesonbuild/dependencies/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
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
Expand Down Expand Up @@ -461,6 +461,22 @@ def get_partial_dependency(self, *, compile_args: bool = False,
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>
Expand Down
15 changes: 1 addition & 14 deletions mesonbuild/interpreter/compiler.py
Original file line number Diff line number Diff line change
Expand Up @@ -239,20 +239,7 @@ def _determine_args(self, nobuiltins: bool,
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)
Expand Down

0 comments on commit 06b76f7

Please sign in to comment.