From 805122c7895e9498a5330654cb18d3ad7e6a40a1 Mon Sep 17 00:00:00 2001
From: Todd Gamblin <tgamblin@llnl.gov>
Date: Tue, 12 May 2015 14:52:46 -0700
Subject: [PATCH] SPACK-41: bugfix for nonconvergent normalize()

- constrain() wasn't reporting changes properly.
---
 lib/spack/spack/spec.py               | 11 +++++++----
 lib/spack/spack/test/optional_deps.py |  1 -
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/lib/spack/spack/spec.py b/lib/spack/spack/spec.py
index 0fd9b1f5f5..4a67614be7 100644
--- a/lib/spack/spack/spec.py
+++ b/lib/spack/spack/spec.py
@@ -1014,9 +1014,9 @@ def _normalize_helper(self, visited, spec_deps, provider_index):
         any_change = False
         changed = True
 
+        pkg = spack.db.get(self.name)
         while changed:
             changed = False
-            pkg = spack.db.get(self.name)
             for dep_name in pkg.dependencies:
                 # Do we depend on dep_name?  If so pkg_dep is not None.
                 pkg_dep = self._evaluate_dependency_conditions(dep_name)
@@ -1132,16 +1132,19 @@ def constrain(self, other, **kwargs):
                 raise UnsatisfiableArchitectureSpecError(self.architecture,
                                                          other.architecture)
 
+        changed = False
         if self.compiler is not None and other.compiler is not None:
-            self.compiler.constrain(other.compiler)
+            changed |= self.compiler.constrain(other.compiler)
         elif self.compiler is None:
+            changed |= (self.compiler != other.compiler)
             self.compiler = other.compiler
 
-        changed = False
         changed |= self.versions.intersect(other.versions)
         changed |= self.variants.constrain(other.variants)
-        changed |= bool(self.architecture)
+
+        old = self.architecture
         self.architecture = self.architecture or other.architecture
+        changed |= (self.architecture != old)
 
         if constrain_deps:
             changed |= self._constrain_dependencies(other)
diff --git a/lib/spack/spack/test/optional_deps.py b/lib/spack/spack/test/optional_deps.py
index 669e02f8c9..265a983f3f 100644
--- a/lib/spack/spack/test/optional_deps.py
+++ b/lib/spack/spack/test/optional_deps.py
@@ -92,4 +92,3 @@ def test_transitive_chain(self):
         # the whole chain.
         self.check_normalize('optional-dep-test+f',
                              Spec('optional-dep-test+f', Spec('f'), Spec('g'), Spec('mpi')))
-
-- 
GitLab