Archive:PackagingDrafts/R

= How to package R modules =

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:
 * The R-Project website
 * An introduction to R

If you are interested in packaging R modules, or if you are looking for R libraries, you should check here for upstream sources:
 * The bioconductor website
 * The CRAN website

Spec Templates for R packages
There are two types of R packages: arch-specific and noarch.

Arch specific R packaging spec template
%define packname foo %define packrel 1

Name:            R-%{packname} Version:         1.6.6 Release:         1%{?dist} Source0:         ftp://cran.r-project.org/pub/R/contrib/main/%{packname}_%{version}-%{packrel}.tar.gz License:          GPL URL:             http://cran.r-project.org/src/contrib Group:           Applications/Engineering Summary:         Adds foo functionality for R BuildRequires:    R-devel, tetex-latex BuildRoot:       %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires(post):  R Requires(postun): R

%description R Interface to foo, enables bar!

%setup -q -c -n %{packname}

%build

%install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_libdir}/R/library %{_bindir}/R CMD INSTALL -l $RPM_BUILD_ROOT%{_libdir}/R/library %{packname} test -d %{packname}/src && (cd %{packname}/src; rm -f *.o *.so) rm -rf $RPM_BUILD_ROOT%{_libdir}/R/library/R.css

%check %{_bindir}/R CMD check %{packname}

%clean rm -rf $RPM_BUILD_ROOT

%post %{_R_make_search_index}

%postun %{_R_make_search_index}

%files %defattr(-, root, root, -) %dir %{_libdir}/R/library/%{packname} %doc %{_libdir}/R/library/%{packname}/latex %doc %{_libdir}/R/library/%{packname}/doc %doc %{_libdir}/R/library/%{packname}/html %doc %{_libdir}/R/library/%{packname}/man %doc %{_libdir}/R/library/%{packname}/DESCRIPTION %{_libdir}/R/library/%{packname}/CONTENTS %{_libdir}/R/library/%{packname}/INDEX %{_libdir}/R/library/%{packname}/NAMESPACE %{_libdir}/R/library/%{packname}/Meta %{_libdir}/R/library/%{packname}/R %{_libdir}/R/library/%{packname}/R-ex %{_libdir}/R/library/%{packname}/help

%changelog - Initial package creation
 * Fri Jul 6 2007 Tom "spot" Callaway  1.6.6-1

Noarch R packaging spec template
%define packname foo %define packrel 1

Name:            R-%{packname} Version:         1.6.6 Release:         1%{?dist} Source0:         ftp://cran.r-project.org/pub/R/contrib/main/%{packname}_%{version}-%{packrel}.tar.gz License:          GPL URL:             http://cran.r-project.org/src/contrib Group:           Applications/Engineering Summary:         Adds foo functionality for R BuildRequires:    R-devel, tetex-latex BuildRoot:       %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildArch:       noarch Requires(post):  R Requires(postun): R Requires:         R

%description R Interface to foo, enables bar!

%setup -q -c -n %{packname}

%build

%install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT%{_datadir}/R/library %{_bindir}/R CMD INSTALL -l $RPM_BUILD_ROOT%{_datadir}/R/library %{packname} test -d %{packname}/src && (cd %{packname}/src; rm -f *.o *.so) rm -rf $RPM_BUILD_ROOT%{_datadir}/R/library/R.css

%check %{_bindir}/R CMD check %{packname}

%clean rm -rf $RPM_BUILD_ROOT

%post %{_R_make_search_index}

%postun %{_R_make_search_index}

%files %defattr(-, root, root, -) %dir %{_datadir}/R/library/%{packname} %doc %{_datadir}/R/library/%{packname}/latex %doc %{_datadir}/R/library/%{packname}/doc %doc %{_datadir}/R/library/%{packname}/html %doc %{_datadir}/R/library/%{packname}/man %doc %{_datadir}/R/library/%{packname}/DESCRIPTION %{_datadir}/R/library/%{packname}/CONTENTS %{_datadir}/R/library/%{packname}/INDEX %{_datadir}/R/library/%{packname}/NAMESPACE %{_datadir}/R/library/%{packname}/Meta %{_datadir}/R/library/%{packname}/R %{_datadir}/R/library/%{packname}/R-ex %{_datadir}/R/library/%{packname}/help

%changelog - Initial package creation
 * Fri Jul 6 2007 Tom "spot" Callaway  1.6.6-1

Summary of differences between arch-specific and noarch R packages

 * Noarch packages set
 * Noarch packages install into, arch-specific packages install into

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. When in doubt, use the name of the module that you type to import it in R.

Examples:  R-mAr (R module named mAr) R-RScaLAPACK (R module named RScaLAPACK) R-waveslim (R module named waveslim)

Empty %build section
Unlike normal Fedora packages, there is normally no separate  actions (e.g.  )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  (noarch) or   (arch-specific). Proper  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.

Generating the search index.txt
R keeps a master index.txt, as a search index of which R libraries are installed on the system. This provides the source for the R html help interface that is accessible through the help.start command. This index is always located at. All R packages need to update the search index.txt in %post and %postun. The R package provides a macro to make this simple:. Simply put this macro in %post and %postun in your R package, and it will update the search index.txt to include arch-specific and noarch R libraries upon install and uninstall. This is demonstrated in the spec templates.

NOTE: R packages will throw the following warning from rpmlint: W: R-widgetTools one-line-command-in-%post /usr/lib/rpm/R-make-search-index.sh

Normally, this would be resolved by running, but this will not work with our script. Just ignore this warning.

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
Most (if not all) R addon modules come with a built-in check. This can be triggered by running. In Fedora, the check should be run in the  section. Here is an example  section for a Fedora R package:

%check %{_bindir}/R CMD check %{packname}

Note that frequently, R packages have circular dependency loops when running. If you hit such a case, you can comment out the check to break the dependency loop, and leave a comment explaining the circular dependency problem.

Documentation files
The  operation will install all of the files, including documentation files. The latex, doc, html, man, and DESCRIPTION files/directories need to be marked as. Note that other files, such as CONTENTS, INDEX, NAMESPACE, and help/ are not, since proper R functionality depends on their presence. Be careful not to duplicate  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. 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. Also, there is no simple way to pass special optimization flags to.