Merge pull request #1085 from NERSC/bugfix/compiler_find

Bugfix/compiler find and gfortran fix.
This commit is contained in:
Todd Gamblin 2016-06-20 23:46:13 -07:00 committed by GitHub
commit 3f90fee614
3 changed files with 20 additions and 14 deletions

View File

@ -76,10 +76,16 @@ def compiler_find(args):
if not paths: if not paths:
paths = get_path('PATH') paths = get_path('PATH')
compilers = [c for c in spack.compilers.find_compilers(*args.add_paths) # Don't initialize compilers config via compilers.get_compiler_config.
if c.spec not in spack.compilers.all_compilers(scope=args.scope)] # Just let compiler_find do the
# entire process and return an empty config from all_compilers
# Default for any other process is init_config=True
compilers = [c for c in spack.compilers.find_compilers(*paths)
if c.spec not in spack.compilers.all_compilers(
scope=args.scope, init_config=False)]
if compilers: if compilers:
spack.compilers.add_compilers_to_config(compilers, scope=args.scope) spack.compilers.add_compilers_to_config(compilers, scope=args.scope,
init_config=False)
n = len(compilers) n = len(compilers)
s = 's' if n > 1 else '' s = 's' if n > 1 else ''
filename = spack.config.get_config_filename(args.scope, 'compilers') filename = spack.config.get_config_filename(args.scope, 'compilers')

View File

@ -83,7 +83,7 @@ def _to_dict(compiler):
return {'compiler': d} return {'compiler': d}
def get_compiler_config(scope=None): def get_compiler_config(scope=None, init_config=True):
"""Return the compiler configuration for the specified architecture. """Return the compiler configuration for the specified architecture.
""" """
def init_compiler_config(): def init_compiler_config():
@ -93,12 +93,12 @@ def init_compiler_config():
for compiler in compilers: for compiler in compilers:
compilers_dict.append(_to_dict(compiler)) compilers_dict.append(_to_dict(compiler))
spack.config.update_config('compilers', compilers_dict, scope=scope) spack.config.update_config('compilers', compilers_dict, scope=scope)
config = spack.config.get_config('compilers', scope=scope) config = spack.config.get_config('compilers', scope=scope)
# Update the configuration if there are currently no compilers # Update the configuration if there are currently no compilers
# configured. Avoid updating automatically if there ARE site # configured. Avoid updating automatically if there ARE site
# compilers configured but no user ones. # compilers configured but no user ones.
if not config: if not config and init_config:
if scope is None: if scope is None:
# We know no compilers were configured in any scope. # We know no compilers were configured in any scope.
init_compiler_config() init_compiler_config()
@ -117,14 +117,14 @@ def init_compiler_config():
return [] # Return empty list which we will later append to. return [] # Return empty list which we will later append to.
def add_compilers_to_config(compilers, scope=None): def add_compilers_to_config(compilers, scope=None, init_config=True):
"""Add compilers to the config for the specified architecture. """Add compilers to the config for the specified architecture.
Arguments: Arguments:
- compilers: a list of Compiler objects. - compilers: a list of Compiler objects.
- scope: configuration scope to modify. - scope: configuration scope to modify.
""" """
compiler_config = get_compiler_config(scope) compiler_config = get_compiler_config(scope, init_config)
for compiler in compilers: for compiler in compilers:
compiler_config.append(_to_dict(compiler)) compiler_config.append(_to_dict(compiler))
global _cache_config_file global _cache_config_file
@ -153,23 +153,23 @@ def remove_compiler_from_config(compiler_spec, scope=None):
spack.config.update_config('compilers', filtered_compiler_config, scope) spack.config.update_config('compilers', filtered_compiler_config, scope)
def all_compilers_config(scope=None): def all_compilers_config(scope=None, init_config=True):
"""Return a set of specs for all the compiler versions currently """Return a set of specs for all the compiler versions currently
available to build with. These are instances of CompilerSpec. available to build with. These are instances of CompilerSpec.
""" """
# Get compilers for this architecture. # Get compilers for this architecture.
global _cache_config_file #Create a cache of the config file so we don't load all the time. global _cache_config_file #Create a cache of the config file so we don't load all the time.
if not _cache_config_file: if not _cache_config_file:
_cache_config_file = get_compiler_config(scope) _cache_config_file = get_compiler_config(scope, init_config)
return _cache_config_file return _cache_config_file
else: else:
return _cache_config_file return _cache_config_file
def all_compilers(scope=None): def all_compilers(scope=None, init_config=True):
# Return compiler specs from the merged config. # Return compiler specs from the merged config.
return [spack.spec.CompilerSpec(s['compiler']['spec']) return [spack.spec.CompilerSpec(s['compiler']['spec'])
for s in all_compilers_config(scope)] for s in all_compilers_config(scope, init_config)]
def default_compiler(): def default_compiler():

View File

@ -77,9 +77,9 @@ def fc_version(cls, fc):
return get_compiler_version( return get_compiler_version(
fc, '-dumpversion', fc, '-dumpversion',
# older gfortran versions don't have simple dumpversion output. # older gfortran versions don't have simple dumpversion output.
r'(?:GNU Fortran \(GCC\))?(\d+\.\d+(?:\.\d+)?)', module) r'(?:GNU Fortran \(GCC\))?(\d+\.\d+(?:\.\d+)?)')
@classmethod @classmethod
def f77_version(cls, f77): def f77_version(cls, f77):
return cls.fc_version(f77, module) return cls.fc_version(f77)