python: allow it as a build-tool again (#49201)
Python was removed from being a build tool in #46980, due to issues when reusing specs. This PR adds a new rule to match the interpreter among different Python packages, in clingo. It also adds a bunch of new "build-tools", so that specs like: ``` py-matplotlib backend=tkagg ``` can be concretized in one go. Modifications: - [x] Make `py-matplotlib backend=tkagg` concretizable - [x] Add unit-tests to ensure situations like in #46980 do not happen --------- Signed-off-by: Massimiliano Culpo <massimiliano.culpo@gmail.com>
This commit is contained in:

committed by
GitHub

parent
dbd531112c
commit
3caa3132aa
@@ -1658,13 +1658,16 @@ def track_dependencies(input_spec, requirements):
|
||||
return requirements + [fn.attr("track_dependencies", input_spec.name)]
|
||||
|
||||
def dependency_holds(input_spec, requirements):
|
||||
return remove_node(input_spec, requirements) + [
|
||||
result = remove_node(input_spec, requirements) + [
|
||||
fn.attr(
|
||||
"dependency_holds", pkg.name, input_spec.name, dt.flag_to_string(t)
|
||||
)
|
||||
for t in dt.ALL_FLAGS
|
||||
if t & depflag
|
||||
]
|
||||
if input_spec.name not in pkg.extendees:
|
||||
return result
|
||||
return result + [fn.attr("extends", pkg.name, input_spec.name)]
|
||||
|
||||
context = ConditionContext()
|
||||
context.source = ConstraintOrigin.append_type_suffix(
|
||||
|
@@ -524,6 +524,16 @@ error(10, "'{0}' is not a valid dependency for any package in the DAG", Package)
|
||||
:- attr("node", node(ID, Package)),
|
||||
not needed(node(ID, Package)).
|
||||
|
||||
|
||||
% Extensions depending on each other must all extend the same node (e.g. all Python packages
|
||||
% depending on each other must depend on the same Python interpreter)
|
||||
error(100, "{0} and {1} must depend on the same {2}", ExtensionParent, ExtensionChild, ExtendeePackage)
|
||||
:- depends_on(ExtensionParent, ExtensionChild),
|
||||
attr("extends", ExtensionParent, ExtendeePackage),
|
||||
depends_on(ExtensionParent, node(X, ExtendeePackage)),
|
||||
depends_on(ExtensionChild, node(Y, ExtendeePackage)),
|
||||
X != Y.
|
||||
|
||||
#defined dependency_type/2.
|
||||
|
||||
%-----------------------------------------------------------------------------
|
||||
|
@@ -2888,6 +2888,23 @@ def test_specifying_different_versions_build_deps(self):
|
||||
assert any(x.satisfies(hdf5_str) for x in result.specs)
|
||||
assert any(x.satisfies(pinned_str) for x in result.specs)
|
||||
|
||||
@pytest.mark.regression("44289")
|
||||
def test_all_extensions_depend_on_same_extendee(self):
|
||||
"""Tests that we don't reuse dependencies that bring in a different extendee"""
|
||||
setuptools = spack.concretize.concretize_one("py-setuptools ^python@3.10")
|
||||
|
||||
solver = spack.solver.asp.Solver()
|
||||
setup = spack.solver.asp.SpackSolverSetup()
|
||||
result, _, _ = solver.driver.solve(
|
||||
setup, [Spec("py-floating ^python@3.11")], reuse=list(setuptools.traverse())
|
||||
)
|
||||
assert len(result.specs) == 1
|
||||
|
||||
floating = result.specs[0]
|
||||
assert all(setuptools.dag_hash() != x.dag_hash() for x in floating.traverse())
|
||||
pythons = [x for x in floating.traverse() if x.name == "python"]
|
||||
assert len(pythons) == 1 and pythons[0].satisfies("@3.11")
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"v_str,v_opts,checksummed",
|
||||
|
Reference in New Issue
Block a user