summaryrefslogtreecommitdiff
path: root/lib/spack/spack/solver/concretize.lp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/spack/spack/solver/concretize.lp')
-rw-r--r--lib/spack/spack/solver/concretize.lp27
1 files changed, 25 insertions, 2 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp
index 22bb1dff3f..af168ce109 100644
--- a/lib/spack/spack/solver/concretize.lp
+++ b/lib/spack/spack/solver/concretize.lp
@@ -235,6 +235,22 @@ node_os(Package, OS)
% one target per node -- optimization will pick the "best" one
1 { node_target(Package, Target) : target(Target) } 1 :- node(Package).
+% The target weight is either the default target weight
+% or a more specific per-package weight if set
+target_weight(Target, Package, Weight)
+ :- default_target_weight(Target, Weight),
+ node(Package),
+ not derive_target_from_parent(_, Package),
+ not package_target_weight(Target, Package, _).
+
+target_weight(Target, Dependency, Weight)
+ :- depends_on(Package, Dependency),
+ derive_target_from_parent(Package, Dependency),
+ target_weight(Target, Package, Weight).
+
+target_weight(Target, Package, Weight)
+ :- package_target_weight(Target, Package, Weight).
+
% can't use targets on node if the compiler for the node doesn't support them
:- node_target(Package, Target),
not compiler_supports_target(Compiler, Version, Target),
@@ -247,7 +263,9 @@ node_target(Package, Target)
% each node has the weight of its assigned target
node_target_weight(Package, Weight)
- :- node(Package), node_target(Package, Target), target_weight(Target, Weight).
+ :- node(Package),
+ node_target(Package, Target),
+ target_weight(Target, Package, Weight).
% compatibility rules for targets among nodes
node_target_match_pref(Package, Target) :- node_target_set(Package, Target).
@@ -257,7 +275,12 @@ node_target_match_pref(Dependency, Target)
node_target_match(Package, 1)
:- node_target(Package, Target), node_target_match_pref(Package, Target).
+derive_target_from_parent(Parent, Package)
+ :- depends_on(Parent, Package), not package_target_weight(_, Package, _).
+
+
#defined node_target_set/2.
+#defined package_target_weight/3.
%-----------------------------------------------------------------------------
% Compiler semantics
@@ -422,7 +445,7 @@ root(Dependency, 1) :- not root(Dependency), node(Dependency).
% fastest target for node
% TODO: if these are slightly different by compiler (e.g., skylake is
-% best, gcc supports skylake and broadweell, clang's best is haswell)
+% best, gcc supports skylake and broadwell, clang's best is haswell)
% things seem to get really slow.
#maximize{ Weight@5,Package : node_target_match(Package, Weight) }.
#minimize{ Weight@4,Package : node_target_weight(Package, Weight) }.