Cray compiler: fix implicit rpaths for classic versions (#17310)

* check link dirs for existence
This commit is contained in:
Greg Becker 2020-06-30 12:46:20 -05:00 committed by GitHub
parent c12885768d
commit 212299a021
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 40 additions and 13 deletions

View file

@ -152,6 +152,10 @@ def _parse_non_system_link_dirs(string):
""" """
link_dirs = _parse_link_paths(string) link_dirs = _parse_link_paths(string)
# Remove directories that do not exist. Some versions of the Cray compiler
# report nonexistent directories
link_dirs = [d for d in link_dirs if os.path.isdir(d)]
# Return set of directories containing needed compiler libs, minus # Return set of directories containing needed compiler libs, minus
# system paths. Note that 'filter_system_paths' only checks for an # system paths. Note that 'filter_system_paths' only checks for an
# exact match, while 'in_system_subdirectory' checks if a path contains # exact match, while 'in_system_subdirectory' checks if a path contains

View file

@ -159,7 +159,13 @@ def __init__(self):
default_compiler_entry['paths']['f77']], default_compiler_entry['paths']['f77']],
environment={}) environment={})
_get_compiler_link_paths = Compiler._get_compiler_link_paths def _get_compiler_link_paths(self, paths):
# Mock os.path.isdir so the link paths don't have to exist
old_isdir = os.path.isdir
os.path.isdir = lambda x: True
ret = super(MockCompiler, self)._get_compiler_link_paths(paths)
os.path.isdir = old_isdir
return ret
@property @property
def name(self): def name(self):
@ -222,6 +228,7 @@ def call_compiler(exe, *args, **kwargs):
('f77', 'fflags'), ('f77', 'fflags'),
('f77', 'cppflags'), ('f77', 'cppflags'),
]) ])
@pytest.mark.enable_compiler_link_paths
def test_get_compiler_link_paths(monkeypatch, exe, flagname): def test_get_compiler_link_paths(monkeypatch, exe, flagname):
# create fake compiler that emits mock verbose output # create fake compiler that emits mock verbose output
compiler = MockCompiler() compiler = MockCompiler()
@ -261,6 +268,7 @@ def test_get_compiler_link_paths_no_verbose_flag():
assert dirs == [] assert dirs == []
@pytest.mark.enable_compiler_link_paths
def test_get_compiler_link_paths_load_env(working_env, monkeypatch, tmpdir): def test_get_compiler_link_paths_load_env(working_env, monkeypatch, tmpdir):
gcc = str(tmpdir.join('gcc')) gcc = str(tmpdir.join('gcc'))
with open(gcc, 'w') as f: with open(gcc, 'w') as f:

View file

@ -619,18 +619,26 @@ def dirs_with_libfiles(tmpdir_factory):
@pytest.fixture(scope='function', autouse=True) @pytest.fixture(scope='function', autouse=True)
def disable_compiler_execution(monkeypatch): def disable_compiler_execution(monkeypatch, request):
def noop(*args): """
return [] This fixture can be disabled for tests of the compiler link path
functionality by::
# Compiler.determine_implicit_rpaths actually runs the compiler. So this @pytest.mark.enable_compiler_link_paths
# replaces that function with a noop that simulates finding no implicit
# RPATHs If a test is marked in that way this is a no-op."""
monkeypatch.setattr( if 'enable_compiler_link_paths' not in request.keywords:
spack.compiler.Compiler, def noop(*args):
'_get_compiler_link_paths', return []
noop
) # Compiler.determine_implicit_rpaths actually runs the compiler. So
# replace that function with a noop that simulates finding no implicit
# RPATHs
monkeypatch.setattr(
spack.compiler.Compiler,
'_get_compiler_link_paths',
noop
)
@pytest.fixture(scope='function') @pytest.fixture(scope='function')

View file

@ -2,7 +2,7 @@
# Spack Project Developers. See the top-level COPYRIGHT file for details. # Spack Project Developers. See the top-level COPYRIGHT file for details.
# #
# SPDX-License-Identifier: (Apache-2.0 OR MIT) # SPDX-License-Identifier: (Apache-2.0 OR MIT)
import pytest
import os import os
import spack.paths import spack.paths
@ -13,6 +13,13 @@
'compiler_verbose_output') 'compiler_verbose_output')
@pytest.fixture(autouse=True)
def allow_nonexistent_paths(monkeypatch):
# Allow nonexistent paths to be detected as part of the output
# for testing purposes.
monkeypatch.setattr(os.path, 'isdir', lambda x: True)
def check_link_paths(filename, paths): def check_link_paths(filename, paths):
with open(os.path.join(datadir, filename)) as file: with open(os.path.join(datadir, filename)) as file:
output = file.read() output = file.read()