diff options
author | Greg Becker <becker33@llnl.gov> | 2020-05-20 17:09:07 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-20 17:09:07 -0700 |
commit | cfb6f212360ff4aa75eb65fcb6b9c29c508458e1 (patch) | |
tree | 67a5a8d6396db90ff1aff90ac0bd3c056ecf1965 /lib | |
parent | 92989fbbfdc68c25df64004c6b0802431cc4055d (diff) | |
download | spack-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.py | 14 | ||||
-rw-r--r-- | lib/spack/spack/test/concretize_preferences.py | 64 |
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. |