summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorGreg Becker <becker33@llnl.gov>2020-05-20 17:09:07 -0700
committerGitHub <noreply@github.com>2020-05-20 17:09:07 -0700
commitcfb6f212360ff4aa75eb65fcb6b9c29c508458e1 (patch)
tree67a5a8d6396db90ff1aff90ac0bd3c056ecf1965 /lib
parent92989fbbfdc68c25df64004c6b0802431cc4055d (diff)
downloadspack-cfb6f212360ff4aa75eb65fcb6b9c29c508458e1.tar.gz
spack-cfb6f212360ff4aa75eb65fcb6b9c29c508458e1.tar.bz2
spack-cfb6f212360ff4aa75eb65fcb6b9c29c508458e1.tar.xz
spack-cfb6f212360ff4aa75eb65fcb6b9c29c508458e1.zip
externals: allow package prefs to configure default not buildable (#16735)
Allows `all` to be configured non-buildable in packages.yaml. The following config would only allow zlib to be built by Spack, all other packages would have to be found as externals. ``` packages: all: buildable: False zlib: buildable: True ```
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/package_prefs.py14
-rw-r--r--lib/spack/spack/test/concretize_preferences.py64
2 files changed, 74 insertions, 4 deletions
diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py
index aa904a0792..67325fc7ae 100644
--- a/lib/spack/spack/package_prefs.py
+++ b/lib/spack/spack/package_prefs.py
@@ -190,11 +190,17 @@ def spec_externals(spec):
def is_spec_buildable(spec):
"""Return true if the spec pkgspec is configured as buildable"""
+
allpkgs = spack.config.get('packages')
- do_not_build = [name for name, entry in allpkgs.items()
- if not entry.get('buildable', True)]
- return not (spec.name in do_not_build or
- any(spec.package.provides(name) for name in do_not_build))
+ all_buildable = allpkgs.get('all', {}).get('buildable', True)
+
+ # Get the list of names for which all_buildable is overridden
+ reverse = [name for name, entry in allpkgs.items()
+ if entry.get('buildable', all_buildable) != all_buildable]
+ # Does this spec override all_buildable
+ spec_reversed = (spec.name in reverse or
+ any(spec.package.provides(name) for name in reverse))
+ return not all_buildable if spec_reversed else all_buildable
def get_package_dir_permissions(spec):
diff --git a/lib/spack/spack/test/concretize_preferences.py b/lib/spack/spack/test/concretize_preferences.py
index ca4df6700c..df46ed9fe8 100644
--- a/lib/spack/spack/test/concretize_preferences.py
+++ b/lib/spack/spack/test/concretize_preferences.py
@@ -239,6 +239,70 @@ mpi:
spec.concretize()
assert spec['mpich'].external_path == '/dummy/path'
+ def test_buildable_false(self):
+ conf = syaml.load_config("""\
+libelf:
+ buildable: false
+""")
+ spack.config.set('packages', conf, scope='concretize')
+ spec = Spec('libelf')
+ assert not spack.package_prefs.is_spec_buildable(spec)
+
+ spec = Spec('mpich')
+ assert spack.package_prefs.is_spec_buildable(spec)
+
+ def test_buildable_false_virtual(self):
+ conf = syaml.load_config("""\
+mpi:
+ buildable: false
+""")
+ spack.config.set('packages', conf, scope='concretize')
+ spec = Spec('libelf')
+ assert spack.package_prefs.is_spec_buildable(spec)
+
+ spec = Spec('mpich')
+ assert not spack.package_prefs.is_spec_buildable(spec)
+
+ def test_buildable_false_all(self):
+ conf = syaml.load_config("""\
+all:
+ buildable: false
+""")
+ spack.config.set('packages', conf, scope='concretize')
+ spec = Spec('libelf')
+ assert not spack.package_prefs.is_spec_buildable(spec)
+
+ spec = Spec('mpich')
+ assert not spack.package_prefs.is_spec_buildable(spec)
+
+ def test_buildable_false_all_true_package(self):
+ conf = syaml.load_config("""\
+all:
+ buildable: false
+libelf:
+ buildable: true
+""")
+ spack.config.set('packages', conf, scope='concretize')
+ spec = Spec('libelf')
+ assert spack.package_prefs.is_spec_buildable(spec)
+
+ spec = Spec('mpich')
+ assert not spack.package_prefs.is_spec_buildable(spec)
+
+ def test_buildable_false_all_true_virtual(self):
+ conf = syaml.load_config("""\
+all:
+ buildable: false
+mpi:
+ buildable: true
+""")
+ spack.config.set('packages', conf, scope='concretize')
+ spec = Spec('libelf')
+ assert not spack.package_prefs.is_spec_buildable(spec)
+
+ spec = Spec('mpich')
+ assert spack.package_prefs.is_spec_buildable(spec)
+
def test_config_permissions_from_all(self, configure_permissions):
# Although these aren't strictly about concretization, they are
# configured in the same file and therefore convenient to test here.