From f3db624b86fc6b746a74dd7f042745e040312fed Mon Sep 17 00:00:00 2001 From: Greg Becker Date: Sun, 6 Nov 2022 16:45:38 -0800 Subject: package preferences: allow specs to be configured buildable when their virtuals are not (#18269) * respect spec buildable that overrides virtual buildable --- lib/spack/spack/package_prefs.py | 18 +++++++++--------- lib/spack/spack/test/concretize_preferences.py | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/package_prefs.py b/lib/spack/spack/package_prefs.py index 975585ac95..48d1ca129d 100644 --- a/lib/spack/spack/package_prefs.py +++ b/lib/spack/spack/package_prefs.py @@ -195,23 +195,23 @@ def spec_externals(spec): def is_spec_buildable(spec): """Return true if the spec is configured as buildable""" - allpkgs = spack.config.get("packages") all_buildable = allpkgs.get("all", {}).get("buildable", True) + so_far = all_buildable # the default "so far" def _package(s): pkg_cls = spack.repo.path.get_pkg_class(s.name) return pkg_cls(s) - # Get the list of names for which all_buildable is overridden - reverse = [ - name + # check whether any providers for this package override the default + if any( + _package(spec).provides(name) and entry.get("buildable", so_far) != so_far 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(_package(spec).provides(name) for name in reverse) - return not all_buildable if spec_reversed else all_buildable + ): + so_far = not so_far + + spec_buildable = allpkgs.get(spec.name, {}).get("buildable", so_far) + return spec_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 eb5b073444..56bda697fc 100644 --- a/lib/spack/spack/test/concretize_preferences.py +++ b/lib/spack/spack/test/concretize_preferences.py @@ -395,6 +395,23 @@ mpi: spec = Spec("mpich") assert spack.package_prefs.is_spec_buildable(spec) + def test_buildable_false_virtual_true_pacakge(self): + conf = syaml.load_config( + """\ +mpi: + buildable: false +mpich: + buildable: true +""" + ) + spack.config.set("packages", conf, scope="concretize") + + spec = Spec("zmpi") + 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. -- cgit v1.2.3-70-g09d2