Set module variables for all packages before running setup_dependent_package (#44327)
When a package is running `setup_dependent_package` on a parent, ensure that module variables like `spack_cc` are available. This was often true prior to this commit, but externals were an exception. --------- Co-authored-by: John Parent <john.parent@kitware.com>
This commit is contained in:
		@@ -1003,7 +1003,6 @@ def set_all_package_py_globals(self):
 | 
			
		||||
        """Set the globals in modules of package.py files."""
 | 
			
		||||
        for dspec, flag in chain(self.external, self.nonexternal):
 | 
			
		||||
            pkg = dspec.package
 | 
			
		||||
 | 
			
		||||
            if self.should_set_package_py_globals & flag:
 | 
			
		||||
                if self.context == Context.BUILD and self.needs_build_context & flag:
 | 
			
		||||
                    set_package_py_globals(pkg, context=Context.BUILD)
 | 
			
		||||
@@ -1011,6 +1010,12 @@ def set_all_package_py_globals(self):
 | 
			
		||||
                    # 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.
 | 
			
		||||
 
 | 
			
		||||
@@ -513,6 +513,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 (
 | 
			
		||||
        determine_number_of_jobs(
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user