Allow self concretization to bootstrap compilers

This commit is contained in:
Massimiliano Culpo 2024-10-26 15:29:57 +02:00
parent f56aaf1fc3
commit 1ddc0e6b52
No known key found for this signature in database
GPG Key ID: 3E52BB992233066C

View File

@ -376,6 +376,7 @@ trigger_node(ID, node(PackageID, Package), node(VirtualID, Virtual)) :- pkg_fact
condition_nodes(TriggerID, PackageNode, node(X, A1))
:- condition_packages(TriggerID, A1),
condition_set(PackageNode, node(X, A1)),
not self_build_requirement(PackageNode, node(X, A1)),
trigger_node(TriggerID, PackageNode, _).
cannot_hold(TriggerID, PackageNode)
@ -420,7 +421,12 @@ imposed_nodes(EffectID, node(NodeID, Package), node(X, A1))
pkg_fact(Package, condition_effect(ID, EffectID)),
imposed_packages(EffectID, A1),
condition_set(node(NodeID, Package), node(X, A1)),
trigger_node(TriggerID, _, node(NodeID, Package)).
trigger_node(TriggerID, _, node(NodeID, Package)),
% We don't want to add build requirements to imposed nodes, to avoid
% unsat problems when we deal with self-dependencies: gcc@14 %gcc@10
not self_build_requirement(node(NodeID, Package), node(X, A1)).
self_build_requirement(node(X, Package), node(Y, Package)) :- build_requirement(node(X, Package), node(Y, Package)).
imposed_nodes(ConditionID, PackageNode, node(X, A1))
:- imposed_packages(ConditionID, A1),
@ -468,6 +474,20 @@ provider(ProviderNode, VirtualNode) :- attr("provider_set", ProviderNode, Virtua
imposed_constraint(ID, "depends_on", A1, A2, A3),
internal_error("Build deps must land in exactly one duplicate").
1 { build_requirement(node(X, Parent), node(0..Y-1, BuildDependency)) : max_dupes(BuildDependency, Y) } 1
:- attr("build_requirement", node(X, Parent), build_requirement("node", BuildDependency)),
impose(ID, node(X, Parent)),
imposed_constraint(ID,"build_requirement",Parent,_).
1 { virtual_build_requirement(ParentNode, node(0..Y-1, Virtual)) : max_dupes(Virtual, Y) } 1
:- attr("dependency_holds", ParentNode, Virtual, "build"),
not attr("dependency_holds", ParentNode, Virtual,"link"),
not attr("dependency_holds", ParentNode, Virtual,"run"),
virtual(Virtual).
attr("virtual_node", VirtualNode) :- virtual_build_requirement(ParentNode, VirtualNode).
build_requirement(ParentNode, ProviderNode) :- virtual_build_requirement(ParentNode, VirtualNode), provider(ProviderNode, VirtualNode).
% From cli we can have literal expressions like:
%
% root %gcc@12.0 ^dep %gcc@11.2
@ -476,10 +496,10 @@ provider(ProviderNode, VirtualNode) :- attr("provider_set", ProviderNode, Virtua
% version constraints on "gcc" in the "imposed_constraint".
attr("node_version_satisfies", node(X, BuildDependency), Constraint) :-
attr("build_requirement", ParentNode, build_requirement("node_version_satisfies", BuildDependency, Constraint)),
attr("depends_on", ParentNode, node(X, BuildDependency), "build").
build_requirement(ParentNode, node(X, BuildDependency)).
attr("depends_on", node(X, Parent), node(Y, BuildDependency), "build") :- build_requirement(node(X, Parent), node(Y, BuildDependency)).
1 { attr("depends_on", ParentNode, node(0..Y-1, BuildDependency), "build") : max_dupes(BuildDependency, Y) } 1 :-
attr("build_requirement", ParentNode, build_requirement("node", BuildDependency)).
% Reconstruct virtual dependencies for reused specs
attr("virtual_on_edge", node(X, A1), node(Y, A2), Virtual)
@ -712,6 +732,7 @@ do_not_impose(EffectID, node(X, Package))
virtual_condition_holds(_, PossibleProvider, Virtual),
PossibleProvider != ProviderNode,
explicitly_requested_root(PossibleProvider),
not self_build_requirement(PossibleProvider, ProviderNode),
not explicitly_requested_root(ProviderNode),
internal_error("If a root can provide a virtual, it must be the provider").
@ -1538,7 +1559,7 @@ opt_criterion(310, "requirement weight").
% Try hard to reuse installed packages (i.e., minimize the number built)
opt_criterion(110, "number of packages to build (vs. reuse)").
#minimize { 0@110: #true }.
#minimize { 1@110,PackageNode : build(PackageNode), optimize_for_reuse() }.
#minimize { 1@110,PackageNode : build(PackageNode) }.
opt_criterion(100, "number of nodes from the same package").
#minimize { 0@100: #true }.