diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/compilers/__init__.py | 16 | ||||
-rw-r--r-- | lib/spack/spack/installer.py | 18 | ||||
-rw-r--r-- | lib/spack/spack/modules/lmod.py | 20 | ||||
-rw-r--r-- | lib/spack/spack/test/installer.py | 11 | ||||
-rw-r--r-- | lib/spack/spack/test/modules/lmod.py | 9 |
5 files changed, 48 insertions, 26 deletions
diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py index 05ffaf9f6c..e54f8dc96c 100644 --- a/lib/spack/spack/compilers/__init__.py +++ b/lib/spack/spack/compilers/__init__.py @@ -49,12 +49,26 @@ _compiler_to_pkg = { "clang": "llvm+clang", "oneapi": "intel-oneapi-compilers", "rocmcc": "llvm-amdgpu", + "intel@2020:": "intel-oneapi-compilers-classic", +} + +# TODO: generating this from the previous dict causes docs errors +package_name_to_compiler_name = { + "llvm": "clang", + "intel-oneapi-compilers": "oneapi", + "llvm-amdgpu": "rocmcc", + "intel-oneapi-compilers-classic": "intel", } def pkg_spec_for_compiler(cspec): """Return the spec of the package that provides the compiler.""" - spec_str = "%s@%s" % (_compiler_to_pkg.get(cspec.name, cspec.name), cspec.versions) + for spec, package in _compiler_to_pkg.items(): + if cspec.satisfies(spec): + spec_str = "%s@%s" % (package, cspec.versions) + break + else: + spec_str = str(cspec) return spack.spec.Spec(spec_str) diff --git a/lib/spack/spack/installer.py b/lib/spack/spack/installer.py index 62770d0349..a0f505a922 100644 --- a/lib/spack/spack/installer.py +++ b/lib/spack/spack/installer.py @@ -1241,6 +1241,12 @@ class PackageInstaller(object): fail_fast = request.install_args.get("fail_fast") self.fail_fast = self.fail_fast or fail_fast + def _add_compiler_package_to_config(self, pkg): + compiler_search_prefix = getattr(pkg, "compiler_search_prefix", pkg.spec.prefix) + spack.compilers.add_compilers_to_config( + spack.compilers.find_compilers([compiler_search_prefix]) + ) + def _install_task(self, task): """ Perform the installation of the requested spec and/or dependency @@ -1266,9 +1272,7 @@ class PackageInstaller(object): if use_cache and _install_from_cache(pkg, cache_only, explicit, unsigned): self._update_installed(task) if task.compiler: - spack.compilers.add_compilers_to_config( - spack.compilers.find_compilers([pkg.spec.prefix]) - ) + self._add_compiler_package_to_config(pkg) return pkg.run_tests = tests is True or tests and pkg.name in tests @@ -1296,9 +1300,7 @@ class PackageInstaller(object): # If a compiler, ensure it is added to the configuration if task.compiler: - spack.compilers.add_compilers_to_config( - spack.compilers.find_compilers([pkg.spec.prefix]) - ) + self._add_compiler_package_to_config(pkg) except spack.build_environment.StopPhase as e: # A StopPhase exception means that do_install was asked to # stop early from clients, and is not an error at this point @@ -1717,9 +1719,7 @@ class PackageInstaller(object): # It's an already installed compiler, add it to the config if task.compiler: - spack.compilers.add_compilers_to_config( - spack.compilers.find_compilers([pkg.spec.prefix]) - ) + self._add_compiler_package_to_config(pkg) else: # At this point we've failed to get a write or a read diff --git a/lib/spack/spack/modules/lmod.py b/lib/spack/spack/modules/lmod.py index bb288336ea..3378e53354 100644 --- a/lib/spack/spack/modules/lmod.py +++ b/lib/spack/spack/modules/lmod.py @@ -184,22 +184,10 @@ class LmodConfiguration(BaseConfiguration): # If it is in the list of supported compilers family -> compiler if self.spec.name in spack.compilers.supported_compilers(): provides["compiler"] = spack.spec.CompilerSpec(str(self.spec)) - # Special case for llvm - if self.spec.name == "llvm": - provides["compiler"] = spack.spec.CompilerSpec(str(self.spec)) - provides["compiler"].name = "clang" - # Special case for llvm-amdgpu - if self.spec.name == "llvm-amdgpu": - provides["compiler"] = spack.spec.CompilerSpec(str(self.spec)) - provides["compiler"].name = "rocmcc" - # Special case for oneapi - if self.spec.name == "intel-oneapi-compilers": - provides["compiler"] = spack.spec.CompilerSpec(str(self.spec)) - provides["compiler"].name = "oneapi" - # Special case for oneapi classic - if self.spec.name == "intel-oneapi-compilers-classic": - provides["compiler"] = spack.spec.CompilerSpec(str(self.spec)) - provides["compiler"].name = "intel" + elif self.spec.name in spack.compilers.package_name_to_compiler_name: + # If it is the package for a supported compiler, but of a different name + cname = spack.compilers.package_name_to_compiler_name[self.spec.name] + provides["compiler"] = spack.spec.CompilerSpec("%s@%s" % (cname, self.spec.version)) # All the other tokens in the hierarchy must be virtual dependencies for x in self.hierarchy_tokens: diff --git a/lib/spack/spack/test/installer.py b/lib/spack/spack/test/installer.py index 8a713ca704..4c85f4ba26 100644 --- a/lib/spack/spack/test/installer.py +++ b/lib/spack/spack/test/installer.py @@ -487,6 +487,17 @@ def test_update_tasks_for_compiler_packages_as_compiler(mock_packages, config, m assert installer.build_pq[0][1].compiler +def test_bootstrapping_compilers_with_different_names_from_spec( + install_mockery, mutable_config, mock_fetch +): + with spack.config.override("config:install_missing_compilers", True): + with spack.concretize.disable_compiler_existence_check(): + spec = spack.spec.Spec("trivial-install-test-package%oneapi@22.2.0").concretized() + spec.package.do_install() + + assert spack.spec.CompilerSpec("oneapi@22.2.0") in spack.compilers.all_compiler_specs() + + def test_dump_packages_deps_ok(install_mockery, tmpdir, mock_packages): """Test happy path for dump_packages with dependencies.""" diff --git a/lib/spack/spack/test/modules/lmod.py b/lib/spack/spack/test/modules/lmod.py index 5d0d04032e..c0d228c2fe 100644 --- a/lib/spack/spack/test/modules/lmod.py +++ b/lib/spack/spack/test/modules/lmod.py @@ -81,6 +81,15 @@ class TestLmod(object): else: assert repetitions == 1 + def test_compilers_provided_different_name(self, factory, module_configuration): + module_configuration("complex_hierarchy") + module, spec = factory("intel-oneapi-compilers%clang@3.3") + + provides = module.conf.provides + + assert "compiler" in provides + assert provides["compiler"] == spack.spec.CompilerSpec("oneapi@3.0") + def test_simple_case(self, modulefile_content, module_configuration): """Tests the generation of a simple TCL module file.""" |