Allow self concretization to bootstrap compilers
This commit is contained in:
parent
f56aaf1fc3
commit
1ddc0e6b52
@ -376,6 +376,7 @@ trigger_node(ID, node(PackageID, Package), node(VirtualID, Virtual)) :- pkg_fact
|
|||||||
condition_nodes(TriggerID, PackageNode, node(X, A1))
|
condition_nodes(TriggerID, PackageNode, node(X, A1))
|
||||||
:- condition_packages(TriggerID, A1),
|
:- condition_packages(TriggerID, A1),
|
||||||
condition_set(PackageNode, node(X, A1)),
|
condition_set(PackageNode, node(X, A1)),
|
||||||
|
not self_build_requirement(PackageNode, node(X, A1)),
|
||||||
trigger_node(TriggerID, PackageNode, _).
|
trigger_node(TriggerID, PackageNode, _).
|
||||||
|
|
||||||
cannot_hold(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)),
|
pkg_fact(Package, condition_effect(ID, EffectID)),
|
||||||
imposed_packages(EffectID, A1),
|
imposed_packages(EffectID, A1),
|
||||||
condition_set(node(NodeID, Package), node(X, 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_nodes(ConditionID, PackageNode, node(X, A1))
|
||||||
:- imposed_packages(ConditionID, 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),
|
imposed_constraint(ID, "depends_on", A1, A2, A3),
|
||||||
internal_error("Build deps must land in exactly one duplicate").
|
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:
|
% From cli we can have literal expressions like:
|
||||||
%
|
%
|
||||||
% root %gcc@12.0 ^dep %gcc@11.2
|
% 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".
|
% version constraints on "gcc" in the "imposed_constraint".
|
||||||
attr("node_version_satisfies", node(X, BuildDependency), Constraint) :-
|
attr("node_version_satisfies", node(X, BuildDependency), Constraint) :-
|
||||||
attr("build_requirement", ParentNode, build_requirement("node_version_satisfies", 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
|
% Reconstruct virtual dependencies for reused specs
|
||||||
attr("virtual_on_edge", node(X, A1), node(Y, A2), Virtual)
|
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),
|
virtual_condition_holds(_, PossibleProvider, Virtual),
|
||||||
PossibleProvider != ProviderNode,
|
PossibleProvider != ProviderNode,
|
||||||
explicitly_requested_root(PossibleProvider),
|
explicitly_requested_root(PossibleProvider),
|
||||||
|
not self_build_requirement(PossibleProvider, ProviderNode),
|
||||||
not explicitly_requested_root(ProviderNode),
|
not explicitly_requested_root(ProviderNode),
|
||||||
internal_error("If a root can provide a virtual, it must be the provider").
|
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)
|
% Try hard to reuse installed packages (i.e., minimize the number built)
|
||||||
opt_criterion(110, "number of packages to build (vs. reuse)").
|
opt_criterion(110, "number of packages to build (vs. reuse)").
|
||||||
#minimize { 0@110: #true }.
|
#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").
|
opt_criterion(100, "number of nodes from the same package").
|
||||||
#minimize { 0@100: #true }.
|
#minimize { 0@100: #true }.
|
||||||
|
Loading…
Reference in New Issue
Block a user