# CRAN Package Information
= tools::CRAN_package_db()
db
# Number of total packages on CRAN
= nrow(db)
num_pkgs_db
# Calculate number of dependencies
= length(tools::dependsOnPkgs("RcppArmadillo",
num_deb_arma recursive = FALSE, installed = db))
Editor’s Note: This post is based off of work by both Bob Rudis and Kevin Ushey on StackOverflow under the question Using an alternate compiler for Travis-CI R project builds. Thanks also to readers Bhaskar Karambelkar and Dirk Eddelbuettel for making suggestions on how to improve the post.
Introduction
Recently, the Armadillo
project – led by the wonderful, rugged, australian Conrad Sanderson – has increased the gcc compiler requirement from 4.6 to 4.7.2. In turn, this rippled downstream to affect any package that has a dependency on RcppArmadillo
. For users that do not use Travis-CI to continously check their package prior to submitting to CRAN, there is no change. However, for those that do use Travis-CI and its the default VM/container image – still serving Ubuntu Precise 12.04 despite the promised transition to Ubuntu Trusty 14.04 – their package will error on a package dependency instead of erroring on the material being tested. Specifically, the error will be:
checking whether g++ version is sufficient... no
configure: WARNING: Only g++ version 4.7.2 or greater can be used with RcppArmadillo.
configure: error: Please use a different compiler.
The error can be found in the logs associated with the build.
Using functions found in the tools
package released with R 3.4.0, we can compute the amount of CRAN packages that depend on RcppArmadillo
and, thus, may end up failing on a Travis-CI build due to the upstream change.
Thus, there are 1173 out of 21507 packages on CRAN whose testing procedure may be affected depending on their Travis-CI configuration. For an extended look at these functions in tools
, take a look at Dirk Eddelbuettel’s R^4: Easy package information post.
Simple configuration fix
The easiest change is to pre-emptively set the distro
variable in to trusty.
# Trusty was released later than precise
dist: trusty
This changes the VM image from Ubuntu Precise 12.04 with gcc 4.6.3 to Ubuntu Trusty 14.04 with gcc 4.8.2.
Advanced configuration of .travis.yml
Within this section, I’ll work through the different configuration options I’ve recently used to re-enable testing on the iccbeta
package. The majority of configuration options is a mixture between responses by both Bob Rudis and Kevin Ushey on StackOverflow under the question Using an alternate compiler for Travis-CI R project builds.
We’ll begin with the standard devtools::use_travis()
function call. From here, change sudo: false
to sudo: required
.
# Semi-standard devtools wrapper travis declaration
language: r
cache: packages
sudo: required
We’ll also request the VM to be on a newer operating system, e.g. Trusty 14.04 vs Precise 12.04. For further details, please see Travis-CI’s default VM Environment.
# Trusty was released later than precise
dist: trusty
Now, we’ll request a more up-to-date compiler from the ubuntu-r-toolchain test PPA (i.e Personal Package Archives).
# Install new packages via ubuntu's apt-get manager
# View available compilers in the ubuntu-toolchain-r ppa at:
# https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- gcc-5
- g++-5
- gfortran-5
With the packages installed, we can create symbolic links to different programs using update-alternatives
. Issuing update-alternatives
leads to the link in /etc/alternatives
being changed to reflect the correct binary. This setup maintains the current configuration across the system. If you need to manually set the variables, please see the end of this post for advice on manipulating ~/.R/Makevars
.
before_install:
- sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 60 --slave /usr/bin/g++ g++ /usr/bin/g++-5
- sudo update-alternatives --install /usr/bin/gfortran gfortran /usr/bin/gfortran-5 60
Last, but not least, I’ve added the option to build the package on all versions of R that the DESCRIPTION
file indicates is supported.
r:
- 3.2
- oldrel
- release
- devel
If all goes well, then you should end up with a nice green test matrix.
Fin
Over the course of the post, we had a situation where the default compiler on Travis-CI had to be changed due to new requirements in a package dependency. The details of the .travis.yml
file for the compiler changed were addressed separately and are available for a single script download here:
https://github.com/tmsalab/iccbeta/blob/master/.travis.yml
Misc Note
If there is a preference to avoid overriding the binaries gcc
and g++
in /bin
or not using sudo: required
, then a similar effect is possible by explicitly telling R about the new compiler versions. Achieving this is possible by specifying implicit variables found in R’s ~/.R/Makevars
file. One important note to raise is the CC
declaration also include a fixed compilation standard of 1999. This is due to the openssl
package failing without it being set, which in turns causes failure to occur in installing devtools
on Travis-CI.
# Specify local Makevars configuration
before_install:
- mkdir -p ~/.R
- VER=-5
- echo "CC=gcc$(VER) -std=gnu99" >> ~/.R/Makevars
- echo "CXX=g++$(VER)" >> ~/.R/Makevars
- echo 'CXX1X=$(CXX)' >> ~/.R/Makevars
- echo 'CXX11=$(CXX)' >> ~/.R/Makevars
- echo 'CXX14=$(CXX)' >> ~/.R/Makevars
- echo 'CXX14=$(CXX)' >> ~/.R/Makevars
- echo "SHLIB_CXXLD=g++$(VER)" >> ~/.R/Makevars
- echo "FC=gfortran$(VER)" >> ~/.R/Makevars
- echo "F77=gfortran$(VER)" >> ~/.R/Makevars