summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/solver/concretize.lp11
-rw-r--r--lib/spack/spack/test/concretize.py37
2 files changed, 48 insertions, 0 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp
index da149dd3fa..efca3bfed2 100644
--- a/lib/spack/spack/solver/concretize.lp
+++ b/lib/spack/spack/solver/concretize.lp
@@ -1535,6 +1535,17 @@ opt_criterion(5, "non-preferred targets").
build_priority(PackageNode, Priority)
}.
+% Choose more recent versions for nodes
+opt_criterion(1, "edge wiring").
+#minimize{ 0@201: #true }.
+#minimize{ 0@1: #true }.
+#minimize{
+ Weight@1,ParentNode,PackageNode
+ : version_weight(PackageNode, Weight),
+ not attr("root", PackageNode),
+ depends_on(ParentNode, PackageNode)
+}.
+
%-----------
% Notes
%-----------
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index 48334e70a1..04959a19b3 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -2228,6 +2228,43 @@ class TestConcretizeSeparately:
s = Spec("virtual-build").concretized()
assert s["pkgconfig"].name == "pkg-config"
+ @pytest.mark.regression("40595")
+ def test_no_multiple_solutions_with_different_edges_same_nodes(self):
+ r"""Tests that the root node, which has a dependency on py-setuptools without constraint,
+ doesn't randomly pick one of the two setuptools (@=59, @=60) needed by its dependency.
+
+ o py-floating@1.25.0/3baitsp
+ |\
+ | |\
+ | | |\
+ | o | | py-shapely@1.25.0/4hep6my
+ |/| | |
+ | |\| |
+ | | |/
+ | |/|
+ | | o py-setuptools@60/cwhbthc
+ | |/
+ |/|
+ | o py-numpy@1.25.0/5q5fx4d
+ |/|
+ | |\
+ | o | py-setuptools@59/jvsa7sd
+ |/ /
+ o | python@3.11.2/pdmjekv
+ o | gmake@3.0/jv7k2bl
+ /
+ o gmake@4.1/uo6ot3d
+ """
+ spec_str = "py-floating"
+
+ root = spack.spec.Spec(spec_str).concretized()
+ assert root["py-shapely"].satisfies("^py-setuptools@=60")
+ assert root["py-numpy"].satisfies("^py-setuptools@=59")
+
+ edges = root.edges_to_dependencies("py-setuptools")
+ assert len(edges) == 1
+ assert edges[0].spec.satisfies("@=60")
+
@pytest.mark.parametrize(
"v_str,v_opts,checksummed",