R Packaging Guidelines
What is R?
The definition from The R-Project website says that R is:
" R is a language and environment for statistical computing and graphics."
R is a GNU project, very similar to the S language developed by Bell Laboratories.
This language is heavily used in research as it provides a lot of statistical and graphical tools. It is also a well developed language for data manipulation.
If you are looking for more information on R, you can go to:
If you are interested in packaging R modules, or if you are looking for R libraries, you should check here for upstream sources:
Spec Templates for R packages
There are two types of R packages: arch-specific and noarch. The following template shows how to package an arch-specific R package; there are very minor differences for noarch packages, which are noted below the template.
%global packname foo %global rlibdir %{_libdir}/R/library Name: R-%{packname} Version: 1.6.6 Release: %autorelease Summary: Adds foo functionality for R License: GPL-2.0-or-later URL: https://CRAN.R-project.org/package=%{packname} Source: %{url}&version=%{version}#/%{packname}_%{version}.tar.gz BuildRequires: R-devel BuildRequires: R(<another_addon>) BuildRequires: ... %description R Interface to foo, enables bar! %prep %setup -q -c -n %{packname} %build %install mkdir -p %{buildroot}%{rlibdir} %{_bindir}/R CMD INSTALL -l %{buildroot}%{rlibdir} %{packname} test -d %{packname}/src && (cd %{packname}/src; rm -f *.o *.so) rm -f %{buildroot}%{rlibdir}/R.css %check export LANG=C.UTF-8 export _R_CHECK_FORCE_SUGGESTS_=0 %{_bindir}/R CMD check --no-manual --ignore-vignettes %{packname} %files %dir %{rlibdir}/%{packname} %doc %{rlibdir}/%{packname}/doc %doc %{rlibdir}/%{packname}/html %doc %{rlibdir}/%{packname}/NEWS %{rlibdir}/%{packname}/DESCRIPTION %{rlibdir}/%{packname}/INDEX %{rlibdir}/%{packname}/NAMESPACE %{rlibdir}/%{packname}/Meta %{rlibdir}/%{packname}/R %{rlibdir}/%{packname}/help %{rlibdir}/%{packname}/libs %changelog %autochangelog
Differences between arch-specific and noarch R packages
-
Noarch packages set
BuildArch: noarch
. -
Noarch packages install into
%{_datadir}/R/library/%{packname}
; arch-specific packages install into%{_libdir}/R/library/%{packname}
.
Change the%global rlibdir
at the top of the file to use%{_datadir}
instead of%{_libdir}
.
Automatically generated dependencies
All R packages that depend on R-devel
will automatically produce Provides, Requires, Suggests, and Enhances via a generator in R-rpm-macros
.
This generator uses upstream metadata in DESCRIPTION
files to determine what the package should depend on.
Provides with a standardized name
The generator adds run time Provides in the form of R(foo) = packageVersion
.
The version from the metadata will be normalized (as specified in R version for package versioning).
Dependencies on standardized names
The generator adds run time requires in the form of R(foo)
(with versions as specified in the metadata if supplied.)
The packager MUST inspect the generated Requires for correctness.
All hard dependencies (R’s LinkingTo
, Depends
, Imports
) MUST be resolvable within the targeted Fedora version.
Unwanted dependencies may be removed by editing the installed DESCRIPTION
file
or using rpm’s %__requires_exclude
(substitute suggests
or enhances
if necessary).
For example, to filter out Suggests
on foo
, use:
%global __suggests_exclude ^R\\(foo\\)
To filter out multiple packages, use:
%global __suggests_exclude ^R\\((foo\\.bar|baz)\\)
Note that you need to escape regular expression special characters with backslash and you need to escape said backslash for RPM.
R packaging tips
Naming of R packages
Packages of R modules (thus they rely on R as a parent) have their own naming scheme. They should take into account the upstream name of the R module. This makes a package name format of R-$NAME
. When in doubt, use the name of the module that you type to import it in R.
R version
Many R packages contain '-' in their version. Usually, the versioning used is a sequence of at least two (and usually three) non-negative integers separated by single '.' or '-' characters.
To be consistent with the versioning system used in Fedora, you should simply replace dashes with dots.
Empty %build section
Unlike normal Fedora packages, there is normally no separate %build
actions (e.g. %configure
)that need to be taken for an R package. However, it is important that all R module packages include an empty %build
section, as shown in the spec templates.
Installing the R addon bits
Instead of calling make install, to install the R addon components, you need to run R CMD INSTALL -l %{buildroot}%{_datadir}/R/library %{packname}
(noarch) or R CMD INSTALL -l %{buildroot}%{_libdir}/R/library %{packname}
(arch-specific). Proper %install
sections for Fedora R packages are demonstrated in the spec templates.
Deleting the R.css file
Most R addon modules generate a new R.css
file,
but it would conflict with the master R.css
file,
included in the main R package.
You must delete this file, and do not include it in your package.
Cleaning the R directory of binaries
It is important to clean the R directory of binary files (*.o *.so
) before running R CMD CHECK
. Otherwise, the CHECK command will throw a warning about finding binaries in the source dir. This is accomplished by running (in %install
):
test -d %{packname}/src && (cd %{packname}/src; rm -f *.o *.so)
This is demonstrated in the spec templates.
Running %check and Suggests
R addon modules come with a built-in check that can be triggered by running R CMD check
.
In Fedora, the check should be run in the %check
section.
Packages in Suggests
are often used in examples, tests, and vignettes, sometimes even in functions exported by the package.
However, according to CRAN’s guidelines, R addons MUST work without the dependencies listed in Suggests
.
This means that they MUST check for the presence of a suggested package before running anything that requires it (in code, examples, tests, or vignettes).
According to this, Fedora packages MUST drop from BuildRequires
all packages in R’s Suggests
to avoid circular dependency loops.
As a exception to this rule, R addons that are mandatory for running unit tests in the first place (e.g. testthat
, tinytest
, and few more) SHOULD be kept in BuildRequires
for the %check
section.
By default, R CMD check
checks for the presence of suggested packages, so export _R_CHECK_FORCE_SUGGESTS_=0
MUST be added to disable this check.
Additionally, recreation of manual pages and vignettes, which usually use suggested packages, MUST be disabled with --no-manual
and --ignore-vignettes
respectively.
Putting everything together, the %check
section should look like the one in the example spec above.
If this default %check
fails due to some missing suggested package, then it is a bug in the package.
This SHOULD be reported upstream, and a workaround MUST be put in place:
-
If the failure happens in an example, the
--no-examples
flag MAY be added. -
If the failure happens in a test, a
skip()
call MAY be added in the proper place, or even the--no-tests
flag for more complicated situations.
License
Typically, R extensions do not contain license files per CRAN policy. R allows a set of open source licenses and R extensions just declare which one they adhere to. Following this policy, we do not require upstream R extensions to add license files.
Documentation files
The R CMD INSTALL
operation will install all of the files, including documentation files. The doc, html and NEWS files/directories need to be marked as %doc
.
Note that other files, such as DESCRIPTION, INDEX, NAMESPACE, and help/ are not %doc
, since proper R functionality depends on their presence. Be careful not to duplicate %doc
files in the package, the spec templates provide good examples on how to package the R addon files without duplications.
Optimization flags
R packages inherit their optimization flags from the main R package, which stores them in %{_libdir}/R/etc/Makeconf
. The design of R is such that all R addon library modules use the same optimization flags that the main R package was built with. Accordingly, this is why R addon packages do not pass %{optflags}
. Also, there is no simple way to pass special optimization flags to R CMD INSTALL
.
R headers
R packages usually expect to find their header files in %{_libdir}/R/library/*/
. rpmlint will complain that these files are misplaced, but this is safe to ignore.
You should still separate these header files into a -devel subpackage.
R2spec
R2spec is an excellent little tool to assist in creating Fedora-compliant packages for R libraries. Using it as a starting point is recommended (but certainly not mandated). More information here : https://pagure.io/r2spec/
Want to help? Learn how to contribute to Fedora Docs ›