Merge branch 'develop' of https://github.com/LLNL/spack into features/module_refresh

Conflicts:
	share/spack/setup-env.sh
This commit is contained in:
alalazo 2016-07-18 14:12:47 +02:00
commit a96eb7096d
25 changed files with 786 additions and 267 deletions

View file

@ -183,7 +183,7 @@ To uninstall a package and every package that depends on it, you may give the
spack uninstall --dependents mpich spack uninstall --dependents mpich
will display a list of all the packages that depends on `mpich` and, upon confirmation, will display a list of all the packages that depend on `mpich` and, upon confirmation,
will uninstall them in the right order. will uninstall them in the right order.
A line like A line like
@ -543,11 +543,12 @@ More formally, a spec consists of the following pieces:
* ``+`` or ``-`` or ``~`` Optional variant specifiers (``+debug``, * ``+`` or ``-`` or ``~`` Optional variant specifiers (``+debug``,
``-qt``, or ``~qt``) for boolean variants ``-qt``, or ``~qt``) for boolean variants
* ``name=<value>`` Optional variant specifiers that are not restricted to * ``name=<value>`` Optional variant specifiers that are not restricted to
boolean variants boolean variants
* ``name=<value>`` Optional compiler flag specifiers. Valid flag names are * ``name=<value>`` Optional compiler flag specifiers. Valid flag names are
``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, and ``ldlibs``. ``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, and ``ldlibs``.
* ``target=<value> os=<value>`` Optional architecture specifier * ``target=<value> os=<value>`` Optional architecture specifier
(``target=haswell os=CNL10``) * ``^`` Dependency specs (``^callpath@1.1``) (``target=haswell os=CNL10``)
* ``^`` Dependency specs (``^callpath@1.1``)
There are two things to notice here. The first is that specs are There are two things to notice here. The first is that specs are
recursively defined. That is, each dependency after ``^`` is a spec recursively defined. That is, each dependency after ``^`` is a spec

View file

@ -2627,14 +2627,14 @@ Spack packages with variants similar to already-existing Spack
packages should use the same name for their variants. Standard packages should use the same name for their variants. Standard
variant names are: variant names are:
======= ======== ======================== ======= ======== ========================
Name Default Description Name Default Description
------- -------- ------------------------ ======= ======== ========================
shared True Build shared libraries shared True Build shared libraries
static Build static libraries static Build static libraries
mpi Use MPI mpi Use MPI
python Build Python extension python Build Python extension
------- -------- ------------------------ ======= ======== ========================
If specified in this table, the corresponding default should be used If specified in this table, the corresponding default should be used
when declaring a variant. when declaring a variant.

View file

@ -42,7 +42,7 @@
'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink', 'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink',
'set_executable', 'copy_mode', 'unset_executable_mode', 'set_executable', 'copy_mode', 'unset_executable_mode',
'remove_dead_links', 'remove_linked_tree', 'find_library_path', 'remove_dead_links', 'remove_linked_tree', 'find_library_path',
'fix_darwin_install_name', 'to_link_flags'] 'fix_darwin_install_name', 'to_link_flags', 'to_lib_name']
def filter_file(regex, repl, *filenames, **kwargs): def filter_file(regex, repl, *filenames, **kwargs):
@ -431,6 +431,13 @@ def fix_darwin_install_name(path):
break break
def to_lib_name(library):
"""Transforms a path to the library /path/to/lib<name>.xyz into <name>
"""
# Assume libXYZ.suffix
return os.path.basename(library)[3:].split(".")[0]
def to_link_flags(library): def to_link_flags(library):
"""Transforms a path to a <library> into linking flags -L<dir> -l<name>. """Transforms a path to a <library> into linking flags -L<dir> -l<name>.
@ -438,8 +445,7 @@ def to_link_flags(library):
A string of linking flags. A string of linking flags.
""" """
dir = os.path.dirname(library) dir = os.path.dirname(library)
# Assume libXYZ.suffix name = to_lib_name(library)
name = os.path.basename(library)[3:].split(".")[0]
res = '-L%s -l%s' % (dir, name) res = '-L%s -l%s' % (dir, name)
return res return res

View file

@ -142,9 +142,9 @@ def __call__(self, stage):
# Build dependencies and extensions # Build dependencies and extensions
dependenciesDict = { dependenciesDict = {
'autotools': "# depends_on('foo')", 'autotools': "# depends_on('foo')",
'cmake': "depends_on('cmake')", 'cmake': "depends_on('cmake', type='build')",
'scons': "depends_on('scons')", 'scons': "depends_on('scons', type='build')",
'python': "extends('python')", 'python': "extends('python', type=nolink)",
'R': "extends('R')", 'R': "extends('R')",
'unknown': "# depends_on('foo')" 'unknown': "# depends_on('foo')"
} }

View file

@ -29,9 +29,11 @@
description = "Get detailed information on a particular package" description = "Get detailed information on a particular package"
def padder(str_list, extra=0): def padder(str_list, extra=0):
"""Return a function to pad elements of a list.""" """Return a function to pad elements of a list."""
length = max(len(str(s)) for s in str_list) + extra length = max(len(str(s)) for s in str_list) + extra
def pad(string): def pad(string):
string = str(string) string = str(string)
padding = max(0, length - len(string)) padding = max(0, length - len(string))
@ -40,7 +42,8 @@ def pad(string):
def setup_parser(subparser): def setup_parser(subparser):
subparser.add_argument('name', metavar="PACKAGE", help="Name of package to get info for.") subparser.add_argument(
'name', metavar="PACKAGE", help="Name of package to get info for.")
def print_text_info(pkg): def print_text_info(pkg):
@ -84,7 +87,7 @@ def print_text_info(pkg):
for deptype in ('build', 'link', 'run'): for deptype in ('build', 'link', 'run'):
print print
print "%s Dependencies:" % deptype.capitalize() print "%s Dependencies:" % deptype.capitalize()
deps = pkg.dependencies(deptype) deps = pkg.dependencies_of_type(deptype)
if deps: if deps:
colify(deps, indent=4) colify(deps, indent=4)
else: else:

View file

@ -60,7 +60,7 @@
_db_dirname = '.spack-db' _db_dirname = '.spack-db'
# DB version. This is stuck in the DB file to track changes in format. # DB version. This is stuck in the DB file to track changes in format.
_db_version = Version('0.9.1') _db_version = Version('0.9.2')
# Default timeout for spack database locks is 5 min. # Default timeout for spack database locks is 5 min.
_db_lock_timeout = 60 _db_lock_timeout = 60
@ -215,14 +215,10 @@ def _read_spec_from_yaml(self, hash_key, installs, parent_key=None):
# Add dependencies from other records in the install DB to # Add dependencies from other records in the install DB to
# form a full spec. # form a full spec.
if 'dependencies' in spec_dict[spec.name]: if 'dependencies' in spec_dict[spec.name]:
for dep in spec_dict[spec.name]['dependencies'].values(): yaml_deps = spec_dict[spec.name]['dependencies']
if type(dep) == tuple: for dname, dhash, dtypes in Spec.read_yaml_dep_specs(yaml_deps):
dep_hash, deptypes = dep child = self._read_spec_from_yaml(dhash, installs, hash_key)
else: spec._add_dependency(child, dtypes)
dep_hash = dep
deptypes = spack.alldeps
child = self._read_spec_from_yaml(dep_hash, installs, hash_key)
spec._add_dependency(child, deptypes)
# Specs from the database need to be marked concrete because # Specs from the database need to be marked concrete because
# they represent actual installations. # they represent actual installations.
@ -639,13 +635,14 @@ def _exit(self):
class CorruptDatabaseError(SpackError): class CorruptDatabaseError(SpackError):
def __init__(self, path, msg=''): def __init__(self, path, msg=''):
super(CorruptDatabaseError, self).__init__( super(CorruptDatabaseError, self).__init__(
"Spack database is corrupt: %s. %s." + \ "Spack database is corrupt: %s. %s." % (path, msg),
"Try running `spack reindex` to fix." % (path, msg)) "Try running `spack reindex` to fix.")
class InvalidDatabaseVersionError(SpackError): class InvalidDatabaseVersionError(SpackError):
def __init__(self, expected, found): def __init__(self, expected, found):
super(InvalidDatabaseVersionError, self).__init__( super(InvalidDatabaseVersionError, self).__init__(
"Expected database version %s but found version %s." + \ "Expected database version %s but found version %s."
"Try running `spack reindex` to fix." % % (expected, found),
(expected, found)) "`spack reindex` may fix this, or you may need a newer "
"Spack version.")

View file

