# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
from typing import Optional, Tuple
import llnl.util.lang as lang
from llnl.util.filesystem import mkdirp
from spack.directives import extends
from .generic import GenericBuilder, Package
[docs]
class RBuilder(GenericBuilder):
"""The R builder provides a single phase that can be overridden:
1. :py:meth:`~.RBuilder.install`
It has sensible defaults, and for many packages the only thing
necessary will be to add dependencies.
"""
#: Names associated with package methods in the old build-system format
legacy_methods: Tuple[str, ...] = (
"configure_args",
"configure_vars",
) + GenericBuilder.legacy_methods
[docs]
def install(self, pkg, spec, prefix):
"""Installs an R package."""
mkdirp(pkg.module.r_lib_dir)
config_args = self.configure_args()
config_vars = self.configure_vars()
args = ["--vanilla", "CMD", "INSTALL"]
if config_args:
args.append(f"--configure-args={' '.join(config_args)}")
if config_vars:
args.append(f"--configure-vars={' '.join(config_vars)}")
args.extend([f"--library={pkg.module.r_lib_dir}", self.stage.source_path])
pkg.module.R(*args)
[docs]
class RPackage(Package):
"""Specialized class for packages that are built using R.
For more information on the R build system, see:
https://stat.ethz.ch/R-manual/R-devel/library/utils/html/INSTALL.html
"""
# package attributes that can be expanded to set the homepage, url,
# list_url, and git values
# For CRAN packages
cran: Optional[str] = None
# For Bioconductor packages
bioc: Optional[str] = None
GenericBuilder = RBuilder
#: This attribute is used in UI queries that need to know the build
#: system base class
build_system_class = "RPackage"
extends("r")
@lang.classproperty
def homepage(cls):
if cls.cran:
return f"https://cloud.r-project.org/package={cls.cran}"
elif cls.bioc:
return f"https://bioconductor.org/packages/{cls.bioc}"
@lang.classproperty
def url(cls):
if cls.cran:
return f"https://cloud.r-project.org/src/contrib/{cls.cran}_{str(list(cls.versions)[0])}.tar.gz"
@lang.classproperty
def list_url(cls):
if cls.cran:
return f"https://cloud.r-project.org/src/contrib/Archive/{cls.cran}/"
@lang.classproperty
def git(cls):
if cls.bioc:
return f"https://git.bioconductor.org/packages/{cls.bioc}"