diff options
author | Todd Gamblin <tgamblin@llnl.gov> | 2021-03-13 16:03:50 -0800 |
---|---|---|
committer | Todd Gamblin <tgamblin@llnl.gov> | 2021-05-22 11:51:20 -0700 |
commit | 4d148a430e77a9d7842f3c02797e760dd87c8f63 (patch) | |
tree | a4b57f2efbef6b774883fd90b15710574bf9f10b | |
parent | 9717e0244f70892ec4cf8573bf0b88ec95840894 (diff) | |
download | spack-4d148a430e77a9d7842f3c02797e760dd87c8f63.tar.gz spack-4d148a430e77a9d7842f3c02797e760dd87c8f63.tar.bz2 spack-4d148a430e77a9d7842f3c02797e760dd87c8f63.tar.xz spack-4d148a430e77a9d7842f3c02797e760dd87c8f63.zip |
bugfix: allow imposed constraints to be overridden in special cases
In most cases, we want condition_holds(ID) to imply any imposed
constraints associated with the ID. However, the dependency relationship
in Spack is special because it's "extra" conditional -- a dependency
*condition* may hold, but we have decided that externals will not have
dependencies, so we need a way to avoid having imposed constraints appear
for nodes that don't exist.
This introduces a new rule that says that constraints are imposed
*unless* we define `do_not_impose(ID)`. This allows rules like
dependencies, which rely on more than just spec conditions, to cancel
imposed constraints.
We add one special case for this: dependencies of externals.
-rw-r--r-- | lib/spack/spack/solver/concretize.lp | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index 01e70b9469..492a7c817a 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -49,10 +49,14 @@ condition_holds(ID) :- attr(Name, A1, A2) : condition_requirement(ID, Name, A1, A2); attr(Name, A1, A2, A3) : condition_requirement(ID, Name, A1, A2, A3). +% condition_holds(ID) implies all imposed_constraints, unless do_not_impose(ID) +% is derived. This allows imposed constraints to be canceled in special cases. +impose(ID) :- condition_holds(ID), not do_not_impose(ID). + % conditions that hold impose constraints on other specs -attr(Name, A1) :- condition_holds(ID), imposed_constraint(ID, Name, A1). -attr(Name, A1, A2) :- condition_holds(ID), imposed_constraint(ID, Name, A1, A2). -attr(Name, A1, A2, A3) :- condition_holds(ID), imposed_constraint(ID, Name, A1, A2, A3). +attr(Name, A1) :- impose(ID), imposed_constraint(ID, Name, A1). +attr(Name, A1, A2) :- impose(ID), imposed_constraint(ID, Name, A1, A2). +attr(Name, A1, A2, A3) :- impose(ID), imposed_constraint(ID, Name, A1, A2, A3). #defined condition/1. #defined condition_requirement/3. @@ -72,15 +76,21 @@ depends_on(Package, Dependency) :- depends_on(Package, Dependency, _). dependency_holds(Package, Dependency, Type) :- dependency_condition(ID, Package, Dependency), dependency_type(ID, Type), - condition_holds(ID). + condition_holds(ID), + not external(Package). + +% We cut off dependencies of externals (as we don't really know them). +% Don't impose constraints on dependencies that don't exist. +do_not_impose(ID) :- + not dependency_holds(Package, Dependency, _), + dependency_condition(ID, Package, Dependency). % declared dependencies are real if they're not virtual AND % the package is not an external. % They're only triggered if the associated dependnecy condition holds. depends_on(Package, Dependency, Type) :- dependency_holds(Package, Dependency, Type), - not virtual(Dependency), - not external(Package). + not virtual(Dependency). % every root must be a node node(Package) :- root(Package). |