summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMassimiliano Culpo <massimiliano.culpo@gmail.com>2021-05-06 19:19:10 +0200
committerGitHub <noreply@github.com>2021-05-06 10:19:10 -0700
commitf83ec4d46f1e87d7fad392a2d85dd5af362b5742 (patch)
tree4f8f3d83141156ca2a9a3257ab00910dd0c3d668 /lib
parent2ba493cd630dfc44e69c32b6e31993fa949fc10b (diff)
downloadspack-f83ec4d46f1e87d7fad392a2d85dd5af362b5742.tar.gz
spack-f83ec4d46f1e87d7fad392a2d85dd5af362b5742.tar.bz2
spack-f83ec4d46f1e87d7fad392a2d85dd5af362b5742.tar.xz
spack-f83ec4d46f1e87d7fad392a2d85dd5af362b5742.zip
ASP-based solver: no intermediate package for concretizing together (#23307)
The ASP-based solver can natively manage cases where more than one root spec is given, and is able to concretize all the roots together (ensuring one spec per package at most). Modifications: - [x] When concretising together an environment the ASP-based solver calls directly its `solve` method rather than constructing a temporary fake root package.
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/concretize.py18
-rw-r--r--lib/spack/spack/test/cmd/env.py15
2 files changed, 33 insertions, 0 deletions
diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py
index fbd9a7908b..900009e283 100644
--- a/lib/spack/spack/concretize.py
+++ b/lib/spack/spack/concretize.py
@@ -724,6 +724,24 @@ def concretize_specs_together(*abstract_specs, **kwargs):
Returns:
List of concretized specs
"""
+ if spack.config.get('config:concretizer') == 'original':
+ return _concretize_specs_together_original(*abstract_specs, **kwargs)
+ return _concretize_specs_together_new(*abstract_specs, **kwargs)
+
+
+def _concretize_specs_together_new(*abstract_specs, **kwargs):
+ import spack.solver.asp
+ result = spack.solver.asp.solve(abstract_specs)
+
+ if not result.satisfiable:
+ result.print_cores()
+ tty.die("Unsatisfiable spec.")
+
+ opt, i, answer = min(result.answers)
+ return [answer[s.name].copy() for s in abstract_specs]
+
+
+def _concretize_specs_together_original(*abstract_specs, **kwargs):
def make_concretization_repository(abstract_specs):
"""Returns the path to a temporary repository created to contain
a fake package that depends on all of the abstract specs.
diff --git a/lib/spack/spack/test/cmd/env.py b/lib/spack/spack/test/cmd/env.py
index 5665b41fac..5ff0f0de9f 100644
--- a/lib/spack/spack/test/cmd/env.py
+++ b/lib/spack/spack/test/cmd/env.py
@@ -2454,3 +2454,18 @@ def test_does_not_rewrite_rel_dev_path_when_keep_relative_is_set(tmpdir):
print(e.dev_specs)
assert e.dev_specs['mypkg1']['path'] == '../build_folder'
assert e.dev_specs['mypkg2']['path'] == '/some/other/path'
+
+
+@pytest.mark.regression('23440')
+def test_custom_version_concretize_together(tmpdir):
+ # Custom versions should be permitted in specs when
+ # concretizing together
+ e = ev.create('custom_version')
+ e.concretization = 'together'
+
+ # Concretize a first time using 'mpich' as the MPI provider
+ e.add('hdf5@myversion')
+ e.add('mpich')
+ e.concretize()
+
+ assert any('hdf5@myversion' in spec for _, spec in e.concretized_specs())