summaryrefslogtreecommitdiff
path: root/lib/spack/spack/spec.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/spack/spack/spec.py')
-rw-r--r--lib/spack/spack/spec.py39
1 files changed, 26 insertions, 13 deletions
diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 5a491d5eed..a11e8ab915 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -2876,13 +2876,14 @@ class Spec:
continue
# Add any patches from the package to the spec.
- patches = []
+ patches = set()
for cond, patch_list in s.package_class.patches.items():
if s.satisfies(cond):
for patch in patch_list:
- patches.append(patch)
+ patches.add(patch)
if patches:
spec_to_patches[id(s)] = patches
+
# Also record all patches required on dependencies by
# depends_on(..., patch=...)
for dspec in root.traverse_edges(deptype=all, cover="edges", root=False):
@@ -2890,17 +2891,25 @@ class Spec:
continue
pkg_deps = dspec.parent.package_class.dependencies
- if dspec.spec.name not in pkg_deps:
- continue
patches = []
- for cond, dependency in pkg_deps[dspec.spec.name].items():
+ for cond, deps_by_name in pkg_deps.items():
+ if not dspec.parent.satisfies(cond):
+ continue
+
+ dependency = deps_by_name.get(dspec.spec.name)
+ if not dependency:
+ continue
+
for pcond, patch_list in dependency.patches.items():
- if dspec.parent.satisfies(cond) and dspec.spec.satisfies(pcond):
+ if dspec.spec.satisfies(pcond):
patches.extend(patch_list)
+
if patches:
- all_patches = spec_to_patches.setdefault(id(dspec.spec), [])
- all_patches.extend(patches)
+ all_patches = spec_to_patches.setdefault(id(dspec.spec), set())
+ for patch in patches:
+ all_patches.add(patch)
+
for spec in root.traverse():
if id(spec) not in spec_to_patches:
continue
@@ -3163,13 +3172,17 @@ class Spec:
If no conditions are True (and we don't depend on it), return
``(None, None)``.
"""
- conditions = self.package_class.dependencies[name]
-
vt.substitute_abstract_variants(self)
# evaluate when specs to figure out constraints on the dependency.
dep = None
- for when_spec, dependency in conditions.items():
- if self.satisfies(when_spec):
+ for when_spec, deps_by_name in self.package_class.dependencies.items():
+ if not self.satisfies(when_spec):
+ continue
+
+ for dep_name, dependency in deps_by_name.items():
+ if dep_name != name:
+ continue
+
if dep is None:
dep = dp.Dependency(Spec(self.name), Spec(name), depflag=0)
try:
@@ -3344,7 +3357,7 @@ class Spec:
while changed:
changed = False
- for dep_name in self.package_class.dependencies:
+ for dep_name in self.package_class.dependency_names():
# Do we depend on dep_name? If so pkg_dep is not None.
dep = self._evaluate_dependency_conditions(dep_name)