@ -34,6 +34,7 @@
import llnl.util.tty as tty import llnl.util.tty as tty
from llnl.util.filesystem import join_path, mkdirp from llnl.util.filesystem import join_path, mkdirp
import spack
from spack.spec import Spec from spack.spec import Spec
from spack.error import SpackError from spack.error import SpackError
@ -223,8 +224,14 @@ def write_spec(self, spec, path):
def read_spec(self, path): def read_spec(self, path):
"""Read the contents of a file and parse them as a spec""" """Read the contents of a file and parse them as a spec"""
try:
with open(path) as f: with open(path) as f:
spec = Spec.from_yaml(f) spec = Spec.from_yaml(f)
except Exception as e:
if spack.debug:
raise
raise SpecReadError(
'Unable to read file: %s' % path, 'Cause: ' + str(e))
# Specs read from actual installations are always concrete # Specs read from actual installations are always concrete
spec._mark_concrete() spec._mark_concrete()
@ -456,10 +463,12 @@ def __init__(self, path):
"Install path %s already exists!") "Install path %s already exists!")
class SpecReadError(DirectoryLayoutError):
"""Raised when directory layout can't read a spec."""
class InvalidExtensionSpecError(DirectoryLayoutError): class InvalidExtensionSpecError(DirectoryLayoutError):
"""Raised when an extension file has a bad spec in it.""" """Raised when an extension file has a bad spec in it."""
def __init__(self, message):
super(InvalidExtensionSpecError, self).__init__(message)
class ExtensionAlreadyInstalledError(DirectoryLayoutError): class ExtensionAlreadyInstalledError(DirectoryLayoutError):

View file

