From 7d79648cb507865309ab2c8f6e54743377e645c3 Mon Sep 17 00:00:00 2001 From: psakievich Date: Tue, 11 Mar 2025 07:05:26 -0600 Subject: [PATCH] build_environment.py: fix external module loading (#49401) * load external modules in topo order from leaf to root * only load external modules of transitive link/run deps --- lib/spack/spack/build_environment.py | 32 ++++++++++++++-------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 3e1663131c0..73a9aff184b 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -881,21 +881,6 @@ def get_rpath_deps(pkg: spack.package_base.PackageBase) -> List[spack.spec.Spec] return _get_rpath_deps_from_spec(pkg.spec, pkg.transitive_rpaths) -def load_external_modules(pkg): - """Traverse a package's spec DAG and load any external modules. - - Traverse a package's dependencies and load any external modules - associated with them. - - Args: - pkg (spack.package_base.PackageBase): package to load deps for - """ - for dep in list(pkg.spec.traverse()): - external_modules = dep.external_modules or [] - for external_module in external_modules: - load_module(external_module) - - def setup_package(pkg, dirty, context: Context = Context.BUILD): """Execute all environment setup routines.""" if context not in (Context.BUILD, Context.TEST): @@ -946,7 +931,7 @@ def setup_package(pkg, dirty, context: Context = Context.BUILD): for mod in pkg.compiler.modules: load_module(mod) - load_external_modules(pkg) + load_external_modules(setup_context) # Make sure nothing's strange about the Spack environment. validate(env_mods, tty.warn) @@ -1235,6 +1220,21 @@ def _make_runnable(self, dep: spack.spec.Spec, env: EnvironmentModifications): env.prepend_path("PATH", bin_dir) +def load_external_modules(context: SetupContext) -> None: + """Traverse a package's spec DAG and load any external modules. + + Traverse a package's dependencies and load any external modules + associated with them. + + Args: + context: A populated SetupContext object + """ + for spec, _ in context.external: + external_modules = spec.external_modules or [] + for external_module in external_modules: + load_module(external_module) + + def _setup_pkg_and_run( serialized_pkg: "spack.subprocess_context.PackageInstallContext", function: Callable,