summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Scheibel <scheibel1@llnl.gov>2023-10-31 13:19:12 -0700
committerGitHub <noreply@github.com>2023-10-31 21:19:12 +0100
commit2f2d9ae30dad64cc654c48154e1c4ef65c03eba4 (patch)
treed5b1db03959c3422e06f7ecc7032d7515fc2e68f
parentf9c0a15ba058e63a6dbcc9674184438687313464 (diff)
downloadspack-2f2d9ae30dad64cc654c48154e1c4ef65c03eba4.tar.gz
spack-2f2d9ae30dad64cc654c48154e1c4ef65c03eba4.tar.bz2
spack-2f2d9ae30dad64cc654c48154e1c4ef65c03eba4.tar.xz
spack-2f2d9ae30dad64cc654c48154e1c4ef65c03eba4.zip
Fix cflags requirements (#40639)
-rw-r--r--lib/spack/spack/solver/concretize.lp21
-rw-r--r--lib/spack/spack/test/concretize_requirements.py14
2 files changed, 22 insertions, 13 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp
index 92ba77ad82..26c7907759 100644
--- a/lib/spack/spack/solver/concretize.lp
+++ b/lib/spack/spack/solver/concretize.lp
@@ -696,15 +696,18 @@ requirement_group_satisfied(node(ID, Package), X) :-
% flags if their only source is from a requirement. This is overly-specific
% and should use a more-generic approach like in https://github.com/spack/spack/pull/37180
-{ attr("node_flag", node(ID, A1), A2, A3) } :-
- requirement_group_member(Y, Package, X),
- activate_requirement(node(ID, Package), X),
- imposed_constraint(Y,"node_flag_set", A1, A2, A3).
-
-{ attr("node_flag_source", node(ID, A1), A2, node(ID, A3)) } :-
- requirement_group_member(Y, Package, X),
- activate_requirement(node(ID, Package), X),
- imposed_constraint(Y,"node_flag_source", A1, A2, A3).
+{ attr("node_flag", node(ID, Package), FlagType, FlagValue) } :-
+ requirement_group_member(ConditionID, Package, RequirementID),
+ activate_requirement(node(ID, Package), RequirementID),
+ pkg_fact(Package, condition_effect(ConditionID, EffectID)),
+ imposed_constraint(EffectID, "node_flag_set", Package, FlagType, FlagValue).
+
+{ attr("node_flag_source", node(NodeID1, Package1), FlagType, node(NodeID2, Package2)) } :-
+ requirement_group_member(ConditionID, Package1, RequirementID),
+ activate_requirement(node(NodeID1, Package1), RequirementID),
+ pkg_fact(Package1, condition_effect(ConditionID, EffectID)),
+ imposed_constraint(EffectID, "node_flag_source", Package1, FlagType, Package2),
+ imposed_packages(NodeID2, Package2).
requirement_weight(node(ID, Package), Group, W) :-
W = #min {
diff --git a/lib/spack/spack/test/concretize_requirements.py b/lib/spack/spack/test/concretize_requirements.py
index cd51006088..d5295691ce 100644
--- a/lib/spack/spack/test/concretize_requirements.py
+++ b/lib/spack/spack/test/concretize_requirements.py
@@ -469,16 +469,22 @@ packages:
@pytest.mark.regression("34241")
-def test_require_cflags(concretize_scope, test_repo):
+def test_require_cflags(concretize_scope, mock_packages):
"""Ensures that flags can be required from configuration."""
conf_str = """\
packages:
- y:
+ mpich2:
require: cflags="-g"
+ mpi:
+ require: mpich cflags="-O1"
"""
update_packages_config(conf_str)
- spec = Spec("y").concretized()
- assert spec.satisfies("cflags=-g")
+
+ spec_mpich2 = Spec("mpich2").concretized()
+ assert spec_mpich2.satisfies("cflags=-g")
+
+ spec_mpi = Spec("mpi").concretized()
+ assert spec_mpi.satisfies("mpich cflags=-O1")
def test_requirements_for_package_that_is_not_needed(concretize_scope, test_repo):