diff options
author | John W. Parent <45471568+johnwparent@users.noreply.github.com> | 2024-10-18 16:36:16 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-18 13:36:16 -0700 |
commit | 31cfcafeba35429d9b6d811ae27eff0e88b1fee8 (patch) | |
tree | 0629e837ba391c1c11417bf9084a219ba64eb3bf /lib | |
parent | 230bc7010a5bbcfd213c2531be91ebc7381d3886 (diff) | |
download | spack-31cfcafeba35429d9b6d811ae27eff0e88b1fee8.tar.gz spack-31cfcafeba35429d9b6d811ae27eff0e88b1fee8.tar.bz2 spack-31cfcafeba35429d9b6d811ae27eff0e88b1fee8.tar.xz spack-31cfcafeba35429d9b6d811ae27eff0e88b1fee8.zip |
Build logic fix: reorder definition of package module variables (#46992)
#44327 made sure to always run `set_package_py_globals` on all
packages before running `setup_dependent_package` for any package,
so that packages implementing the latter could depend on variables
like `spack_cc` being defined.
This ran into an undocumented dependency: `std_cmake_args` is set in
`set_package_py_globals` and makes use of `cmake_prefix_paths` (if it
is defined in the package); `py-torch`es implementation of
`cmake_prefix_paths` depends on a variable set by
`setup_dependent_package` (`python_platlib`).
This generally restores #44327, and corrects the resulting issue by
moving assignment of `std_cmake_args` to after both actions have been
run.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/spack/spack/build_environment.py | 21 | ||||
-rw-r--r-- | lib/spack/spack/test/build_environment.py | 24 |
2 files changed, 41 insertions, 4 deletions
diff --git a/lib/spack/spack/build_environment.py b/lib/spack/spack/build_environment.py index 3737caf35e..ed62e517ef 100644 --- a/lib/spack/spack/build_environment.py +++ b/lib/spack/spack/build_environment.py @@ -617,14 +617,12 @@ def set_package_py_globals(pkg, context: Context = Context.BUILD): """ module = ModuleChangePropagator(pkg) + jobs = spack.config.determine_number_of_jobs(parallel=pkg.parallel) + module.make_jobs = jobs if context == Context.BUILD: - module.std_cmake_args = spack.build_systems.cmake.CMakeBuilder.std_args(pkg) module.std_meson_args = spack.build_systems.meson.MesonBuilder.std_args(pkg) module.std_pip_args = spack.build_systems.python.PythonPipBuilder.std_args(pkg) - jobs = spack.config.determine_number_of_jobs(parallel=pkg.parallel) - module.make_jobs = jobs - # TODO: make these build deps that can be installed if not found. module.make = MakeExecutable("make", jobs) module.gmake = MakeExecutable("gmake", jobs) @@ -1048,6 +1046,12 @@ class SetupContext: # This includes runtime dependencies, also runtime deps of direct build deps. set_package_py_globals(pkg, context=Context.RUN) + # Looping over the set of packages a second time + # ensures all globals are loaded into the module space prior to + # any package setup. This guarantees package setup methods have + # access to expected module level definitions such as "spack_cc" + for dspec, flag in chain(self.external, self.nonexternal): + pkg = dspec.package for spec in dspec.dependents(): # Note: some specs have dependents that are unreachable from the root, so avoid # setting globals for those. @@ -1057,6 +1061,15 @@ class SetupContext: pkg.setup_dependent_package(dependent_module, spec) dependent_module.propagate_changes_to_mro() + pkg = self.specs[0].package + if self.context == Context.BUILD: + module = ModuleChangePropagator(pkg) + # std_cmake_args is not sufficiently static to be defined + # in set_package_py_globals and is deprecated so its handled + # here as a special case + module.std_cmake_args = spack.build_systems.cmake.CMakeBuilder.std_args(pkg) + module.propagate_changes_to_mro() + def get_env_modifications(self) -> EnvironmentModifications: """Returns the environment variable modifications for the given input specs and context. Environment modifications include: diff --git a/lib/spack/spack/test/build_environment.py b/lib/spack/spack/test/build_environment.py index f435a893a1..281d79f856 100644 --- a/lib/spack/spack/test/build_environment.py +++ b/lib/spack/spack/test/build_environment.py @@ -516,6 +516,30 @@ def test_setting_dtags_based_on_config(config_setting, expected_flag, config, mo assert dtags_to_add.value == expected_flag +def test_module_globals_available_at_setup_dependent_time( + monkeypatch, mutable_config, mock_packages, working_env +): + """Spack built package externaltest depends on an external package + externaltool. Externaltool's setup_dependent_package needs to be able to + access globals on the dependent""" + + def setup_dependent_package(module, dependent_spec): + # Make sure set_package_py_globals was already called on + # dependents + # ninja is always set by the setup context and is not None + dependent_module = dependent_spec.package.module + assert hasattr(dependent_module, "ninja") + assert dependent_module.ninja is not None + dependent_spec.package.test_attr = True + + externaltool = spack.spec.Spec("externaltest").concretized() + monkeypatch.setattr( + externaltool["externaltool"].package, "setup_dependent_package", setup_dependent_package + ) + spack.build_environment.setup_package(externaltool.package, False) + assert externaltool.package.test_attr + + def test_build_jobs_sequential_is_sequential(): assert ( spack.config.determine_number_of_jobs( |