@ -37,7 +37,6 @@
import re import re
import textwrap import textwrap
import time import time
import glob
import string import string
import llnl.util.tty as tty import llnl.util.tty as tty
@ -62,10 +61,10 @@
from spack.stage import Stage, ResourceStage, StageComposite from spack.stage import Stage, ResourceStage, StageComposite
from spack.util.compression import allowed_archive from spack.util.compression import allowed_archive
from spack.util.environment import dump_environment from spack.util.environment import dump_environment
from spack.util.executable import ProcessError, Executable, which from spack.util.executable import ProcessError, which
from spack.version import * from spack.version import *
from spack import directory_layout from spack import directory_layout
from urlparse import urlparse
"""Allowed URL schemes for spack packages.""" """Allowed URL schemes for spack packages."""
_ALLOWED_URL_SCHEMES = ["http", "https", "ftp", "file", "git"] _ALLOWED_URL_SCHEMES = ["http", "https", "ftp", "file", "git"]
@ -410,7 +409,6 @@ def package_dir(self):
"""Return the directory where the package.py file lives.""" """Return the directory where the package.py file lives."""
return os.path.dirname(self.module.__file__) return os.path.dirname(self.module.__file__)
@property @property
def global_license_dir(self): def global_license_dir(self):
"""Returns the directory where global license files for all """Returns the directory where global license files for all
@ -565,6 +563,11 @@ def fetcher(self):
def fetcher(self, f): def fetcher(self, f):
self._fetcher = f self._fetcher = f
def dependencies_of_type(self, *deptypes):
"""Get subset of the dependencies with certain types."""
return dict((name, conds) for name, conds in self.dependencies.items()
if any(d in self._deptypes[name] for d in deptypes))
@property @property
def extendee_spec(self): def extendee_spec(self):
""" """
@ -687,7 +690,7 @@ def installed_dependents(self):
if self.name == spec.name: if self.name == spec.name:
continue continue
# XXX(deptype): Should build dependencies not count here? # XXX(deptype): Should build dependencies not count here?
#for dep in spec.traverse(deptype=('run')): # for dep in spec.traverse(deptype=('run')):
for dep in spec.traverse(deptype=spack.alldeps): for dep in spec.traverse(deptype=spack.alldeps):
if self.spec == dep: if self.spec == dep:
dependents.append(spec) dependents.append(spec)
@ -699,7 +702,7 @@ def prefix(self):
return self.spec.prefix return self.spec.prefix
@property @property
#TODO: Change this to architecture # TODO: Change this to architecture
def compiler(self): def compiler(self):
"""Get the spack.compiler.Compiler object used to build this package""" """Get the spack.compiler.Compiler object used to build this package"""
if not self.spec.concrete: if not self.spec.concrete:
@ -761,7 +764,6 @@ def do_fetch(self, mirror_only=False):
self.stage.cache_local() self.stage.cache_local()
def do_stage(self, mirror_only=False): def do_stage(self, mirror_only=False):
"""Unpacks the fetched tarball, then changes into the expanded tarball """Unpacks the fetched tarball, then changes into the expanded tarball
directory.""" directory."""
@ -879,6 +881,7 @@ def _resource_stage(self, resource):
return resource_stage_folder return resource_stage_folder
install_phases = set(['configure', 'build', 'install', 'provenance']) install_phases = set(['configure', 'build', 'install', 'provenance'])
def do_install(self, def do_install(self,
keep_prefix=False, keep_prefix=False,
keep_stage=False, keep_stage=False,
@ -890,7 +893,7 @@ def do_install(self,
fake=False, fake=False,
explicit=False, explicit=False,
dirty=False, dirty=False,
install_phases = install_phases): install_phases=install_phases):
"""Called by commands to install a package and its dependencies. """Called by commands to install a package and its dependencies.
Package implementations should override install() to describe Package implementations should override install() to describe
@ -911,7 +914,8 @@ def do_install(self,
run_tests -- Runn tests within the package's install() run_tests -- Runn tests within the package's install()
""" """
if not self.spec.concrete: if not self.spec.concrete:
raise ValueError("Can only install concrete packages: %s." % self.spec.name) raise ValueError("Can only install concrete packages: %s."
% self.spec.name)
# No installation needed if package is external # No installation needed if package is external
if self.spec.external: if self.spec.external:
@ -920,7 +924,8 @@ def do_install(self,
return return
# Ensure package is not already installed # Ensure package is not already installed
if 'install' in install_phases and spack.install_layout.check_installed(self.spec): layout = spack.install_layout
if 'install' in install_phases and layout.check_installed(self.spec):
tty.msg("%s is already installed in %s" % (self.name, self.prefix)) tty.msg("%s is already installed in %s" % (self.name, self.prefix))
rec = spack.installed_db.get_record(self.spec) rec = spack.installed_db.get_record(self.spec)
if (not rec.explicit) and explicit: if (not rec.explicit) and explicit:
@ -1001,20 +1006,17 @@ def build_process():
if 'install' in self.install_phases: if 'install' in self.install_phases:
self.sanity_check_prefix() self.sanity_check_prefix()
# Copy provenance into the install directory on success # Copy provenance into the install directory on success
if 'provenance' in self.install_phases: if 'provenance' in self.install_phases:
log_install_path = spack.install_layout.build_log_path( log_install_path = layout.build_log_path(self.spec)
self.spec) env_install_path = layout.build_env_path(self.spec)
env_install_path = spack.install_layout.build_env_path( packages_dir = layout.build_packages_path(self.spec)
self.spec)
packages_dir = spack.install_layout.build_packages_path(
self.spec)
# Remove first if we're overwriting another build # Remove first if we're overwriting another build
# (can happen with spack setup) # (can happen with spack setup)
try: try:
shutil.rmtree(packages_dir) # log_install_path and env_install_path are inside this # log_install_path and env_install_path are here
shutil.rmtree(packages_dir)
except: except:
pass pass
@ -1041,7 +1043,7 @@ def build_process():
except directory_layout.InstallDirectoryAlreadyExistsError: except directory_layout.InstallDirectoryAlreadyExistsError:
if 'install' in install_phases: if 'install' in install_phases:
# Abort install if install directory exists. # Abort install if install directory exists.
# But do NOT remove it (you'd be overwriting someon else's stuff) # But do NOT remove it (you'd be overwriting someone's data)
tty.warn("Keeping existing install prefix in place.") tty.warn("Keeping existing install prefix in place.")
raise raise
else: else:
@ -1533,24 +1535,29 @@ def _hms(seconds):
parts.append("%.2fs" % s) parts.append("%.2fs" % s)
return ' '.join(parts) return ' '.join(parts)
class StagedPackage(Package): class StagedPackage(Package):
"""A Package subclass where the install() is split up into stages.""" """A Package subclass where the install() is split up into stages."""
def install_setup(self): def install_setup(self):
"""Creates an spack_setup.py script to configure the package later if we like.""" """Creates a spack_setup.py script to configure the package later."""
raise InstallError("Package %s provides no install_setup() method!" % self.name) raise InstallError(
"Package %s provides no install_setup() method!" % self.name)
def install_configure(self): def install_configure(self):
"""Runs the configure process.""" """Runs the configure process."""
raise InstallError("Package %s provides no install_configure() method!" % self.name) raise InstallError(
"Package %s provides no install_configure() method!" % self.name)
def install_build(self): def install_build(self):
"""Runs the build process.""" """Runs the build process."""
raise InstallError("Package %s provides no install_build() method!" % self.name) raise InstallError(
"Package %s provides no install_build() method!" % self.name)
def install_install(self): def install_install(self):
"""Runs the install process.""" """Runs the install process."""
raise InstallError("Package %s provides no install_install() method!" % self.name) raise InstallError(
"Package %s provides no install_install() method!" % self.name)
def install(self, spec, prefix): def install(self, spec, prefix):
if 'setup' in self.install_phases: if 'setup' in self.install_phases:
@ -1567,9 +1574,10 @@ def install(self, spec, prefix):
else: else:
# Create a dummy file so the build doesn't fail. # Create a dummy file so the build doesn't fail.
# That way, the module file will also be created. # That way, the module file will also be created.
with open(os.path.join(prefix, 'dummy'), 'w') as fout: with open(os.path.join(prefix, 'dummy'), 'w'):
pass pass
# stackoverflow.com/questions/12791997/how-do-you-do-a-simple-chmod-x-from-within-python # stackoverflow.com/questions/12791997/how-do-you-do-a-simple-chmod-x-from-within-python
def make_executable(path): def make_executable(path):
mode = os.stat(path).st_mode mode = os.stat(path).st_mode
@ -1577,9 +1585,7 @@ def make_executable(path):
os.chmod(path, mode) os.chmod(path, mode)
class CMakePackage(StagedPackage): class CMakePackage(StagedPackage):
def make_make(self): def make_make(self):
import multiprocessing import multiprocessing
# number of jobs spack will to build with. # number of jobs spack will to build with.
@ -1593,37 +1599,41 @@ def make_make(self):
return make return make
def configure_args(self): def configure_args(self):
"""Returns package-specific arguments to be provided to the configure command.""" """Returns package-specific arguments to be provided to
the configure command.
"""
return list() return list()
def configure_env(self): def configure_env(self):
"""Returns package-specific environment under which the configure command should be run.""" """Returns package-specific environment under which the
configure command should be run.
"""
return dict() return dict()
def spack_transitive_include_path(self): def transitive_inc_path(self):
return ';'.join( return ';'.join(
os.path.join(dep, 'include') os.path.join(dep, 'include')
for dep in os.environ['SPACK_DEPENDENCIES'].split(os.pathsep) for dep in os.environ['SPACK_DEPENDENCIES'].split(os.pathsep)
) )
def install_setup(self): def install_setup(self):
cmd = [str(which('cmake'))] + \ cmd = [str(which('cmake'))]
spack.build_environment.get_std_cmake_args(self) + \ cmd += spack.build_environment.get_std_cmake_args(self)
['-DCMAKE_INSTALL_PREFIX=%s' % os.environ['SPACK_PREFIX'], cmd += ['-DCMAKE_INSTALL_PREFIX=%s' % os.environ['SPACK_PREFIX'],
'-DCMAKE_C_COMPILER=%s' % os.environ['SPACK_CC'], '-DCMAKE_C_COMPILER=%s' % os.environ['SPACK_CC'],
'-DCMAKE_CXX_COMPILER=%s' % os.environ['SPACK_CXX'], '-DCMAKE_CXX_COMPILER=%s' % os.environ['SPACK_CXX'],
'-DCMAKE_Fortran_COMPILER=%s' % os.environ['SPACK_FC']] + \ '-DCMAKE_Fortran_COMPILER=%s' % os.environ['SPACK_FC']]
self.configure_args() cmd += self.configure_args()
env = dict() env = {
env['PATH'] = os.environ['PATH'] 'PATH': os.environ['PATH'],
env['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.spack_transitive_include_path() 'SPACK_TRANSITIVE_INCLUDE_PATH': self.transitive_inc_path(),
env['CMAKE_PREFIX_PATH'] = os.environ['CMAKE_PREFIX_PATH'] 'CMAKE_PREFIX_PATH': os.environ['CMAKE_PREFIX_PATH']
}
setup_fname = 'spconfig.py' setup_fname = 'spconfig.py'
with open(setup_fname, 'w') as fout: with open(setup_fname, 'w') as fout:
fout.write(\ fout.write(r"""#!%s
r"""#!%s
# #
import sys import sys
@ -1639,34 +1649,39 @@ def cmdlist(str):
for name in env_vars: for name in env_vars:
val = env[name] val = env[name]
if string.find(name, 'PATH') < 0: if string.find(name, 'PATH') < 0:
fout.write('env[%s] = %s\n' % (repr(name),repr(val))) fout.write('env[%s] = %s\n' % (repr(name), repr(val)))
else: else:
if name == 'SPACK_TRANSITIVE_INCLUDE_PATH': if name == 'SPACK_TRANSITIVE_INCLUDE_PATH':
sep = ';' sep = ';'
else: else:
sep = ':' sep = ':'
fout.write('env[%s] = "%s".join(cmdlist("""\n' % (repr(name),sep)) fout.write('env[%s] = "%s".join(cmdlist("""\n'
% (repr(name), sep))
for part in string.split(val, sep): for part in string.split(val, sep):
fout.write(' %s\n' % part) fout.write(' %s\n' % part)
fout.write('"""))\n') fout.write('"""))\n')
fout.write("env['CMAKE_TRANSITIVE_INCLUDE_PATH'] = env['SPACK_TRANSITIVE_INCLUDE_PATH'] # Deprecated\n") fout.write("env['CMAKE_TRANSITIVE_INCLUDE_PATH'] = "
"env['SPACK_TRANSITIVE_INCLUDE_PATH'] # Deprecated\n")
fout.write('\ncmd = cmdlist("""\n') fout.write('\ncmd = cmdlist("""\n')
fout.write('%s\n' % cmd[0]) fout.write('%s\n' % cmd[0])
for arg in cmd[1:]: for arg in cmd[1:]:
fout.write(' %s\n' % arg) fout.write(' %s\n' % arg)
fout.write('""") + sys.argv[1:]\n') fout.write('""") + sys.argv[1:]\n')
fout.write('\nproc = subprocess.Popen(cmd, env=env)\nproc.wait()\n') fout.write('\nproc = subprocess.Popen(cmd, env=env)\n')
fout.write('proc.wait()\n')
make_executable(setup_fname) make_executable(setup_fname)
def install_configure(self): def install_configure(self):
cmake = which('cmake') cmake = which('cmake')
with working_dir(self.build_directory, create=True): with working_dir(self.build_directory, create=True):
os.environ.update(self.configure_env()) env = os.environ
os.environ['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.spack_transitive_include_path() env.update(self.configure_env())
options = self.configure_args() + spack.build_environment.get_std_cmake_args(self) env['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.transitive_inc_path()
options = self.configure_args()
options += spack.build_environment.get_std_cmake_args(self)
cmake(self.source_directory, *options) cmake(self.source_directory, *options)
def install_build(self): def install_build(self):

View file

@ -96,7 +96,6 @@
expansion when it is the first character in an id typed on the command line. expansion when it is the first character in an id typed on the command line.
""" """
import sys import sys
import itertools
import hashlib import hashlib
import base64 import base64
import imp import imp
@ -116,8 +115,6 @@
import spack.error import spack.error
import spack.compilers as compilers import spack.compilers as compilers
# TODO: move display_specs to some other location.
from spack.cmd.find import display_specs
from spack.version import * from spack.version import *
from spack.util.string import * from spack.util.string import *
from spack.util.prefix import Prefix from spack.util.prefix import Prefix
@ -155,6 +152,7 @@
every time we call str()""" every time we call str()"""
_any_version = VersionList([':']) _any_version = VersionList([':'])
# Special types of dependencies.
alldeps = ('build', 'link', 'run') alldeps = ('build', 'link', 'run')
nolink = ('build', 'run') nolink = ('build', 'run')
@ -296,10 +294,15 @@ def __repr__(self):
@key_ordering @key_ordering
class DependencySpec(object): class DependencySpec(object):
""" """Dependencies can be one (or more) of several types:
Dependencies have conditions in which they apply.
This stores both what is depended on and why it is a dependency. - build: needs to be in the PATH at build time.
- link: is linked to and added to compiler flags.
- run: needs to be in the PATH for the package to run.
Fields:
- spec: the spack.spec.Spec description of a dependency.
- deptypes: strings representing the type of dependency this is.
""" """
def __init__(self, spec, deptypes): def __init__(self, spec, deptypes):
self.spec = spec self.spec = spec
@ -558,15 +561,15 @@ def dependents(self, deptype=None):
def _find_deps_dict(self, where, deptype): def _find_deps_dict(self, where, deptype):
deptype = self._deptype_norm(deptype) deptype = self._deptype_norm(deptype)
return [(dep.spec.name, dep) return dict((dep.spec.name, dep)
for dep in where.values() for dep in where.values()
if deptype and any(d in deptype for d in dep.deptypes)] if deptype and any(d in deptype for d in dep.deptypes))
def dependencies_dict(self, deptype=None): def dependencies_dict(self, deptype=None):
return dict(self._find_deps_dict(self._dependencies, deptype)) return self._find_deps_dict(self._dependencies, deptype)
def dependents_dict(self, deptype=None): def dependents_dict(self, deptype=None):
return dict(self._find_deps_dict(self._dependents, deptype)) return self._find_deps_dict(self._dependents, deptype)
# #
# Private routines here are called by the parser when building a spec. # Private routines here are called by the parser when building a spec.
@ -644,7 +647,8 @@ def _set_platform(self, value):
mod = imp.load_source(mod_name, path) mod = imp.load_source(mod_name, path)
class_name = mod_to_class(value) class_name = mod_to_class(value)
if not hasattr(mod, class_name): if not hasattr(mod, class_name):
tty.die('No class %s defined in %s' % (class_name, mod_name)) tty.die(
'No class %s defined in %s' % (class_name, mod_name))
cls = getattr(mod, class_name) cls = getattr(mod, class_name)
if not inspect.isclass(cls): if not inspect.isclass(cls):
tty.die('%s.%s is not a class' % (mod_name, class_name)) tty.die('%s.%s is not a class' % (mod_name, class_name))
@ -667,13 +671,15 @@ def _set_platform(self, value):
def _set_os(self, value): def _set_os(self, value):
"""Called by the parser to set the architecture operating system""" """Called by the parser to set the architecture operating system"""
if self.architecture.platform: arch = self.architecture
self.architecture.platform_os = self.architecture.platform.operating_system(value) if arch.platform:
arch.platform_os = arch.platform.operating_system(value)
def _set_target(self, value): def _set_target(self, value):
"""Called by the parser to set the architecture target""" """Called by the parser to set the architecture target"""
if self.architecture.platform: arch = self.architecture
self.architecture.target = self.architecture.platform.target(value) if arch.platform:
arch.target = arch.platform.target(value)
def _add_dependency(self, spec, deptypes): def _add_dependency(self, spec, deptypes):
"""Called by the parser to add another spec as a dependency.""" """Called by the parser to add another spec as a dependency."""
@ -688,7 +694,8 @@ def _add_dependency(self, spec, deptypes):
# #
@property @property
def fullname(self): def fullname(self):
return (('%s.%s' % (self.namespace, self.name)) if self.namespace else return (
('%s.%s' % (self.namespace, self.name)) if self.namespace else
(self.name if self.name else '')) (self.name if self.name else ''))
@property @property
@ -745,15 +752,15 @@ def concrete(self):
if self._concrete: if self._concrete:
return True return True
self._concrete = bool(not self.virtual self._concrete = bool(not self.virtual and
and self.namespace is not None self.namespace is not None and
and self.versions.concrete self.versions.concrete and
and self.variants.concrete self.variants.concrete and
and self.architecture self.architecture and
and self.architecture.concrete self.architecture.concrete and
and self.compiler and self.compiler.concrete self.compiler and self.compiler.concrete and
and self.compiler_flags.concrete self.compiler_flags.concrete and
and self._dependencies.concrete) self._dependencies.concrete)
return self._concrete return self._concrete
def traverse(self, visited=None, deptype=None, **kwargs): def traverse(self, visited=None, deptype=None, **kwargs):
@ -914,9 +921,11 @@ def to_node_dict(self):
d = { d = {
'parameters': params, 'parameters': params,
'arch': self.architecture, 'arch': self.architecture,
'dependencies': dict((d, (deps[d].spec.dag_hash(), 'dependencies': dict(
deps[d].deptypes)) (name, {
for d in sorted(deps.keys())) 'hash': dspec.spec.dag_hash(),
'type': [str(s) for s in dspec.deptypes]})
for name, dspec in deps.items())
} }
# Older concrete specs do not have a namespace. Omit for # Older concrete specs do not have a namespace. Omit for
@ -982,13 +991,33 @@ def from_node_dict(node):
raise SpackRecordError( raise SpackRecordError(
"Did not find a valid format for variants in YAML file") "Did not find a valid format for variants in YAML file")
# XXX(deptypes): why are dependencies not meant to be read here? # Don't read dependencies here; from_node_dict() is used by
#for name, dep_info in node['dependencies'].items(): # from_yaml() to read the root *and* each dependency spec.
# (dag_hash, deptypes) = dep_info
# spec._dependencies[name] = DependencySpec(dag_hash, deptypes)
return spec return spec
@staticmethod
def read_yaml_dep_specs(dependency_dict):
"""Read the DependencySpec portion of a YAML-formatted Spec.
This needs to be backward-compatible with older spack spec
formats so that reindex will work on old specs/databases.
"""
for dep_name, elt in dependency_dict.items():
if isinstance(elt, basestring):
# original format, elt is just the dependency hash.
dag_hash, deptypes = elt, ['build', 'link']
elif isinstance(elt, tuple):
# original deptypes format: (used tuples, not future-proof)
dag_hash, deptypes = elt
elif isinstance(elt, 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.")
yield dep_name, dag_hash, list(deptypes)
@staticmethod @staticmethod
def from_yaml(stream): def from_yaml(stream):
"""Construct a spec from YAML. """Construct a spec from YAML.
@ -1000,27 +1029,30 @@ def from_yaml(stream):
represent more than the DAG does. represent more than the DAG does.
""" """
deps = {}
spec = None
try: try:
yfile = yaml.load(stream) yfile = yaml.load(stream)
except MarkedYAMLError, e: except MarkedYAMLError, e:
raise SpackYAMLError("error parsing YAML spec:", str(e)) raise SpackYAMLError("error parsing YAML spec:", str(e))
for node in yfile['spec']: nodes = yfile['spec']
name = next(iter(node))
dep = Spec.from_node_dict(node)
if not spec:
spec = dep
deps[dep.name] = dep
for node in yfile['spec']: # Read nodes out of list. Root spec is the first element;
# 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.")
deps = dict((spec.name, spec) for spec in dep_list)
spec = dep_list[0]
for node in nodes:
# get dependency dict from the node.
name = next(iter(node)) name = next(iter(node))
for dep_name, (dep, deptypes) in \ yaml_deps = node[name]['dependencies']
node[name]['dependencies'].items(): for dname, dhash, dtypes in Spec.read_yaml_dep_specs(yaml_deps):
deps[name]._dependencies[dep_name] = \ # Fill in dependencies by looking them up by name in deps dict
DependencySpec(deps[dep_name], deptypes) deps[name]._dependencies[dname] = DependencySpec(
deps[dname], set(dtypes))
return spec return spec
def _concretize_helper(self, presets=None, visited=None): def _concretize_helper(self, presets=None, visited=None):
@ -1171,14 +1203,16 @@ def _expand_virtual_packages(self):
def feq(cfield, sfield): def feq(cfield, sfield):
return (not cfield) or (cfield == sfield) return (not cfield) or (cfield == sfield)
if replacement is spec or (feq(replacement.name, spec.name) and if replacement is spec or (
feq(replacement.name, spec.name) and
feq(replacement.versions, spec.versions) and feq(replacement.versions, spec.versions) and
feq(replacement.compiler, spec.compiler) and feq(replacement.compiler, spec.compiler) and
feq(replacement.architecture, spec.architecture) and feq(replacement.architecture, spec.architecture) and
feq(replacement._dependencies, spec._dependencies) and feq(replacement._dependencies, spec._dependencies) and
feq(replacement.variants, spec.variants) and feq(replacement.variants, spec.variants) and
feq(replacement.external, spec.external) and feq(replacement.external, spec.external) and
feq(replacement.external_module, spec.external_module)): feq(replacement.external_module,
spec.external_module)):
continue continue
# Refine this spec to the candidate. This uses # Refine this spec to the candidate. This uses
# replace_with AND dup so that it can work in # replace_with AND dup so that it can work in
@ -1235,10 +1269,10 @@ def concretize(self):
if s.namespace is None: if s.namespace is None:
s.namespace = spack.repo.repo_for_pkg(s.name).namespace s.namespace = spack.repo.repo_for_pkg(s.name).namespace
for s in self.traverse(root=False): for s in self.traverse(root=False):
if s.external_module: if s.external_module:
compiler = spack.compilers.compiler_for_spec(s.compiler, s.architecture) compiler = spack.compilers.compiler_for_spec(
s.compiler, s.architecture)
for mod in compiler.modules: for mod in compiler.modules:
load_module(mod) load_module(mod)
@ -1505,13 +1539,13 @@ def normalize(self, force=False):
# Ensure first that all packages & compilers in the DAG exist. # Ensure first that all packages & compilers in the DAG exist.
self.validate_names() self.validate_names()
# Get all the dependencies into one DependencyMap # Get all the dependencies into one DependencyMap
spec_deps = self.flat_dependencies_with_deptype(copy=False, spec_deps = self.flat_dependencies_with_deptype(
deptype_query=alldeps) copy=False, deptype_query=alldeps)
# Initialize index of virtual dependency providers if # Initialize index of virtual dependency providers if
# concretize didn't pass us one already # concretize didn't pass us one already
provider_index = ProviderIndex([s.spec for s in spec_deps.values()], provider_index = ProviderIndex(
restrict=True) [s.spec for s in spec_deps.values()], restrict=True)
# traverse the package DAG and fill out dependencies according # traverse the package DAG and fill out dependencies according
# to package files & their 'when' specs # to package files & their 'when' specs
@ -1584,20 +1618,17 @@ def constrain(self, other, deps=True):
other.variants[v]) other.variants[v])
# TODO: Check out the logic here # TODO: Check out the logic here
if self.architecture is not None and other.architecture is not None: sarch, oarch = self.architecture, other.architecture
if self.architecture.platform is not None and other.architecture.platform is not None: if sarch is not None and oarch is not None:
if self.architecture.platform != other.architecture.platform: if sarch.platform is not None and oarch.platform is not None:
raise UnsatisfiableArchitectureSpecError(self.architecture, if sarch.platform != oarch.platform:
other.architecture) raise UnsatisfiableArchitectureSpecError(sarch, oarch)
if self.architecture.platform_os is not None and other.architecture.platform_os is not None: if sarch.platform_os is not None and oarch.platform_os is not None:
if self.architecture.platform_os != other.architecture.platform_os: if sarch.platform_os != oarch.platform_os:
raise UnsatisfiableArchitectureSpecError(self.architecture, raise UnsatisfiableArchitectureSpecError(sarch, oarch)
other.architecture) if sarch.target is not None and oarch.target is not None:
if self.architecture.target is not None and other.architecture.target is not None: if sarch.target != oarch.target:
if self.architecture.target != other.architecture.target: raise UnsatisfiableArchitectureSpecError(sarch, oarch)
raise UnsatisfiableArchitectureSpecError(self.architecture,
other.architecture)
changed = False changed = False
if self.compiler is not None and other.compiler is not None: if self.compiler is not None and other.compiler is not None:
@ -1612,15 +1643,16 @@ def constrain(self, other, deps=True):
changed |= self.compiler_flags.constrain(other.compiler_flags) changed |= self.compiler_flags.constrain(other.compiler_flags)
old = str(self.architecture) old = str(self.architecture)
if self.architecture is None or other.architecture is None: sarch, oarch = self.architecture, other.architecture
self.architecture = self.architecture or other.architecture if sarch is None or other.architecture is None:
self.architecture = sarch or oarch
else: else:
if self.architecture.platform is None or other.architecture.platform is None: if sarch.platform is None or oarch.platform is None:
self.architecture.platform = self.architecture.platform or other.architecture.platform self.architecture.platform = sarch.platform or oarch.platform
if self.architecture.platform_os is None or other.architecture.platform_os is None: if sarch.platform_os is None or oarch.platform_os is None:
self.architecture.platform_os = self.architecture.platform_os or other.architecture.platform_os sarch.platform_os = sarch.platform_os or oarch.platform_os
if self.architecture.target is None or other.architecture.target is None: if sarch.target is None or oarch.target is None:
self.architecture.target = self.architecture.target or other.architecture.target sarch.target = sarch.target or oarch.target
changed |= (str(self.architecture) != old) changed |= (str(self.architecture) != old)
if deps: if deps:
@ -1751,15 +1783,25 @@ def satisfies(self, other, deps=True, strict=False):
# Architecture satisfaction is currently just string equality. # Architecture satisfaction is currently just string equality.
# If not strict, None means unconstrained. # If not strict, None means unconstrained.
if self.architecture and other.architecture: sarch, oarch = self.architecture, other.architecture
if ((self.architecture.platform and other.architecture.platform and self.architecture.platform != other.architecture.platform) or if sarch and oarch:
(self.architecture.platform_os and other.architecture.platform_os and self.architecture.platform_os != other.architecture.platform_os) or if ((sarch.platform and
(self.architecture.target and other.architecture.target and self.architecture.target != other.architecture.target)): oarch.platform and
sarch.platform != oarch.platform) or
(sarch.platform_os and
oarch.platform_os and
sarch.platform_os != oarch.platform_os) or
(sarch.target and
oarch.target and
sarch.target != oarch.target)):
return False return False
elif strict and ((other.architecture and not self.architecture) or
(other.architecture.platform and not self.architecture.platform) or elif strict and ((oarch and not sarch) or
(other.architecture.platform_os and not self.architecture.platform_os) or (oarch.platform and not sarch.platform) or
(other.architecture.target and not self.architecture.target)): (oarch.platform_os and not sarch.platform_os) or
(oarch.target and not sarch.target)):
return False return False
if not self.compiler_flags.satisfies( if not self.compiler_flags.satisfies(
@ -1841,11 +1883,16 @@ def _dup(self, other, **kwargs):
# We don't count dependencies as changes here # We don't count dependencies as changes here
changed = True changed = True
if hasattr(self, 'name'): if hasattr(self, 'name'):
changed = (self.name != other.name and self.versions != other.versions and \ changed = (self.name != other.name and
self.architecture != other.architecture and self.compiler != other.compiler and \ self.versions != other.versions and
self.variants != other.variants and self._normal != other._normal and \ self.architecture != other.architecture and
self.concrete != other.concrete and self.external != other.external and \ self.compiler != other.compiler and
self.external_module != other.external_module and self.compiler_flags != other.compiler_flags) self.variants != other.variants and
self._normal != other._normal and
self.concrete != other.concrete and
self.external != other.external and
self.external_module != other.external_module and
self.compiler_flags != other.compiler_flags)
# Local node attributes get copied first. # Local node attributes get copied first.
self.name = other.name self.name = other.name
@ -2000,7 +2047,6 @@ def _cmp_node(self):
self.compiler, self.compiler,
self.compiler_flags) self.compiler_flags)
def eq_node(self, other): def eq_node(self, other):
"""Equality with another spec, not including dependencies.""" """Equality with another spec, not including dependencies."""
return self._cmp_node() == other._cmp_node() return self._cmp_node() == other._cmp_node()
@ -2196,41 +2242,39 @@ def write(s, c):
def dep_string(self): def dep_string(self):
return ''.join("^" + dep.format() for dep in self.sorted_deps()) return ''.join("^" + dep.format() for dep in self.sorted_deps())
def __cmp__(self, other): def __cmp__(self, other):
#Package name sort order is not configurable, always goes alphabetical # Package name sort order is not configurable, always goes alphabetical
if self.name != other.name: if self.name != other.name:
return cmp(self.name, other.name) return cmp(self.name, other.name)
#Package version is second in compare order # Package version is second in compare order
pkgname = self.name pkgname = self.name
if self.versions != other.versions: if self.versions != other.versions:
return spack.pkgsort.version_compare(pkgname, return spack.pkgsort.version_compare(
self.versions, other.versions) pkgname, self.versions, other.versions)
#Compiler is third # Compiler is third
if self.compiler != other.compiler: if self.compiler != other.compiler:
return spack.pkgsort.compiler_compare(pkgname, return spack.pkgsort.compiler_compare(
self.compiler, other.compiler) pkgname, self.compiler, other.compiler)
#Variants # Variants
if self.variants != other.variants: if self.variants != other.variants:
return spack.pkgsort.variant_compare(pkgname, return spack.pkgsort.variant_compare(
self.variants, other.variants) pkgname, self.variants, other.variants)
#Target # Target
if self.architecture != other.architecture: if self.architecture != other.architecture:
return spack.pkgsort.architecture_compare(pkgname, return spack.pkgsort.architecture_compare(
self.architecture, other.architecture) pkgname, self.architecture, other.architecture)
#Dependency is not configurable # Dependency is not configurable
if self._dependencies != other._dependencies: if self._dependencies != other._dependencies:
return -1 if self._dependencies < other._dependencies else 1 return -1 if self._dependencies < other._dependencies else 1
#Equal specs # Equal specs
return 0 return 0
def __str__(self): def __str__(self):
return self.format() + self.dep_string() return self.format() + self.dep_string()
@ -2244,12 +2288,14 @@ def tree(self, **kwargs):
indent = kwargs.pop('indent', 0) indent = kwargs.pop('indent', 0)
fmt = kwargs.pop('format', '$_$@$%@+$+$=') fmt = kwargs.pop('format', '$_$@$%@+$+$=')
prefix = kwargs.pop('prefix', None) prefix = kwargs.pop('prefix', None)
deptypes = kwargs.pop('deptypes', ('build', 'link'))
check_kwargs(kwargs, self.tree) check_kwargs(kwargs, self.tree)
out = "" out = ""
cur_id = 0 cur_id = 0
ids = {} ids = {}
for d, node in self.traverse(order='pre', cover=cover, depth=True): for d, node in self.traverse(
order='pre', cover=cover, depth=True, deptypes=deptypes):
if prefix is not None: if prefix is not None:
out += prefix(node) out += prefix(node)
out += " " * indent out += " " * indent
@ -2303,8 +2349,8 @@ def __init__(self):
# Lexer is always the same for every parser. # Lexer is always the same for every parser.
_lexer = SpecLexer() _lexer = SpecLexer()
class SpecParser(spack.parse.Parser):
class SpecParser(spack.parse.Parser):
def __init__(self): def __init__(self):
super(SpecParser, self).__init__(_lexer) super(SpecParser, self).__init__(_lexer)
self.previous = None self.previous = None
@ -2357,8 +2403,8 @@ def do_parse(self):
except spack.parse.ParseError, e: except spack.parse.ParseError, e:
raise SpecParseError(e) raise SpecParseError(e)
# If the spec has an os or a target and no platform, give it
# If the spec has an os or a target and no platform, give it the default platform # the default platform
for spec in specs: for spec in specs:
for s in spec.traverse(): for s in spec.traverse():
if s.architecture.os_string or s.architecture.target_string: if s.architecture.os_string or s.architecture.target_string:

View file

@ -1,7 +1,31 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
""" Test checks if the architecture class is created correctly and also that """ Test checks if the architecture class is created correctly and also that
the functions are looking for the correct architecture name the functions are looking for the correct architecture name
""" """
import unittest import itertools
import os import os
import platform as py_platform import platform as py_platform
import spack import spack
@ -14,9 +38,8 @@
from spack.test.mock_packages_test import * from spack.test.mock_packages_test import *
#class ArchitectureTest(unittest.TestCase):
class ArchitectureTest(MockPackagesTest):
class ArchitectureTest(MockPackagesTest):
def setUp(self): def setUp(self):
super(ArchitectureTest, self).setUp() super(ArchitectureTest, self).setUp()
self.platform = spack.architecture.platform() self.platform = spack.architecture.platform()
@ -36,24 +59,22 @@ def test_dict_functions_for_architecture(self):
self.assertEqual(arch, new_arch) self.assertEqual(arch, new_arch)
self.assertTrue( isinstance(arch, spack.architecture.Arch) ) self.assertTrue(isinstance(arch, spack.architecture.Arch))
self.assertTrue( isinstance(arch.platform, spack.architecture.Platform) ) self.assertTrue(isinstance(arch.platform, spack.architecture.Platform))
self.assertTrue( isinstance(arch.platform_os, self.assertTrue(isinstance(arch.platform_os,
spack.architecture.OperatingSystem) ) spack.architecture.OperatingSystem))
self.assertTrue( isinstance(arch.target, self.assertTrue(isinstance(arch.target,
spack.architecture.Target) ) spack.architecture.Target))
self.assertTrue( isinstance(new_arch, spack.architecture.Arch) ) self.assertTrue(isinstance(new_arch, spack.architecture.Arch))
self.assertTrue( isinstance(new_arch.platform, self.assertTrue(isinstance(new_arch.platform,
spack.architecture.Platform) ) spack.architecture.Platform))
self.assertTrue( isinstance(new_arch.platform_os, self.assertTrue(isinstance(new_arch.platform_os,
spack.architecture.OperatingSystem) ) spack.architecture.OperatingSystem))
self.assertTrue( isinstance(new_arch.target, self.assertTrue(isinstance(new_arch.target,
spack.architecture.Target) ) spack.architecture.Target))
def test_platform(self): def test_platform(self):
output_platform_class = spack.architecture.platform() output_platform_class = spack.architecture.platform()
my_arch_class = None
if os.path.exists('/opt/cray/craype'): if os.path.exists('/opt/cray/craype'):
my_platform_class = CrayXc() my_platform_class = CrayXc()
elif os.path.exists('/bgsys'): elif os.path.exists('/bgsys'):
@ -107,10 +128,11 @@ def test_user_input_combination(self):
combinations = itertools.product(os_list, target_list) combinations = itertools.product(os_list, target_list)
results = [] results = []
for arch in combinations: for arch in combinations:
o,t = arch o, t = arch
spec = Spec("libelf os=%s target=%s" % (o, t)) spec = Spec("libelf os=%s target=%s" % (o, t))
spec.concretize() spec.concretize()
results.append(spec.architecture.platform_os == self.platform.operating_system(o)) results.append(spec.architecture.platform_os ==
self.platform.operating_system(o))
results.append(spec.architecture.target == self.platform.target(t)) results.append(spec.architecture.target == self.platform.target(t))
res = all(results) res = all(results)

View file

@ -18,7 +18,7 @@ if [[ ! $flake8 ]]; then
fi fi
# Check if changed files are flake8 conformant [framework] # Check if changed files are flake8 conformant [framework]
changed=$(git diff --name-only develop... | grep '.py$') changed=$(git diff --name-only --find-renames develop... | grep '.py$')
# Add approved style exemptions to the changed packages. # Add approved style exemptions to the changed packages.
for file in $changed; do for file in $changed; do
@ -26,6 +26,7 @@ for file in $changed; do
cp "$file" "$file~" cp "$file" "$file~"
# Exempt lines with urls and descriptions from overlong line errors. # Exempt lines with urls and descriptions from overlong line errors.
perl -i -pe 's/^(\s*homepage\s*=.*)$/\1 # NOQA: ignore=E501/' $file
perl -i -pe 's/^(\s*url\s*=.*)$/\1 # NOQA: ignore=E501/' $file perl -i -pe 's/^(\s*url\s*=.*)$/\1 # NOQA: ignore=E501/' $file
perl -i -pe 's/^(\s*version\(.*\).*)$/\1 # NOQA: ignore=E501/' $file perl -i -pe 's/^(\s*version\(.*\).*)$/\1 # NOQA: ignore=E501/' $file
perl -i -pe 's/^(\s*variant\(.*\).*)$/\1 # NOQA: ignore=E501/' $file perl -i -pe 's/^(\s*variant\(.*\).*)$/\1 # NOQA: ignore=E501/' $file

View file

@ -57,6 +57,11 @@
######################################################################## ########################################################################
function spack { function spack {
# Zsh does not do word splitting by default, this enables it for this function only
if [ -n "$ZSH_VERSION" ]; then
emulate -L sh
fi
# save raw arguments into an array before butchering them # save raw arguments into an array before butchering them
args=( "$@" ) args=( "$@" )
@ -93,11 +98,18 @@ function spack {
;; ;;
"use"|"unuse"|"load"|"unload") "use"|"unuse"|"load"|"unload")
# Shift any other args for use off before parsing spec. # Shift any other args for use off before parsing spec.
_sp_subcommand_args=""
_sp_module_args="" _sp_module_args=""
if [[ "$1" =~ ^- ]]; then while [[ "$1" =~ ^- ]]; do
_sp_module_args="$1"; shift if [ "$1" = "-r" -o "$1" = "--dependencies" ]; then
_sp_spec="$@" _sp_subcommand_args="$_sp_subcommand_args $1"
else
_sp_module_args="$_sp_module_args $1"
fi fi
shift
done
_sp_spec="$@"
# Here the user has run use or unuse with a spec. Find a matching # Here the user has run use or unuse with a spec. Find a matching
# spec using 'spack module find', then use the appropriate module # spec using 'spack module find', then use the appropriate module
@ -105,19 +117,19 @@ function spack {
# If spack module command comes back with an error, do nothing. # If spack module command comes back with an error, do nothing.
case $_sp_subcommand in case $_sp_subcommand in
"use") "use")
if _sp_full_spec=$(command spack $_sp_flags module find --module-type dotkit $_sp_spec); then if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args --module-type dotkit $_sp_spec); then
use $_sp_module_args $_sp_full_spec use $_sp_module_args $_sp_full_spec
fi ;; fi ;;
"unuse") "unuse")
if _sp_full_spec=$(command spack $_sp_flags module find --module-type dotkit $_sp_spec); then if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args --module-type dotkit $_sp_spec); then
unuse $_sp_module_args $_sp_full_spec unuse $_sp_module_args $_sp_full_spec
fi ;; fi ;;
"load") "load")
if _sp_full_spec=$(command spack $_sp_flags module find --module-type tcl $_sp_spec); then if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args --module-type tcl $_sp_spec); then
module load $_sp_module_args $_sp_full_spec module load $_sp_module_args $_sp_full_spec
fi ;; fi ;;
"unload") "unload")
if _sp_full_spec=$(command spack $_sp_flags module find --module-type tcl $_sp_spec); then if _sp_full_spec=$(command spack $_sp_flags module find $_sp_subcommand_args --module-type tcl $_sp_spec); then
module unload $_sp_module_args $_sp_full_spec module unload $_sp_module_args $_sp_full_spec
fi ;; fi ;;
esac esac

