summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/spack/spack/build_environment.py2
-rw-r--r--lib/spack/spack/compiler.py26
-rw-r--r--lib/spack/spack/compilers/__init__.py21
-rw-r--r--lib/spack/spack/concretize.py9
-rw-r--r--lib/spack/spack/test/architecture.py8
-rw-r--r--var/spack/mock_configs/site_spackconfig/compilers.yaml5
6 files changed, 43 insertions, 28 deletions
diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py
index 6e03394777..0cb4d77499 100644
--- a/lib/spack/spack/build_environment.py
+++ b/lib/spack/spack/build_environment.py
@@ -171,7 +171,7 @@ def set_compiler_environment_variables(pkg):
os.environ['SPACK_COMPILER_SPEC'] = str(pkg.spec.compiler)
- if compiler.modules:
+ if compiler.strategy == 'MODULES':
for mod in compiler.modules:
load_module(mod)
diff --git a/lib/spack/spack/compiler.py b/lib/spack/spack/compiler.py
index 46f2dfaec7..5d851f5a3d 100644
--- a/lib/spack/spack/compiler.py
+++ b/lib/spack/spack/compiler.py
@@ -106,26 +106,28 @@ class Compiler(object):
PrgEnv_compiler = None
- def __init__(self, cspec, paths, modules=None):
+ def __init__(self, cspec, strategy, paths, modules=None):
def check(exe):
if exe is None:
return None
_verify_executables(exe)
return exe
+ self.strategy = strategy
+
self.cc = check(paths[0])
self.cxx = check(paths[1])
- self.f77 = check(paths[2])
- if len(paths) == 3:
- self.fc = self.f77
- else:
- self.fc = check(paths[3])
+ if len(paths) > 2:
+ self.f77 = check(paths[2])
+ if len(paths) == 3:
+ self.fc = self.f77
+ else:
+ self.fc = check(paths[3])
self.spec = cspec
self.modules = modules
-
@property
def version(self):
return self.spec.version
@@ -267,7 +269,7 @@ class Compiler(object):
if newcount <= prevcount:
continue
- compilers[ver] = cls(spec, paths)
+ compilers[ver] = cls(spec, 'PATH', paths)
return list(compilers.values())
@@ -287,7 +289,7 @@ class Compiler(object):
for name, version in matches:
v = version
- comp = cls(spack.spec.CompilerSpec(name + '@' + v),
+ comp = cls(spack.spec.CompilerSpec(name + '@' + v), 'MODULES',
['cc', 'CC', 'ftn'], [cls.PrgEnv, name +'/' + v])
compilers.append(comp)
@@ -302,12 +304,12 @@ class Compiler(object):
def __str__(self):
"""Return a string represntation of the compiler toolchain."""
- if self.modules:
+ if self.strategy is 'MODULES':
return "%s(%s)" % (
- self.name, '\n '.join((str(s) for s in (self.cc, self.cxx, self.f77, self.fc, self.modules))))
+ self.name, '\n '.join((str(s) for s in (self.strategy, self.cc, self.cxx, self.f77, self.fc, self.modules))))
else:
return "%s(%s)" % (
- self.name, '\n '.join((str(s) for s in (self.cc, self.cxx, self.f77, self.fc))))
+ self.name, '\n '.join((str(s) for s in (self.strategy, self.cc, self.cxx, self.f77, self.fc))))
class CompilerAccessError(spack.error.SpackError):
diff --git a/lib/spack/spack/compilers/__init__.py b/lib/spack/spack/compilers/__init__.py
index e38ef949d7..32885062fd 100644
--- a/lib/spack/spack/compilers/__init__.py
+++ b/lib/spack/spack/compilers/__init__.py
@@ -129,6 +129,11 @@ def add_compilers_to_config(scope, *compilers):
for compiler in compilers:
compiler_entry = {}
+ val = getattr(compiler, 'strategy')
+ if not val:
+ val = 'None'
+ compiler_entry[c] = val
+
for c in _required_instance_vars:
val = getattr(compiler, c)
if not val:
@@ -190,6 +195,11 @@ def compilers_for_spec(compiler_spec):
raise InvalidCompilerConfigurationError(cspec)
cls = class_for_compiler_name(cspec.name)
+
+ strategy = items['strategy']
+ if not strategy:
+ raise InvalidCompilerConfigurationError(cspec)
+
compiler_paths = []
for c in _required_instance_vars:
compiler_path = items[c]
@@ -203,22 +213,19 @@ def compilers_for_spec(compiler_spec):
items[m] = None
mods = items[m]
- return cls(cspec, compiler_paths, mods)
+ return cls(cspec, strategy, compiler_paths, mods)
matches = find(compiler_spec)
return [get_compiler(cspec) for cspec in matches]
@_auto_compiler_spec
-def compiler_for_spec(compiler_spec, target):
+def compiler_for_spec(compiler_spec, operating_system):
"""Get the compiler that satisfies compiler_spec. compiler_spec must
be concrete."""
assert(compiler_spec.concrete)
- compilers = compilers_for_spec(compiler_spec)
- if target.compiler_strategy == "PATH":
- compilers = [c for c in compilers if c.modules is None]
- elif target.compiler_strategy == "MODULES":
- compilers = [c for c in compilers if c.modules is not None]
+ compilers = [c for c in compilers_for_spec(compiler_spec)
+ if c.strategy == operating_system.strategy]
if len(compilers) < 1:
raise NoCompilerForSpecError(compiler_spec, target)
if len(compilers) > 1:
diff --git a/lib/spack/spack/concretize.py b/lib/spack/spack/concretize.py
index 37204e32a4..7a87a824d5 100644
--- a/lib/spack/spack/concretize.py
+++ b/lib/spack/spack/concretize.py
@@ -354,10 +354,11 @@ class DefaultConcretizer(object):
# Should think whether this can be more efficient
def _proper_compiler_style(cspec, architecture):
compilers = spack.compilers.compilers_for_spec(cspec)
- if architecture.platform_os.compiler_strategy == 'PATH':
- filter(lambda c: not c.modules, compilers)
- if architecture.platform_os.compiler_strategy == 'MODULES':
- filter(lambda c: c.modules, compilers)
+ filter(lambda c: c.strategy == architecture.platform_os.compiler_strategy, compilers)
+#if architecture.platform_os.compiler_strategy == 'PATH':
+ # filter(lambda c: not c.modules, compilers)
+ #if architecture.platform_os.compiler_strategy == 'MODULES':
+ # filter(lambda c: c.modules, compilers)
return compilers
diff --git a/lib/spack/spack/test/architecture.py b/lib/spack/spack/test/architecture.py
index a390a3fbaa..75a67bf02f 100644
--- a/lib/spack/spack/test/architecture.py
+++ b/lib/spack/spack/test/architecture.py
@@ -34,10 +34,10 @@ class ArchitectureTest(unittest.TestCase):
'target' : {'name':'haswell', 'module_name': 'craype-haswell'}}
arch = spack.architecture.arch_from_dict(d)
- self.assertIsInstance(arch, Arch)
- self.assertIsInstance(arch.platform, Platform)
- self.assertIsInstance(arch.platform_os, OperatingSystem)
- self.assertIsInstance(arch.target, Target)
+ self.assertTrue( isinstance(arch, Arch) )
+ self.assertTrue( isinstance(arch.platform, Platform) )
+ self.assertTrue( isinstance(arch.platform_os, OperatingSystem) )
+ self.assertTrue( isinstance(arch.target, Target) )
def test_platform_class_and_compiler_strategies(self):
diff --git a/var/spack/mock_configs/site_spackconfig/compilers.yaml b/var/spack/mock_configs/site_spackconfig/compilers.yaml
index 72fa252881..5f8b38007b 100644
--- a/var/spack/mock_configs/site_spackconfig/compilers.yaml
+++ b/var/spack/mock_configs/site_spackconfig/compilers.yaml
@@ -6,12 +6,14 @@ compilers:
f77: None
fc: None
modules: None
+ strategy: PATH
gcc@4.5.0:
cc: /path/to/gcc
cxx: /path/to/g++
f77: /path/to/gfortran
fc: /path/to/gfortran
modules: None
+ strategy: PATH
gcc@5.2.0:
cc: cc
cxx: CC
@@ -20,6 +22,7 @@ compilers:
modules:
- PrgEnv-gnu
- gcc/5.2.0
+ strategy: MODULES
intel@15.0.1:
cc: cc
ccx: CC
@@ -28,8 +31,10 @@ compilers:
modules:
- PrgEnv-intel
- intel/15.0.1
+ strategy: MODULES
intel@15.1.2:
cc: /path/to/icc
cxx: /path/to/ic++
f77: /path/to/ifort
fc: /path/to/ifort
+ strategy: PATH \ No newline at end of file