Merge branch 'develop' of https://github.com/LLNL/spack into features/module_refresh
Conflicts: share/spack/setup-env.sh
This commit is contained in:
		| @@ -183,7 +183,7 @@ To uninstall a package and every package that depends on it, you may give the | ||||
|  | ||||
|    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. | ||||
|  | ||||
| A line like | ||||
| @@ -547,7 +547,8 @@ boolean variants | ||||
| * ``name=<value>`` Optional compiler flag specifiers. Valid flag names are | ||||
|   ``cflags``, ``cxxflags``, ``fflags``, ``cppflags``, ``ldflags``, and ``ldlibs``. | ||||
| * ``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 | ||||
| recursively defined.  That is, each dependency after ``^`` is a spec | ||||
|   | ||||
| @@ -2629,12 +2629,12 @@ variant names are: | ||||
|  | ||||
|   ======= ======== ======================== | ||||
|   Name    Default   Description | ||||
| ------- -------- ------------------------ | ||||
|   ======= ======== ======================== | ||||
|   shared   True     Build shared libraries | ||||
|   static            Build static libraries | ||||
|   mpi               Use MPI | ||||
|   python            Build Python extension | ||||
| ------- -------- ------------------------ | ||||
|   ======= ======== ======================== | ||||
|  | ||||
| If specified in this table, the corresponding default should be used | ||||
| when declaring a variant. | ||||
|   | ||||
| @@ -42,7 +42,7 @@ | ||||
|            'FileFilter', 'change_sed_delimiter', 'is_exe', 'force_symlink', | ||||
|            'set_executable', 'copy_mode', 'unset_executable_mode', | ||||
|            '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): | ||||
| @@ -431,6 +431,13 @@ def fix_darwin_install_name(path): | ||||
|                     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): | ||||
|     """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. | ||||
|     """ | ||||
|     dir  = os.path.dirname(library) | ||||
|     # Assume libXYZ.suffix | ||||
|     name = os.path.basename(library)[3:].split(".")[0] | ||||
|     name = to_lib_name(library) | ||||
|     res = '-L%s -l%s' % (dir, name) | ||||
|     return res | ||||
|  | ||||
|   | ||||
| @@ -142,9 +142,9 @@ def __call__(self, stage): | ||||
|         # Build dependencies and extensions | ||||
|         dependenciesDict = { | ||||
|             'autotools': "# depends_on('foo')", | ||||
|             'cmake':     "depends_on('cmake')", | ||||
|             'scons':     "depends_on('scons')", | ||||
|             'python':    "extends('python')", | ||||
|             'cmake':     "depends_on('cmake', type='build')", | ||||
|             'scons':     "depends_on('scons', type='build')", | ||||
|             'python':    "extends('python', type=nolink)", | ||||
|             'R':         "extends('R')", | ||||
|             'unknown':   "# depends_on('foo')" | ||||
|         } | ||||
|   | ||||
| @@ -29,9 +29,11 @@ | ||||
|  | ||||
| description = "Get detailed information on a particular package" | ||||
|  | ||||
|  | ||||
| def padder(str_list, extra=0): | ||||
|     """Return a function to pad elements of a list.""" | ||||
|     length = max(len(str(s)) for s in str_list) + extra | ||||
|  | ||||
|     def pad(string): | ||||
|         string = str(string) | ||||
|         padding = max(0, length - len(string)) | ||||
| @@ -40,7 +42,8 @@ def pad(string): | ||||
|  | ||||
|  | ||||
| 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): | ||||
| @@ -84,7 +87,7 @@ def print_text_info(pkg): | ||||
|     for deptype in ('build', 'link', 'run'): | ||||
|         print | ||||
|         print "%s Dependencies:" % deptype.capitalize() | ||||
|         deps = pkg.dependencies(deptype) | ||||
|         deps = pkg.dependencies_of_type(deptype) | ||||
|         if deps: | ||||
|             colify(deps, indent=4) | ||||
|         else: | ||||
|   | ||||
| @@ -60,7 +60,7 @@ | ||||
| _db_dirname = '.spack-db' | ||||
|  | ||||
| # 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. | ||||
| _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 | ||||
|         # form a full spec. | ||||
|         if 'dependencies' in spec_dict[spec.name]: | ||||
|             for dep in spec_dict[spec.name]['dependencies'].values(): | ||||
|                 if type(dep) == tuple: | ||||
|                     dep_hash, deptypes = dep | ||||
|                 else: | ||||
|                     dep_hash = dep | ||||
|                     deptypes = spack.alldeps | ||||
|                 child = self._read_spec_from_yaml(dep_hash, installs, hash_key) | ||||
|                 spec._add_dependency(child, deptypes) | ||||
|             yaml_deps = spec_dict[spec.name]['dependencies'] | ||||
|             for dname, dhash, dtypes in Spec.read_yaml_dep_specs(yaml_deps): | ||||
|                 child = self._read_spec_from_yaml(dhash, installs, hash_key) | ||||
|                 spec._add_dependency(child, dtypes) | ||||
|  | ||||
|         # Specs from the database need to be marked concrete because | ||||
|         # they represent actual installations. | ||||
| @@ -639,13 +635,14 @@ def _exit(self): | ||||
| class CorruptDatabaseError(SpackError): | ||||
|     def __init__(self, path, msg=''): | ||||
|         super(CorruptDatabaseError, self).__init__( | ||||
|             "Spack database is corrupt: %s.  %s." + \ | ||||
|             "Try running `spack reindex` to fix." % (path, msg)) | ||||
|             "Spack database is corrupt: %s.  %s." % (path, msg), | ||||
|             "Try running `spack reindex` to fix.") | ||||
|  | ||||
|  | ||||
| class InvalidDatabaseVersionError(SpackError): | ||||
|     def __init__(self, expected, found): | ||||
|         super(InvalidDatabaseVersionError, self).__init__( | ||||
|             "Expected database version %s but found version %s." + \ | ||||
|             "Try running `spack reindex` to fix." % | ||||
|             (expected, found)) | ||||
|             "Expected database version %s but found version %s." | ||||
|             % (expected, found), | ||||
|             "`spack reindex` may fix this, or you may need a newer " | ||||
|             "Spack version.") | ||||
|   | ||||
| @@ -34,6 +34,7 @@ | ||||
| import llnl.util.tty as tty | ||||
| from llnl.util.filesystem import join_path, mkdirp | ||||
|  | ||||
| import spack | ||||
| from spack.spec import Spec | ||||
| from spack.error import SpackError | ||||
|  | ||||
| @@ -223,8 +224,14 @@ def write_spec(self, spec, path): | ||||
|  | ||||
|     def read_spec(self, path): | ||||
|         """Read the contents of a file and parse them as a spec""" | ||||
|         try: | ||||
|             with open(path) as 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 | ||||
|         spec._mark_concrete() | ||||
| @@ -456,10 +463,12 @@ def __init__(self, path): | ||||
|             "Install path %s already exists!") | ||||
|  | ||||
|  | ||||
| class SpecReadError(DirectoryLayoutError): | ||||
|     """Raised when directory layout can't read a spec.""" | ||||
|  | ||||
|  | ||||
| class InvalidExtensionSpecError(DirectoryLayoutError): | ||||
|     """Raised when an extension file has a bad spec in it.""" | ||||
|     def __init__(self, message): | ||||
|         super(InvalidExtensionSpecError, self).__init__(message) | ||||
|  | ||||
|  | ||||
| class ExtensionAlreadyInstalledError(DirectoryLayoutError): | ||||
|   | ||||
| @@ -37,7 +37,6 @@ | ||||
| import re | ||||
| import textwrap | ||||
| import time | ||||
| import glob | ||||
| import string | ||||
|  | ||||
| import llnl.util.tty as tty | ||||
| @@ -62,10 +61,10 @@ | ||||
| from spack.stage import Stage, ResourceStage, StageComposite | ||||
| from spack.util.compression import allowed_archive | ||||
| 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 import directory_layout | ||||
| from urlparse import urlparse | ||||
|  | ||||
|  | ||||
| """Allowed URL schemes for spack packages.""" | ||||
| _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 os.path.dirname(self.module.__file__) | ||||
|  | ||||
|  | ||||
|     @property | ||||
|     def global_license_dir(self): | ||||
|         """Returns the directory where global license files for all | ||||
| @@ -565,6 +563,11 @@ def fetcher(self): | ||||
|     def fetcher(self, 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 | ||||
|     def extendee_spec(self): | ||||
|         """ | ||||
| @@ -761,7 +764,6 @@ def do_fetch(self, mirror_only=False): | ||||
|  | ||||
|         self.stage.cache_local() | ||||
|  | ||||
|  | ||||
|     def do_stage(self, mirror_only=False): | ||||
|         """Unpacks the fetched tarball, then changes into the expanded tarball | ||||
|            directory.""" | ||||
| @@ -879,6 +881,7 @@ def _resource_stage(self, resource): | ||||
|         return resource_stage_folder | ||||
|  | ||||
|     install_phases = set(['configure', 'build', 'install', 'provenance']) | ||||
|  | ||||
|     def do_install(self, | ||||
|                    keep_prefix=False, | ||||
|                    keep_stage=False, | ||||
| @@ -911,7 +914,8 @@ def do_install(self, | ||||
|         run_tests   -- Runn tests within the package's install() | ||||
|         """ | ||||
|         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 | ||||
|         if self.spec.external: | ||||
| @@ -920,7 +924,8 @@ def do_install(self, | ||||
|             return | ||||
|  | ||||
|         # 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)) | ||||
|             rec = spack.installed_db.get_record(self.spec) | ||||
|             if (not rec.explicit) and explicit: | ||||
| @@ -1001,20 +1006,17 @@ def build_process(): | ||||
|                     if 'install' in self.install_phases: | ||||
|                         self.sanity_check_prefix() | ||||
|  | ||||
|  | ||||
|                     # Copy provenance into the install directory on success | ||||
|                     if 'provenance' in self.install_phases: | ||||
|                         log_install_path = spack.install_layout.build_log_path( | ||||
|                             self.spec) | ||||
|                         env_install_path = spack.install_layout.build_env_path( | ||||
|                             self.spec) | ||||
|                         packages_dir = spack.install_layout.build_packages_path( | ||||
|                             self.spec) | ||||
|                         log_install_path = layout.build_log_path(self.spec) | ||||
|                         env_install_path = layout.build_env_path(self.spec) | ||||
|                         packages_dir = layout.build_packages_path(self.spec) | ||||
|  | ||||
|                         # Remove first if we're overwriting another build | ||||
|                         # (can happen with spack setup) | ||||
|                         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: | ||||
|                             pass | ||||
|  | ||||
| @@ -1041,7 +1043,7 @@ def build_process(): | ||||
|         except directory_layout.InstallDirectoryAlreadyExistsError: | ||||
|             if 'install' in install_phases: | ||||
|                 # 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.") | ||||
|                 raise | ||||
|             else: | ||||
| @@ -1533,24 +1535,29 @@ def _hms(seconds): | ||||
|         parts.append("%.2fs" % s) | ||||
|     return ' '.join(parts) | ||||
|  | ||||
|  | ||||
| class StagedPackage(Package): | ||||
|     """A Package subclass where the install() is split up into stages.""" | ||||
|  | ||||
|     def install_setup(self): | ||||
|         """Creates an spack_setup.py script to configure the package later if we like.""" | ||||
|         raise InstallError("Package %s provides no install_setup() method!" % self.name) | ||||
|         """Creates a spack_setup.py script to configure the package later.""" | ||||
|         raise InstallError( | ||||
|             "Package %s provides no install_setup() method!" % self.name) | ||||
|  | ||||
|     def install_configure(self): | ||||
|         """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): | ||||
|         """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): | ||||
|         """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): | ||||
|         if 'setup' in self.install_phases: | ||||
| @@ -1567,9 +1574,10 @@ def install(self, spec, prefix): | ||||
|         else: | ||||
|             # Create a dummy file so the build doesn't fail. | ||||
|             # 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 | ||||
|  | ||||
|  | ||||
| # stackoverflow.com/questions/12791997/how-do-you-do-a-simple-chmod-x-from-within-python | ||||
| def make_executable(path): | ||||
|     mode = os.stat(path).st_mode | ||||
| @@ -1577,9 +1585,7 @@ def make_executable(path): | ||||
|     os.chmod(path, mode) | ||||
|  | ||||
|  | ||||
|  | ||||
| class CMakePackage(StagedPackage): | ||||
|  | ||||
|     def make_make(self): | ||||
|         import multiprocessing | ||||
|         # number of jobs spack will to build with. | ||||
| @@ -1593,37 +1599,41 @@ def make_make(self): | ||||
|         return make | ||||
|  | ||||
|     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() | ||||
|  | ||||
|     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() | ||||
|  | ||||
|     def spack_transitive_include_path(self): | ||||
|     def transitive_inc_path(self): | ||||
|         return ';'.join( | ||||
|             os.path.join(dep, 'include') | ||||
|             for dep in os.environ['SPACK_DEPENDENCIES'].split(os.pathsep) | ||||
|         ) | ||||
|  | ||||
|     def install_setup(self): | ||||
|         cmd = [str(which('cmake'))] + \ | ||||
|             spack.build_environment.get_std_cmake_args(self) + \ | ||||
|             ['-DCMAKE_INSTALL_PREFIX=%s' % os.environ['SPACK_PREFIX'], | ||||
|         cmd = [str(which('cmake'))] | ||||
|         cmd += spack.build_environment.get_std_cmake_args(self) | ||||
|         cmd += ['-DCMAKE_INSTALL_PREFIX=%s' % os.environ['SPACK_PREFIX'], | ||||
|                 '-DCMAKE_C_COMPILER=%s' % os.environ['SPACK_CC'], | ||||
|                 '-DCMAKE_CXX_COMPILER=%s' % os.environ['SPACK_CXX'], | ||||
|             '-DCMAKE_Fortran_COMPILER=%s' % os.environ['SPACK_FC']] + \ | ||||
|             self.configure_args() | ||||
|                 '-DCMAKE_Fortran_COMPILER=%s' % os.environ['SPACK_FC']] | ||||
|         cmd += self.configure_args() | ||||
|  | ||||
|         env = dict() | ||||
|         env['PATH'] = os.environ['PATH'] | ||||
|         env['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.spack_transitive_include_path() | ||||
|         env['CMAKE_PREFIX_PATH'] = os.environ['CMAKE_PREFIX_PATH'] | ||||
|         env = { | ||||
|             'PATH': os.environ['PATH'], | ||||
|             'SPACK_TRANSITIVE_INCLUDE_PATH': self.transitive_inc_path(), | ||||
|             'CMAKE_PREFIX_PATH': os.environ['CMAKE_PREFIX_PATH'] | ||||
|         } | ||||
|  | ||||
|         setup_fname = 'spconfig.py' | ||||
|         with open(setup_fname, 'w') as fout: | ||||
|             fout.write(\ | ||||
| r"""#!%s | ||||
|             fout.write(r"""#!%s | ||||
| # | ||||
|  | ||||
| import sys | ||||
| @@ -1646,27 +1656,32 @@ def cmdlist(str): | ||||
|                     else: | ||||
|                         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): | ||||
|                         fout.write('    %s\n' % part) | ||||
|                     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('%s\n' % cmd[0]) | ||||
|             for arg in cmd[1:]: | ||||
|                 fout.write('    %s\n' % arg) | ||||
|             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) | ||||
|  | ||||
|  | ||||
|     def install_configure(self): | ||||
|         cmake = which('cmake') | ||||
|         with working_dir(self.build_directory, create=True): | ||||
|             os.environ.update(self.configure_env()) | ||||
|             os.environ['SPACK_TRANSITIVE_INCLUDE_PATH'] = self.spack_transitive_include_path() | ||||
|             options = self.configure_args() + spack.build_environment.get_std_cmake_args(self) | ||||
|             env = os.environ | ||||
|             env.update(self.configure_env()) | ||||
|             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) | ||||
|  | ||||
|     def install_build(self): | ||||
|   | ||||
| @@ -96,7 +96,6 @@ | ||||
| expansion when it is the first character in an id typed on the command line. | ||||
| """ | ||||
| import sys | ||||
| import itertools | ||||
| import hashlib | ||||
| import base64 | ||||
| import imp | ||||
| @@ -116,8 +115,6 @@ | ||||
| import spack.error | ||||
| 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.util.string import * | ||||
| from spack.util.prefix import Prefix | ||||
| @@ -155,6 +152,7 @@ | ||||
|    every time we call str()""" | ||||
| _any_version = VersionList([':']) | ||||
|  | ||||
| # Special types of dependencies. | ||||
| alldeps = ('build', 'link', 'run') | ||||
| nolink = ('build', 'run') | ||||
|  | ||||
| @@ -296,10 +294,15 @@ def __repr__(self): | ||||
|  | ||||
| @key_ordering | ||||
| class DependencySpec(object): | ||||
|     """ | ||||
|     Dependencies have conditions in which they apply. | ||||
|     """Dependencies can be one (or more) of several types: | ||||
|  | ||||
|     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): | ||||
|         self.spec = spec | ||||
| @@ -558,15 +561,15 @@ def dependents(self, deptype=None): | ||||
|     def _find_deps_dict(self, where, deptype): | ||||
|         deptype = self._deptype_norm(deptype) | ||||
|  | ||||
|         return [(dep.spec.name, dep) | ||||
|         return dict((dep.spec.name, dep) | ||||
|                     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): | ||||
|         return dict(self._find_deps_dict(self._dependencies, deptype)) | ||||
|         return self._find_deps_dict(self._dependencies, deptype) | ||||
|  | ||||
|     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. | ||||
| @@ -644,7 +647,8 @@ def _set_platform(self, value): | ||||
|                 mod = imp.load_source(mod_name, path) | ||||
|                 class_name = mod_to_class(value) | ||||
|                 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) | ||||
|                 if not inspect.isclass(cls): | ||||
|                     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): | ||||
|         """Called by the parser to set the architecture operating system""" | ||||
|         if self.architecture.platform: | ||||
|             self.architecture.platform_os = self.architecture.platform.operating_system(value) | ||||
|         arch = self.architecture | ||||
|         if arch.platform: | ||||
|             arch.platform_os = arch.platform.operating_system(value) | ||||
|  | ||||
|     def _set_target(self, value): | ||||
|         """Called by the parser to set the architecture target""" | ||||
|         if self.architecture.platform: | ||||
|             self.architecture.target = self.architecture.platform.target(value) | ||||
|         arch = self.architecture | ||||
|         if arch.platform: | ||||
|             arch.target = arch.platform.target(value) | ||||
|  | ||||
|     def _add_dependency(self, spec, deptypes): | ||||
|         """Called by the parser to add another spec as a dependency.""" | ||||
| @@ -688,7 +694,8 @@ def _add_dependency(self, spec, deptypes): | ||||
|     # | ||||
|     @property | ||||
|     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 '')) | ||||
|  | ||||
|     @property | ||||
| @@ -745,15 +752,15 @@ def concrete(self): | ||||
|         if self._concrete: | ||||
|             return True | ||||
|  | ||||
|         self._concrete = bool(not self.virtual | ||||
|                               and self.namespace is not None | ||||
|                               and self.versions.concrete | ||||
|                               and self.variants.concrete | ||||
|                               and self.architecture | ||||
|                               and self.architecture.concrete | ||||
|                               and self.compiler and self.compiler.concrete | ||||
|                               and self.compiler_flags.concrete | ||||
|                               and self._dependencies.concrete) | ||||
|         self._concrete = bool(not self.virtual and | ||||
|                               self.namespace is not None and | ||||
|                               self.versions.concrete and | ||||
|                               self.variants.concrete and | ||||
|                               self.architecture and | ||||
|                               self.architecture.concrete and | ||||
|                               self.compiler and self.compiler.concrete and | ||||
|                               self.compiler_flags.concrete and | ||||
|                               self._dependencies.concrete) | ||||
|         return self._concrete | ||||
|  | ||||
|     def traverse(self, visited=None, deptype=None, **kwargs): | ||||
| @@ -914,9 +921,11 @@ def to_node_dict(self): | ||||
|         d = { | ||||
|             'parameters': params, | ||||
|             'arch': self.architecture, | ||||
|             'dependencies': dict((d, (deps[d].spec.dag_hash(), | ||||
|                                       deps[d].deptypes)) | ||||
|                                  for d in sorted(deps.keys())) | ||||
|             'dependencies': dict( | ||||
|                 (name, { | ||||
|                     '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 | ||||
| @@ -982,13 +991,33 @@ def from_node_dict(node): | ||||
|             raise SpackRecordError( | ||||
|                 "Did not find a valid format for variants in YAML file") | ||||
|  | ||||
|         # XXX(deptypes): why are dependencies not meant to be read here? | ||||
|         #for name, dep_info in node['dependencies'].items(): | ||||
|         #    (dag_hash, deptypes) = dep_info | ||||
|         #    spec._dependencies[name] = DependencySpec(dag_hash, deptypes) | ||||
|         # Don't read dependencies here; from_node_dict() is used by | ||||
|         # from_yaml() to read the root *and* each dependency 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 | ||||
|     def from_yaml(stream): | ||||
|         """Construct a spec from YAML. | ||||
| @@ -1000,27 +1029,30 @@ def from_yaml(stream): | ||||
|         represent more than the DAG does. | ||||
|  | ||||
|         """ | ||||
|         deps = {} | ||||
|         spec = None | ||||
|  | ||||
|         try: | ||||
|             yfile = yaml.load(stream) | ||||
|         except MarkedYAMLError, e: | ||||
|             raise SpackYAMLError("error parsing YAML spec:", str(e)) | ||||
|  | ||||
|         for node in yfile['spec']: | ||||
|             name = next(iter(node)) | ||||
|             dep = Spec.from_node_dict(node) | ||||
|             if not spec: | ||||
|                 spec = dep | ||||
|             deps[dep.name] = dep | ||||
|         nodes = yfile['spec'] | ||||
|  | ||||
|         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)) | ||||
|             for dep_name, (dep, deptypes) in \ | ||||
|                     node[name]['dependencies'].items(): | ||||
|                 deps[name]._dependencies[dep_name] = \ | ||||
|                         DependencySpec(deps[dep_name], deptypes) | ||||
|             yaml_deps = node[name]['dependencies'] | ||||
|             for dname, dhash, dtypes in Spec.read_yaml_dep_specs(yaml_deps): | ||||
|                 # Fill in dependencies by looking them up by name in deps dict | ||||
|                 deps[name]._dependencies[dname] = DependencySpec( | ||||
|                     deps[dname], set(dtypes)) | ||||
|  | ||||
|         return spec | ||||
|  | ||||
|     def _concretize_helper(self, presets=None, visited=None): | ||||
| @@ -1171,14 +1203,16 @@ def _expand_virtual_packages(self): | ||||
|                 def feq(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.compiler, spec.compiler) and | ||||
|                         feq(replacement.architecture, spec.architecture) and | ||||
|                         feq(replacement._dependencies, spec._dependencies) and | ||||
|                         feq(replacement.variants, spec.variants) and | ||||
|                         feq(replacement.external, spec.external) and | ||||
|                     feq(replacement.external_module, spec.external_module)): | ||||
|                         feq(replacement.external_module, | ||||
|                             spec.external_module)): | ||||
|                     continue | ||||
|                 # Refine this spec to the candidate. This uses | ||||
|                 # replace_with AND dup so that it can work in | ||||
| @@ -1235,10 +1269,10 @@ def concretize(self): | ||||
|             if s.namespace is None: | ||||
|                 s.namespace = spack.repo.repo_for_pkg(s.name).namespace | ||||
|  | ||||
|  | ||||
|         for s in self.traverse(root=False): | ||||
|             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: | ||||
|                     load_module(mod) | ||||
|  | ||||
| @@ -1505,13 +1539,13 @@ def normalize(self, force=False): | ||||
|         # Ensure first that all packages & compilers in the DAG exist. | ||||
|         self.validate_names() | ||||
|         # Get all the dependencies into one DependencyMap | ||||
|         spec_deps = self.flat_dependencies_with_deptype(copy=False, | ||||
|                                                         deptype_query=alldeps) | ||||
|         spec_deps = self.flat_dependencies_with_deptype( | ||||
|             copy=False, deptype_query=alldeps) | ||||
|  | ||||
|         # Initialize index of virtual dependency providers if | ||||
|         # concretize didn't pass us one already | ||||
|         provider_index = ProviderIndex([s.spec for s in spec_deps.values()], | ||||
|                                        restrict=True) | ||||
|         provider_index = ProviderIndex( | ||||
|             [s.spec for s in spec_deps.values()], restrict=True) | ||||
|  | ||||
|         # traverse the package DAG and fill out dependencies according | ||||
|         # to package files & their 'when' specs | ||||
| @@ -1584,20 +1618,17 @@ def constrain(self, other, deps=True): | ||||
|                                                     other.variants[v]) | ||||
|  | ||||
|         # TODO: Check out the logic here | ||||
|         if self.architecture is not None and other.architecture is not None: | ||||
|             if self.architecture.platform is not None and other.architecture.platform is not None: | ||||
|                 if self.architecture.platform != other.architecture.platform: | ||||
|                     raise UnsatisfiableArchitectureSpecError(self.architecture, | ||||
|                                                              other.architecture) | ||||
|             if self.architecture.platform_os is not None and other.architecture.platform_os is not None: | ||||
|                 if self.architecture.platform_os != other.architecture.platform_os: | ||||
|                     raise UnsatisfiableArchitectureSpecError(self.architecture, | ||||
|                                                              other.architecture) | ||||
|             if self.architecture.target is not None and other.architecture.target is not None: | ||||
|                 if self.architecture.target != other.architecture.target: | ||||
|                     raise UnsatisfiableArchitectureSpecError(self.architecture, | ||||
|                                                              other.architecture) | ||||
|  | ||||
|         sarch, oarch = self.architecture, other.architecture | ||||
|         if sarch is not None and oarch is not None: | ||||
|             if sarch.platform is not None and oarch.platform is not None: | ||||
|                 if sarch.platform != oarch.platform: | ||||
|                     raise UnsatisfiableArchitectureSpecError(sarch, oarch) | ||||
|             if sarch.platform_os is not None and oarch.platform_os is not None: | ||||
|                 if sarch.platform_os != oarch.platform_os: | ||||
|                     raise UnsatisfiableArchitectureSpecError(sarch, oarch) | ||||
|             if sarch.target is not None and oarch.target is not None: | ||||
|                 if sarch.target != oarch.target: | ||||
|                     raise UnsatisfiableArchitectureSpecError(sarch, oarch) | ||||
|  | ||||
|         changed = False | ||||
|         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) | ||||
|  | ||||
|         old = str(self.architecture) | ||||
|         if self.architecture is None or other.architecture is None: | ||||
|             self.architecture = self.architecture or other.architecture | ||||
|         sarch, oarch = self.architecture, other.architecture | ||||
|         if sarch is None or other.architecture is None: | ||||
|             self.architecture = sarch or oarch | ||||
|         else: | ||||
|             if self.architecture.platform is None or other.architecture.platform is None: | ||||
|                 self.architecture.platform = self.architecture.platform or other.architecture.platform | ||||
|             if self.architecture.platform_os is None or other.architecture.platform_os is None: | ||||
|                 self.architecture.platform_os = self.architecture.platform_os or other.architecture.platform_os | ||||
|             if self.architecture.target is None or other.architecture.target is None: | ||||
|                 self.architecture.target = self.architecture.target or other.architecture.target | ||||
|             if sarch.platform is None or oarch.platform is None: | ||||
|                 self.architecture.platform = sarch.platform or oarch.platform | ||||
|             if sarch.platform_os is None or oarch.platform_os is None: | ||||
|                 sarch.platform_os = sarch.platform_os or oarch.platform_os | ||||
|             if sarch.target is None or oarch.target is None: | ||||
|                 sarch.target = sarch.target or oarch.target | ||||
|         changed |= (str(self.architecture) != old) | ||||
|  | ||||
|         if deps: | ||||
| @@ -1751,15 +1783,25 @@ def satisfies(self, other, deps=True, strict=False): | ||||
|  | ||||
|         # Architecture satisfaction is currently just string equality. | ||||
|         # If not strict, None means unconstrained. | ||||
|         if self.architecture and other.architecture: | ||||
|             if ((self.architecture.platform and other.architecture.platform and self.architecture.platform != other.architecture.platform) or | ||||
|                 (self.architecture.platform_os and other.architecture.platform_os and self.architecture.platform_os != other.architecture.platform_os) or | ||||
|                 (self.architecture.target and other.architecture.target and self.architecture.target != other.architecture.target)): | ||||
|         sarch, oarch = self.architecture, other.architecture | ||||
|         if sarch and oarch: | ||||
|             if ((sarch.platform and | ||||
|                  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 | ||||
|         elif strict and ((other.architecture and not self.architecture) or | ||||
|                          (other.architecture.platform and not self.architecture.platform) or | ||||
|                          (other.architecture.platform_os and not self.architecture.platform_os) or | ||||
|                          (other.architecture.target and not self.architecture.target)): | ||||
|  | ||||
|         elif strict and ((oarch and not sarch) or | ||||
|                          (oarch.platform and not sarch.platform) or | ||||
|                          (oarch.platform_os and not sarch.platform_os) or | ||||
|                          (oarch.target and not sarch.target)): | ||||
|             return False | ||||
|  | ||||
|         if not self.compiler_flags.satisfies( | ||||
| @@ -1841,11 +1883,16 @@ def _dup(self, other, **kwargs): | ||||
|         # We don't count dependencies as changes here | ||||
|         changed = True | ||||
|         if hasattr(self, 'name'): | ||||
|             changed = (self.name != other.name and self.versions != other.versions and \ | ||||
|                        self.architecture != other.architecture and self.compiler != other.compiler and \ | ||||
|                        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) | ||||
|             changed = (self.name != other.name and | ||||
|                        self.versions != other.versions and | ||||
|                        self.architecture != other.architecture and | ||||
|                        self.compiler != other.compiler and | ||||
|                        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. | ||||
|         self.name = other.name | ||||
| @@ -2000,7 +2047,6 @@ def _cmp_node(self): | ||||
|                 self.compiler, | ||||
|                 self.compiler_flags) | ||||
|  | ||||
|  | ||||
|     def eq_node(self, other): | ||||
|         """Equality with another spec, not including dependencies.""" | ||||
|         return self._cmp_node() == other._cmp_node() | ||||
| @@ -2196,7 +2242,6 @@ def write(s, c): | ||||
|     def dep_string(self): | ||||
|         return ''.join("^" + dep.format() for dep in self.sorted_deps()) | ||||
|  | ||||
|  | ||||
|     def __cmp__(self, other): | ||||
|         # Package name sort order is not configurable, always goes alphabetical | ||||
|         if self.name != other.name: | ||||
| @@ -2205,23 +2250,23 @@ def __cmp__(self, other): | ||||
|         # Package version is second in compare order | ||||
|         pkgname = self.name | ||||
|         if self.versions != other.versions: | ||||
|             return spack.pkgsort.version_compare(pkgname, | ||||
|                          self.versions, other.versions) | ||||
|             return spack.pkgsort.version_compare( | ||||
|                 pkgname, self.versions, other.versions) | ||||
|  | ||||
|         # Compiler is third | ||||
|         if self.compiler != other.compiler: | ||||
|             return spack.pkgsort.compiler_compare(pkgname, | ||||
|                          self.compiler, other.compiler) | ||||
|             return spack.pkgsort.compiler_compare( | ||||
|                 pkgname, self.compiler, other.compiler) | ||||
|  | ||||
|         # Variants | ||||
|         if self.variants != other.variants: | ||||
|             return spack.pkgsort.variant_compare(pkgname, | ||||
|                          self.variants, other.variants) | ||||
|             return spack.pkgsort.variant_compare( | ||||
|                 pkgname, self.variants, other.variants) | ||||
|  | ||||
|         # Target | ||||
|         if self.architecture != other.architecture: | ||||
|             return spack.pkgsort.architecture_compare(pkgname, | ||||
|                          self.architecture, other.architecture) | ||||
|             return spack.pkgsort.architecture_compare( | ||||
|                 pkgname, self.architecture, other.architecture) | ||||
|  | ||||
|         # Dependency is not configurable | ||||
|         if self._dependencies != other._dependencies: | ||||
| @@ -2230,7 +2275,6 @@ def __cmp__(self, other): | ||||
|         # Equal specs | ||||
|         return 0 | ||||
|  | ||||
|  | ||||
|     def __str__(self): | ||||
|         return self.format() + self.dep_string() | ||||
|  | ||||
| @@ -2244,12 +2288,14 @@ def tree(self, **kwargs): | ||||
|         indent = kwargs.pop('indent', 0) | ||||
|         fmt = kwargs.pop('format', '$_$@$%@+$+$=') | ||||
|         prefix = kwargs.pop('prefix', None) | ||||
|         deptypes = kwargs.pop('deptypes', ('build', 'link')) | ||||
|         check_kwargs(kwargs, self.tree) | ||||
|  | ||||
|         out = "" | ||||
|         cur_id = 0 | ||||
|         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: | ||||
|                 out += prefix(node) | ||||
|             out += " " * indent | ||||
| @@ -2303,8 +2349,8 @@ def __init__(self): | ||||
| # Lexer is always the same for every parser. | ||||
| _lexer = SpecLexer() | ||||
|  | ||||
| class SpecParser(spack.parse.Parser): | ||||
|  | ||||
| class SpecParser(spack.parse.Parser): | ||||
|     def __init__(self): | ||||
|         super(SpecParser, self).__init__(_lexer) | ||||
|         self.previous = None | ||||
| @@ -2357,8 +2403,8 @@ def do_parse(self): | ||||
|         except spack.parse.ParseError, e: | ||||
|             raise SpecParseError(e) | ||||
|  | ||||
|  | ||||
|         # If the spec has an os or a target and no platform, give it the default platform | ||||
|         # If the spec has an os or a target and no platform, give it | ||||
|         # the default platform | ||||
|         for spec in specs: | ||||
|             for s in spec.traverse(): | ||||
|                 if s.architecture.os_string or s.architecture.target_string: | ||||
|   | ||||
| @@ -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 | ||||
|     the functions are looking for the correct architecture name | ||||
| """ | ||||
| import unittest | ||||
| import itertools | ||||
| import os | ||||
| import platform as py_platform | ||||
| import spack | ||||
| @@ -14,9 +38,8 @@ | ||||
|  | ||||
| from spack.test.mock_packages_test import * | ||||
|  | ||||
| #class ArchitectureTest(unittest.TestCase): | ||||
| class ArchitectureTest(MockPackagesTest): | ||||
|  | ||||
| class ArchitectureTest(MockPackagesTest): | ||||
|     def setUp(self): | ||||
|         super(ArchitectureTest, self).setUp() | ||||
|         self.platform = spack.architecture.platform() | ||||
| @@ -50,10 +73,8 @@ def test_dict_functions_for_architecture(self): | ||||
|         self.assertTrue(isinstance(new_arch.target, | ||||
|                                    spack.architecture.Target)) | ||||
|  | ||||
|  | ||||
|     def test_platform(self): | ||||
|         output_platform_class = spack.architecture.platform() | ||||
|         my_arch_class = None | ||||
|         if os.path.exists('/opt/cray/craype'): | ||||
|             my_platform_class = CrayXc() | ||||
|         elif os.path.exists('/bgsys'): | ||||
| @@ -110,7 +131,8 @@ def test_user_input_combination(self): | ||||
|             o, t = arch | ||||
|             spec = Spec("libelf os=%s target=%s" % (o, t)) | ||||
|             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)) | ||||
|         res = all(results) | ||||
|  | ||||
|   | ||||
| @@ -18,7 +18,7 @@ if [[ ! $flake8 ]]; then | ||||
| fi | ||||
|  | ||||
| # 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. | ||||
| for file in $changed; do | ||||
| @@ -26,6 +26,7 @@ for file in $changed; do | ||||
|         cp "$file" "$file~" | ||||
|  | ||||
|         # 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*version\(.*\).*)$/\1  # NOQA: ignore=E501/' $file | ||||
|         perl -i -pe 's/^(\s*variant\(.*\).*)$/\1  # NOQA: ignore=E501/' $file | ||||
|   | ||||
| @@ -57,6 +57,11 @@ | ||||
| ######################################################################## | ||||
|  | ||||
| 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 | ||||
|     args=( "$@" ) | ||||
|  | ||||
| @@ -93,11 +98,18 @@ function spack { | ||||
|             ;; | ||||
|         "use"|"unuse"|"load"|"unload") | ||||
|             # Shift any other args for use off before parsing spec. | ||||
|             _sp_subcommand_args="" | ||||
|             _sp_module_args="" | ||||
|             if [[ "$1" =~ ^- ]]; then | ||||
|                 _sp_module_args="$1"; shift | ||||
|                 _sp_spec="$@" | ||||
|             while [[ "$1" =~ ^- ]]; do | ||||
|                 if [ "$1" = "-r" -o "$1" = "--dependencies" ]; then | ||||
|                     _sp_subcommand_args="$_sp_subcommand_args $1" | ||||
|                 else | ||||
|                     _sp_module_args="$_sp_module_args $1" | ||||
|                 fi | ||||
|                 shift | ||||
|             done | ||||
|  | ||||
|             _sp_spec="$@" | ||||
|  | ||||
|             # Here the user has run use or unuse with a spec.  Find a matching | ||||
|             # 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. | ||||
|             case $_sp_subcommand in | ||||
|                 "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 | ||||
|                     fi ;; | ||||
|                 "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 | ||||
|                     fi ;; | ||||
|                 "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 | ||||
|                     fi ;; | ||||
|                 "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 | ||||
|                     fi ;; | ||||
|             esac | ||||
|   | ||||
							
								
								
									
										53
									
								
								var/spack/repos/builtin/packages/gts/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								var/spack/repos/builtin/packages/gts/package.py
									
									
									
									
									
										Normal 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') | ||||
							
								
								
									
										76
									
								
								var/spack/repos/builtin/packages/hmmer/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								var/spack/repos/builtin/packages/hmmer/package.py
									
									
									
									
									
										Normal 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') | ||||
| @@ -23,7 +23,9 @@ | ||||
| # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||||
| ############################################################################## | ||||
| from spack import * | ||||
| import os, sys | ||||
| import os | ||||
| import sys | ||||
|  | ||||
|  | ||||
| class Hypre(Package): | ||||
|     """Hypre is a library of high performance preconditioners that | ||||
| @@ -37,7 +39,7 @@ class Hypre(Package): | ||||
|     version('2.10.0b', '768be38793a35bb5d055905b271f5b8e') | ||||
|  | ||||
|     # 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 | ||||
|     variant('internal-superlu', default=True, description="Use internal Superlu routines") | ||||
|  | ||||
| @@ -46,21 +48,26 @@ class Hypre(Package): | ||||
|     depends_on("lapack") | ||||
|  | ||||
|     def install(self, spec, prefix): | ||||
|         blas_dir = spec['blas'].prefix | ||||
|         lapack_dir = spec['lapack'].prefix | ||||
|         mpi_dir = spec['mpi'].prefix | ||||
|  | ||||
|         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') | ||||
|  | ||||
|         os.environ['CC'] = spec['mpi'].mpicc | ||||
|         os.environ['CXX'] = spec['mpi'].mpicxx | ||||
|         os.environ['F77'] = spec['mpi'].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 = [ | ||||
|                 "--prefix=%s" % prefix, | ||||
|                 "--with-lapack-libs=lapack", | ||||
|                 "--with-lapack-lib-dirs=%s/lib" % lapack_dir, | ||||
|                 "--with-blas-libs=blas", | ||||
|                 "--with-blas-lib-dirs=%s/lib" % blas_dir] | ||||
|             '--prefix=%s' % prefix, | ||||
|             '--with-lapack-libs=%s' % to_lib_name( | ||||
|                 spec['lapack'].lapack_shared_lib), | ||||
|             '--with-lapack-lib-dirs=%s/lib' % spec['lapack'].prefix, | ||||
|             '--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: | ||||
|             configure_args.append("--enable-shared") | ||||
|  | ||||
| @@ -76,4 +83,12 @@ def install(self, spec, prefix): | ||||
|             configure(*configure_args) | ||||
|  | ||||
|             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") | ||||
|   | ||||
| @@ -63,6 +63,7 @@ class Openmpi(Package): | ||||
|     list_url = "http://www.open-mpi.org/software/ompi/" | ||||
|     list_depth = 3 | ||||
|  | ||||
|     version('2.0.0', 'cdacc800cb4ce690c1f1273cb6366674') | ||||
|     version('1.10.3', 'e2fe4513200e2aaa1500b762342c674b') | ||||
|     version('1.10.2', 'b2f43d9635d2d52826e5ef9feb97fd4c') | ||||
|     version('1.10.1', 'f0fcd77ed345b7eafb431968124ba16e') | ||||
| @@ -101,6 +102,7 @@ class Openmpi(Package): | ||||
|  | ||||
|     provides('mpi@:2.2', when='@1.6.5') | ||||
|     provides('mpi@:3.0', when='@1.7.5:') | ||||
|     provides('mpi@:3.1', when='@2.0.0:') | ||||
|  | ||||
|     depends_on('hwloc') | ||||
|     depends_on('sqlite', when='+sqlite3') | ||||
| @@ -169,7 +171,8 @@ def install(self, spec, prefix): | ||||
|             '--with-psm2' if '+psm2' in spec else '--without-psm2', | ||||
|             '--with-mxm' if '+mxm' in spec else '--without-mxm', | ||||
|             # 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-sqlite3' if '+sqlite3' in spec else '--without-sqlite3', | ||||
|             '--enable-vt' if '+vt' in spec else '--disable-vt' | ||||
|   | ||||
| @@ -24,6 +24,7 @@ | ||||
| ############################################################################## | ||||
| from spack import * | ||||
|  | ||||
|  | ||||
| class PyNumpy(Package): | ||||
|     """NumPy is the fundamental package for scientific computing with Python. | ||||
|     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.1',  '78842b73560ec378142665e712ae4ad9') | ||||
|  | ||||
|  | ||||
|     variant('blas',   default=True) | ||||
|     variant('lapack', default=True) | ||||
|  | ||||
| @@ -63,6 +63,6 @@ def install(self, spec, prefix): | ||||
|                 f.write('[DEFAULT]\n') | ||||
|                 f.write('libraries=%s\n'    % ','.join(libraries)) | ||||
|                 f.write('library_dirs=%s\n' % ':'.join(library_dirs)) | ||||
|                 f.write('rpath=%s\n' % ':'.join(library_dirs)) | ||||
|  | ||||
|         python('setup.py', 'install', '--prefix=%s' % prefix) | ||||
|  | ||||
|   | ||||
| @@ -38,16 +38,29 @@ class Python(Package): | ||||
|     homepage = "http://www.python.org" | ||||
|     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.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.9', '5eebcaa0030dc4061156d3429657fb83') | ||||
|     version('2.7.8', 'd4bca0159acb0b44a781292b5231936f') | ||||
|  | ||||
|     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("bzip2") | ||||
| @@ -85,7 +98,13 @@ def install(self, spec, prefix): | ||||
|         ] | ||||
|  | ||||
|         if '+ucs4' in spec: | ||||
|             if spec.satisfies('@:2.7'): | ||||
|                 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:'): | ||||
|             config_args.append('--without-ensurepip') | ||||
|   | ||||
							
								
								
									
										51
									
								
								var/spack/repos/builtin/packages/r-ggvis/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								var/spack/repos/builtin/packages/r-ggvis/package.py
									
									
									
									
									
										Normal 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) | ||||
							
								
								
									
										44
									
								
								var/spack/repos/builtin/packages/r-htmltools/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								var/spack/repos/builtin/packages/r-htmltools/package.py
									
									
									
									
									
										Normal 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) | ||||
							
								
								
									
										49
									
								
								var/spack/repos/builtin/packages/r-httpuv/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								var/spack/repos/builtin/packages/r-httpuv/package.py
									
									
									
									
									
										Normal 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) | ||||
							
								
								
									
										52
									
								
								var/spack/repos/builtin/packages/r-shiny/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								var/spack/repos/builtin/packages/r-shiny/package.py
									
									
									
									
									
										Normal 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) | ||||
							
								
								
									
										41
									
								
								var/spack/repos/builtin/packages/r-xtable/package.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								var/spack/repos/builtin/packages/r-xtable/package.py
									
									
									
									
									
										Normal 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) | ||||
| @@ -71,6 +71,7 @@ def install(self, spec, prefix): | ||||
|         # Configure and install | ||||
|         options = ['--prefix=%s' % prefix, | ||||
|                    '--enable-mpi' if '+mpi' in spec else '--disable-mpi', | ||||
|                    '--with-metis={0}'.format(spec['metis'].prefix), | ||||
|                    '--enable-optimization'] | ||||
|         configure(*options) | ||||
|         make() | ||||
|   | ||||
| @@ -118,6 +118,7 @@ def install(self, spec, prefix): | ||||
|         options.extend(std_cmake_args) | ||||
|  | ||||
|         mpi_bin = spec['mpi'].prefix.bin | ||||
|         # Note: -DXYZ_LIBRARY_NAMES= needs semicolon separated list of names | ||||
|         options.extend([ | ||||
|             '-DTrilinos_ENABLE_ALL_PACKAGES:BOOL=ON', | ||||
|             '-DTrilinos_ENABLE_ALL_OPTIONAL_PACKAGES:BOOL=ON', | ||||
| @@ -131,10 +132,12 @@ def install(self, spec, prefix): | ||||
|             '-DTPL_ENABLE_MPI:BOOL=ON', | ||||
|             '-DMPI_BASE_DIR:PATH=%s' % spec['mpi'].prefix, | ||||
|             '-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, | ||||
|             '-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, | ||||
|             '-DTrilinos_ENABLE_EXPLICIT_INSTANTIATION:BOOL=ON', | ||||
|             '-DTrilinos_ENABLE_CXX11:BOOL=ON', | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 alalazo
					alalazo