View file

@ -0,0 +1,53 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class Gts(Package):
"""GTS stands for the GNU Triangulated Surface Library.
It is an Open Source Free Software Library intended to provide a set of
useful functions to deal with 3D surfaces meshed with interconnected
triangles. The source code is available free of charge under the Free
Software LGPL license.
The code is written entirely in C with an object-oriented approach
based mostly on the design of GTK+. Careful attention is paid to
performance related issues as the initial goal of GTS is to provide a
simple and efficient library to scientists dealing with 3D computational
surface meshes.
"""
homepage = "http://gts.sourceforge.net/index.html"
url = "http://gts.sourceforge.net/tarballs/gts-snapshot-121130.tar.gz"
version('121130', '023ebb6b13b8707534182a3ef0d12908')
depends_on('glib')
def install(self, spec, prefix):
configure('--prefix={0}'.format(prefix))
make()
make('install')

View file

@ -0,0 +1,76 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class Hmmer(Package):
"""HMMER is used for searching sequence databases for sequence homologs,
and for making sequence alignments. It implements methods using
probabilistic models called profile hidden Markov models (profile HMMs).
"""
homepage = 'http://www.hmmer.org'
url = 'http://eddylab.org/software/hmmer3/3.1b2/hmmer-3.1b2.tar.gz'
version('3.1b2', 'c8c141018bc0ccd7fc37b33f2b945d5f')
version('3.0', '4cf685f3bc524ba5b5cdaaa070a83588')
version('2.4i', 'dab234c87e026ac1de942450750acd20')
version('2.3.2', '5f073340c0cf761288f961a73821228a')
version('2.3.1', 'c724413e5761c630892506698a4716e2')
variant('mpi', default=True, description='Compile with MPI')
variant('gsl', default=False, description='Compile with GSL')
depends_on('mpi', when='+mpi')
depends_on('gsl', when='+gsl')
def url_for_version(self, version):
base_url = 'http://eddylab.org/software'
if version >= Version('3.0'):
return '{0}/hmmer3/{1}/hmmer-{1}.tar.gz'.format(base_url, version)
else:
return '{0}/hmmer/{1}/hmmer-{1}.tar.gz'.format(base_url, version)
def install(self, spec, prefix):
configure_args = [
'--prefix={0}'.format(prefix)
]
if '+gsl' in self.spec:
configure_args.extend([
'--with-gsl',
'LIBS=-lgsl -lgslcblas'
])
if '+mpi' in self.spec:
configure_args.append('--enable-mpi')
configure(*configure_args)
make()
if self.run_tests:
make('check')
make('install')

