summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2020-04-19 12:26:47 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2020-11-17 10:04:13 -0800
commitcd55fd4bd3af0dcb1c92954ef36eb2a3e530b505 (patch)
treef21e517d237689dec506039676b42e6f12d520c8 /lib
parent51cb49743e6f81456843200c203c0669eb39ac2a (diff)
downloadspack-cd55fd4bd3af0dcb1c92954ef36eb2a3e530b505.tar.gz
spack-cd55fd4bd3af0dcb1c92954ef36eb2a3e530b505.tar.bz2
spack-cd55fd4bd3af0dcb1c92954ef36eb2a3e530b505.tar.xz
spack-cd55fd4bd3af0dcb1c92954ef36eb2a3e530b505.zip
concretizer: allow non-default OS, inherit OS along dependencies
Diffstat (limited to 'lib')
-rw-r--r--lib/spack/spack/solver/asp.py20
-rw-r--r--lib/spack/spack/solver/concretize.lp24
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.