diff options
author | Harmen Stoppels <harmenstoppels@gmail.com> | 2022-10-17 18:14:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-17 16:14:12 +0000 |
commit | 39105a3a6f2fe49376a2068a5885fcbdb4a5acbf (patch) | |
tree | bd70732a463ef7b79cd85ee31c60f22c69c73fce /lib | |
parent | 90818719663fbf96c1746694bd1b1ab11ce40cc4 (diff) | |
download | spack-39105a3a6f2fe49376a2068a5885fcbdb4a5acbf.tar.gz spack-39105a3a6f2fe49376a2068a5885fcbdb4a5acbf.tar.bz2 spack-39105a3a6f2fe49376a2068a5885fcbdb4a5acbf.tar.xz spack-39105a3a6f2fe49376a2068a5885fcbdb4a5acbf.zip |
installer.py: traverse_dependencies has local deptype (#33367)
Currently `traverse_dependencies` fixes deptypes to traverse once and
for all in the recursion, but this is incorrect, since deptypes depend
on the node (e.g. if it's a dependency and cache-only, don't follow
build type edges, even if the parent is build from sources and needs
build deps.)
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/installer.py | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/lib/spack/spack/installer.py b/lib/spack/spack/installer.py index 1de78e392b..ca53f87691 100644 --- a/lib/spack/spack/installer.py +++ b/lib/spack/spack/installer.py @@ -2426,21 +2426,31 @@ class BuildRequest(object): """The specification associated with the package.""" return self.pkg.spec - def traverse_dependencies(self): + def traverse_dependencies(self, spec=None, visited=None): """ Yield any dependencies of the appropriate type(s) Yields: (Spec) The next child spec in the DAG """ - get_spec = lambda s: s.spec - - deptypes = self.get_deptypes(self.pkg) - tty.debug("Processing dependencies for {0}: {1}".format(self.pkg_id, deptypes)) - for dspec in self.spec.traverse_edges( - deptype=deptypes, order="post", root=False, direction="children" - ): - yield get_spec(dspec) + # notice: deptype is not constant across nodes, so we cannot use + # spec.traverse_edges(deptype=...). + + if spec is None: + spec = self.spec + if visited is None: + visited = set() + deptype = self.get_deptypes(spec.package) + + for dep in spec.dependencies(deptype=deptype): + hash = dep.dag_hash() + if hash in visited: + continue + visited.add(hash) + # In Python 3: yield from self.traverse_dependencies(dep, visited) + for s in self.traverse_dependencies(dep, visited): + yield s + yield dep class InstallError(spack.error.SpackError): |