View file

@ -23,7 +23,9 @@
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
############################################################################## ##############################################################################
from spack import * from spack import *
import os, sys import os
import sys
class Hypre(Package): class Hypre(Package):
"""Hypre is a library of high performance preconditioners that """Hypre is a library of high performance preconditioners that
@ -37,7 +39,7 @@ class Hypre(Package):
version('2.10.0b', '768be38793a35bb5d055905b271f5b8e') version('2.10.0b', '768be38793a35bb5d055905b271f5b8e')
# hypre does not know how to build shared libraries on Darwin # hypre does not know how to build shared libraries on Darwin
variant('shared', default=sys.platform!='darwin', description="Build shared library version (disables static library)") variant('shared', default=(sys.platform != 'darwin'), description="Build shared library version (disables static library)")
# SuperluDist have conflicting headers with those in Hypre # SuperluDist have conflicting headers with those in Hypre
variant('internal-superlu', default=True, description="Use internal Superlu routines") variant('internal-superlu', default=True, description="Use internal Superlu routines")
@ -46,21 +48,26 @@ class Hypre(Package):
depends_on("lapack") depends_on("lapack")
def install(self, spec, prefix): def install(self, spec, prefix):
blas_dir = spec['blas'].prefix os.environ['CC'] = spec['mpi'].mpicc
lapack_dir = spec['lapack'].prefix os.environ['CXX'] = spec['mpi'].mpicxx
mpi_dir = spec['mpi'].prefix os.environ['F77'] = spec['mpi'].mpif77
os.environ['CC'] = os.path.join(mpi_dir, 'bin', 'mpicc')
os.environ['CXX'] = os.path.join(mpi_dir, 'bin', 'mpicxx')
os.environ['F77'] = os.path.join(mpi_dir, 'bin', 'mpif77')
# Since +shared does not build on macOS and also Atlas does not have
# a single static lib to build against, link against shared libs with
# a hope that --whole-archive linker option (or alike) was used
# to command the linker to include whole static libs' content into the
# shared lib
# Note: --with-(lapack|blas)_libs= needs space separated list of names
configure_args = [ configure_args = [
"--prefix=%s" % prefix, '--prefix=%s' % prefix,
"--with-lapack-libs=lapack", '--with-lapack-libs=%s' % to_lib_name(
"--with-lapack-lib-dirs=%s/lib" % lapack_dir, spec['lapack'].lapack_shared_lib),
"--with-blas-libs=blas", '--with-lapack-lib-dirs=%s/lib' % spec['lapack'].prefix,
"--with-blas-lib-dirs=%s/lib" % blas_dir] '--with-blas-libs=%s' % to_lib_name(
spec['blas'].blas_shared_lib),
'--with-blas-lib-dirs=%s/lib' % spec['blas'].prefix
]
if '+shared' in self.spec: if '+shared' in self.spec:
configure_args.append("--enable-shared") configure_args.append("--enable-shared")
@ -76,4 +83,12 @@ def install(self, spec, prefix):
configure(*configure_args) configure(*configure_args)
make() make()
if self.run_tests:
make("check")
make("test")
Executable(join_path('test', 'ij'))()
sstruct = Executable(join_path('test', 'struct'))
sstruct()
sstruct('-in', 'test/sstruct.in.default', '-solver', '40',
'-rhsone')
make("install") make("install")

