summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2021-04-21 10:02:43 +0200
committerGitHub <noreply@github.com>2021-04-21 01:02:43 -0700
commit3325eff486634f708cfb0222e30da49602a62bf5 (patch)
tree80f94983bf7209c865736b8518ad67a898009152 /lib
parent9a473d6ab368fbeeed408e9063983b60e661a27a (diff)
downloadspack-3325eff486634f708cfb0222e30da49602a62bf5.tar.gz
spack-3325eff486634f708cfb0222e30da49602a62bf5.tar.bz2
spack-3325eff486634f708cfb0222e30da49602a62bf5.tar.xz
spack-3325eff486634f708cfb0222e30da49602a62bf5.zip
ASP-based solve: minimize compiler mismatches (#23016)
fixes #22718 Instead of trying to maximize the number of matches (preferred behavior), try to minimize the number of mismatches (unwanted behavior).
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/solver/concretize.lp47
-rw-r--r--lib/spack/spack/test/concretize.py11
2 files changed, 26 insertions, 32 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp
index 51ab721744..64fee0f220 100644
--- a/lib/spack/spack/solver/concretize.lp
+++ b/lib/spack/spack/solver/concretize.lp
@@ -603,32 +603,19 @@ node_compiler_version(Package, Compiler, Version) :- node_compiler_version_set(P
not compiler_supports_os(Compiler, Version, OS),
not allow_compiler(Compiler, Version).
-% If the compiler is what was prescribed from command line etc.
-% or is the same as a root node, there is a version match
-
-% Compiler prescribed in the root spec
-node_compiler_version_match_pref(Package, Compiler, V)
- :- node_compiler_set(Package, Compiler),
- node_compiler_version(Package, Compiler, V),
- not external(Package).
-
-% Compiler inherited from a parent node
-node_compiler_version_match_pref(Dependency, Compiler, V)
- :- depends_on(Package, Dependency),
- node_compiler_version_match_pref(Package, Compiler, V),
- node_compiler_version(Dependency, Compiler, V),
- not node_compiler_set(Dependency, Compiler).
-
-% Compiler inherited from the root package
-node_compiler_version_match_pref(Dependency, Compiler, V)
- :- depends_on(Package, Dependency),
- node_compiler_version(Package, Compiler, V), root(Package),
- node_compiler_version(Dependency, Compiler, V),
- not node_compiler_set(Dependency, Compiler).
+% If a package and one of its dependencies don't have the
+% same compiler there's a mismatch.
+compiler_mismatch(Package, Dependency)
+ :- depends_on(Package, Dependency),
+ node_compiler_version(Package, Compiler1, _),
+ node_compiler_version(Dependency, Compiler2, _),
+ Compiler1 != Compiler2.
-compiler_version_match(Package, 1)
- :- node_compiler_version(Package, Compiler, V),
- node_compiler_version_match_pref(Package, Compiler, V).
+compiler_mismatch(Package, Dependency)
+ :- depends_on(Package, Dependency),
+ node_compiler_version(Package, Compiler, Version1),
+ node_compiler_version(Dependency, Compiler, Version2),
+ Version1 != Version2.
#defined node_compiler_set/2.
#defined node_compiler_version_set/3.
@@ -772,14 +759,10 @@ opt_criterion(8, "count of non-root multi-valued variants").
not root(Package)
}.
-% Try to maximize the number of compiler matches in the DAG,
-% while minimizing the number of nodes. This is done because
-% a maximization on the number of matches for compilers is highly
-% correlated to a preference to have as many nodes as possible
-opt_criterion(7, "compiler matches + number of nodes").
+% Try to minimize the number of compiler mismatches in the DAG.
+opt_criterion(7, "compiler mismatches").
#minimize{ 0@7 : #true }.
-#minimize{ 1@7,Package : node(Package) }.
-#maximize{ Weight@7,Package : compiler_version_match(Package, Weight) }.
+#minimize{ 1@7,Package,Dependency : compiler_mismatch(Package, Dependency) }.
% Choose more recent versions for nodes
opt_criterion(6, "version badness").
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index fda09cebb1..28cf25fa78 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -1199,3 +1199,14 @@ class TestConcretize(object):
for node in s.traverse():
assert node.satisfies(expected_os)
+
+ @pytest.mark.regression('22718')
+ @pytest.mark.parametrize('spec_str,expected_compiler', [
+ ('mpileaks', '%gcc@4.5.0'),
+ ('mpileaks ^mpich%clang@3.3', '%clang@3.3')
+ ])
+ def test_compiler_is_unique(self, spec_str, expected_compiler):
+ s = Spec(spec_str).concretized()
+
+ for node in s.traverse():
+ assert node.satisfies(expected_compiler)