concretizer: allow non-default OS, inherit OS along dependencies

This commit is contained in:
Todd Gamblin 2020-04-19 12:26:47 -07:00
parent 51cb49743e
commit cd55fd4bd3
2 changed files with 30 additions and 14 deletions

View File

@ -19,6 +19,7 @@
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 @@ def platform_defaults(self):
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."""

View File

@ -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
node_os(Package, OS)
:- node(Package), not node_os_set(Package), node_os_default(OS).
% 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, _).
% 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).
% fall back to default if not set or inherited
node_os(Package, OS)
:- node(Package),
not node_os_set(Package), not node_os_inherit(Package),
node_os_default(OS).
#defined node_os_set/2.