View file

@ -63,6 +63,7 @@ class Openmpi(Package):
list_url = "http://www.open-mpi.org/software/ompi/" list_url = "http://www.open-mpi.org/software/ompi/"
list_depth = 3 list_depth = 3
version('2.0.0', 'cdacc800cb4ce690c1f1273cb6366674')
version('1.10.3', 'e2fe4513200e2aaa1500b762342c674b') version('1.10.3', 'e2fe4513200e2aaa1500b762342c674b')
version('1.10.2', 'b2f43d9635d2d52826e5ef9feb97fd4c') version('1.10.2', 'b2f43d9635d2d52826e5ef9feb97fd4c')
version('1.10.1', 'f0fcd77ed345b7eafb431968124ba16e') version('1.10.1', 'f0fcd77ed345b7eafb431968124ba16e')
@ -101,6 +102,7 @@ class Openmpi(Package):
provides('mpi@:2.2', when='@1.6.5') provides('mpi@:2.2', when='@1.6.5')
provides('mpi@:3.0', when='@1.7.5:') provides('mpi@:3.0', when='@1.7.5:')
provides('mpi@:3.1', when='@2.0.0:')
depends_on('hwloc') depends_on('hwloc')
depends_on('sqlite', when='+sqlite3') depends_on('sqlite', when='+sqlite3')
@ -169,7 +171,8 @@ def install(self, spec, prefix):
'--with-psm2' if '+psm2' in spec else '--without-psm2', '--with-psm2' if '+psm2' in spec else '--without-psm2',
'--with-mxm' if '+mxm' in spec else '--without-mxm', '--with-mxm' if '+mxm' in spec else '--without-mxm',
# Other options # Other options
'--enable-mpi-thread-multiple' if '+thread_multiple' in spec else '--disable-mpi-thread-multiple', # NOQA: ignore=E501 ('--enable-mpi-thread-multiple' if '+thread_multiple' in spec
else '--disable-mpi-thread-multiple'),
'--with-pmi' if '+pmi' in spec else '--without-pmi', '--with-pmi' if '+pmi' in spec else '--without-pmi',
'--with-sqlite3' if '+sqlite3' in spec else '--without-sqlite3', '--with-sqlite3' if '+sqlite3' in spec else '--without-sqlite3',
'--enable-vt' if '+vt' in spec else '--disable-vt' '--enable-vt' if '+vt' in spec else '--disable-vt'

