m (Packaging/R moved to Packaging:R: Moving Packaging Pages to Packaging Namespace) |
(Writeup of https://fedorahosted.org/fpc/ticket/535) |
||
(11 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
== What is R? == | == What is R? == | ||
The definition from [http://www.r-project.org/ The R-Project website] says that R is: | The definition from [http://www.r-project.org/ The R-Project website] says that R is: | ||
Line 20: | Line 16: | ||
* [http://www.bioconductor.org/ The bioconductor website] | * [http://www.bioconductor.org/ The bioconductor website] | ||
* [http://cran.r-project.org/ The CRAN website] | * [http://cran.r-project.org/ The CRAN website] | ||
* [http://r-forge.r-project.org/ The R-forge from the R-Project website] | |||
* [http://www.rforge.net/ The RForge website] | |||
== Spec Templates for R packages == | == Spec Templates for R packages == | ||
Line 28: | Line 26: | ||
<pre> | <pre> | ||
% | %global packname foo | ||
% | %global packrel 1 | ||
Name: R-%{packname} | Name: R-%{packname} | ||
Line 35: | Line 33: | ||
Release: 1%{?dist} | Release: 1%{?dist} | ||
Source0: ftp://cran.r-project.org/pub/R/contrib/main/%{packname}_%{version}-%{packrel}.tar.gz | Source0: ftp://cran.r-project.org/pub/R/contrib/main/%{packname}_%{version}-%{packrel}.tar.gz | ||
License: | License: GPLv2+ | ||
URL: http://cran.r-project.org/src/contrib | URL: http://cran.r-project.org/src/contrib | ||
Group: Applications/Engineering | Group: Applications/Engineering | ||
Summary: Adds foo functionality for R | Summary: Adds foo functionality for R | ||
BuildRequires: R-devel, | BuildRequires: R-devel, tex(latex) | ||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) | BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) | ||
Requires | Requires: R-core | ||
%description | %description | ||
Line 64: | Line 61: | ||
%clean | %clean | ||
rm -rf $RPM_BUILD_ROOT | rm -rf $RPM_BUILD_ROOT | ||
%files | %files | ||
%dir %{_libdir}/R/library/%{packname} | %dir %{_libdir}/R/library/%{packname} | ||
%doc %{_libdir}/R/library/%{packname}/doc | %doc %{_libdir}/R/library/%{packname}/doc | ||
%doc %{_libdir}/R/library/%{packname}/html | %doc %{_libdir}/R/library/%{packname}/html | ||
%doc %{_libdir}/R/library/%{packname}/NEWS | %doc %{_libdir}/R/library/%{packname}/NEWS | ||
%{_libdir}/R/library/%{packname}/ | %{_libdir}/R/library/%{packname}/DESCRIPTION | ||
%{_libdir}/R/library/%{packname}/INDEX | %{_libdir}/R/library/%{packname}/INDEX | ||
%{_libdir}/R/library/%{packname}/NAMESPACE | %{_libdir}/R/library/%{packname}/NAMESPACE | ||
Line 96: | Line 83: | ||
<pre> | <pre> | ||
% | %global packname foo | ||
% | %global packrel 1 | ||
Name: R-%{packname} | Name: R-%{packname} | ||
Line 103: | Line 90: | ||
Release: 1%{?dist} | Release: 1%{?dist} | ||
Source0: ftp://cran.r-project.org/pub/R/contrib/main/%{packname}_%{version}-%{packrel}.tar.gz | Source0: ftp://cran.r-project.org/pub/R/contrib/main/%{packname}_%{version}-%{packrel}.tar.gz | ||
License: | License: GPLv2+ | ||
URL: http://cran.r-project.org/src/contrib | URL: http://cran.r-project.org/src/contrib | ||
Group: Applications/Engineering | Group: Applications/Engineering | ||
Summary: Adds foo functionality for R | Summary: Adds foo functionality for R | ||
BuildRequires: R-devel, | BuildRequires: R-devel, tex(latex) | ||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) | BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) | ||
BuildArch: noarch | BuildArch: noarch | ||
Requires: R-core | |||
Requires: R | |||
%description | %description | ||
Line 134: | Line 119: | ||
%clean | %clean | ||
rm -rf $RPM_BUILD_ROOT | rm -rf $RPM_BUILD_ROOT | ||
%files | %files | ||
%dir %{_datadir}/R/library/%{packname} | %dir %{_datadir}/R/library/%{packname} | ||
%doc %{_datadir}/R/library/%{packname}/doc | %doc %{_datadir}/R/library/%{packname}/doc | ||
%doc %{_datadir}/R/library/%{packname}/html | %doc %{_datadir}/R/library/%{packname}/html | ||
%doc %{_datadir}/R/library/%{packname}/NEWS | %doc %{_datadir}/R/library/%{packname}/NEWS | ||
%{_datadir}/R/library/%{packname}/ | %{_datadir}/R/library/%{packname}/DESCRIPTION | ||
%{_datadir}/R/library/%{packname}/INDEX | %{_datadir}/R/library/%{packname}/INDEX | ||
%{_datadir}/R/library/%{packname}/NAMESPACE | %{_datadir}/R/library/%{packname}/NAMESPACE | ||
Line 167: | Line 142: | ||
* Noarch packages set <code>BuildArch: noarch</code> | * Noarch packages set <code>BuildArch: noarch</code> | ||
* Noarch packages install into <code>%{_datadir}/R/library/%{packname}</code>, arch-specific packages install into <code>%{_libdir}/R/library/%{packname}</code> | * Noarch packages install into <code>%{_datadir}/R/library/%{packname}</code>, arch-specific packages install into <code>%{_libdir}/R/library/%{packname}</code> | ||
=== 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://fedorahosted.org/r2spec/ | |||
== R packaging tips == | == R packaging tips == | ||
Line 178: | Line 157: | ||
R-RScaLAPACK (R module named RScaLAPACK) | R-RScaLAPACK (R module named RScaLAPACK) | ||
R-waveslim (R module named waveslim) | R-waveslim (R module named waveslim) | ||
</pre> | |||
=== 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. | |||
Example: | |||
<pre> | |||
Upstream tarball: Rfoo-0.5-8.tar.gz | |||
Fedora Version: 0.5.8 | |||
</pre> | </pre> | ||
Line 188: | Line 178: | ||
=== Deleting the R.css file === | === 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. | 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 === | === Cleaning the R directory of binaries === | ||
Line 221: | Line 199: | ||
=== Documentation files === | === Documentation files === | ||
The <code>R CMD INSTALL</code> operation will install all of the files, including documentation files. The | The <code>R CMD INSTALL</code> operation will install all of the files, including documentation files. The doc, html and NEWS files/directories need to be marked as <code>%doc</code>. | ||
Note that other files, such as | Note that other files, such as DESCRIPTION, INDEX, NAMESPACE, and help/ are not <code>%doc</code>, since proper R functionality depends on their presence. Be careful not to duplicate <code>%doc</code> files in the package, the spec templates provide good examples on how to package the R addon files without duplications. | ||
==== R documentation ==== | |||
R documentation is written in Tex. rpmlint sometimes complains that these Tex files are not utf-8 files, but the encoding is normally specified in the file when needed, so this error is safe to ignore (and you should not try to re-encode the files). | |||
=== Optimization flags === | === Optimization flags === | ||
R packages inherit their optimization flags from the main R package, which stores them in <code>%{_libdir}/R/etc/Makeconf</code>. 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 <code>$RPM_OPT_FLAGS</code>. Also, there is no simple way to pass special optimization flags to <code>R CMD INSTALL</code>. | R packages inherit their optimization flags from the main R package, which stores them in <code>%{_libdir}/R/etc/Makeconf</code>. 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 <code>$RPM_OPT_FLAGS</code>. Also, there is no simple way to pass special optimization flags to <code>R CMD INSTALL</code>. | ||
=== 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. | |||
[[Category:Packaging guidelines]] |
Revision as of 19:45, 21 May 2015
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.
Arch specific R packaging spec template
%global packname foo %global 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: GPLv2+ URL: http://cran.r-project.org/src/contrib Group: Applications/Engineering Summary: Adds foo functionality for R BuildRequires: R-devel, tex(latex) BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: R-core %description R Interface to foo, enables bar! %prep %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 %files %dir %{_libdir}/R/library/%{packname} %doc %{_libdir}/R/library/%{packname}/doc %doc %{_libdir}/R/library/%{packname}/html %doc %{_libdir}/R/library/%{packname}/NEWS %{_libdir}/R/library/%{packname}/DESCRIPTION %{_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 * Fri Jul 6 2007 Tom "spot" Callaway <tcallawa@redhat.com> 1.6.6-1 - Initial package creation
Noarch R packaging spec template
%global packname foo %global 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: GPLv2+ URL: http://cran.r-project.org/src/contrib Group: Applications/Engineering Summary: Adds foo functionality for R BuildRequires: R-devel, tex(latex) BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildArch: noarch Requires: R-core %description R Interface to foo, enables bar! %prep %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 %files %dir %{_datadir}/R/library/%{packname} %doc %{_datadir}/R/library/%{packname}/doc %doc %{_datadir}/R/library/%{packname}/html %doc %{_datadir}/R/library/%{packname}/NEWS %{_datadir}/R/library/%{packname}/DESCRIPTION %{_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 * Fri Jul 6 2007 Tom "spot" Callaway <tcallawa@redhat.com> 1.6.6-1 - Initial package creation
Summary of 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}
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://fedorahosted.org/r2spec/
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.
Examples:
R-mAr (R module named mAr) R-RScaLAPACK (R module named RScaLAPACK) R-waveslim (R module named waveslim)
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.
Example:
Upstream tarball: Rfoo-0.5-8.tar.gz Fedora Version: 0.5.8
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 $RPM_BUILD_ROOT%{_datadir}/R/library %{packname}
(noarch) or R CMD INSTALL -l $RPM_BUILD_ROOT%{_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
Most (if not all) R addon modules come with a built-in check. This can be triggered by running R CMD check
. In Fedora, the check should be run in the %check
section. Here is an example %check
section for a Fedora R package:
%check %{_bindir}/R CMD check %{packname}
Note that frequently, R packages have circular dependency loops when running R CMD check
. 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 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.
R documentation
R documentation is written in Tex. rpmlint sometimes complains that these Tex files are not utf-8 files, but the encoding is normally specified in the file when needed, so this error is safe to ignore (and you should not try to re-encode the files).
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 $RPM_OPT_FLAGS
. 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.