fix extendee_spec for transitive dependencies on potential extendees (#48025)

* fix extendee_spec for transitive dependencies on potential extendees

* regression test

* resolve conditional extensions on direct deps

* remove outdated comment

Co-authored-by: Harmen Stoppels <me@harmenstoppels.nl>

---------

Co-authored-by: Harmen Stoppels <me@harmenstoppels.nl>
This commit is contained in:
Greg Becker 2025-03-21 08:27:51 -07:00 committed by GitHub
parent 6e10fac7ae
commit 5983f72439
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 57 additions and 7 deletions

View File

@ -462,8 +462,7 @@ def _execute_extends(pkg):
if dep_spec.name == "python" and not pkg.name == "python-venv":
_depends_on(pkg, spack.spec.Spec("python-venv"), when=when, type=("build", "run"))
# TODO: the values of the extendees dictionary are not used. Remove in next refactor.
pkg.extendees[dep_spec.name] = (dep_spec, None)
pkg.extendees[dep_spec.name] = (dep_spec, when_spec)
return _execute_extends

View File

@ -1288,12 +1288,13 @@ def extendee_spec(self):
if not self.extendees:
return None
deps = []
# If the extendee is in the spec's deps already, return that.
for dep in self.spec.traverse(deptype=("link", "run")):
if dep.name in self.extendees:
deps.append(dep)
deps = [
dep
for dep in self.spec.dependencies(deptype=("link", "run"))
for d, when in self.extendees.values()
if dep.satisfies(d) and self.spec.satisfies(when)
]
if deps:
assert len(deps) == 1

View File

@ -67,6 +67,20 @@ def test_extends_spec(config, mock_packages):
assert extender.package.extends(extendee)
@pytest.mark.regression("48024")
def test_conditionally_extends_transitive_dep(config, mock_packages):
spec = spack.spec.Spec("conditionally-extends-transitive-dep").concretized()
assert not spec.package.extendee_spec
@pytest.mark.regression("48025")
def test_conditionally_extends_direct_dep(config, mock_packages):
spec = spack.spec.Spec("conditionally-extends-direct-dep").concretized()
assert not spec.package.extendee_spec
@pytest.mark.regression("34368")
def test_error_on_anonymous_dependency(config, mock_packages):
pkg = spack.repo.PATH.get_pkg_class("pkg-a")

View File

@ -0,0 +1,18 @@
# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.package import *
class ConditionallyExtendsDirectDep(Package):
"""Package that tests if the extends directive supports a spec."""
homepage = "http://www.example.com"
url = "http://www.example.com/example-1.0.tar.gz"
version("1.0", md5="0123456789abcdef0123456789abcdef")
extends("extendee", when="@2:") # will not satisfy version
depends_on("extendee")

View File

@ -0,0 +1,18 @@
# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from spack.package import *
class ConditionallyExtendsTransitiveDep(Package):
"""Package that tests if the extends directive supports a spec."""
homepage = "http://www.example.com"
url = "http://www.example.com/example-1.0.tar.gz"
version("1.0", md5="0123456789abcdef0123456789abcdef")
extends("extendee", when="@2:") # will not satisfy version
depends_on("extension1")