concretizer: allow non-default OS, inherit OS along dependencies
This commit is contained in:
parent
51cb49743e
commit
cd55fd4bd3
@ -19,6 +19,7 @@
|
|||||||
import llnl.util.tty.color as color
|
import llnl.util.tty.color as color
|
||||||
|
|
||||||
import spack
|
import spack
|
||||||
|
import spack.architecture
|
||||||
import spack.cmd
|
import spack.cmd
|
||||||
import spack.config
|
import spack.config
|
||||||
import spack.dependency
|
import spack.dependency
|
||||||
@ -617,9 +618,22 @@ def platform_defaults(self):
|
|||||||
self.fact(fn.node_platform_default(default.platform))
|
self.fact(fn.node_platform_default(default.platform))
|
||||||
|
|
||||||
def os_defaults(self, specs):
|
def os_defaults(self, specs):
|
||||||
self.h2('Default operating system')
|
self.h2('Possible operating systems')
|
||||||
default = default_arch()
|
platform = spack.architecture.platform()
|
||||||
self.fact(fn.node_os_default(default.os))
|
|
||||||
|
# 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):
|
def target_defaults(self, specs):
|
||||||
"""Add facts about targets and target compatibility."""
|
"""Add facts about targets and target compatibility."""
|
||||||
|
@ -169,22 +169,24 @@ node_platform_set(Package) :- node_platform_set(Package, _).
|
|||||||
% OS semantics
|
% OS semantics
|
||||||
%-----------------------------------------------------------------------------
|
%-----------------------------------------------------------------------------
|
||||||
% one os per node
|
% 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(Package, OS) :- node(Package), node_os_set(Package, OS).
|
||||||
node_os_set(Package) :- node_os_set(Package, _).
|
node_os_set(Package) :- node_os_set(Package, _).
|
||||||
|
|
||||||
% fall back to default if not set
|
% inherit OS along dependencies
|
||||||
node_os(Package, OS)
|
node_os_inherit(Package, OS) :- node_os_set(Package, OS).
|
||||||
:- node(Package), not node_os_set(Package), node_os_default(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)
|
% fall back to default if not set or inherited
|
||||||
% TODO make this smarter; build env may have a different os from run env
|
node_os(Package, OS)
|
||||||
node_os_set(Package, OS)
|
:- node(Package),
|
||||||
:- depends_on(Package, Dependency), node_os_set(Dependency, OS).
|
not node_os_set(Package), not node_os_inherit(Package),
|
||||||
node_os_set(Dependency, OS)
|
node_os_default(OS).
|
||||||
:- depends_on(Package, Dependency), node_os_set(Package, OS).
|
|
||||||
|
|
||||||
#defined node_os_set/2.
|
#defined node_os_set/2.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user