Cray compiler: fix implicit rpaths for classic versions (#17310)
* check link dirs for existence
This commit is contained in:
parent
c12885768d
commit
212299a021
4 changed files with 40 additions and 13 deletions
|
@ -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
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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')
|
||||||
|
|
|
@ -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()
|
||||||
|
|
Loading…
Reference in a new issue