Add new RubyPackage build system base class (#18199)
* Add new RubyPackage build system base class * Ruby: add spack external find support * Add build tests for RubyPackage
This commit is contained in:
parent
e22a0ca5cf
commit
443407cda5
27 changed files with 513 additions and 112 deletions
13
.github/workflows/linux_build_tests.yaml
vendored
13
.github/workflows/linux_build_tests.yaml
vendored
|
@ -18,6 +18,7 @@ on:
|
||||||
- '!var/spack/repos/builtin/packages/py-setuptools/**'
|
- '!var/spack/repos/builtin/packages/py-setuptools/**'
|
||||||
- '!var/spack/repos/builtin/packages/openjpeg/**'
|
- '!var/spack/repos/builtin/packages/openjpeg/**'
|
||||||
- '!var/spack/repos/builtin/packages/r-rcpp/**'
|
- '!var/spack/repos/builtin/packages/r-rcpp/**'
|
||||||
|
- '!var/spack/repos/builtin/packages/ruby-rake/**'
|
||||||
# Don't run if we only modified documentation
|
# Don't run if we only modified documentation
|
||||||
- 'lib/spack/docs/**'
|
- 'lib/spack/docs/**'
|
||||||
|
|
||||||
|
@ -26,7 +27,14 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
package: [lz4, mpich, tut, py-setuptools, openjpeg, r-rcpp]
|
package:
|
||||||
|
- lz4 # MakefilePackage
|
||||||
|
- mpich # AutotoolsPackage
|
||||||
|
- tut # WafPackage
|
||||||
|
- py-setuptools # PythonPackage
|
||||||
|
- openjpeg # CMakePackage
|
||||||
|
- r-rcpp # RPackage
|
||||||
|
- ruby-rake # RubyPackage
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
- uses: actions/cache@v2
|
- uses: actions/cache@v2
|
||||||
|
@ -41,9 +49,10 @@ jobs:
|
||||||
- name: Install System Packages
|
- name: Install System Packages
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get -yqq install ccache gfortran perl perl-base r-base r-base-core r-base-dev findutils openssl libssl-dev libpciaccess-dev
|
sudo apt-get -yqq install ccache gfortran perl perl-base r-base r-base-core r-base-dev ruby findutils openssl libssl-dev libpciaccess-dev
|
||||||
R --version
|
R --version
|
||||||
perl --version
|
perl --version
|
||||||
|
ruby --version
|
||||||
- name: Copy Configuration
|
- name: Copy Configuration
|
||||||
run: |
|
run: |
|
||||||
ccache -M 300M && ccache -z
|
ccache -M 300M && ccache -z
|
||||||
|
|
|
@ -12,5 +12,173 @@ RubyPackage
|
||||||
Like Perl, Python, and R, Ruby has its own build system for
|
Like Perl, Python, and R, Ruby has its own build system for
|
||||||
installing Ruby gems.
|
installing Ruby gems.
|
||||||
|
|
||||||
This build system is a work-in-progress. See
|
^^^^^^
|
||||||
https://github.com/spack/spack/pull/3127 for more information.
|
Phases
|
||||||
|
^^^^^^
|
||||||
|
|
||||||
|
The ``RubyPackage`` base class provides the following phases that
|
||||||
|
can be overridden:
|
||||||
|
|
||||||
|
#. ``build`` - build everything needed to install
|
||||||
|
#. ``install`` - install everything from build directory
|
||||||
|
|
||||||
|
For packages that come with a ``*.gemspec`` file, these phases run:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ gem build *.gemspec
|
||||||
|
$ gem install *.gem
|
||||||
|
|
||||||
|
|
||||||
|
For packages that come with a ``Rakefile`` file, these phases run:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ rake package
|
||||||
|
$ gem install *.gem
|
||||||
|
|
||||||
|
|
||||||
|
For packages that come pre-packaged as a ``*.gem`` file, the build
|
||||||
|
phase is skipped and the install phase runs:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ gem install *.gem
|
||||||
|
|
||||||
|
|
||||||
|
These are all standard ``gem`` commands and can be found by running:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ gem help commands
|
||||||
|
|
||||||
|
|
||||||
|
For packages that only distribute ``*.gem`` files, these files can be
|
||||||
|
downloaded with the ``expand=False`` option in the ``version`` directive.
|
||||||
|
The build phase will be automatically skipped.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
Important files
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When building from source, Ruby packages can be identified by the
|
||||||
|
presence of any of the following files:
|
||||||
|
|
||||||
|
* ``*.gemspec``
|
||||||
|
* ``Rakefile``
|
||||||
|
* ``setup.rb`` (not yet supported)
|
||||||
|
|
||||||
|
However, not all Ruby packages are released as source code. Some are only
|
||||||
|
released as ``*.gem`` files. These files can be extracted using:
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$ gem unpack *.gem
|
||||||
|
|
||||||
|
|
||||||
|
^^^^^^^^^^^
|
||||||
|
Description
|
||||||
|
^^^^^^^^^^^
|
||||||
|
|
||||||
|
The ``*.gemspec`` file may contain something like:
|
||||||
|
|
||||||
|
.. code-block:: ruby
|
||||||
|
|
||||||
|
summary = 'An implementation of the AsciiDoc text processor and publishing toolchain'
|
||||||
|
description = 'A fast, open source text processor and publishing toolchain for converting AsciiDoc content to HTML 5, DocBook 5, and other formats.'
|
||||||
|
|
||||||
|
|
||||||
|
Either of these can be used for the description of the Spack package.
|
||||||
|
|
||||||
|
^^^^^^^^
|
||||||
|
Homepage
|
||||||
|
^^^^^^^^
|
||||||
|
|
||||||
|
The ``*.gemspec`` file may contain something like:
|
||||||
|
|
||||||
|
.. code-block:: ruby
|
||||||
|
|
||||||
|
homepage = 'https://asciidoctor.org'
|
||||||
|
|
||||||
|
|
||||||
|
This should be used as the official homepage of the Spack package.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
Build system dependencies
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
All Ruby packages require Ruby at build and run-time. For this reason,
|
||||||
|
the base class contains:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
extends('ruby')
|
||||||
|
depends_on('ruby', type=('build', 'run'))
|
||||||
|
|
||||||
|
|
||||||
|
The ``*.gemspec`` file may contain something like:
|
||||||
|
|
||||||
|
.. code-block:: ruby
|
||||||
|
|
||||||
|
required_ruby_version = '>= 2.3.0'
|
||||||
|
|
||||||
|
|
||||||
|
This can be added to the Spack package using:
|
||||||
|
|
||||||
|
.. code-block:: python
|
||||||
|
|
||||||
|
depends_on('ruby@2.3.0:', type=('build', 'run'))
|
||||||
|
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^
|
||||||
|
Ruby dependencies
|
||||||
|
^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When you install a package with ``gem``, it reads the ``*.gemspec``
|
||||||
|
file in order to determine the dependencies of the package.
|
||||||
|
If the dependencies are not yet installed, ``gem`` downloads them
|
||||||
|
and installs them for you. This may sound convenient, but Spack
|
||||||
|
cannot rely on this behavior for two reasons:
|
||||||
|
|
||||||
|
#. Spack needs to be able to install packages on air-gapped networks.
|
||||||
|
|
||||||
|
If there is no internet connection, ``gem`` can't download the
|
||||||
|
package dependencies. By explicitly listing every dependency in
|
||||||
|
the ``package.py``, Spack knows what to download ahead of time.
|
||||||
|
|
||||||
|
#. Duplicate installations of the same dependency may occur.
|
||||||
|
|
||||||
|
Spack supports *activation* of Ruby extensions, which involves
|
||||||
|
symlinking the package installation prefix to the Ruby installation
|
||||||
|
prefix. If your package is missing a dependency, that dependency
|
||||||
|
will be installed to the installation directory of the same package.
|
||||||
|
If you try to activate the package + dependency, it may cause a
|
||||||
|
problem if that package has already been activated.
|
||||||
|
|
||||||
|
For these reasons, you must always explicitly list all dependencies.
|
||||||
|
Although the documentation may list the package's dependencies,
|
||||||
|
often the developers assume people will use ``gem`` and won't have to
|
||||||
|
worry about it. Always check the ``*.gemspec`` file to find the true
|
||||||
|
dependencies.
|
||||||
|
|
||||||
|
Check for the following clues in the ``*.gemspec`` file:
|
||||||
|
|
||||||
|
* ``add_runtime_dependency``
|
||||||
|
|
||||||
|
These packages are required for installation.
|
||||||
|
|
||||||
|
* ``add_dependency``
|
||||||
|
|
||||||
|
This is an alias for ``add_runtime_dependency``
|
||||||
|
|
||||||
|
* ``add_development_dependency``
|
||||||
|
|
||||||
|
These packages are optional dependencies used for development.
|
||||||
|
They should not be added as dependencies of the package.
|
||||||
|
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
External documentation
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
For more information on Ruby packaging, see:
|
||||||
|
https://guides.rubygems.org/
|
||||||
|
|
59
lib/spack/spack/build_systems/ruby.py
Normal file
59
lib/spack/spack/build_systems/ruby.py
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
import glob
|
||||||
|
import inspect
|
||||||
|
|
||||||
|
from spack.directives import depends_on, extends
|
||||||
|
from spack.package import PackageBase, run_after
|
||||||
|
|
||||||
|
|
||||||
|
class RubyPackage(PackageBase):
|
||||||
|
"""Specialized class for building Ruby gems.
|
||||||
|
|
||||||
|
This class provides two phases that can be overridden if required:
|
||||||
|
|
||||||
|
#. :py:meth:`~.RubyPackage.build`
|
||||||
|
#. :py:meth:`~.RubyPackage.install`
|
||||||
|
"""
|
||||||
|
#: Phases of a Ruby package
|
||||||
|
phases = ['build', 'install']
|
||||||
|
|
||||||
|
#: This attribute is used in UI queries that need to know the build
|
||||||
|
#: system base class
|
||||||
|
build_system_class = 'RubyPackage'
|
||||||
|
|
||||||
|
extends('ruby')
|
||||||
|
|
||||||
|
depends_on('ruby', type=('build', 'run'))
|
||||||
|
|
||||||
|
def build(self, spec, prefix):
|
||||||
|
"""Build a Ruby gem."""
|
||||||
|
|
||||||
|
# ruby-rake provides both rake.gemspec and Rakefile, but only
|
||||||
|
# rake.gemspec can be built without an existing rake installation
|
||||||
|
gemspecs = glob.glob('*.gemspec')
|
||||||
|
rakefiles = glob.glob('Rakefile')
|
||||||
|
if gemspecs:
|
||||||
|
inspect.getmodule(self).gem('build', '--norc', gemspecs[0])
|
||||||
|
elif rakefiles:
|
||||||
|
jobs = inspect.getmodule(self).make_jobs
|
||||||
|
inspect.getmodule(self).rake('package', '-j{0}'.format(jobs))
|
||||||
|
else:
|
||||||
|
# Some Ruby packages only ship `*.gem` files, so nothing to build
|
||||||
|
pass
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
"""Install a Ruby gem.
|
||||||
|
|
||||||
|
The ruby package sets ``GEM_HOME`` to tell gem where to install to."""
|
||||||
|
|
||||||
|
gems = glob.glob('*.gem')
|
||||||
|
if gems:
|
||||||
|
inspect.getmodule(self).gem(
|
||||||
|
'install', '--norc', '--ignore-dependencies', gems[0])
|
||||||
|
|
||||||
|
# Check that self.prefix is there after installation
|
||||||
|
run_after('install')(PackageBase.sanity_check_prefix)
|
|
@ -352,6 +352,34 @@ def __init__(self, name, *args, **kwargs):
|
||||||
super(OctavePackageTemplate, self).__init__(name, *args, **kwargs)
|
super(OctavePackageTemplate, self).__init__(name, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyPackageTemplate(PackageTemplate):
|
||||||
|
"""Provides appropriate overrides for Ruby packages"""
|
||||||
|
|
||||||
|
base_class_name = 'RubyPackage'
|
||||||
|
|
||||||
|
dependencies = """\
|
||||||
|
# FIXME: Add dependencies if required. Only add the ruby dependency
|
||||||
|
# if you need specific versions. A generic ruby dependency is
|
||||||
|
# added implicity by the RubyPackage class.
|
||||||
|
# depends_on('ruby@X.Y.Z:', type=('build', 'run'))
|
||||||
|
# depends_on('ruby-foo', type=('build', 'run'))"""
|
||||||
|
|
||||||
|
body_def = """\
|
||||||
|
def build(self, spec, prefix):
|
||||||
|
# FIXME: If not needed delete this function
|
||||||
|
pass"""
|
||||||
|
|
||||||
|
def __init__(self, name, *args, **kwargs):
|
||||||
|
# If the user provided `--name ruby-numpy`, don't rename it
|
||||||
|
# ruby-ruby-numpy
|
||||||
|
if not name.startswith('ruby-'):
|
||||||
|
# Make it more obvious that we are renaming the package
|
||||||
|
tty.msg("Changing package name from {0} to ruby-{0}".format(name))
|
||||||
|
name = 'ruby-{0}'.format(name)
|
||||||
|
|
||||||
|
super(RubyPackageTemplate, self).__init__(name, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
class MakefilePackageTemplate(PackageTemplate):
|
class MakefilePackageTemplate(PackageTemplate):
|
||||||
"""Provides appropriate overrides for Makefile packages"""
|
"""Provides appropriate overrides for Makefile packages"""
|
||||||
|
|
||||||
|
@ -410,6 +438,7 @@ def __init__(self, name, *args, **kwargs):
|
||||||
'perlmake': PerlmakePackageTemplate,
|
'perlmake': PerlmakePackageTemplate,
|
||||||
'perlbuild': PerlbuildPackageTemplate,
|
'perlbuild': PerlbuildPackageTemplate,
|
||||||
'octave': OctavePackageTemplate,
|
'octave': OctavePackageTemplate,
|
||||||
|
'ruby': RubyPackageTemplate,
|
||||||
'makefile': MakefilePackageTemplate,
|
'makefile': MakefilePackageTemplate,
|
||||||
'intel': IntelPackageTemplate,
|
'intel': IntelPackageTemplate,
|
||||||
'meson': MesonPackageTemplate,
|
'meson': MesonPackageTemplate,
|
||||||
|
@ -464,12 +493,16 @@ def __call__(self, stage, url):
|
||||||
"""Try to guess the type of build system used by a project based on
|
"""Try to guess the type of build system used by a project based on
|
||||||
the contents of its archive or the URL it was downloaded from."""
|
the contents of its archive or the URL it was downloaded from."""
|
||||||
|
|
||||||
|
if url is not None:
|
||||||
# Most octave extensions are hosted on Octave-Forge:
|
# Most octave extensions are hosted on Octave-Forge:
|
||||||
# https://octave.sourceforge.net/index.html
|
# https://octave.sourceforge.net/index.html
|
||||||
# They all have the same base URL.
|
# They all have the same base URL.
|
||||||
if url is not None and 'downloads.sourceforge.net/octave/' in url:
|
if 'downloads.sourceforge.net/octave/' in url:
|
||||||
self.build_system = 'octave'
|
self.build_system = 'octave'
|
||||||
return
|
return
|
||||||
|
if url.endswith('.gem'):
|
||||||
|
self.build_system = 'ruby'
|
||||||
|
return
|
||||||
|
|
||||||
# A list of clues that give us an idea of the build system a package
|
# A list of clues that give us an idea of the build system a package
|
||||||
# uses. If the regular expression matches a file contained in the
|
# uses. If the regular expression matches a file contained in the
|
||||||
|
@ -488,6 +521,9 @@ def __call__(self, stage, url):
|
||||||
(r'/WORKSPACE$', 'bazel'),
|
(r'/WORKSPACE$', 'bazel'),
|
||||||
(r'/Build\.PL$', 'perlbuild'),
|
(r'/Build\.PL$', 'perlbuild'),
|
||||||
(r'/Makefile\.PL$', 'perlmake'),
|
(r'/Makefile\.PL$', 'perlmake'),
|
||||||
|
(r'/.*\.gemspec$', 'ruby'),
|
||||||
|
(r'/Rakefile$', 'ruby'),
|
||||||
|
(r'/setup\.rb$', 'ruby'),
|
||||||
(r'/.*\.pro$', 'qmake'),
|
(r'/.*\.pro$', 'qmake'),
|
||||||
(r'/(GNU)?[Mm]akefile$', 'makefile'),
|
(r'/(GNU)?[Mm]akefile$', 'makefile'),
|
||||||
(r'/DESCRIPTION$', 'octave'),
|
(r'/DESCRIPTION$', 'octave'),
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
from spack.build_systems.python import PythonPackage
|
from spack.build_systems.python import PythonPackage
|
||||||
from spack.build_systems.r import RPackage
|
from spack.build_systems.r import RPackage
|
||||||
from spack.build_systems.perl import PerlPackage
|
from spack.build_systems.perl import PerlPackage
|
||||||
|
from spack.build_systems.ruby import RubyPackage
|
||||||
from spack.build_systems.intel import IntelPackage
|
from spack.build_systems.intel import IntelPackage
|
||||||
from spack.build_systems.meson import MesonPackage
|
from spack.build_systems.meson import MesonPackage
|
||||||
from spack.build_systems.sip import SIPPackage
|
from spack.build_systems.sip import SIPPackage
|
||||||
|
|
|
@ -23,6 +23,9 @@
|
||||||
('WORKSPACE', 'bazel'),
|
('WORKSPACE', 'bazel'),
|
||||||
('Makefile.PL', 'perlmake'),
|
('Makefile.PL', 'perlmake'),
|
||||||
('Build.PL', 'perlbuild'),
|
('Build.PL', 'perlbuild'),
|
||||||
|
('foo.gemspec', 'ruby'),
|
||||||
|
('Rakefile', 'ruby'),
|
||||||
|
('setup.rb', 'ruby'),
|
||||||
('GNUmakefile', 'makefile'),
|
('GNUmakefile', 'makefile'),
|
||||||
('makefile', 'makefile'),
|
('makefile', 'makefile'),
|
||||||
('Makefile', 'makefile'),
|
('Makefile', 'makefile'),
|
||||||
|
|
|
@ -29,4 +29,8 @@ packages:
|
||||||
externals:
|
externals:
|
||||||
- spec: libpciaccess@0.13.5
|
- spec: libpciaccess@0.13.5
|
||||||
prefix: /usr
|
prefix: /usr
|
||||||
|
ruby:
|
||||||
|
buildable: False
|
||||||
|
externals:
|
||||||
|
- spec: ruby@2.5.1
|
||||||
|
prefix: /usr
|
||||||
|
|
|
@ -1,20 +0,0 @@
|
||||||
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
|
||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
||||||
|
|
||||||
from spack import *
|
|
||||||
|
|
||||||
|
|
||||||
class Asciidoctor(Package):
|
|
||||||
"""Modern asciidoc tool based on ruby"""
|
|
||||||
|
|
||||||
homepage = "https://asciidoctor.org/"
|
|
||||||
url = "https://rubygems.org/downloads/asciidoctor-1.5.8.gem"
|
|
||||||
|
|
||||||
version('1.5.8', sha256='9deaa93eacadda48671e18395b992eafba35d08f25ddbe28d25bb275831a8d62', expand=False)
|
|
||||||
|
|
||||||
extends('ruby')
|
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
|
||||||
gem('install', 'asciidoctor-{0}.gem'.format(self.version))
|
|
16
var/spack/repos/builtin/packages/ruby-asciidoctor/package.py
Normal file
16
var/spack/repos/builtin/packages/ruby-asciidoctor/package.py
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyAsciidoctor(RubyPackage):
|
||||||
|
"""A fast, open source text processor and publishing toolchain for
|
||||||
|
converting AsciiDoc content to HTML 5, DocBook 5, and other formats."""
|
||||||
|
|
||||||
|
homepage = "https://asciidoctor.org/"
|
||||||
|
url = "https://github.com/asciidoctor/asciidoctor/archive/v2.0.10.tar.gz"
|
||||||
|
|
||||||
|
version('2.0.10', sha256='afca74837e6d4b339535e8ba0b79f2ad00bd1eef78bf391cc36995ca2e31630a')
|
||||||
|
|
||||||
|
depends_on('ruby@2.3.0:', type=('build', 'run'))
|
19
var/spack/repos/builtin/packages/ruby-erubis/package.py
Normal file
19
var/spack/repos/builtin/packages/ruby-erubis/package.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyErubis(RubyPackage):
|
||||||
|
"""Erubis is a fast, secure, and very extensible implementation of eRuby.
|
||||||
|
"""
|
||||||
|
|
||||||
|
homepage = "http://www.kuwata-lab.com/erubis/"
|
||||||
|
git = "https://github.com/kwatch/erubis.git"
|
||||||
|
|
||||||
|
version('master', branch='master')
|
||||||
|
version('2.7.0', commit='14d3eab57fbc361312c8f3af350cbf9a5bafce17')
|
||||||
|
|
||||||
|
def patch(self):
|
||||||
|
filter_file('$Release$', str(self.version),
|
||||||
|
'erubis.gemspec', string=True)
|
|
@ -3,20 +3,16 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
from spack import *
|
|
||||||
|
|
||||||
|
class RubyGnuplot(RubyPackage):
|
||||||
class RubyGnuplot(Package):
|
|
||||||
"""Utility library to aid in interacting with gnuplot from ruby"""
|
"""Utility library to aid in interacting with gnuplot from ruby"""
|
||||||
|
|
||||||
homepage = "https://rubygems.org/gems/gnuplot/versions/2.6.2"
|
homepage = "https://github.com/rdp/ruby_gnuplot"
|
||||||
url = "https://rubygems.org/downloads/gnuplot-2.6.2.gem"
|
url = "https://rubygems.org/downloads/gnuplot-2.6.2.gem"
|
||||||
|
|
||||||
|
# Source code is available at https://github.com/rdp/ruby_gnuplot
|
||||||
|
# but release tarballs are not available, download gem instead
|
||||||
|
|
||||||
version('2.6.2', sha256='d2c28d4a55867ef6f0a5725ce157581917b4d27417bc3767c7c643a828416bb3', expand=False)
|
version('2.6.2', sha256='d2c28d4a55867ef6f0a5725ce157581917b4d27417bc3767c7c643a828416bb3', expand=False)
|
||||||
|
|
||||||
depends_on('gnuplot+X')
|
depends_on('gnuplot+X')
|
||||||
|
|
||||||
extends('ruby')
|
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
|
||||||
gem('install', 'gnuplot-{0}.gem'.format(self.version))
|
|
||||||
|
|
16
var/spack/repos/builtin/packages/ruby-hpricot/package.py
Normal file
16
var/spack/repos/builtin/packages/ruby-hpricot/package.py
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyHpricot(RubyPackage):
|
||||||
|
"""A swift, liberal HTML parser with a fantastic library.
|
||||||
|
|
||||||
|
NOTE: ruby-hpricot is no longer maintained, consider ruby-nokogiri instead.
|
||||||
|
"""
|
||||||
|
|
||||||
|
homepage = "https://github.com/hpricot/hpricot"
|
||||||
|
url = "https://github.com/hpricot/hpricot/archive/0.8.6.tar.gz"
|
||||||
|
|
||||||
|
version('0.8.6', sha256='792f63cebe2f2b02058974755b4c8a3aef52e5daf37f779a34885d5ff2876017')
|
16
var/spack/repos/builtin/packages/ruby-mustache/package.py
Normal file
16
var/spack/repos/builtin/packages/ruby-mustache/package.py
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyMustache(RubyPackage):
|
||||||
|
"""Inspired by ctemplate and et, Mustache is a framework-agnostic way to
|
||||||
|
render logic-free views."""
|
||||||
|
|
||||||
|
homepage = "https://github.com/mustache/mustache"
|
||||||
|
url = "https://github.com/mustache/mustache/archive/v1.1.1.tar.gz"
|
||||||
|
|
||||||
|
version('1.1.1', sha256='9ab4a9842a37d5278789ba26152b0b78f649e3020266809ec33610a89f7e65ea')
|
||||||
|
|
||||||
|
depends_on('ruby@2.0:', type=('build', 'run'))
|
|
@ -3,21 +3,15 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
from spack import *
|
|
||||||
|
|
||||||
|
class RubyNarray(RubyPackage):
|
||||||
class RubyNarray(Package):
|
|
||||||
"""Numo::NArray is an Numerical N-dimensional Array class for fast
|
"""Numo::NArray is an Numerical N-dimensional Array class for fast
|
||||||
processing and easy manipulation of multi-dimensional numerical data,
|
processing and easy manipulation of multi-dimensional numerical data,
|
||||||
similar to numpy.ndaray."""
|
similar to numpy.ndaray."""
|
||||||
|
|
||||||
homepage = "https://rubygems.org/gems/narray"
|
homepage = "https://masa16.github.io/narray/"
|
||||||
git = "https://github.com/ruby-numo/narray.git"
|
url = "https://github.com/ruby-numo/numo-narray/archive/v0.9.1.8.tar.gz"
|
||||||
|
|
||||||
version('0.9.0.9', commit='9cadbbccf1e01b6d1bc143c19d598cad1c420869')
|
version('0.9.1.8', sha256='48814c6ebf2c4846fcf6cfd2705a15a97a608960c1676cb6c7b5c9254b0dd51b')
|
||||||
|
|
||||||
extends('ruby')
|
depends_on('ruby@2.2:2.999', type=('build', 'run'))
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
|
||||||
gem('build', 'numo-narray.gemspec')
|
|
||||||
gem('install', 'numo-narray-{0}.gem'.format(self.version))
|
|
||||||
|
|
15
var/spack/repos/builtin/packages/ruby-rake/package.py
Normal file
15
var/spack/repos/builtin/packages/ruby-rake/package.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyRake(RubyPackage):
|
||||||
|
"""Rake is a Make-like program implemented in Ruby."""
|
||||||
|
|
||||||
|
homepage = "https://github.com/ruby/rake"
|
||||||
|
url = "https://github.com/ruby/rake/archive/v13.0.1.tar.gz"
|
||||||
|
|
||||||
|
version('13.0.1', sha256='d865329b5e0c38bd9d11ce70bd1ad6e0d5676c4eee74fd818671c55ec49d92fd')
|
||||||
|
|
||||||
|
depends_on('ruby@2.2:', type=('build', 'run'))
|
15
var/spack/repos/builtin/packages/ruby-rdiscount/package.py
Normal file
15
var/spack/repos/builtin/packages/ruby-rdiscount/package.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyRdiscount(RubyPackage):
|
||||||
|
"""Fast Implementation of Gruber's Markdown in C."""
|
||||||
|
|
||||||
|
homepage = "https://dafoster.net/projects/rdiscount/"
|
||||||
|
url = "https://github.com/davidfstr/rdiscount/archive/2.2.0.2.tar.gz"
|
||||||
|
|
||||||
|
version('2.2.0.2', sha256='a6956059fc61365c242373b03c5012582d7342842eae38fe59ebc1bc169744db')
|
||||||
|
|
||||||
|
depends_on('ruby@1.9.3:', type=('build', 'run'))
|
|
@ -3,21 +3,17 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
from spack import *
|
|
||||||
|
|
||||||
|
class RubyRonn(RubyPackage):
|
||||||
class RubyRonn(Package):
|
|
||||||
"""Ronn builds manuals. It converts simple, human readable textfiles to
|
"""Ronn builds manuals. It converts simple, human readable textfiles to
|
||||||
roff for terminal display, and also to HTML for the web."""
|
roff for terminal display, and also to HTML for the web."""
|
||||||
|
|
||||||
homepage = "https://rubygems.org/gems/ronn"
|
homepage = "https://rtomayko.github.io/ronn/"
|
||||||
url = "https://github.com/rtomayko/ronn/archive/0.7.3.tar.gz"
|
url = "https://github.com/rtomayko/ronn/archive/0.7.3.tar.gz"
|
||||||
|
|
||||||
version('0.7.3', sha256='808aa6668f636ce03abba99c53c2005cef559a5099f6b40bf2c7aad8e273acb4')
|
version('0.7.3', sha256='808aa6668f636ce03abba99c53c2005cef559a5099f6b40bf2c7aad8e273acb4')
|
||||||
version('0.7.0', sha256='ea14337093de8707aa8a67b97357332fa8a03b0df722bdbf4f027fbe4379b185')
|
version('0.7.0', sha256='ea14337093de8707aa8a67b97357332fa8a03b0df722bdbf4f027fbe4379b185')
|
||||||
|
|
||||||
extends('ruby')
|
depends_on('ruby-hpricot@0.8.2:', type=('build', 'run'))
|
||||||
|
depends_on('ruby-rdiscount@1.5.8:', type=('build', 'run'))
|
||||||
def install(self, spec, prefix):
|
depends_on('ruby-mustache@0.7.0:', type=('build', 'run'))
|
||||||
gem('build', 'ronn.gemspec')
|
|
||||||
gem('install', 'ronn-{0}.gem'.format(self.version))
|
|
||||||
|
|
|
@ -3,18 +3,16 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
from spack import *
|
|
||||||
|
|
||||||
|
class RubyRubyinline(RubyPackage):
|
||||||
class RubyRubyinline(Package):
|
|
||||||
"""Inline allows you to write foreign code within your ruby code."""
|
"""Inline allows you to write foreign code within your ruby code."""
|
||||||
|
|
||||||
homepage = "https://rubygems.org/gems/RubyInline"
|
homepage = "https://www.zenspider.com/projects/rubyinline.html"
|
||||||
url = "https://rubygems.org/downloads/RubyInline-3.12.4.gem"
|
url = "https://rubygems.org/downloads/RubyInline-3.12.5.gem"
|
||||||
|
|
||||||
version('3.12.4', sha256='205bbc14c02d3d55e1b497241ede832ab87f3d981f92f3bda98b75e8144103e0', expand=False)
|
# Source code available at https://github.com/seattlerb/rubyinline
|
||||||
|
# but I had trouble getting the Rakefile to build
|
||||||
|
|
||||||
extends('ruby')
|
version('3.12.5', sha256='d4559cb86b7fedd2e9b4b0a3bd99a1955186dbc09f1269920a0dd5c67639c156', expand=False)
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
depends_on('ruby-zentest@4.3:4.999', type=('build', 'run'))
|
||||||
gem('install', 'RubyInline-{0}.gem'.format(self.version))
|
|
||||||
|
|
|
@ -3,10 +3,8 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
from spack import *
|
|
||||||
|
|
||||||
|
class RubySvn2git(RubyPackage):
|
||||||
class RubySvn2git(Package):
|
|
||||||
"""svn2git is a tiny utility for migrating projects from Subversion to Git
|
"""svn2git is a tiny utility for migrating projects from Subversion to Git
|
||||||
while keeping the trunk, branches and tags where they should be. It uses
|
while keeping the trunk, branches and tags where they should be. It uses
|
||||||
git-svn to clone an svn repository and does some clean-up to make sure
|
git-svn to clone an svn repository and does some clean-up to make sure
|
||||||
|
@ -21,9 +19,3 @@ class RubySvn2git(Package):
|
||||||
|
|
||||||
depends_on('git')
|
depends_on('git')
|
||||||
depends_on('subversion+perl')
|
depends_on('subversion+perl')
|
||||||
|
|
||||||
extends('ruby')
|
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
|
||||||
gem('build', 'svn2git.gemspec')
|
|
||||||
gem('install', 'svn2git-{0}.gem'.format(self.version))
|
|
||||||
|
|
|
@ -3,18 +3,13 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
from spack import *
|
|
||||||
|
|
||||||
|
class RubyTerminalTable(RubyPackage):
|
||||||
class RubyTerminalTable(Package):
|
|
||||||
"""Simple, feature rich ascii table generation library"""
|
"""Simple, feature rich ascii table generation library"""
|
||||||
|
|
||||||
homepage = "https://rubygems.org/gems/terminal-table"
|
homepage = "https://github.com/tj/terminal-table"
|
||||||
url = "https://rubygems.org/downloads/terminal-table-1.8.0.gem"
|
url = "https://github.com/tj/terminal-table/archive/v1.8.0.tar.gz"
|
||||||
|
|
||||||
version('1.8.0', sha256='13371f069af18e9baa4e44d404a4ada9301899ce0530c237ac1a96c19f652294', expand=False)
|
version('1.8.0', sha256='69b8e157f5dc3f056b5242923ab3e729a16c6f893b3a5d540e71135a973e5fbe')
|
||||||
|
|
||||||
extends('ruby')
|
depends_on('ruby-unicode-display-width@1.1.1:1.999', type=('build', 'run'))
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
|
||||||
gem('install', 'terminal-table-{0}.gem'.format(self.version))
|
|
||||||
|
|
15
var/spack/repos/builtin/packages/ruby-thor/package.py
Normal file
15
var/spack/repos/builtin/packages/ruby-thor/package.py
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyThor(RubyPackage):
|
||||||
|
"""Thor is a toolkit for building powerful command-line interfaces."""
|
||||||
|
|
||||||
|
homepage = "http://whatisthor.com/"
|
||||||
|
url = "https://github.com/erikhuda/thor/archive/v1.0.1.tar.gz"
|
||||||
|
|
||||||
|
version('1.0.1', sha256='e6b902764e237ce296cf9e339c93f8ca83bec5b59be0bf8bacd7ffddc6684d07')
|
||||||
|
|
||||||
|
depends_on('ruby@2.0.0:', type=('build', 'run'))
|
18
var/spack/repos/builtin/packages/ruby-tmuxinator/package.py
Normal file
18
var/spack/repos/builtin/packages/ruby-tmuxinator/package.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyTmuxinator(RubyPackage):
|
||||||
|
"""Create and manage complex tmux sessions easily."""
|
||||||
|
|
||||||
|
homepage = "https://github.com/tmuxinator/tmuxinator"
|
||||||
|
url = "https://github.com/tmuxinator/tmuxinator/archive/v2.0.1.tar.gz"
|
||||||
|
|
||||||
|
version('2.0.1', sha256='a2c8428d239a6e869da516cecee3ac64db47ba1f1932317eb397b1afd698ee09')
|
||||||
|
|
||||||
|
depends_on('ruby@2.5.8:', type=('build', 'run'))
|
||||||
|
depends_on('ruby-erubis@2.6:2.999', type=('build', 'run'))
|
||||||
|
depends_on('ruby-thor@1.0:1.999', type=('build', 'run'))
|
||||||
|
depends_on('ruby-xdg@2.2.5:2.999', type=('build', 'run'))
|
|
@ -0,0 +1,15 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyUnicodeDisplayWidth(RubyPackage):
|
||||||
|
"""Determines the monospace display width of a string in Ruby."""
|
||||||
|
|
||||||
|
homepage = "https://github.com/janlelis/unicode-display_width"
|
||||||
|
url = "https://github.com/janlelis/unicode-display_width/archive/v1.7.0.tar.gz"
|
||||||
|
|
||||||
|
version('1.7.0', sha256='2dd6faa95e022a9f52841d29be6c622c58fff9fb0b84fb2cb30d4f0e13fa8a73')
|
||||||
|
|
||||||
|
depends_on('ruby@1.9.3:', type=('build', 'run'))
|
18
var/spack/repos/builtin/packages/ruby-xdg/package.py
Normal file
18
var/spack/repos/builtin/packages/ruby-xdg/package.py
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyXdg(RubyPackage):
|
||||||
|
"""Provides a Ruby implementation of the XDG Base Directory Specification.
|
||||||
|
"""
|
||||||
|
|
||||||
|
homepage = "https://www.alchemists.io/projects/xdg/"
|
||||||
|
url = "https://rubygems.org/downloads/xdg-2.2.5.gem"
|
||||||
|
|
||||||
|
# Source code can be found at https://github.com/bkuhlmann/xdg and
|
||||||
|
# https://github.com/rubyworks/xdg but I was unable to get it to build
|
||||||
|
# from source
|
||||||
|
|
||||||
|
version('2.2.5', sha256='f3a5f799363852695e457bb7379ac6c4e3e8cb3a51ce6b449ab47fbb1523b913', expand=False)
|
19
var/spack/repos/builtin/packages/ruby-zentest/package.py
Normal file
19
var/spack/repos/builtin/packages/ruby-zentest/package.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
||||||
|
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
|
|
||||||
|
class RubyZentest(RubyPackage):
|
||||||
|
"""ZenTest provides 4 different tools: zentest, unit_diff, autotest, and
|
||||||
|
multiruby."""
|
||||||
|
|
||||||
|
homepage = "https://github.com/seattlerb/zentest"
|
||||||
|
url = "https://rubygems.org/downloads/ZenTest-4.12.0.gem"
|
||||||
|
|
||||||
|
# Source code available at https://github.com/seattlerb/zentest
|
||||||
|
# but I had trouble getting the Rakefile to build
|
||||||
|
|
||||||
|
version('4.12.0', sha256='5301757c3ab29dd2222795c1b076dd348f4d92fe0426e97a13ae56fea47a786e', expand=False)
|
||||||
|
|
||||||
|
depends_on('ruby@1.8:2.999', type=('build', 'run'))
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||||
|
|
||||||
from spack import *
|
import re
|
||||||
|
|
||||||
|
|
||||||
class Ruby(AutotoolsPackage):
|
class Ruby(AutotoolsPackage):
|
||||||
|
@ -54,6 +54,14 @@ class Ruby(AutotoolsPackage):
|
||||||
expand=False
|
expand=False
|
||||||
)
|
)
|
||||||
|
|
||||||
|
executables = ['^ruby$']
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def determine_version(cls, exe):
|
||||||
|
output = Executable(exe)('--version', output=str, error=str)
|
||||||
|
match = re.search(r'ruby ([\d.]+)', output)
|
||||||
|
return match.group(1) if match else None
|
||||||
|
|
||||||
def url_for_version(self, version):
|
def url_for_version(self, version):
|
||||||
url = "http://cache.ruby-lang.org/pub/ruby/{0}/ruby-{1}.tar.gz"
|
url = "http://cache.ruby-lang.org/pub/ruby/{0}/ruby-{1}.tar.gz"
|
||||||
return url.format(version.up_to(2), version)
|
return url.format(version.up_to(2), version)
|
||||||
|
@ -92,8 +100,9 @@ def setup_dependent_package(self, module, dependent_spec):
|
||||||
gem('install', '<gem-name>.gem')
|
gem('install', '<gem-name>.gem')
|
||||||
"""
|
"""
|
||||||
# Ruby extension builds have global ruby and gem functions
|
# Ruby extension builds have global ruby and gem functions
|
||||||
module.ruby = Executable(join_path(self.spec.prefix.bin, 'ruby'))
|
module.ruby = Executable(self.prefix.bin.ruby)
|
||||||
module.gem = Executable(join_path(self.spec.prefix.bin, 'gem'))
|
module.gem = Executable(self.prefix.bin.gem)
|
||||||
|
module.rake = Executable(self.prefix.bin.rake)
|
||||||
|
|
||||||
@run_after('install')
|
@run_after('install')
|
||||||
def post_install(self):
|
def post_install(self):
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other
|
|
||||||
# Spack Project Developers. See the top-level COPYRIGHT file for details.
|
|
||||||
#
|
|
||||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
|
||||||
|
|
||||||
from spack import *
|
|
||||||
|
|
||||||
|
|
||||||
class Tmuxinator(Package):
|
|
||||||
"""A session configuration creator and manager for tmux"""
|
|
||||||
|
|
||||||
homepage = "https://github.com/tmuxinator/tmuxinator"
|
|
||||||
git = "https://github.com/tmuxinator/tmuxinator.git"
|
|
||||||
|
|
||||||
version('0.6.11', tag='v0.6.11')
|
|
||||||
|
|
||||||
extends('ruby')
|
|
||||||
|
|
||||||
def install(self, spec, prefix):
|
|
||||||
gem('build', 'tmuxinator.gemspec')
|
|
||||||
gem('install', 'tmuxinator-{0}.gem'.format(self.version))
|
|
Loading…
Reference in a new issue