View file

@ -24,6 +24,7 @@
############################################################################## ##############################################################################
from spack import * from spack import *
class PyNumpy(Package): class PyNumpy(Package):
"""NumPy is the fundamental package for scientific computing with Python. """NumPy is the fundamental package for scientific computing with Python.
It contains among other things: a powerful N-dimensional array object, It contains among other things: a powerful N-dimensional array object,
@ -38,7 +39,6 @@ class PyNumpy(Package):
version('1.9.2', 'a1ed53432dbcd256398898d35bc8e645') version('1.9.2', 'a1ed53432dbcd256398898d35bc8e645')
version('1.9.1', '78842b73560ec378142665e712ae4ad9') version('1.9.1', '78842b73560ec378142665e712ae4ad9')
variant('blas', default=True) variant('blas', default=True)
variant('lapack', default=True) variant('lapack', default=True)
@ -63,6 +63,6 @@ def install(self, spec, prefix):
f.write('[DEFAULT]\n') f.write('[DEFAULT]\n')
f.write('libraries=%s\n' % ','.join(libraries)) f.write('libraries=%s\n' % ','.join(libraries))
f.write('library_dirs=%s\n' % ':'.join(library_dirs)) f.write('library_dirs=%s\n' % ':'.join(library_dirs))
f.write('rpath=%s\n' % ':'.join(library_dirs))
python('setup.py', 'install', '--prefix=%s' % prefix) python('setup.py', 'install', '--prefix=%s' % prefix)

View file

