
This updates the configuration loading/dumping logic (now called load_config/dump_config) in spack_yaml to preserve comments (by using ruamel.yaml's RoundTripLoader). This has two effects: * environment spack.yaml files expect to retain comments, which load_config now supports. By using load_config, users can now use the ':' override syntax that was previously unavailable for environment configs (but was available for other config files). * config files now retain user comments by default (although in cases where Spack updates/overwrites config, the comments can still be removed). Details: * Subclasses `RoundTripLoader`/`RoundTripDumper` to parse yaml into ruamel's `CommentedMap` and analogous data structures * Applies filename info directly to ruamel objects in cases where the updated loader returns those * Copies management of sections in `SingleFileScope` from #10651 to allow overrides to occur * Updates the loader/dumper to handle the processing of overrides by specifically checking for the `:` character * Possibly the most controversial aspect, but without that, the parsed objects have to be reconstructed (i.e. as was done in `mark_overrides`). It is possible that `mark_overrides` could remain and a deep copy will not cause problems, but IMO that's generally worth avoiding. * This is also possibly controversial because Spack YAML strings can include `:`. My reckoning is that this only occurs for version specifications, so it is safe to check for `endswith(':') and not ('@' in string)` * As a consequence, this PR ends up reserving spack yaml functions load_config/dump_config exclusively for the purpose of storing spack config
40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other
|
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
|
#
|
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
|
|
"""Yaml Version Check is a module for ensuring that config file
|
|
formats are compatible with the current version of Spack."""
|
|
import os.path
|
|
import os
|
|
import llnl.util.tty as tty
|
|
import spack.util.spack_yaml as syaml
|
|
import spack.config
|
|
|
|
|
|
def pre_run():
|
|
check_compiler_yaml_version()
|
|
|
|
|
|
def check_compiler_yaml_version():
|
|
config = spack.config.config
|
|
|
|
for scope in config.file_scopes:
|
|
file_name = os.path.join(scope.path, 'compilers.yaml')
|
|
data = None
|
|
if os.path.isfile(file_name):
|
|
with open(file_name) as f:
|
|
data = syaml.load_config(f)
|
|
|
|
if data:
|
|
compilers = data.get('compilers')
|
|
if compilers and len(compilers) > 0:
|
|
if (not isinstance(compilers, list) or
|
|
'operating_system' not in compilers[0]['compiler']):
|
|
new_file = os.path.join(scope.path, '_old_compilers.yaml')
|
|
tty.warn('%s in out of date compilers format. '
|
|
'Moved to %s. Spack automatically generate '
|
|
'a compilers config file '
|
|
% (file_name, new_file))
|
|
os.rename(file_name, new_file)
|