diff options
-rw-r--r-- | lib/spack/spack/solver/concretize.lp | 120 |
1 files changed, 69 insertions, 51 deletions
diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index c92f198be7..dde167d806 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -54,45 +54,11 @@ depends_on(Package, Dependency, Type) virtual(Virtual), not external(Package). -% Equivalencies of the form: -% -% name(Arg1, Arg2, ...) :- attr("name", Arg1, Arg2, ...). -% attr("name", Arg1, Arg2, ...) :- name(Arg1, Arg2, ...). +%----------------------------------------------------------------------------- +% Conditional dependencies % -% These allow us to easily define conditional dependency and conflict rules -% without enumerating all spec attributes every time. -node(Package) :- attr("node", Package). -version(Package, Version) :- attr("version", Package, Version). -version_satisfies(Package, Constraint) :- attr("version_satisfies", Package, Constraint). -node_platform(Package, Platform) :- attr("node_platform", Package, Platform). -node_os(Package, OS) :- attr("node_os", Package, OS). -node_target(Package, Target) :- attr("node_target", Package, Target). -node_target_satisfies(Package, Target) :- attr("node_target_satisfies", Package, Target). -variant_value(Package, Variant, Value) :- attr("variant_value", Package, Variant, Value). -variant_set(Package, Variant, Value) :- attr("variant_set", Package, Variant, Value). -node_flag(Package, FlagType, Flag) :- attr("node_flag", Package, FlagType, Flag). -node_compiler(Package, Compiler) :- attr("node_compiler", Package, Compiler). -node_compiler_version(Package, Compiler, Version) - :- attr("node_compiler_version", Package, Compiler, Version). -node_compiler_version_satisfies(Package, Compiler, Version) - :- attr("node_compiler_version_satisfies", Package, Compiler, Version). - -attr("node", Package) :- node(Package). -attr("version", Package, Version) :- version(Package, Version). -attr("version_satisfies", Package, Constraint) :- version_satisfies(Package, Constraint). -attr("node_platform", Package, Platform) :- node_platform(Package, Platform). -attr("node_os", Package, OS) :- node_os(Package, OS). -attr("node_target", Package, Target) :- node_target(Package, Target). -attr("node_target_satisfies", Package, Target) :- node_target_satisfies(Package, Target). -attr("variant_value", Package, Variant, Value) :- variant_value(Package, Variant, Value). -attr("variant_set", Package, Variant, Value) :- variant_set(Package, Variant, Value). -attr("node_flag", Package, FlagType, Flag) :- node_flag(Package, FlagType, Flag). -attr("node_compiler", Package, Compiler) :- node_compiler(Package, Compiler). -attr("node_compiler_version", Package, Compiler, Version) - :- node_compiler_version(Package, Compiler, Version). -attr("node_compiler_version_satisfies", Package, Compiler, Version) - :- node_compiler_version_satisfies(Package, Compiler, Version). - +% This takes care of `when=SPEC` in `depends_on("foo@1.0+bar", when="SPEC")`. +%----------------------------------------------------------------------------- % if any individual condition below is true, trigger the dependency. dependency_conditions(Package, Dependency, Type) :- dependency_conditions_hold(ID, Package, Dependency), @@ -119,19 +85,12 @@ dependency_conditions_hold(ID, Parent, Dependency) :- #defined required_dependency_condition/4. #defined required_dependency_condition/5. -% general rules for conflicts -:- not external(Package) : conflict_condition(ID, "node", Package); - attr(Name, Arg1) : conflict_condition(ID, Name, Arg1); - attr(Name, Arg1, Arg2) : conflict_condition(ID, Name, Arg1, Arg2); - attr(Name, Arg1, Arg2, Arg3) : conflict_condition(ID, Name, Arg1, Arg2, Arg3); - conflict(ID, Package). - -#defined conflict/2. -#defined conflict_condition/3. -#defined conflict_condition/4. -#defined conflict_condition/5. - -% Implications from matching a dependency condition +%----------------------------------------------------------------------------- +% Imposed dependencies +% +% This handles the `@1.0+bar` in `depends_on("foo@1.0+bar", when="SPEC")`. +%----------------------------------------------------------------------------- +% this rule instantiates every non-root node in the DAG node(Dependency) :- dependency_conditions_hold(ID, Package, Dependency), depends_on(Package, Dependency). @@ -149,6 +108,23 @@ attr(Name, Arg1, Arg2, Arg3) :- #defined imposed_dependency_condition/4. #defined imposed_dependency_condition/5. +%----------------------------------------------------------------------------- +% Conflicts +%----------------------------------------------------------------------------- +:- not external(Package) : conflict_condition(ID, "node", Package); + attr(Name, Arg1) : conflict_condition(ID, Name, Arg1); + attr(Name, Arg1, Arg2) : conflict_condition(ID, Name, Arg1, Arg2); + attr(Name, Arg1, Arg2, Arg3) : conflict_condition(ID, Name, Arg1, Arg2, Arg3); + conflict(ID, Package). + +#defined conflict/2. +#defined conflict_condition/3. +#defined conflict_condition/4. +#defined conflict_condition/5. + +%----------------------------------------------------------------------------- +% Virtual dependencies +%----------------------------------------------------------------------------- % if a virtual was required by some package, one provider is in the DAG 1 { node(Package) : provides_virtual(Package, Virtual) } 1 :- virtual_node(Virtual). @@ -219,6 +195,48 @@ path(Parent, Child) :- depends_on(Parent, Child). path(Parent, Descendant) :- path(Parent, A), depends_on(A, Descendant). :- path(A, B), path(B, A). +%----------------------------------------------------------------------------- +% Spec Attributes +%----------------------------------------------------------------------------- +% Equivalencies of the form: +% +% name(Arg1, Arg2, ...) :- attr("name", Arg1, Arg2, ...). +% attr("name", Arg1, Arg2, ...) :- name(Arg1, Arg2, ...). +% +% These allow us to easily define conditional dependency and conflict rules +% without enumerating all spec attributes every time. +node(Package) :- attr("node", Package). +version(Package, Version) :- attr("version", Package, Version). +version_satisfies(Package, Constraint) :- attr("version_satisfies", Package, Constraint). +node_platform(Package, Platform) :- attr("node_platform", Package, Platform). +node_os(Package, OS) :- attr("node_os", Package, OS). +node_target(Package, Target) :- attr("node_target", Package, Target). +node_target_satisfies(Package, Target) :- attr("node_target_satisfies", Package, Target). +variant_value(Package, Variant, Value) :- attr("variant_value", Package, Variant, Value). +variant_set(Package, Variant, Value) :- attr("variant_set", Package, Variant, Value). +node_flag(Package, FlagType, Flag) :- attr("node_flag", Package, FlagType, Flag). +node_compiler(Package, Compiler) :- attr("node_compiler", Package, Compiler). +node_compiler_version(Package, Compiler, Version) + :- attr("node_compiler_version", Package, Compiler, Version). +node_compiler_version_satisfies(Package, Compiler, Version) + :- attr("node_compiler_version_satisfies", Package, Compiler, Version). + +attr("node", Package) :- node(Package). +attr("version", Package, Version) :- version(Package, Version). +attr("version_satisfies", Package, Constraint) :- version_satisfies(Package, Constraint). +attr("node_platform", Package, Platform) :- node_platform(Package, Platform). +attr("node_os", Package, OS) :- node_os(Package, OS). +attr("node_target", Package, Target) :- node_target(Package, Target). +attr("node_target_satisfies", Package, Target) :- node_target_satisfies(Package, Target). +attr("variant_value", Package, Variant, Value) :- variant_value(Package, Variant, Value). +attr("variant_set", Package, Variant, Value) :- variant_set(Package, Variant, Value). +attr("node_flag", Package, FlagType, Flag) :- node_flag(Package, FlagType, Flag). +attr("node_compiler", Package, Compiler) :- node_compiler(Package, Compiler). +attr("node_compiler_version", Package, Compiler, Version) + :- node_compiler_version(Package, Compiler, Version). +attr("node_compiler_version_satisfies", Package, Compiler, Version) + :- node_compiler_version_satisfies(Package, Compiler, Version). + % do not warn if generated program contains none of these. #defined depends_on/3. #defined declared_dependency/3. |