@ -38,16 +38,29 @@ class Python(Package):
homepage = "http://www.python.org" homepage = "http://www.python.org"
url = "http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz" url = "http://www.python.org/ftp/python/2.7.8/Python-2.7.8.tgz"
version('3.5.2', '3fe8434643a78630c61c6464fe2e7e72')
version('3.5.1', 'be78e48cdfc1a7ad90efff146dce6cfe') version('3.5.1', 'be78e48cdfc1a7ad90efff146dce6cfe')
version('3.5.0', 'a56c0c0b45d75a0ec9c6dee933c41c36') version('3.5.0', 'a56c0c0b45d75a0ec9c6dee933c41c36')
version('2.7.11', '6b6076ec9e93f05dd63e47eb9c15728b', preferred=True) version('3.4.3', '4281ff86778db65892c05151d5de738d')
version('3.3.6', 'cdb3cd08f96f074b3f3994ccb51063e9')
version('3.2.6', '23815d82ae706e9b781ca65865353d39')
version('3.1.5', '02196d3fc7bc76bdda68aa36b0dd16ab')
version('2.7.12', '88d61f82e3616a4be952828b3694109d', preferred=True)
version('2.7.11', '6b6076ec9e93f05dd63e47eb9c15728b')
version('2.7.10', 'd7547558fd673bd9d38e2108c6b42521') version('2.7.10', 'd7547558fd673bd9d38e2108c6b42521')
version('2.7.9', '5eebcaa0030dc4061156d3429657fb83') version('2.7.9', '5eebcaa0030dc4061156d3429657fb83')
version('2.7.8', 'd4bca0159acb0b44a781292b5231936f') version('2.7.8', 'd4bca0159acb0b44a781292b5231936f')
extendable = True extendable = True
variant('ucs4', default=False, description='Enable UCS4 unicode strings') variant('ucs4', default=False, description='Enable UCS4 (wide) unicode strings')
# From https://docs.python.org/2/c-api/unicode.html: Python's default
# builds use a 16-bit type for Py_UNICODE and store Unicode values
# internally as UCS2. It is also possible to build a UCS4 version of Python
# (most recent Linux distributions come with UCS4 builds of Python). These
# builds then use a 32-bit type for Py_UNICODE and store Unicode data
# internally as UCS4. Note that UCS2 and UCS4 Python builds are not binary
# compatible.
depends_on("openssl") depends_on("openssl")
depends_on("bzip2") depends_on("bzip2")
@ -85,7 +98,13 @@ def install(self, spec, prefix):
] ]
if '+ucs4' in spec: if '+ucs4' in spec:
if spec.satisfies('@:2.7'):
config_args.append('--enable-unicode=ucs4') config_args.append('--enable-unicode=ucs4')
elif spec.satisfies('@3.0:3.2'):
config_args.append('--with-wide-unicode')
elif spec.satisfies('@3.3:'):
# https://docs.python.org/3.3/whatsnew/3.3.html
raise ValueError('+ucs4 variant not compatible with Python 3.3 and beyond') # NOQA: ignore=E501
if spec.satisfies('@3:'): if spec.satisfies('@3:'):
config_args.append('--without-ensurepip') config_args.append('--without-ensurepip')

View file

@ -0,0 +1,51 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class RGgvis(Package):
"""An implementation of an interactive grammar of graphics, taking the best
parts of 'ggplot2', combining them with the reactive framework from 'shiny'
and web graphics from 'vega'."""
homepage = "http://ggvis.rstudio.com/"
url = "https://cran.r-project.org/src/contrib/ggvis_0.4.2.tar.gz"
list_url = "https://cran.r-project.org/src/contrib/Archive/ggvis"
version('0.4.2', '039f45e5c7f1e0652779163d7d99f922')
extends('R')
depends_on('r-assertthat')
depends_on('r-jsonlite')
depends_on('r-shiny')
depends_on('r-magrittr')
depends_on('r-dplyr')
depends_on('r-lazyeval')
depends_on('r-htmltools')
def install(self, spec, prefix):
R('CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir),
self.stage.source_path)

View file

@ -0,0 +1,44 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class RHtmltools(Package):
"""Tools for HTML generation and output."""
homepage = "https://github.com/rstudio/htmltools"
url = "https://cran.r-project.org/src/contrib/htmltools_0.3.5.tar.gz"
list_url = "https://cran.r-project.org/src/contrib/Archive/htmltools"
version('0.3.5', '5f001aff4a39e329f7342dcec5139724')
extends('R')
depends_on('r-digest')
depends_on('r-rcpp')
def install(self, spec, prefix):
R('CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir),
self.stage.source_path)

View file

@ -0,0 +1,49 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class RHttpuv(Package):
"""Provides low-level socket and protocol support for handling HTTP and
WebSocket requests directly from within R. It is primarily intended as a
building block for other packages, rather than making it particularly easy
to create complete web applications using httpuv alone. httpuv is built on
top of the libuv and http-parser C libraries, both of which were developed
by Joyent, Inc. (See LICENSE file for libuv and http-parser license
information.)"""
homepage = "https://github.com/rstudio/httpuv"
url = "https://cran.r-project.org/src/contrib/httpuv_1.3.3.tar.gz"
list_url = "https://cran.r-project.org/src/contrib/Archive/httpuv"
version('1.3.3', 'c78ae068cf59e949b9791be987bb4489')
extends('R')
depends_on('r-rcpp')
def install(self, spec, prefix):
R('CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir),
self.stage.source_path)

View file

@ -0,0 +1,52 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class RShiny(Package):
"""Makes it incredibly easy to build interactive web applications with R.
Automatic "reactive" binding between inputs and outputs and extensive
pre-built widgets make it possible to build beautiful, responsive, and
powerful applications with minimal effort."""
homepage = "http://shiny.rstudio.com/"
url = "https://cran.r-project.org/src/contrib/shiny_0.13.2.tar.gz"
list_url = "https://cran.r-project.org/src/contrib/Archive/shiny"
version('0.13.2', 'cb5bff7a28ad59ec2883cd0912ca9611')
extends('R')
depends_on('r-httpuv')
depends_on('r-mime')
depends_on('r-jsonlite')
depends_on('r-xtable')
depends_on('r-digest')
depends_on('r-htmltools')
depends_on('r-R6')
def install(self, spec, prefix):
R('CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir),
self.stage.source_path)

View file

@ -0,0 +1,41 @@
##############################################################################
# Copyright (c) 2013-2016, Lawrence Livermore National Security, LLC.
# Produced at the Lawrence Livermore National Laboratory.
#
# This file is part of Spack.
# Created by Todd Gamblin, tgamblin@llnl.gov, All rights reserved.
# LLNL-CODE-647188
#
# For details, see https://github.com/llnl/spack
# Please also see the LICENSE file for our notice and the LGPL.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License (as
# published by the Free Software Foundation) version 2.1, February 1999.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the IMPLIED WARRANTY OF
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the terms and
# conditions of the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
##############################################################################
from spack import *
class RXtable(Package):
"""Coerce data to LaTeX and HTML tables."""
homepage = "http://xtable.r-forge.r-project.org/"
url = "https://cran.r-project.org/src/contrib/xtable_1.8-2.tar.gz"
list_url = "https://cran.r-project.org/src/contrib/Archive/xtable"
version('1.8-2', '239e4825cd046156a67efae3aac01d86')
extends('R')
def install(self, spec, prefix):
R('CMD', 'INSTALL', '--library={0}'.format(self.module.r_lib_dir),
self.stage.source_path)

View file

@ -71,6 +71,7 @@ def install(self, spec, prefix):
# Configure and install # Configure and install
options = ['--prefix=%s' % prefix, options = ['--prefix=%s' % prefix,
'--enable-mpi' if '+mpi' in spec else '--disable-mpi', '--enable-mpi' if '+mpi' in spec else '--disable-mpi',
'--with-metis={0}'.format(spec['metis'].prefix),
'--enable-optimization'] '--enable-optimization']
configure(*options) configure(*options)
make() make()

View file

@ -118,6 +118,7 @@ def install(self, spec, prefix):
options.extend(std_cmake_args) options.extend(std_cmake_args)
mpi_bin = spec['mpi'].prefix.bin mpi_bin = spec['mpi'].prefix.bin
# Note: -DXYZ_LIBRARY_NAMES= needs semicolon separated list of names
options.extend([ options.extend([
'-DTrilinos_ENABLE_ALL_PACKAGES:BOOL=ON', '-DTrilinos_ENABLE_ALL_PACKAGES:BOOL=ON',
'-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES:BOOL=ON', '-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES:BOOL=ON',
@ -131,10 +132,12 @@ def install(self, spec, prefix):
'-DTPL_ENABLE_MPI:BOOL=ON', '-DTPL_ENABLE_MPI:BOOL=ON',
'-DMPI_BASE_DIR:PATH=%s' % spec['mpi'].prefix, '-DMPI_BASE_DIR:PATH=%s' % spec['mpi'].prefix,
'-DTPL_ENABLE_BLAS=ON', '-DTPL_ENABLE_BLAS=ON',
'-DBLAS_LIBRARY_NAMES=blas', # FIXME: don't hardcode names '-DBLAS_LIBRARY_NAMES=%s' % to_lib_name(
spec['blas'].blas_shared_lib),
'-DBLAS_LIBRARY_DIRS=%s' % spec['blas'].prefix.lib, '-DBLAS_LIBRARY_DIRS=%s' % spec['blas'].prefix.lib,
'-DTPL_ENABLE_LAPACK=ON', '-DTPL_ENABLE_LAPACK=ON',
'-DLAPACK_LIBRARY_NAMES=lapack', '-DLAPACK_LIBRARY_NAMES=%s' % to_lib_name(
spec['lapack'].lapack_shared_lib),
'-DLAPACK_LIBRARY_DIRS=%s' % spec['lapack'].prefix, '-DLAPACK_LIBRARY_DIRS=%s' % spec['lapack'].prefix,
'-DTrilinos_ENABLE_EXPLICIT_INSTANTIATION:BOOL=ON', '-DTrilinos_ENABLE_EXPLICIT_INSTANTIATION:BOOL=ON',
'-DTrilinos_ENABLE_CXX11:BOOL=ON', '-DTrilinos_ENABLE_CXX11:BOOL=ON',