summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/spack/spack/test/cmd/dependencies.py4
-rw-r--r--lib/spack/spack/test/concretize.py14
-rw-r--r--lib/spack/spack/test/data/config/packages.yaml3
-rw-r--r--lib/spack/spack/test/package_class.py1
-rw-r--r--var/spack/repos/builtin.mock/packages/low-priority-provider/package.py18
-rw-r--r--var/spack/repos/builtin.mock/packages/many-virtual-consumer/package.py18
6 files changed, 56 insertions, 2 deletions
diff --git a/lib/spack/spack/test/cmd/dependencies.py b/lib/spack/spack/test/cmd/dependencies.py
index 7ca1eae2e5..9d2ebccd9d 100644
--- a/lib/spack/spack/test/cmd/dependencies.py
+++ b/lib/spack/spack/test/cmd/dependencies.py
@@ -14,7 +14,9 @@ from spack.main import SpackCommand
dependencies = SpackCommand('dependencies')
-mpis = ['mpich', 'mpich2', 'multi-provider-mpi', 'zmpi']
+mpis = [
+ 'low-priority-provider', 'mpich', 'mpich2', 'multi-provider-mpi', 'zmpi'
+]
mpi_deps = ['fake']
diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py
index d30191f4f2..b2ac1b6446 100644
--- a/lib/spack/spack/test/concretize.py
+++ b/lib/spack/spack/test/concretize.py
@@ -1274,3 +1274,17 @@ class TestConcretize(object):
# package doesn't end up using a later implementation
s = spack.spec.Spec('hpcviewer@2019.02').concretized()
assert s['java'].satisfies('virtual-with-versions@1.8.0')
+
+ @pytest.mark.regression('26866')
+ def test_non_default_provider_of_multiple_virtuals(self):
+ s = spack.spec.Spec(
+ 'many-virtual-consumer ^low-priority-provider'
+ ).concretized()
+ assert s['mpi'].name == 'low-priority-provider'
+ assert s['lapack'].name == 'low-priority-provider'
+
+ for virtual_pkg in ('mpi', 'lapack'):
+ for pkg in spack.repo.path.providers_for(virtual_pkg):
+ if pkg.name == 'low-priority-provider':
+ continue
+ assert pkg not in s
diff --git a/lib/spack/spack/test/data/config/packages.yaml b/lib/spack/spack/test/data/config/packages.yaml
index 84f470d208..7d5e06a74c 100644
--- a/lib/spack/spack/test/data/config/packages.yaml
+++ b/lib/spack/spack/test/data/config/packages.yaml
@@ -1,7 +1,8 @@
packages:
all:
providers:
- mpi: [openmpi, mpich]
+ mpi: [openmpi, mpich, zmpi]
+ lapack: [openblas-with-lapack]
blas: [openblas]
externaltool:
buildable: False
diff --git a/lib/spack/spack/test/package_class.py b/lib/spack/spack/test/package_class.py
index 22939105a4..8c55b47ba4 100644
--- a/lib/spack/spack/test/package_class.py
+++ b/lib/spack/spack/test/package_class.py
@@ -30,6 +30,7 @@ def mpi_names(mock_repo_path):
def mpileaks_possible_deps(mock_packages, mpi_names):
possible = {
'callpath': set(['dyninst'] + mpi_names),
+ 'low-priority-provider': set(),
'dyninst': set(['libdwarf', 'libelf']),
'fake': set(),
'libdwarf': set(['libelf']),
diff --git a/var/spack/repos/builtin.mock/packages/low-priority-provider/package.py b/var/spack/repos/builtin.mock/packages/low-priority-provider/package.py
new file mode 100644
index 0000000000..d0b768637f
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/low-priority-provider/package.py
@@ -0,0 +1,18 @@
+# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+
+from spack import *
+
+
+class LowPriorityProvider(Package):
+ """Provides multiple virtuals but is low in the priority of clingo"""
+
+ homepage = "http://www.example.com"
+ url = "http://www.example.com/a-1.0.tar.gz"
+
+ version('1.0', '0123456789abcdef0123456789abcdef')
+
+ provides('lapack')
+ provides('mpi')
diff --git a/var/spack/repos/builtin.mock/packages/many-virtual-consumer/package.py b/var/spack/repos/builtin.mock/packages/many-virtual-consumer/package.py
new file mode 100644
index 0000000000..40da0f40e0
--- /dev/null
+++ b/var/spack/repos/builtin.mock/packages/many-virtual-consumer/package.py
@@ -0,0 +1,18 @@
+# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
+# Spack Project Developers. See the top-level COPYRIGHT file for details.
+#
+# SPDX-License-Identifier: (Apache-2.0 OR MIT)
+class ManyVirtualConsumer(Package):
+ """PAckage that depends on many virtual packages"""
+ url = "http://www.example.com/"
+ url = "http://www.example.com/2.0.tar.gz"
+
+ version('1.0', 'abcdef1234567890abcdef1234567890')
+
+ depends_on('mpi')
+ depends_on('lapack')
+
+ # This directive is an example of imposing a constraint on a
+ # dependency is that dependency is in the DAG. This pattern
+ # is mainly used with virtual providers.
+ depends_on('low-priority-provider@1.0', when='^low-priority-provider')