Do not initialize config on spack compiler list (#28042)

When `spack compiler list` is run without being restricted to a
particular scope, and no compilers are found, say that none are 
available, and hint that the use should run spack compiler find to 
auto detect compilers.

* Improve docs
* Check if stdin is a tty
* add a test
This commit is contained in:
Harmen Stoppels 2022-01-12 17:26:28 +01:00 committed by GitHub
parent 91fc4cf28f
commit d74396ad21
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 11 deletions

View file

@ -271,9 +271,10 @@ Compiler configuration
----------------------
Spack has the ability to build packages with multiple compilers and
compiler versions. Spack searches for compilers on your machine
automatically the first time it is run. It does this by inspecting
your ``PATH``.
compiler versions. Compilers can be made available to Spack by
specifying them manually in ``compilers.yaml``, or automatically by
running ``spack compiler find``, but for convenience Spack will
automatically detect compilers the first time it needs them.
.. _cmd-spack-compilers:
@ -281,7 +282,7 @@ your ``PATH``.
``spack compilers``
^^^^^^^^^^^^^^^^^^^
You can see which compilers spack has found by running ``spack
You can see which compilers are available to Spack by running ``spack
compilers`` or ``spack compiler list``:
.. code-block:: console
@ -320,9 +321,10 @@ An alias for ``spack compiler find``.
``spack compiler find``
^^^^^^^^^^^^^^^^^^^^^^^
If you do not see a compiler in this list, but you want to use it with
Spack, you can simply run ``spack compiler find`` with the path to
where the compiler is installed. For example:
Lists the compilers currently available to Spack. If you do not see
a compiler in this list, but you want to use it with Spack, you can
simply run ``spack compiler find`` with the path to where the
compiler is installed. For example:
.. code-block:: console

View file

@ -146,9 +146,22 @@ def compiler_info(args):
def compiler_list(args):
compilers = spack.compilers.all_compilers(scope=args.scope, init_config=False)
# If there are no compilers in any scope, and we're outputting to a tty, give a
# hint to the user.
if len(compilers) == 0:
if not sys.stdout.isatty():
return
msg = "No compilers available"
if args.scope is None:
msg += ". Run `spack compiler find` to autodetect compilers"
tty.msg(msg)
return
index = index_by(compilers, lambda c: (c.spec.name, c.operating_system, c.target))
tty.msg("Available compilers")
index = index_by(spack.compilers.all_compilers(scope=args.scope),
lambda c: (c.spec.name, c.operating_system, c.target))
# For a container, take each element which does not evaluate to false and
# convert it to a string. For elements which evaluate to False (e.g. None)

View file

@ -300,8 +300,8 @@ def find_specs_by_arch(compiler_spec, arch_spec, scope=None, init_config=True):
init_config)]
def all_compilers(scope=None):
config = get_compiler_config(scope)
def all_compilers(scope=None, init_config=True):
config = get_compiler_config(scope, init_config=init_config)
compilers = list()
for items in config:
items = items['compiler']

View file

@ -10,6 +10,7 @@
import llnl.util.filesystem
import spack.compilers
import spack.main
import spack.version
@ -271,3 +272,13 @@ def test_compiler_find_path_order(
'f77': str(clangdir.join('first_in_path', 'gfortran-8')),
'fc': str(clangdir.join('first_in_path', 'gfortran-8')),
}
def test_compiler_list_empty(no_compilers_yaml, working_env, clangdir):
# Spack should not automatically search for compilers when listing them and none
# are available. And when stdout is not a tty like in tests, there should be no
# output and no error exit code.
os.environ['PATH'] = str(clangdir)
out = compiler('list')
assert not out
assert compiler.returncode == 0