summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTodd Gamblin <tgamblin@llnl.gov>2016-05-10 01:30:13 -0700
committerTodd Gamblin <tgamblin@llnl.gov>2016-05-10 01:30:13 -0700
commit57e495943fd38c07afa52b55c2868d16bcdeac6b (patch)
treef3c40815e992b5501437b5041911e1126ba17f78
parentb1da3664ec5de664f2bf4bf49ddcc083dd6037f1 (diff)
parent2b7b7f6d9758d47bb59b59e92cb2c7e3b785ac51 (diff)
downloadspack-57e495943fd38c07afa52b55c2868d16bcdeac6b.tar.gz
spack-57e495943fd38c07afa52b55c2868d16bcdeac6b.tar.bz2
spack-57e495943fd38c07afa52b55c2868d16bcdeac6b.tar.xz
spack-57e495943fd38c07afa52b55c2868d16bcdeac6b.zip
Merge pull request #757 from glennpj/extend_r
Make R extendable
-rw-r--r--lib/spack/spack/cmd/create.py8
-rw-r--r--lib/spack/spack/url.py3
-rw-r--r--var/spack/repos/builtin/packages/R/package.py59
-rw-r--r--var/spack/repos/builtin/packages/r-BiocGenerics/package.py14
-rw-r--r--var/spack/repos/builtin/packages/r-abind/package.py18
-rw-r--r--var/spack/repos/builtin/packages/r-filehash/package.py22
-rw-r--r--var/spack/repos/builtin/packages/r-magic/package.py19
7 files changed, 141 insertions, 2 deletions
diff --git a/lib/spack/spack/cmd/create.py b/lib/spack/spack/cmd/create.py
index f0cd50b8df..e3a31806ab 100644
--- a/lib/spack/spack/cmd/create.py
+++ b/lib/spack/spack/cmd/create.py
@@ -124,10 +124,12 @@ class ConfigureGuesser(object):
autotools = "configure('--prefix=%s' % prefix)"
cmake = "cmake('.', *std_cmake_args)"
python = "python('setup.py', 'install', '--prefix=%s' % prefix)"
+ r = "R('CMD', 'INSTALL', '--library=%s' % self.module.r_lib_dir, '%s' % self.stage.archive_file)"
config_lines = ((r'/configure$', 'autotools', autotools),
(r'/CMakeLists.txt$', 'cmake', cmake),
- (r'/setup.py$', 'python', python))
+ (r'/setup.py$', 'python', python),
+ (r'/NAMESPACE$', 'r', r))
# Peek inside the tarball.
tar = which('tar')
@@ -272,6 +274,10 @@ def create(parser, args):
if guesser.build_system == 'python':
name = 'py-%s' % name
+ # Prepend 'r-' to R package names, by convention.
+ if guesser.build_system == 'r':
+ name = 'r-%s' % name
+
# Create a directory for the new package.
pkg_path = repo.filename_for_package_name(name)
if os.path.exists(pkg_path) and not args.force:
diff --git a/lib/spack/spack/url.py b/lib/spack/spack/url.py
index f51f05cad7..ad51da9d47 100644
--- a/lib/spack/spack/url.py
+++ b/lib/spack/spack/url.py
@@ -206,6 +206,9 @@ def parse_version_offset(path):
# e.g. lame-398-1
(r'-((\d)+-\d)', stem),
+ # e.g. foobar_1.2-3
+ (r'_((\d+\.)+\d+(-\d+)?[a-z]?)', stem),
+
# e.g. foobar-4.5.1
(r'-((\d+\.)*\d+)$', stem),
diff --git a/var/spack/repos/builtin/packages/R/package.py b/var/spack/repos/builtin/packages/R/package.py
index 2471dff09b..7c4aa3520c 100644
--- a/var/spack/repos/builtin/packages/R/package.py
+++ b/var/spack/repos/builtin/packages/R/package.py
@@ -1,4 +1,14 @@
+import functools
+import glob
+import inspect
+import os
+import re
+from contextlib import closing
+
+import spack
+from llnl.util.lang import match_predicate
from spack import *
+from spack.util.environment import *
class R(Package):
@@ -9,6 +19,8 @@ class R(Package):
"""
homepage = "https://www.r-project.org"
url = "http://cran.cnr.berkeley.edu/src/base/R-3/R-3.1.2.tar.gz"
+
+ extendable = True
version('3.2.3', '1ba3dac113efab69e706902810cc2970')
version('3.2.2', '57cef5c2e210a5454da1979562a10e5b')
@@ -38,12 +50,57 @@ class R(Package):
depends_on('tk')
def install(self, spec, prefix):
+ rlibdir = join_path(prefix, 'rlib')
options = ['--prefix=%s' % prefix,
+ '--libdir=%s' % rlibdir,
'--enable-R-shlib',
- '--enable-BLAS-shlib']
+ '--enable-BLAS-shlib',
+ '--enable-R-framework=no']
if '+external-lapack' in spec:
options.extend(['--with-blas', '--with-lapack'])
configure(*options)
make()
make('install')
+
+ # ========================================================================
+ # Set up environment to make install easy for R extensions.
+ # ========================================================================
+
+ @property
+ def r_lib_dir(self):
+ return os.path.join('rlib', 'R', 'library')
+
+ def setup_dependent_environment(self, spack_env, run_env, extension_spec):
+ # Set R_LIBS to include the library dir for the
+ # extension and any other R extensions it depends on.
+ r_libs_path = []
+ for d in extension_spec.traverse():
+ if d.package.extends(self.spec):
+ r_libs_path.append(os.path.join(d.prefix, self.r_lib_dir))
+
+ r_libs_path = ':'.join(r_libs_path)
+ spack_env.set('R_LIBS', r_libs_path)
+
+ # For run time environment set only the path for extension_spec and prepend it to R_LIBS
+ if extension_spec.package.extends(self.spec):
+ run_env.prepend_path('R_LIBS', os.path.join(extension_spec.prefix, self.r_lib_dir))
+
+
+ def setup_dependent_package(self, module, ext_spec):
+ """
+ Called before R modules' install() methods.
+
+ In most cases, extensions will only need to have one line::
+
+ R('CMD', 'INSTALL', '--library=%s' % self.module.r_lib_dir, '%s' % self.stage.archive_file)
+ """
+ # R extension builds can have a global R executable function
+ module.R = Executable(join_path(self.spec.prefix.bin, 'R'))
+
+ # Add variable for library directry
+ module.r_lib_dir = os.path.join(ext_spec.prefix, self.r_lib_dir)
+
+ # Make the site packages directory for extensions, if it does not exist already.
+ if ext_spec.package.is_extension:
+ mkdirp(module.r_lib_dir)
diff --git a/var/spack/repos/builtin/packages/r-BiocGenerics/package.py b/var/spack/repos/builtin/packages/r-BiocGenerics/package.py
new file mode 100644
index 0000000000..2d92c1c4d8
--- /dev/null
+++ b/var/spack/repos/builtin/packages/r-BiocGenerics/package.py
@@ -0,0 +1,14 @@
+from spack import *
+
+class RBiocgenerics(Package):
+ """S4 generic functions needed by many Bioconductor packages."""
+
+ homepage = 'https://www.bioconductor.org/packages/release/bioc/html/BiocGenerics.html'
+ url = "https://www.bioconductor.org/packages/release/bioc/src/contrib/BiocGenerics_0.16.1.tar.gz"
+
+ version('0.16.1', 'c2148ffd86fc6f1f819c7f68eb2c744f', expand=False)
+
+ extends('R')
+
+ def install(self, spec, prefix):
+ R('CMD', 'INSTALL', '--library=%s' % self.module.r_lib_dir, '%s' % self.stage.archive_file)
diff --git a/var/spack/repos/builtin/packages/r-abind/package.py b/var/spack/repos/builtin/packages/r-abind/package.py
new file mode 100644
index 0000000000..d06c7e9240
--- /dev/null
+++ b/var/spack/repos/builtin/packages/r-abind/package.py
@@ -0,0 +1,18 @@
+from spack import *
+
+class RAbind(Package):
+ """Combine multidimensional arrays into a single array. This is a
+ generalization of 'cbind' and 'rbind'. Works with vectors, matrices, and
+ higher-dimensional arrays. Also provides functions 'adrop', 'asub', and
+ 'afill' for manipulating, extracting and replacing data in arrays."""
+
+ homepage = "https://cran.r-project.org/"
+ url = "https://cran.r-project.org/src/contrib/abind_1.4-3.tar.gz"
+
+ version('1.4-3', '10fcf80c677b991bf263d38be35a1fc5', expand=False)
+
+ extends('R')
+
+ def install(self, spec, prefix):
+
+ R('CMD', 'INSTALL', '--library=%s' % self.module.r_lib_dir, '%s' % self.stage.archive_file)
diff --git a/var/spack/repos/builtin/packages/r-filehash/package.py b/var/spack/repos/builtin/packages/r-filehash/package.py
new file mode 100644
index 0000000000..4911c636b4
--- /dev/null
+++ b/var/spack/repos/builtin/packages/r-filehash/package.py
@@ -0,0 +1,22 @@
+from spack import *
+
+class RFilehash(Package):
+ """Implements a simple key-value style database where character string keys
+ are associated with data values that are stored on the disk. A simple
+ interface is provided for inserting, retrieving, and deleting data from the
+ database. Utilities are provided that allow 'filehash' databases to be
+ treated much like environments and lists are already used in R. These
+ utilities are provided to encourage interactive and exploratory analysis on
+ large datasets. Three different file formats for representing the database
+ are currently available and new formats can easily be incorporated by third
+ parties for use in the 'filehash' framework."""
+
+ homepage = 'https://cran.r-project.org/'
+ url = "https://cran.r-project.org/src/contrib/filehash_2.3.tar.gz"
+
+ version('2.3', '01fffafe09b148ccadc9814c103bdc2f', expand=False)
+
+ extends('R')
+
+ def install(self, spec, prefix):
+ R('CMD', 'INSTALL', '--library=%s' % self.module.r_lib_dir, '%s' % self.stage.archive_file)
diff --git a/var/spack/repos/builtin/packages/r-magic/package.py b/var/spack/repos/builtin/packages/r-magic/package.py
new file mode 100644
index 0000000000..e900cdb216
--- /dev/null
+++ b/var/spack/repos/builtin/packages/r-magic/package.py
@@ -0,0 +1,19 @@
+from spack import *
+
+class RMagic(Package):
+ """A collection of efficient, vectorized algorithms for the creation and
+ investigation of magic squares and hypercubes, including a variety of
+ functions for the manipulation and analysis of arbitrarily dimensioned
+ arrays."""
+
+ homepage = "https://cran.r-project.org/"
+ url = "https://cran.r-project.org/src/contrib/magic_1.5-6.tar.gz"
+
+ version('1.5-6', 'a68e5ced253b2196af842e1fc84fd029', expand=False)
+
+ extends('R')
+
+ depends_on('r-abind')
+
+ def install(self, spec, prefix):
+ R('CMD', 'INSTALL', '--library=%s' % self.module.r_lib_dir, '%s' % self.stage.archive_file)