From cd55fd4bd3af0dcb1c92954ef36eb2a3e530b505 Mon Sep 17 00:00:00 2001 From: Todd Gamblin Date: Sun, 19 Apr 2020 12:26:47 -0700 Subject: concretizer: allow non-default OS, inherit OS along dependencies --- lib/spack/spack/solver/asp.py | 20 +++++++++++++++++--- lib/spack/spack/solver/concretize.lp | 24 +++++++++++++----------- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index 8d08245812..146f816c5a 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -19,6 +19,7 @@ import llnl.util.tty as tty import llnl.util.tty.color as color import spack +import spack.architecture import spack.cmd import spack.config import spack.dependency @@ -617,9 +618,22 @@ class AspGenerator(object): self.fact(fn.node_platform_default(default.platform)) def os_defaults(self, specs): - self.h2('Default operating system') - default = default_arch() - self.fact(fn.node_os_default(default.os)) + self.h2('Possible operating systems') + platform = spack.architecture.platform() + + # create set of OS's to consider + possible = set([ + platform.front_os, platform.back_os, platform.default_os]) + for spec in specs: + if spec.architecture and spec.architecture.os: + possible.add(spec.architecture.os) + + # make directives for possible OS's + for os in sorted(possible): + self.fact(fn.os(os)) + + # mark this one as default + self.fact(fn.node_os_default(platform.default_os)) def target_defaults(self, specs): """Add facts about targets and target compatibility.""" diff --git a/lib/spack/spack/solver/concretize.lp b/lib/spack/spack/solver/concretize.lp index f0f706c83a..daf0c23ac7 100644 --- a/lib/spack/spack/solver/concretize.lp +++ b/lib/spack/spack/solver/concretize.lp @@ -169,22 +169,24 @@ node_platform_set(Package) :- node_platform_set(Package, _). % OS semantics %----------------------------------------------------------------------------- % one os per node -1 { node_os(Package, OS) : node_os(Package, OS) } 1 :- node(Package). +1 { node_os(Package, OS) : os(OS) } 1 :- node(Package). -% node_os_set implies that the node has that os +% node_os_set implies that the node must have that os node_os(Package, OS) :- node(Package), node_os_set(Package, OS). node_os_set(Package) :- node_os_set(Package, _). -% fall back to default if not set +% inherit OS along dependencies +node_os_inherit(Package, OS) :- node_os_set(Package, OS). +node_os_inherit(Dependency, OS) + :- node_os_inherit(Package, OS), depends_on(Package, Dependency), + not node_os_set(Dependency). +node_os_inherit(Package) :- node_os_inherit(Package, _). + +% fall back to default if not set or inherited node_os(Package, OS) - :- node(Package), not node_os_set(Package), node_os_default(OS). - -% same OS throughout DAG (can currently only set one OS) -% TODO make this smarter; build env may have a different os from run env -node_os_set(Package, OS) - :- depends_on(Package, Dependency), node_os_set(Dependency, OS). -node_os_set(Dependency, OS) - :- depends_on(Package, Dependency), node_os_set(Package, OS). + :- node(Package), + not node_os_set(Package), not node_os_inherit(Package), + node_os_default(OS). #defined node_os_set/2. -- cgit v1.2.3-60-g2f50