From 47d01c086c7cc6f9e98fee9edbe19b45ad2902ec Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Thu, 21 Nov 2024 10:15:24 +0100 Subject: [PATCH] Prepend compiler wrappers path last, so we don't risk finding externals --- lib/spack/spack/build_environment.py | 15 ++++---- lib/spack/spack/build_systems/compiler.py | 44 +++++++++++------------ 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index a55c2d62e18..f8fff6942aa 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -91,6 +91,7 @@ from spack.util.environment import ( SYSTEM_DIR_CASE_ENTRY, EnvironmentModifications, + PrependPath, env_flag, filter_system_paths, get_path, @@ -431,12 +432,7 @@ def set_wrapper_environment_variables_for_flags(pkg, env): # implicit variables env.set(flag.upper(), " ".join(f for f in env_flags[flag])) pkg.flags_to_build_system_args(build_system_flags) - env.set("SPACK_SYSTEM_DIRS", SYSTEM_DIR_CASE_ENTRY) - - # FIXME (compiler as nodes): recover this one in the correct packages - # compiler.setup_custom_environment(pkg, env) - return env @@ -592,8 +588,8 @@ def set_package_py_globals(pkg, context: Context = Context.BUILD): # in setup_run_environment etc, so don't put it context == build) link_dir = spack.paths.build_env_path - # FIXME (compiler as nodes): make this more general, and not tied to three languages - # Maybe add a callback? + # Set spack_cc, etc. for backward compatibility. This might change if the compiler wrapper + # is modeled as a package. global_names = { "c": ("spack_cc",), "cxx": ("spack_cxx",), @@ -781,6 +777,11 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD): env_mods.extend(setup_context.get_env_modifications()) tty.debug("setup_package: collected all modifications from dependencies") + tty.debug("setup_package: adding compiler wrappers paths") + for x in env_mods.group_by_name()["SPACK_ENV_PATH"]: + assert isinstance(x, PrependPath), "unexpected setting used for SPACK_ENV_PATH" + env_mods.prepend_path("PATH", x.value) + if context == Context.TEST: env_mods.prepend_path("PATH", ".") elif context == Context.BUILD and not dirty and not env_mods.is_unset("CPATH"): diff --git a/lib/spack/spack/build_systems/compiler.py b/lib/spack/spack/build_systems/compiler.py index 67b696fd25a..c45964f76ff 100644 --- a/lib/spack/spack/build_systems/compiler.py +++ b/lib/spack/spack/build_systems/compiler.py @@ -202,6 +202,7 @@ def setup_dependent_build_environment(self, env, dependent_spec): # Populate an object with the list of environment modifications and return it link_dir = pathlib.Path(spack.paths.build_env_path) + env_paths = [] for language, attr_name, wrapper_var_name, spack_var_name in [ ("c", "cc", "CC", "SPACK_CC"), @@ -237,6 +238,25 @@ def setup_dependent_build_environment(self, env, dependent_spec): if isa_arg: env.set(f"SPACK_TARGET_ARGS_{attr_name.upper()}", isa_arg) + # Add spack build environment path with compiler wrappers first in + # the path. We add the compiler wrapper path, which includes default + # wrappers (cc, c++, f77, f90), AND a subdirectory containing + # compiler-specific symlinks. The latter ensures that builds that + # are sensitive to the *name* of the compiler see the right name when + # we're building with the wrappers. + # + # Conflicts on case-insensitive systems (like "CC" and "cc") are + # handled by putting one in the /case-insensitive + # directory. Add that to the path too. + compiler_specific = os.path.join( + spack.paths.build_env_path, os.path.dirname(self.link_paths[language]) + ) + for item in [spack.paths.build_env_path, compiler_specific]: + env_paths.append(item) + ci = os.path.join(item, "case-insensitive") + if os.path.isdir(ci): + env_paths.append(ci) + # FIXME (compiler as nodes): make these paths language specific env.set("SPACK_LINKER_ARG", self.linker_arg) @@ -260,30 +280,8 @@ def setup_dependent_build_environment(self, env, dependent_spec): if extra_rpaths: env.append_path("SPACK_COMPILER_EXTRA_RPATHS", ":".join(extra_rpaths)) - # Add spack build environment path with compiler wrappers first in - # the path. We add the compiler wrapper path, which includes default - # wrappers (cc, c++, f77, f90), AND a subdirectory containing - # compiler-specific symlinks. The latter ensures that builds that - # are sensitive to the *name* of the compiler see the right name when - # we're building with the wrappers. - # - # Conflicts on case-insensitive systems (like "CC" and "cc") are - # handled by putting one in the /case-insensitive - # directory. Add that to the path too. - env_paths = [] - compiler_specific = os.path.join( - spack.paths.build_env_path, os.path.dirname(self.link_paths["c"]) - ) - for item in [spack.paths.build_env_path, compiler_specific]: - env_paths.append(item) - ci = os.path.join(item, "case-insensitive") - if os.path.isdir(ci): - env_paths.append(ci) - - tty.debug("Adding compiler bin/ paths: " + " ".join(env_paths)) for item in env_paths: - env.prepend_path("PATH", item) - env.set_path("SPACK_ENV_PATH", env_paths) + env.prepend_path("SPACK_ENV_PATH", item) def archspec_name(self) -> str: """Name that archspec uses to refer to this compiler"""