|
|
|
@ -81,18 +81,16 @@
|
|
|
|
|
import collections
|
|
|
|
|
import hashlib
|
|
|
|
|
import itertools
|
|
|
|
|
import operator
|
|
|
|
|
import os
|
|
|
|
|
import re
|
|
|
|
|
|
|
|
|
|
import six
|
|
|
|
|
|
|
|
|
|
from operator import attrgetter
|
|
|
|
|
import ruamel.yaml as yaml
|
|
|
|
|
|
|
|
|
|
from llnl.util.filesystem import find_headers, find_libraries, is_exe
|
|
|
|
|
from llnl.util.lang import key_ordering, HashableMap, ObjectWrapper, dedupe
|
|
|
|
|
from llnl.util.lang import check_kwargs, memoized
|
|
|
|
|
from llnl.util.tty.color import cwrite, colorize, cescape, get_color_when
|
|
|
|
|
import llnl.util.filesystem as fs
|
|
|
|
|
import llnl.util.lang as lang
|
|
|
|
|
import llnl.util.tty.color as clr
|
|
|
|
|
import llnl.util.tty as tty
|
|
|
|
|
|
|
|
|
|
import spack.paths
|
|
|
|
@ -103,48 +101,34 @@
|
|
|
|
|
import spack.error
|
|
|
|
|
import spack.hash_types as ht
|
|
|
|
|
import spack.parse
|
|
|
|
|
import spack.provider_index
|
|
|
|
|
import spack.repo
|
|
|
|
|
import spack.store
|
|
|
|
|
import spack.util.crypto
|
|
|
|
|
import spack.util.executable
|
|
|
|
|
import spack.util.module_cmd as md
|
|
|
|
|
import spack.util.prefix
|
|
|
|
|
import spack.util.spack_json as sjson
|
|
|
|
|
import spack.util.spack_yaml as syaml
|
|
|
|
|
|
|
|
|
|
from spack.util.module_cmd import get_path_from_module, load_module
|
|
|
|
|
from spack.error import NoLibrariesError, NoHeadersError
|
|
|
|
|
from spack.error import SpecError, UnsatisfiableSpecError
|
|
|
|
|
from spack.provider_index import ProviderIndex
|
|
|
|
|
from spack.util.crypto import prefix_bits
|
|
|
|
|
from spack.util.executable import Executable
|
|
|
|
|
from spack.util.prefix import Prefix
|
|
|
|
|
from spack.util.spack_yaml import syaml_dict
|
|
|
|
|
from spack.util.string import comma_or
|
|
|
|
|
from spack.variant import MultiValuedVariant, AbstractVariant
|
|
|
|
|
from spack.variant import BoolValuedVariant, substitute_abstract_variants
|
|
|
|
|
from spack.variant import VariantMap, UnknownVariantError
|
|
|
|
|
from spack.variant import DuplicateVariantError
|
|
|
|
|
from spack.variant import UnsatisfiableVariantSpecError
|
|
|
|
|
from spack.version import VersionList, VersionRange, Version, ver
|
|
|
|
|
from ruamel.yaml.error import MarkedYAMLError
|
|
|
|
|
import spack.util.string
|
|
|
|
|
import spack.variant as vt
|
|
|
|
|
import spack.version as vn
|
|
|
|
|
|
|
|
|
|
__all__ = [
|
|
|
|
|
'Spec',
|
|
|
|
|
'parse',
|
|
|
|
|
'SpecError',
|
|
|
|
|
'SpecParseError',
|
|
|
|
|
'DuplicateDependencyError',
|
|
|
|
|
'DuplicateVariantError',
|
|
|
|
|
'DuplicateCompilerSpecError',
|
|
|
|
|
'UnsupportedCompilerError',
|
|
|
|
|
'UnknownVariantError',
|
|
|
|
|
'DuplicateArchitectureError',
|
|
|
|
|
'InconsistentSpecError',
|
|
|
|
|
'InvalidDependencyError',
|
|
|
|
|
'NoProviderError',
|
|
|
|
|
'MultipleProviderError',
|
|
|
|
|
'UnsatisfiableSpecError',
|
|
|
|
|
'UnsatisfiableSpecNameError',
|
|
|
|
|
'UnsatisfiableVersionSpecError',
|
|
|
|
|
'UnsatisfiableCompilerSpecError',
|
|
|
|
|
'UnsatisfiableVariantSpecError',
|
|
|
|
|
'UnsatisfiableCompilerFlagSpecError',
|
|
|
|
|
'UnsatisfiableArchitectureSpecError',
|
|
|
|
|
'UnsatisfiableProviderSpecError',
|
|
|
|
@ -183,7 +167,7 @@
|
|
|
|
|
|
|
|
|
|
#: Versionlist constant so we don't have to build a list
|
|
|
|
|
#: every time we call str()
|
|
|
|
|
_any_version = VersionList([':'])
|
|
|
|
|
_any_version = vn.VersionList([':'])
|
|
|
|
|
|
|
|
|
|
default_format = '{name}{@version}'
|
|
|
|
|
default_format += '{%compiler.name}{@compiler.version}{compiler_flags}'
|
|
|
|
@ -202,15 +186,15 @@ def __call__(self, match):
|
|
|
|
|
# ignore compiler versions (color same as compiler)
|
|
|
|
|
sep = match.group(0)
|
|
|
|
|
if self.last == '%' and sep == '@':
|
|
|
|
|
return cescape(sep)
|
|
|
|
|
return clr.cescape(sep)
|
|
|
|
|
self.last = sep
|
|
|
|
|
|
|
|
|
|
return '%s%s' % (color_formats[sep], cescape(sep))
|
|
|
|
|
return '%s%s' % (color_formats[sep], clr.cescape(sep))
|
|
|
|
|
|
|
|
|
|
return colorize(re.sub(_separators, insert_color(), str(spec)) + '@.')
|
|
|
|
|
return clr.colorize(re.sub(_separators, insert_color(), str(spec)) + '@.')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@key_ordering
|
|
|
|
|
@lang.key_ordering
|
|
|
|
|
class ArchSpec(object):
|
|
|
|
|
def __init__(self, spec_or_platform_tuple=(None, None, None)):
|
|
|
|
|
""" Architecture specification a package should be built with.
|
|
|
|
@ -444,11 +428,11 @@ def concrete(self):
|
|
|
|
|
return self.platform and self.os and self.target
|
|
|
|
|
|
|
|
|
|
def to_dict(self):
|
|
|
|
|
d = syaml_dict([
|
|
|
|
|
d = syaml.syaml_dict([
|
|
|
|
|
('platform', self.platform),
|
|
|
|
|
('platform_os', self.os),
|
|
|
|
|
('target', self.target.to_dict_or_value())])
|
|
|
|
|
return syaml_dict([('arch', d)])
|
|
|
|
|
return syaml.syaml_dict([('arch', d)])
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def from_dict(d):
|
|
|
|
@ -487,7 +471,7 @@ def __contains__(self, string):
|
|
|
|
|
return string in str(self) or string in self.target
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@key_ordering
|
|
|
|
|
@lang.key_ordering
|
|
|
|
|
class CompilerSpec(object):
|
|
|
|
|
"""The CompilerSpec field represents the compiler or range of compiler
|
|
|
|
|
versions that a package should be built with. CompilerSpecs have a
|
|
|
|
@ -516,8 +500,8 @@ def __init__(self, *args):
|
|
|
|
|
elif nargs == 2:
|
|
|
|
|
name, version = args
|
|
|
|
|
self.name = name
|
|
|
|
|
self.versions = VersionList()
|
|
|
|
|
self.versions.add(ver(version))
|
|
|
|
|
self.versions = vn.VersionList()
|
|
|
|
|
self.versions.add(vn.ver(version))
|
|
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
raise TypeError(
|
|
|
|
@ -558,7 +542,7 @@ def concrete(self):
|
|
|
|
|
@property
|
|
|
|
|
def version(self):
|
|
|
|
|
if not self.concrete:
|
|
|
|
|
raise SpecError("Spec is not concrete: " + str(self))
|
|
|
|
|
raise spack.error.SpecError("Spec is not concrete: " + str(self))
|
|
|
|
|
return self.versions[0]
|
|
|
|
|
|
|
|
|
|
def copy(self):
|
|
|
|
@ -571,15 +555,15 @@ def _cmp_key(self):
|
|
|
|
|
return (self.name, self.versions)
|
|
|
|
|
|
|
|
|
|
def to_dict(self):
|
|
|
|
|
d = syaml_dict([('name', self.name)])
|
|
|
|
|
d = syaml.syaml_dict([('name', self.name)])
|
|
|
|
|
d.update(self.versions.to_dict())
|
|
|
|
|
|
|
|
|
|
return syaml_dict([('compiler', d)])
|
|
|
|
|
return syaml.syaml_dict([('compiler', d)])
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
|
def from_dict(d):
|
|
|
|
|
d = d['compiler']
|
|
|
|
|
return CompilerSpec(d['name'], VersionList.from_dict(d))
|
|
|
|
|
return CompilerSpec(d['name'], vn.VersionList.from_dict(d))
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
out = self.name
|
|
|
|
@ -592,7 +576,7 @@ def __repr__(self):
|
|
|
|
|
return str(self)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@key_ordering
|
|
|
|
|
@lang.key_ordering
|
|
|
|
|
class DependencySpec(object):
|
|
|
|
|
"""DependencySpecs connect two nodes in the DAG, and contain deptypes.
|
|
|
|
|
|
|
|
|
@ -640,7 +624,7 @@ def __str__(self):
|
|
|
|
|
'cflags', 'cxxflags', 'fflags', 'ldflags', 'ldlibs', 'cppflags']
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class FlagMap(HashableMap):
|
|
|
|
|
class FlagMap(lang.HashableMap):
|
|
|
|
|
|
|
|
|
|
def __init__(self, spec):
|
|
|
|
|
super(FlagMap, self).__init__()
|
|
|
|
@ -698,7 +682,7 @@ def __str__(self):
|
|
|
|
|
for key in sorted_keys) + cond_symbol
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DependencyMap(HashableMap):
|
|
|
|
|
class DependencyMap(lang.HashableMap):
|
|
|
|
|
"""Each spec has a DependencyMap containing specs for its dependencies.
|
|
|
|
|
The DependencyMap is keyed by name. """
|
|
|
|
|
|
|
|
|
@ -725,8 +709,8 @@ def _command_default_handler(descriptor, spec, cls):
|
|
|
|
|
"""
|
|
|
|
|
path = os.path.join(spec.prefix.bin, spec.name)
|
|
|
|
|
|
|
|
|
|
if is_exe(path):
|
|
|
|
|
return Executable(path)
|
|
|
|
|
if fs.is_exe(path):
|
|
|
|
|
return spack.util.executable.Executable(path)
|
|
|
|
|
else:
|
|
|
|
|
msg = 'Unable to locate {0} command in {1}'
|
|
|
|
|
raise RuntimeError(msg.format(spec.name, spec.prefix.bin))
|
|
|
|
@ -750,13 +734,14 @@ def _headers_default_handler(descriptor, spec, cls):
|
|
|
|
|
Raises:
|
|
|
|
|
NoHeadersError: If no headers are found
|
|
|
|
|
"""
|
|
|
|
|
headers = find_headers('*', root=spec.prefix.include, recursive=True)
|
|
|
|
|
headers = fs.find_headers('*', root=spec.prefix.include, recursive=True)
|
|
|
|
|
|
|
|
|
|
if headers:
|
|
|
|
|
return headers
|
|
|
|
|
else:
|
|
|
|
|
msg = 'Unable to locate {0} headers in {1}'
|
|
|
|
|
raise NoHeadersError(msg.format(spec.name, spec.prefix.include))
|
|
|
|
|
raise spack.error.NoHeadersError(
|
|
|
|
|
msg.format(spec.name, spec.prefix.include))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def _libs_default_handler(descriptor, spec, cls):
|
|
|
|
@ -801,12 +786,13 @@ def _libs_default_handler(descriptor, spec, cls):
|
|
|
|
|
([False] if ('~shared' in spec) else [True, False])
|
|
|
|
|
|
|
|
|
|
for shared in search_shared:
|
|
|
|
|
libs = find_libraries(name, spec.prefix, shared=shared, recursive=True)
|
|
|
|
|
libs = fs.find_libraries(
|
|
|
|
|
name, spec.prefix, shared=shared, recursive=True)
|
|
|
|
|
if libs:
|
|
|
|
|
return libs
|
|
|
|
|
|
|
|
|
|
msg = 'Unable to recursively locate {0} libraries in {1}'
|
|
|
|
|
raise NoLibrariesError(msg.format(spec.name, spec.prefix))
|
|
|
|
|
raise spack.error.NoLibrariesError(msg.format(spec.name, spec.prefix))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ForwardQueryToPackage(object):
|
|
|
|
@ -920,7 +906,7 @@ def __set__(self, instance, value):
|
|
|
|
|
raise AttributeError(msg.format(cls_name, self.attribute_name))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SpecBuildInterface(ObjectWrapper):
|
|
|
|
|
class SpecBuildInterface(lang.ObjectWrapper):
|
|
|
|
|
command = ForwardQueryToPackage(
|
|
|
|
|
'command',
|
|
|
|
|
default_handler=_command_default_handler
|
|
|
|
@ -952,7 +938,7 @@ def __init__(self, spec, name, query_parameters):
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@key_ordering
|
|
|
|
|
@lang.key_ordering
|
|
|
|
|
class Spec(object):
|
|
|
|
|
|
|
|
|
|
#: Cache for spec's prefix, computed lazily in the corresponding property
|
|
|
|
@ -985,8 +971,8 @@ def __init__(self, spec_like=None,
|
|
|
|
|
|
|
|
|
|
# init an empty spec that matches anything.
|
|
|
|
|
self.name = None
|
|
|
|
|
self.versions = VersionList(':')
|
|
|
|
|
self.variants = VariantMap(self)
|
|
|
|
|
self.versions = vn.VersionList(':')
|
|
|
|
|
self.variants = vt.VariantMap(self)
|
|
|
|
|
self.architecture = None
|
|
|
|
|
self.compiler = None
|
|
|
|
|
self.external_path = None
|
|
|
|
@ -1088,9 +1074,9 @@ def _add_flag(self, name, value):
|
|
|
|
|
# map to '+foo' and '~foo' respectively. As such they need a
|
|
|
|
|
# BoolValuedVariant instance.
|
|
|
|
|
if str(value).upper() == 'TRUE' or str(value).upper() == 'FALSE':
|
|
|
|
|
self.variants[name] = BoolValuedVariant(name, value)
|
|
|
|
|
self.variants[name] = vt.BoolValuedVariant(name, value)
|
|
|
|
|
else:
|
|
|
|
|
self.variants[name] = AbstractVariant(name, value)
|
|
|
|
|
self.variants[name] = vt.AbstractVariant(name, value)
|
|
|
|
|
|
|
|
|
|
def _set_architecture(self, **kwargs):
|
|
|
|
|
"""Called by the parser to set the architecture."""
|
|
|
|
@ -1256,7 +1242,7 @@ def traverse_edges(self, visited=None, d=0, deptype='all',
|
|
|
|
|
depth = kwargs.get('depth', False)
|
|
|
|
|
key_fun = kwargs.get('key', id)
|
|
|
|
|
if isinstance(key_fun, six.string_types):
|
|
|
|
|
key_fun = attrgetter(key_fun)
|
|
|
|
|
key_fun = operator.attrgetter(key_fun)
|
|
|
|
|
yield_root = kwargs.get('root', True)
|
|
|
|
|
cover = kwargs.get('cover', 'nodes')
|
|
|
|
|
direction = kwargs.get('direction', 'children')
|
|
|
|
@ -1340,7 +1326,7 @@ def cshort_spec(self):
|
|
|
|
|
@property
|
|
|
|
|
def prefix(self):
|
|
|
|
|
if not self._concrete:
|
|
|
|
|
raise SpecError("Spec is not concrete: " + str(self))
|
|
|
|
|
raise spack.error.SpecError("Spec is not concrete: " + str(self))
|
|
|
|
|
|
|
|
|
|
if self._prefix is None:
|
|
|
|
|
upstream, record = spack.store.db.query_by_spec_hash(
|
|
|
|
@ -1353,7 +1339,7 @@ def prefix(self):
|
|
|
|
|
|
|
|
|
|
@prefix.setter
|
|
|
|
|
def prefix(self, value):
|
|
|
|
|
self._prefix = Prefix(value)
|
|
|
|
|
self._prefix = spack.util.prefix.Prefix(value)
|
|
|
|
|
|
|
|
|
|
def _spec_hash(self, hash):
|
|
|
|
|
"""Utility method for computing different types of Spec hashes.
|
|
|
|
@ -1481,7 +1467,7 @@ def to_node_dict(self, hash=ht.dag_hash):
|
|
|
|
|
Arguments:
|
|
|
|
|
hash (SpecHashDescriptor) type of hash to generate.
|
|
|
|
|
"""
|
|
|
|
|
d = syaml_dict()
|
|
|
|
|
d = syaml.syaml_dict()
|
|
|
|
|
|
|
|
|
|
if self.versions:
|
|
|
|
|
d.update(self.versions.to_dict())
|
|
|
|
@ -1495,7 +1481,7 @@ def to_node_dict(self, hash=ht.dag_hash):
|
|
|
|
|
if self.namespace:
|
|
|
|
|
d['namespace'] = self.namespace
|
|
|
|
|
|
|
|
|
|
params = syaml_dict(
|
|
|
|
|
params = syaml.syaml_dict(
|
|
|
|
|
sorted(
|
|
|
|
|
v.yaml_entry() for _, v in self.variants.items()
|
|
|
|
|
)
|
|
|
|
@ -1524,15 +1510,15 @@ def to_node_dict(self, hash=ht.dag_hash):
|
|
|
|
|
|
|
|
|
|
deps = self.dependencies_dict(deptype=hash.deptype)
|
|
|
|
|
if deps:
|
|
|
|
|
d['dependencies'] = syaml_dict([
|
|
|
|
|
d['dependencies'] = syaml.syaml_dict([
|
|
|
|
|
(name,
|
|
|
|
|
syaml_dict([
|
|
|
|
|
syaml.syaml_dict([
|
|
|
|
|
('hash', dspec.spec._cached_hash(hash)),
|
|
|
|
|
('type', sorted(str(s) for s in dspec.deptypes))])
|
|
|
|
|
) for name, dspec in sorted(deps.items())
|
|
|
|
|
])
|
|
|
|
|
|
|
|
|
|
return syaml_dict([(self.name, d)])
|
|
|
|
|
return syaml.syaml_dict([(self.name, d)])
|
|
|
|
|
|
|
|
|
|
def to_dict(self, hash=ht.dag_hash):
|
|
|
|
|
"""Create a dictionary suitable for writing this spec to YAML or JSON.
|
|
|
|
@ -1607,7 +1593,7 @@ def to_dict(self, hash=ht.dag_hash):
|
|
|
|
|
node[s.name]['build_hash'] = s.build_hash()
|
|
|
|
|
node_list.append(node)
|
|
|
|
|
|
|
|
|
|
return syaml_dict([('spec', node_list)])
|
|
|
|
|
return syaml.syaml_dict([('spec', node_list)])
|
|
|
|
|
|
|
|
|
|
def to_record_dict(self):
|
|
|
|
|
"""Return a "flat" dictionary with name and hash as top-level keys.
|
|
|
|
@ -1628,7 +1614,7 @@ def to_record_dict(self):
|
|
|
|
|
But is otherwise the same as ``to_node_dict()``.
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
dictionary = syaml_dict()
|
|
|
|
|
dictionary = syaml.syaml_dict()
|
|
|
|
|
dictionary["name"] = self.name
|
|
|
|
|
dictionary["hash"] = self.dag_hash()
|
|
|
|
|
dictionary.update(self.to_node_dict()[self.name])
|
|
|
|
@ -1652,7 +1638,7 @@ def from_node_dict(node):
|
|
|
|
|
spec._build_hash = node.get('build_hash', None)
|
|
|
|
|
|
|
|
|
|
if 'version' in node or 'versions' in node:
|
|
|
|
|
spec.versions = VersionList.from_dict(node)
|
|
|
|
|
spec.versions = vn.VersionList.from_dict(node)
|
|
|
|
|
|
|
|
|
|
if 'arch' in node:
|
|
|
|
|
spec.architecture = ArchSpec.from_dict(node)
|
|
|
|
@ -1667,11 +1653,11 @@ def from_node_dict(node):
|
|
|
|
|
if name in _valid_compiler_flags:
|
|
|
|
|
spec.compiler_flags[name] = value
|
|
|
|
|
else:
|
|
|
|
|
spec.variants[name] = MultiValuedVariant.from_node_dict(
|
|
|
|
|
spec.variants[name] = vt.MultiValuedVariant.from_node_dict(
|
|
|
|
|
name, value)
|
|
|
|
|
elif 'variants' in node:
|
|
|
|
|
for name, value in node['variants'].items():
|
|
|
|
|
spec.variants[name] = MultiValuedVariant.from_node_dict(
|
|
|
|
|
spec.variants[name] = vt.MultiValuedVariant.from_node_dict(
|
|
|
|
|
name, value
|
|
|
|
|
)
|
|
|
|
|
for name in FlagMap.valid_compiler_flags():
|
|
|
|
@ -1700,7 +1686,7 @@ def from_node_dict(node):
|
|
|
|
|
patches = node['patches']
|
|
|
|
|
if len(patches) > 0:
|
|
|
|
|
mvar = spec.variants.setdefault(
|
|
|
|
|
'patches', MultiValuedVariant('patches', ())
|
|
|
|
|
'patches', vt.MultiValuedVariant('patches', ())
|
|
|
|
|
)
|
|
|
|
|
mvar.value = patches
|
|
|
|
|
# FIXME: Monkey patches mvar to store patches order
|
|
|
|
@ -1738,7 +1724,8 @@ def read_yaml_dep_specs(dependency_dict):
|
|
|
|
|
# new format: elements of dependency spec are keyed.
|
|
|
|
|
dag_hash, deptypes = elt['hash'], elt['type']
|
|
|
|
|
else:
|
|
|
|
|
raise SpecError("Couldn't parse dependency types in spec.")
|
|
|
|
|
raise spack.error.SpecError(
|
|
|
|
|
"Couldn't parse dependency types in spec.")
|
|
|
|
|
|
|
|
|
|
yield dep_name, dag_hash, list(deptypes)
|
|
|
|
|
|
|
|
|
@ -1907,7 +1894,7 @@ def from_dict(data):
|
|
|
|
|
# dependencies are the following elements.
|
|
|
|
|
dep_list = [Spec.from_node_dict(node) for node in nodes]
|
|
|
|
|
if not dep_list:
|
|
|
|
|
raise SpecError("YAML spec contains no nodes.")
|
|
|
|
|
raise spack.error.SpecError("YAML spec contains no nodes.")
|
|
|
|
|
deps = dict((spec.name, spec) for spec in dep_list)
|
|
|
|
|
spec = dep_list[0]
|
|
|
|
|
|
|
|
|
@ -1936,7 +1923,7 @@ def from_yaml(stream):
|
|
|
|
|
try:
|
|
|
|
|
data = yaml.load(stream)
|
|
|
|
|
return Spec.from_dict(data)
|
|
|
|
|
except MarkedYAMLError as e:
|
|
|
|
|
except yaml.error.MarkedYAMLError as e:
|
|
|
|
|
raise syaml.SpackYAMLError("error parsing YAML spec:", str(e))
|
|
|
|
|
|
|
|
|
|
@staticmethod
|
|
|
|
@ -2032,7 +2019,8 @@ def _expand_virtual_packages(self, concretizer):
|
|
|
|
|
a problem.
|
|
|
|
|
"""
|
|
|
|
|
# Make an index of stuff this spec already provides
|
|
|
|
|
self_index = ProviderIndex(self.traverse(), restrict=True)
|
|
|
|
|
self_index = spack.provider_index.ProviderIndex(
|
|
|
|
|
self.traverse(), restrict=True)
|
|
|
|
|
changed = False
|
|
|
|
|
done = False
|
|
|
|
|
|
|
|
|
@ -2072,7 +2060,7 @@ def _expand_virtual_packages(self, concretizer):
|
|
|
|
|
# constraints.
|
|
|
|
|
copy.normalize(force=True)
|
|
|
|
|
break
|
|
|
|
|
except SpecError:
|
|
|
|
|
except spack.error.SpecError:
|
|
|
|
|
# On error, we'll try the next replacement.
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
@ -2133,7 +2121,8 @@ def concretize(self, tests=False):
|
|
|
|
|
normalize() for more details on this.
|
|
|
|
|
"""
|
|
|
|
|
if not self.name:
|
|
|
|
|
raise SpecError("Attempting to concretize anonymous spec")
|
|
|
|
|
raise spack.error.SpecError(
|
|
|
|
|
"Attempting to concretize anonymous spec")
|
|
|
|
|
|
|
|
|
|
if self._concrete:
|
|
|
|
|
return
|
|
|
|
@ -2214,9 +2203,9 @@ def concretize(self, tests=False):
|
|
|
|
|
if id(spec) not in spec_to_patches:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
patches = list(dedupe(spec_to_patches[id(spec)]))
|
|
|
|
|
patches = list(lang.dedupe(spec_to_patches[id(spec)]))
|
|
|
|
|
mvar = spec.variants.setdefault(
|
|
|
|
|
'patches', MultiValuedVariant('patches', ())
|
|
|
|
|
'patches', vt.MultiValuedVariant('patches', ())
|
|
|
|
|
)
|
|
|
|
|
mvar.value = tuple(p.sha256 for p in patches)
|
|
|
|
|
# FIXME: Monkey patches mvar to store patches order
|
|
|
|
@ -2234,9 +2223,9 @@ def concretize(self, tests=False):
|
|
|
|
|
compiler = spack.compilers.compiler_for_spec(
|
|
|
|
|
s.compiler, s.architecture)
|
|
|
|
|
for mod in compiler.modules:
|
|
|
|
|
load_module(mod)
|
|
|
|
|
md.load_module(mod)
|
|
|
|
|
|
|
|
|
|
s.external_path = get_path_from_module(s.external_module)
|
|
|
|
|
s.external_path = md.get_path_from_module(s.external_module)
|
|
|
|
|
|
|
|
|
|
# Mark everything in the spec as concrete, as well.
|
|
|
|
|
self._mark_concrete()
|
|
|
|
@ -2336,7 +2325,7 @@ def flat_dependencies(self, **kwargs):
|
|
|
|
|
|
|
|
|
|
return flat_deps
|
|
|
|
|
|
|
|
|
|
except UnsatisfiableSpecError as e:
|
|
|
|
|
except spack.error.UnsatisfiableSpecError as e:
|
|
|
|
|
# Here, the DAG contains two instances of the same package
|
|
|
|
|
# with inconsistent constraints. Users cannot produce
|
|
|
|
|
# inconsistent specs like this on the command line: the
|
|
|
|
@ -2369,7 +2358,7 @@ def _evaluate_dependency_conditions(self, name):
|
|
|
|
|
"""
|
|
|
|
|
conditions = self.package_class.dependencies[name]
|
|
|
|
|
|
|
|
|
|
substitute_abstract_variants(self)
|
|
|
|
|
vt.substitute_abstract_variants(self)
|
|
|
|
|
# evaluate when specs to figure out constraints on the dependency.
|
|
|
|
|
dep = None
|
|
|
|
|
for when_spec, dependency in conditions.items():
|
|
|
|
@ -2378,7 +2367,7 @@ def _evaluate_dependency_conditions(self, name):
|
|
|
|
|
dep = dp.Dependency(self.name, Spec(name), type=())
|
|
|
|
|
try:
|
|
|
|
|
dep.merge(dependency)
|
|
|
|
|
except UnsatisfiableSpecError as e:
|
|
|
|
|
except spack.error.UnsatisfiableSpecError as e:
|
|
|
|
|
e.message = (
|
|
|
|
|
"Conflicting conditional dependencies for spec"
|
|
|
|
|
"\n\n\t{0}\n\n"
|
|
|
|
@ -2468,7 +2457,7 @@ def _merge_dependency(
|
|
|
|
|
if provider:
|
|
|
|
|
dep = provider
|
|
|
|
|
else:
|
|
|
|
|
index = ProviderIndex([dep], restrict=True)
|
|
|
|
|
index = spack.provider_index.ProviderIndex([dep], restrict=True)
|
|
|
|
|
items = list(spec_deps.items())
|
|
|
|
|
for name, vspec in items:
|
|
|
|
|
if not vspec.virtual:
|
|
|
|
@ -2498,7 +2487,7 @@ def _merge_dependency(
|
|
|
|
|
# merge package/vdep information into spec
|
|
|
|
|
try:
|
|
|
|
|
changed |= spec_deps[dep.name].constrain(dep)
|
|
|
|
|
except UnsatisfiableSpecError as e:
|
|
|
|
|
except spack.error.UnsatisfiableSpecError as e:
|
|
|
|
|
fmt = 'An unsatisfiable {0}'.format(e.constraint_type)
|
|
|
|
|
fmt += ' constraint has been detected for spec:'
|
|
|
|
|
fmt += '\n\n{0}\n\n'.format(spec_deps[dep.name].tree(indent=4))
|
|
|
|
@ -2585,7 +2574,8 @@ def normalize(self, force=False, tests=False, user_spec_deps=None):
|
|
|
|
|
detection, to ensure that the spec is actually a DAG.
|
|
|
|
|
"""
|
|
|
|
|
if not self.name:
|
|
|
|
|
raise SpecError("Attempting to normalize anonymous spec")
|
|
|
|
|
raise spack.error.SpecError(
|
|
|
|
|
"Attempting to normalize anonymous spec")
|
|
|
|
|
|
|
|
|
|
# Set _normal and _concrete to False when forced
|
|
|
|
|
if force:
|
|
|
|
@ -2615,7 +2605,7 @@ def normalize(self, force=False, tests=False, user_spec_deps=None):
|
|
|
|
|
|
|
|
|
|
# Initialize index of virtual dependency providers if
|
|
|
|
|
# concretize didn't pass us one already
|
|
|
|
|
provider_index = ProviderIndex(
|
|
|
|
|
provider_index = spack.provider_index.ProviderIndex(
|
|
|
|
|
[s for s in all_spec_deps.values()], restrict=True)
|
|
|
|
|
|
|
|
|
|
# traverse the package DAG and fill out dependencies according
|
|
|
|
@ -2663,9 +2653,9 @@ def validate_or_raise(self):
|
|
|
|
|
not_existing = set(spec.variants) - (
|
|
|
|
|
set(pkg_variants) | set(spack.directives.reserved_names))
|
|
|
|
|
if not_existing:
|
|
|
|
|
raise UnknownVariantError(spec, not_existing)
|
|
|
|
|
raise vt.UnknownVariantError(spec, not_existing)
|
|
|
|
|
|
|
|
|
|
substitute_abstract_variants(spec)
|
|
|
|
|
vt.substitute_abstract_variants(spec)
|
|
|
|
|
|
|
|
|
|
def constrain(self, other, deps=True):
|
|
|
|
|
"""Merge the constraints of other with self.
|
|
|
|
@ -2679,7 +2669,7 @@ def constrain(self, other, deps=True):
|
|
|
|
|
if self.satisfies(other):
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
raise UnsatisfiableSpecError(
|
|
|
|
|
raise spack.error.UnsatisfiableSpecError(
|
|
|
|
|
self, other, 'constrain a concrete spec'
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
@ -2700,7 +2690,7 @@ def constrain(self, other, deps=True):
|
|
|
|
|
|
|
|
|
|
for v in [x for x in other.variants if x in self.variants]:
|
|
|
|
|
if not self.variants[v].compatible(other.variants[v]):
|
|
|
|
|
raise UnsatisfiableVariantSpecError(
|
|
|
|
|
raise vt.UnsatisfiableVariantSpecError(
|
|
|
|
|
self.variants[v], other.variants[v]
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
@ -2928,8 +2918,10 @@ def satisfies_dependencies(self, other, strict=False):
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
# For virtual dependencies, we need to dig a little deeper.
|
|
|
|
|
self_index = ProviderIndex(self.traverse(), restrict=True)
|
|
|
|
|
other_index = ProviderIndex(other.traverse(), restrict=True)
|
|
|
|
|
self_index = spack.provider_index.ProviderIndex(
|
|
|
|
|
self.traverse(), restrict=True)
|
|
|
|
|
other_index = spack.provider_index.ProviderIndex(
|
|
|
|
|
other.traverse(), restrict=True)
|
|
|
|
|
|
|
|
|
|
# This handles cases where there are already providers for both vpkgs
|
|
|
|
|
if not self_index.satisfies(other_index):
|
|
|
|
@ -2954,7 +2946,7 @@ def virtual_dependencies(self):
|
|
|
|
|
return [spec for spec in self.traverse() if spec.virtual]
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
@memoized
|
|
|
|
|
@lang.memoized
|
|
|
|
|
def patches(self):
|
|
|
|
|
"""Return patch objects for any patch sha256 sums on this Spec.
|
|
|
|
|
|
|
|
|
@ -2965,7 +2957,7 @@ def patches(self):
|
|
|
|
|
patches from install directories, but it probably should.
|
|
|
|
|
"""
|
|
|
|
|
if not self.concrete:
|
|
|
|
|
raise SpecError("Spec is not concrete: " + str(self))
|
|
|
|
|
raise spack.error.SpecError("Spec is not concrete: " + str(self))
|
|
|
|
|
|
|
|
|
|
if 'patches' not in self.variants:
|
|
|
|
|
return []
|
|
|
|
@ -3135,7 +3127,8 @@ def copy(self, deps=True, **kwargs):
|
|
|
|
|
@property
|
|
|
|
|
def version(self):
|
|
|
|
|
if not self.versions.concrete:
|
|
|
|
|
raise SpecError("Spec version is not concrete: " + str(self))
|
|
|
|
|
raise spack.error.SpecError(
|
|
|
|
|
"Spec version is not concrete: " + str(self))
|
|
|
|
|
return self.versions[0]
|
|
|
|
|
|
|
|
|
|
def __getitem__(self, name):
|
|
|
|
@ -3375,10 +3368,10 @@ def format(self, format_string=default_format, **kwargs):
|
|
|
|
|
out = six.StringIO()
|
|
|
|
|
|
|
|
|
|
def write(s, c=None):
|
|
|
|
|
f = cescape(s)
|
|
|
|
|
f = clr.cescape(s)
|
|
|
|
|
if c is not None:
|
|
|
|
|
f = color_formats[c] + f + '@.'
|
|
|
|
|
cwrite(f, stream=out, color=color)
|
|
|
|
|
clr.cwrite(f, stream=out, color=color)
|
|
|
|
|
|
|
|
|
|
def write_attribute(spec, attribute, color):
|
|
|
|
|
current = spec
|
|
|
|
@ -3445,7 +3438,7 @@ def write_attribute(spec, attribute, color):
|
|
|
|
|
'Attempted to format private attribute'
|
|
|
|
|
)
|
|
|
|
|
else:
|
|
|
|
|
if isinstance(current, VariantMap):
|
|
|
|
|
if isinstance(current, vt.VariantMap):
|
|
|
|
|
# subscript instead of getattr for variant names
|
|
|
|
|
current = current[part]
|
|
|
|
|
else:
|
|
|
|
@ -3463,7 +3456,7 @@ def write_attribute(spec, attribute, color):
|
|
|
|
|
m = 'Attempted to format attribute %s.' % attribute
|
|
|
|
|
m += 'Spec.%s has no attribute %s' % (parent, part)
|
|
|
|
|
raise SpecFormatStringError(m)
|
|
|
|
|
if isinstance(current, VersionList):
|
|
|
|
|
if isinstance(current, vn.VersionList):
|
|
|
|
|
if current == _any_version:
|
|
|
|
|
# We don't print empty version lists
|
|
|
|
|
return
|
|
|
|
@ -3609,10 +3602,10 @@ def old_format(self, format_string='$_$@$%@+$+$=', **kwargs):
|
|
|
|
|
named_str = fmt = ''
|
|
|
|
|
|
|
|
|
|
def write(s, c=None):
|
|
|
|
|
f = cescape(s)
|
|
|
|
|
f = clr.cescape(s)
|
|
|
|
|
if c is not None:
|
|
|
|
|
f = color_formats[c] + f + '@.'
|
|
|
|
|
cwrite(f, stream=out, color=color)
|
|
|
|
|
clr.cwrite(f, stream=out, color=color)
|
|
|
|
|
|
|
|
|
|
iterator = enumerate(format_string)
|
|
|
|
|
for i, c in iterator:
|
|
|
|
@ -3807,7 +3800,7 @@ def _installed_explicitly(self):
|
|
|
|
|
def tree(self, **kwargs):
|
|
|
|
|
"""Prints out this spec and its dependencies, tree-formatted
|
|
|
|
|
with indentation."""
|
|
|
|
|
color = kwargs.pop('color', get_color_when())
|
|
|
|
|
color = kwargs.pop('color', clr.get_color_when())
|
|
|
|
|
depth = kwargs.pop('depth', False)
|
|
|
|
|
hashes = kwargs.pop('hashes', False)
|
|
|
|
|
hlen = kwargs.pop('hashlen', None)
|
|
|
|
@ -3819,7 +3812,7 @@ def tree(self, **kwargs):
|
|
|
|
|
show_types = kwargs.pop('show_types', False)
|
|
|
|
|
deptypes = kwargs.pop('deptypes', 'all')
|
|
|
|
|
recurse_dependencies = kwargs.pop('recurse_dependencies', True)
|
|
|
|
|
check_kwargs(kwargs, self.tree)
|
|
|
|
|
lang.check_kwargs(kwargs, self.tree)
|
|
|
|
|
|
|
|
|
|
out = ""
|
|
|
|
|
for d, dep_spec in self.traverse_edges(
|
|
|
|
@ -3836,16 +3829,17 @@ def tree(self, **kwargs):
|
|
|
|
|
if status_fn:
|
|
|
|
|
status = status_fn(node)
|
|
|
|
|
if node.package.installed_upstream:
|
|
|
|
|
out += colorize("@g{[^]} ", color=color)
|
|
|
|
|
out += clr.colorize("@g{[^]} ", color=color)
|
|
|
|
|
elif status is None:
|
|
|
|
|
out += colorize("@K{ - } ", color=color) # not installed
|
|
|
|
|
out += clr.colorize("@K{ - } ", color=color) # !installed
|
|
|
|
|
elif status:
|
|
|
|
|
out += colorize("@g{[+]} ", color=color) # installed
|
|
|
|
|
out += clr.colorize("@g{[+]} ", color=color) # installed
|
|
|
|
|
else:
|
|
|
|
|
out += colorize("@r{[-]} ", color=color) # missing
|
|
|
|
|
out += clr.colorize("@r{[-]} ", color=color) # missing
|
|
|
|
|
|
|
|
|
|
if hashes:
|
|
|
|
|
out += colorize('@K{%s} ', color=color) % node.dag_hash(hlen)
|
|
|
|
|
out += clr.colorize(
|
|
|
|
|
'@K{%s} ', color=color) % node.dag_hash(hlen)
|
|
|
|
|
|
|
|
|
|
if show_types:
|
|
|
|
|
types = set()
|
|
|
|
@ -4157,17 +4151,17 @@ def spec(self, name):
|
|
|
|
|
while self.next:
|
|
|
|
|
if self.accept(AT):
|
|
|
|
|
vlist = self.version_list()
|
|
|
|
|
spec.versions = VersionList()
|
|
|
|
|
spec.versions = vn.VersionList()
|
|
|
|
|
for version in vlist:
|
|
|
|
|
spec._add_version(version)
|
|
|
|
|
|
|
|
|
|
elif self.accept(ON):
|
|
|
|
|
name = self.variant()
|
|
|
|
|
spec.variants[name] = BoolValuedVariant(name, True)
|
|
|
|
|
spec.variants[name] = vt.BoolValuedVariant(name, True)
|
|
|
|
|
|
|
|
|
|
elif self.accept(OFF):
|
|
|
|
|
name = self.variant()
|
|
|
|
|
spec.variants[name] = BoolValuedVariant(name, False)
|
|
|
|
|
spec.variants[name] = vt.BoolValuedVariant(name, False)
|
|
|
|
|
|
|
|
|
|
elif self.accept(PCT):
|
|
|
|
|
spec._set_compiler(self.compiler())
|
|
|
|
@ -4223,16 +4217,16 @@ def version(self):
|
|
|
|
|
end = self.token.value
|
|
|
|
|
elif start:
|
|
|
|
|
# No colon, but there was a version.
|
|
|
|
|
return Version(start)
|
|
|
|
|
return vn.Version(start)
|
|
|
|
|
else:
|
|
|
|
|
# No colon and no id: invalid version.
|
|
|
|
|
self.next_token_error("Invalid version specifier")
|
|
|
|
|
|
|
|
|
|
if start:
|
|
|
|
|
start = Version(start)
|
|
|
|
|
start = vn.Version(start)
|
|
|
|
|
if end:
|
|
|
|
|
end = Version(end)
|
|
|
|
|
return VersionRange(start, end)
|
|
|
|
|
end = vn.Version(end)
|
|
|
|
|
return vn.VersionRange(start, end)
|
|
|
|
|
|
|
|
|
|
def version_list(self):
|
|
|
|
|
vlist = []
|
|
|
|
@ -4247,13 +4241,13 @@ def compiler(self):
|
|
|
|
|
|
|
|
|
|
compiler = CompilerSpec.__new__(CompilerSpec)
|
|
|
|
|
compiler.name = self.token.value
|
|
|
|
|
compiler.versions = VersionList()
|
|
|
|
|
compiler.versions = vn.VersionList()
|
|
|
|
|
if self.accept(AT):
|
|
|
|
|
vlist = self.version_list()
|
|
|
|
|
for version in vlist:
|
|
|
|
|
compiler._add_version(version)
|
|
|
|
|
else:
|
|
|
|
|
compiler.versions = VersionList(':')
|
|
|
|
|
compiler.versions = vn.VersionList(':')
|
|
|
|
|
return compiler
|
|
|
|
|
|
|
|
|
|
def check_identifier(self, id=None):
|
|
|
|
@ -4309,10 +4303,10 @@ def base32_prefix_bits(hash_string, bits):
|
|
|
|
|
% (bits, hash_string))
|
|
|
|
|
|
|
|
|
|
hash_bytes = base64.b32decode(hash_string, casefold=True)
|
|
|
|
|
return prefix_bits(hash_bytes, bits)
|
|
|
|
|
return spack.util.crypto.prefix_bits(hash_bytes, bits)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SpecParseError(SpecError):
|
|
|
|
|
class SpecParseError(spack.error.SpecError):
|
|
|
|
|
"""Wrapper for ParseError for when we're parsing specs."""
|
|
|
|
|
def __init__(self, parse_error):
|
|
|
|
|
super(SpecParseError, self).__init__(parse_error.message)
|
|
|
|
@ -4320,40 +4314,41 @@ def __init__(self, parse_error):
|
|
|
|
|
self.pos = parse_error.pos
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DuplicateDependencyError(SpecError):
|
|
|
|
|
class DuplicateDependencyError(spack.error.SpecError):
|
|
|
|
|
"""Raised when the same dependency occurs in a spec twice."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DuplicateCompilerSpecError(SpecError):
|
|
|
|
|
class DuplicateCompilerSpecError(spack.error.SpecError):
|
|
|
|
|
"""Raised when the same compiler occurs in a spec twice."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UnsupportedCompilerError(SpecError):
|
|
|
|
|
class UnsupportedCompilerError(spack.error.SpecError):
|
|
|
|
|
"""Raised when the user asks for a compiler spack doesn't know about."""
|
|
|
|
|
def __init__(self, compiler_name):
|
|
|
|
|
super(UnsupportedCompilerError, self).__init__(
|
|
|
|
|
"The '%s' compiler is not yet supported." % compiler_name)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class DuplicateArchitectureError(SpecError):
|
|
|
|
|
class DuplicateArchitectureError(spack.error.SpecError):
|
|
|
|
|
"""Raised when the same architecture occurs in a spec twice."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class InconsistentSpecError(SpecError):
|
|
|
|
|
class InconsistentSpecError(spack.error.SpecError):
|
|
|
|
|
"""Raised when two nodes in the same spec DAG have inconsistent
|
|
|
|
|
constraints."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class InvalidDependencyError(SpecError):
|
|
|
|
|
class InvalidDependencyError(spack.error.SpecError):
|
|
|
|
|
"""Raised when a dependency in a spec is not actually a dependency
|
|
|
|
|
of the package."""
|
|
|
|
|
def __init__(self, pkg, deps):
|
|
|
|
|
self.invalid_deps = deps
|
|
|
|
|
super(InvalidDependencyError, self).__init__(
|
|
|
|
|
'Package {0} does not depend on {1}'.format(pkg, comma_or(deps)))
|
|
|
|
|
'Package {0} does not depend on {1}'.format(
|
|
|
|
|
pkg, spack.util.string.comma_or(deps)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NoProviderError(SpecError):
|
|
|
|
|
class NoProviderError(spack.error.SpecError):
|
|
|
|
|
"""Raised when there is no package that provides a particular
|
|
|
|
|
virtual dependency.
|
|
|
|
|
"""
|
|
|
|
@ -4363,7 +4358,7 @@ def __init__(self, vpkg):
|
|
|
|
|
self.vpkg = vpkg
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MultipleProviderError(SpecError):
|
|
|
|
|
class MultipleProviderError(spack.error.SpecError):
|
|
|
|
|
"""Raised when there is no package that provides a particular
|
|
|
|
|
virtual dependency.
|
|
|
|
|
"""
|
|
|
|
@ -4376,42 +4371,42 @@ def __init__(self, vpkg, providers):
|
|
|
|
|
self.providers = providers
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UnsatisfiableSpecNameError(UnsatisfiableSpecError):
|
|
|
|
|
class UnsatisfiableSpecNameError(spack.error.UnsatisfiableSpecError):
|
|
|
|
|
"""Raised when two specs aren't even for the same package."""
|
|
|
|
|
def __init__(self, provided, required):
|
|
|
|
|
super(UnsatisfiableSpecNameError, self).__init__(
|
|
|
|
|
provided, required, "name")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UnsatisfiableVersionSpecError(UnsatisfiableSpecError):
|
|
|
|
|
class UnsatisfiableVersionSpecError(spack.error.UnsatisfiableSpecError):
|
|
|
|
|
"""Raised when a spec version conflicts with package constraints."""
|
|
|
|
|
def __init__(self, provided, required):
|
|
|
|
|
super(UnsatisfiableVersionSpecError, self).__init__(
|
|
|
|
|
provided, required, "version")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UnsatisfiableCompilerSpecError(UnsatisfiableSpecError):
|
|
|
|
|
class UnsatisfiableCompilerSpecError(spack.error.UnsatisfiableSpecError):
|
|
|
|
|
"""Raised when a spec comiler conflicts with package constraints."""
|
|
|
|
|
def __init__(self, provided, required):
|
|
|
|
|
super(UnsatisfiableCompilerSpecError, self).__init__(
|
|
|
|
|
provided, required, "compiler")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UnsatisfiableCompilerFlagSpecError(UnsatisfiableSpecError):
|
|
|
|
|
class UnsatisfiableCompilerFlagSpecError(spack.error.UnsatisfiableSpecError):
|
|
|
|
|
"""Raised when a spec variant conflicts with package constraints."""
|
|
|
|
|
def __init__(self, provided, required):
|
|
|
|
|
super(UnsatisfiableCompilerFlagSpecError, self).__init__(
|
|
|
|
|
provided, required, "compiler_flags")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UnsatisfiableArchitectureSpecError(UnsatisfiableSpecError):
|
|
|
|
|
class UnsatisfiableArchitectureSpecError(spack.error.UnsatisfiableSpecError):
|
|
|
|
|
"""Raised when a spec architecture conflicts with package constraints."""
|
|
|
|
|
def __init__(self, provided, required):
|
|
|
|
|
super(UnsatisfiableArchitectureSpecError, self).__init__(
|
|
|
|
|
provided, required, "architecture")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class UnsatisfiableProviderSpecError(UnsatisfiableSpecError):
|
|
|
|
|
class UnsatisfiableProviderSpecError(spack.error.UnsatisfiableSpecError):
|
|
|
|
|
"""Raised when a provider is supplied but constraints don't match
|
|
|
|
|
a vpkg requirement"""
|
|
|
|
|
def __init__(self, provided, required):
|
|
|
|
@ -4421,14 +4416,14 @@ def __init__(self, provided, required):
|
|
|
|
|
|
|
|
|
|
# TODO: get rid of this and be more specific about particular incompatible
|
|
|
|
|
# dep constraints
|
|
|
|
|
class UnsatisfiableDependencySpecError(UnsatisfiableSpecError):
|
|
|
|
|
class UnsatisfiableDependencySpecError(spack.error.UnsatisfiableSpecError):
|
|
|
|
|
"""Raised when some dependency of constrained specs are incompatible"""
|
|
|
|
|
def __init__(self, provided, required):
|
|
|
|
|
super(UnsatisfiableDependencySpecError, self).__init__(
|
|
|
|
|
provided, required, "dependency")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AmbiguousHashError(SpecError):
|
|
|
|
|
class AmbiguousHashError(spack.error.SpecError):
|
|
|
|
|
def __init__(self, msg, *specs):
|
|
|
|
|
spec_fmt = '{namespace}.{name}{@version}{%compiler}{compiler_flags}'
|
|
|
|
|
spec_fmt += '{variants}{arch=architecture}{/hash:7}'
|
|
|
|
@ -4437,21 +4432,21 @@ def __init__(self, msg, *specs):
|
|
|
|
|
super(AmbiguousHashError, self).__init__(msg + specs_str)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class InvalidHashError(SpecError):
|
|
|
|
|
class InvalidHashError(spack.error.SpecError):
|
|
|
|
|
def __init__(self, spec, hash):
|
|
|
|
|
super(InvalidHashError, self).__init__(
|
|
|
|
|
"The spec specified by %s does not match provided spec %s"
|
|
|
|
|
% (hash, spec))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class NoSuchHashError(SpecError):
|
|
|
|
|
class NoSuchHashError(spack.error.SpecError):
|
|
|
|
|
def __init__(self, hash):
|
|
|
|
|
super(NoSuchHashError, self).__init__(
|
|
|
|
|
"No installed spec matches the hash: '%s'"
|
|
|
|
|
% hash)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SpecFilenameError(SpecError):
|
|
|
|
|
class SpecFilenameError(spack.error.SpecError):
|
|
|
|
|
"""Raised when a spec file name is invalid."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -4459,7 +4454,7 @@ class NoSuchSpecFileError(SpecFilenameError):
|
|
|
|
|
"""Raised when a spec file doesn't exist."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class RedundantSpecError(SpecError):
|
|
|
|
|
class RedundantSpecError(spack.error.SpecError):
|
|
|
|
|
def __init__(self, spec, addition):
|
|
|
|
|
super(RedundantSpecError, self).__init__(
|
|
|
|
|
"Attempting to add %s to spec %s which is already concrete."
|
|
|
|
@ -4467,7 +4462,7 @@ def __init__(self, spec, addition):
|
|
|
|
|
% (addition, spec))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SpecFormatStringError(SpecError):
|
|
|
|
|
class SpecFormatStringError(spack.error.SpecError):
|
|
|
|
|
"""Called for errors in Spec format strings."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -4479,7 +4474,7 @@ def __init__(self, sigil, requirement, used):
|
|
|
|
|
super(SpecFormatSigilError, self).__init__(msg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConflictsInSpecError(SpecError, RuntimeError):
|
|
|
|
|
class ConflictsInSpecError(spack.error.SpecError, RuntimeError):
|
|
|
|
|
def __init__(self, spec, matches):
|
|
|
|
|
message = 'Conflicts in concretized spec "{0}"\n'.format(
|
|
|
|
|
spec.short_spec
|
|
|
|
@ -4507,10 +4502,10 @@ def __init__(self, spec, matches):
|
|
|
|
|
super(ConflictsInSpecError, self).__init__(message, long_message)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SpecDependencyNotFoundError(SpecError):
|
|
|
|
|
class SpecDependencyNotFoundError(spack.error.SpecError):
|
|
|
|
|
"""Raised when a failure is encountered writing the dependencies of
|
|
|
|
|
a spec."""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class SpecDeprecatedError(SpecError):
|
|
|
|
|
class SpecDeprecatedError(spack.error.SpecError):
|
|
|
|
|
"""Raised when a spec concretizes to a deprecated spec or dependency."""
|
|
|
|
|