summaryrefslogtreecommitdiff
path: root/lib/spack/spack/compilers/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/spack/spack/compilers/__init__.py')
-rw-r--r--lib/spack/spack/compilers/__init__.py64
1 files changed, 42 insertions, 22 deletions
diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py
index 095e26edb5..a36ea618bc 100644
--- a/lib/spack/spack/compilers/__init__.py
+++ b/lib/spack/spack/compilers/__init__.py
@@ -41,49 +41,69 @@ _imported_compilers_module = 'spack.compiler.versions'
_imported_versions_module = 'spack.compilers'
+def _auto_compiler_spec(function):
+ def converter(cspec_like):
+ if not isinstance(cspec_like, spack.spec.CompilerSpec):
+ cspec_like = spack.spec.CompilerSpec(cspec_like)
+ return function(cspec_like)
+ return converter
+
+
@memoized
def supported_compilers():
- """Return a list of names of compilers supported by Spack.
+ """Return a set of names of compilers supported by Spack.
See available_compilers() to get a list of all the available
versions of supported compilers.
"""
- return sorted(c for c in list_modules(spack.compilers_path))
+ return sorted(name for name in list_modules(spack.compilers_path))
+@_auto_compiler_spec
def supported(compiler_spec):
"""Test if a particular compiler is supported."""
- if not isinstance(compiler_spec, spack.spec.CompilerSpec):
- compiler_spec = spack.spec.CompilerSpec(compiler_spec)
return compiler_spec.name in supported_compilers()
-def available_compilers():
- """Return a list of specs for all the compiler versions currently
- available to build with. These are instances of
- CompilerSpec.
+@memoized
+def all_compilers():
+ """Return a set of specs for all the compiler versions currently
+ available to build with. These are instances of CompilerSpec.
"""
- return [spack.spec.CompilerSpec(c)
- for c in list_modules(spack.compiler_version_path)]
+ return set(spack.spec.CompilerSpec(c)
+ for c in list_modules(spack.compiler_version_path))
-def compiler_for_spec(compiler_spec):
- """This gets an instance of an actual spack.compiler.Compiler object
- from a compiler spec. The spec needs to be concrete for this to
- work; it will raise an error if passed an abstract compiler.
+@_auto_compiler_spec
+def find(compiler_spec):
+ """Return specs of available compilers that match the supplied
+ compiler spec. Return an list if nothing found."""
+ return [c for c in all_compilers() if c.satisfies(compiler_spec)]
+
+
+@_auto_compiler_spec
+def compilers_for_spec(compiler_spec):
+ """This gets all compilers that satisfy the supplied CompilerSpec.
+ Returns an empty list if none are found.
"""
- matches = [c for c in available_compilers() if c.satisfies(compiler_spec)]
+ matches = find(compiler_spec)
- # TODO: do something when there are zero matches.
- assert(len(matches) >= 1)
+ compilers = []
+ for cspec in matches:
+ path = join_path(spack.compiler_version_path, "%s.py" % cspec)
+ mod = imp.load_source(_imported_versions_module, path)
+ cls = class_for_compiler_name(cspec.name)
+ compilers.append(cls(mod.cc, mod.cxx, mod.f77, mod.fc))
- compiler = matches[0]
- file_path = join_path(spack.compiler_version_path, "%s.py" % compiler)
+ return compilers
- mod = imp.load_source(_imported_versions_module, file_path)
- compiler_class = class_for_compiler_name(compiler.name)
- return compiler_class(mod.cc, mod.cxx, mod.f77, mod.f90)
+@_auto_compiler_spec
+def compiler_for_spec(compiler_spec):
+ assert(compiler_spec.concrete)
+ compilers = compilers_for_spec(compiler_spec)
+ assert(len(compilers) == 1)
+ return compilers[0]
def class_for_compiler_name(compiler_name):