compiler-wrapper: set SPACK_COMPILER_EXTRA_RPATHS (#49828)

Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
This commit is contained in:
Massimiliano Culpo 2025-04-03 11:23:08 +02:00 committed by GitHub
parent 035096006e
commit 5c71d36330
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 61 additions and 0 deletions

View File

@ -777,3 +777,54 @@ def test_optimization_flags_are_using_node_target(default_mock_concretization, m
assert len(actions) == 1 and isinstance(actions[0], spack.util.environment.SetEnv)
assert actions[0].value == "-march=x86-64 -mtune=generic"
@pytest.mark.regression("49827")
@pytest.mark.parametrize(
"gcc_config,expected_rpaths",
[
(
"""\
gcc:
externals:
- spec: gcc@14.2.0 languages=c
prefix: /fake/path1
extra_attributes:
compilers:
c: /fake/path1
extra_rpaths:
- /extra/rpaths1
- /extra/rpaths2
""",
"/extra/rpaths1:/extra/rpaths2",
),
(
"""\
gcc:
externals:
- spec: gcc@14.2.0 languages=c
prefix: /fake/path1
extra_attributes:
compilers:
c: /fake/path1
""",
None,
),
],
)
@pytest.mark.not_on_windows("Windows doesn't use the compiler-wrapper")
def test_extra_rpaths_is_set(
working_env, mutable_config, mock_packages, gcc_config, expected_rpaths
):
"""Tests that using a compiler with an 'extra_rpaths' section will set the corresponding
SPACK_COMPILER_EXTRA_RPATHS variable for the wrapper.
"""
cfg_data = syaml.load_config(gcc_config)
spack.config.set("packages", cfg_data)
mpich = spack.concretize.concretize_one("mpich %gcc@14")
spack.build_environment.setup_package(mpich.package, dirty=False)
if expected_rpaths is not None:
assert os.environ["SPACK_COMPILER_EXTRA_RPATHS"] == expected_rpaths
else:
assert "SPACK_COMPILER_EXTRA_RPATHS" not in os.environ

View File

@ -162,6 +162,7 @@ def setup_dependent_build_environment(self, env, dependent_spec):
bin_dir = self.bin_dir()
implicit_rpaths, env_paths = [], []
extra_rpaths = []
for language, attr_name, wrapper_var_name, spack_var_name in _var_list:
compiler_pkg = dependent_spec[language].package
if not hasattr(compiler_pkg, attr_name):
@ -215,12 +216,21 @@ def setup_dependent_build_environment(self, env, dependent_spec):
# Check if this compiler has implicit rpaths
implicit_rpaths.extend(_implicit_rpaths(pkg=compiler_pkg))
# Add extra rpaths, if they are defined in an external spec
extra_rpaths.extend(
getattr(compiler_pkg.spec, "extra_attributes", {}).get("extra_rpaths", [])
)
if implicit_rpaths:
# Implicit rpaths are accumulated across all compilers so, whenever they are mixed,
# the compiler used in ccld mode will account for rpaths from other compilers too.
implicit_rpaths = lang.dedupe(implicit_rpaths)
env.set("SPACK_COMPILER_IMPLICIT_RPATHS", ":".join(implicit_rpaths))
if extra_rpaths:
extra_rpaths = lang.dedupe(extra_rpaths)
env.set("SPACK_COMPILER_EXTRA_RPATHS", ":".join(extra_rpaths))
env.set("SPACK_ENABLE_NEW_DTAGS", self.enable_new_dtags)
env.set("SPACK_DISABLE_NEW_DTAGS", self.disable_new_dtags)