使用Travis-CI R项目构建的备用编译器

时间:2016-09-27 15:31:30

标签: c++ r gcc travis-ci rcpp

Travis-CI对Ubuntu的official R project build支持使用(在本期问题时)gcc版本4.6。

CRAN使用gcc 4.9,在CRAN上构建正常的一些软件包不会在gcc 4.6的Travis上构建。

如何更改R项目/包构建的默认gcc编译器以更接近地镜像CRAN构建?

2 个答案:

答案 0 :(得分:8)

我真的希望能够使用Travis来测试我的ndjson包,但我正在使用的C ++库不会在gcc 4.6下编译。

CRAN上的ndjson软件包 和CRAN builds are fine(除了Windows上的r-oldrel之外我没有打扰过一些),所以我需要一个改变R在Travis上使用的编译器的方法。

我在下面的示例中使用gcc 5,但您可以使用toolchain test builds中提供的任何版本。理想情况下,人们应该模仿CRAN的gcc版本,这可能是特拉维斯人可能考虑为R版本默认的东西。

.travis.yml开始时相同:

language: r
warnings_are_errors: true
sudo: required

env:
 global:
   - CRAN: http://cran.rstudio.com

我添加了一个矩阵构建配置来添加新的包源以及指定需要安装的包。我将它留在矩阵配置中,因为我将尝试(最终)添加clang

matrix:
  include:
    - os: linux
      compiler: gcc
      addons:
        apt:
          sources: ['ubuntu-toolchain-r-test']
          packages: ['g++-5']
      env:
        - COMPILER=g++-5
        - CC=gcc=5
        - CXX=g++-5

接下来,我确保自动默认编译器设置为较新的gcc,并且还确保R通过创建本地Makevars来使用它:

before_install:
  - sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 100
  - mkdir -p ~/.R
  - echo "VkVSPS01CkNDPWdjYyQoVkVSKSAtc3RkPWMxMSAKQ1hYPWcrKyQoVkVSKQpTSExJQl9DWFhMRD1nKyskKFZFUikKRkM9Z2ZvcnRyYW4KRjc3PWdmb3J0cmFuCg==" | base64 -d > ~/.R/Makevars
  - cat ~/.R/Makevars

base64字符串等同于:

VER=-5
CC=gcc$(VER) -std=c11
CXX=g++$(VER)
SHLIB_CXXLD=g++$(VER)
FC=gfortran
F77=gfortran

只是(IMO)这样清洁。

理论上,我所要做的就是创建Makevars(即不必使用gcc更改默认update-alternatives)但事实证明Travis使用了Makevars安装依赖项时设置{1}} gcc,而不是实际的包构建本身。所以,update-alternatives是必要的。我还必须添加-std=c11以确保编译的一些依赖项(构建错误与它)。

.travis.yml配置进行这些修改后,ndjson构建得很好。

答案 1 :(得分:6)

为了提供替代方法,我在我的一个包sourcetools中使用自定义shell脚本。我的目标是确保使用(现在很古老的)gcc-4.4编译器构建包。在.travis.yml,我有:

language: r
cache: packages
sudo: false
warnings_are_errors: true

before_install:
  - source travis/before-install.sh

addons:
  apt:
    packages:
      - gcc-4.4
      - g++-4.4
      - clang

r:
  - oldrel
  - release
  - devel

env:
  - COMPILER=gcc-4.4
  - COMPILER=gcc
  - COMPILER=clang

travis/before-install.sh,我有:

#!/usr/bin/env sh

mkdir -p ~/.R

if [ "${COMPILER}" = "gcc-4.4" ]; then
    echo "CC=gcc-4.4 -std=gnu99"    >> ~/.R/Makevars
    echo "CXX=g++-4.4"              >> ~/.R/Makevars
    echo "CXX1X=g++-4.4 -std=c++0x" >> ~/.R/Makevars
fi

if [ "${COMPILER}" = "gcc" ]; then
    echo "CC=gcc -std=gnu99"    >> ~/.R/Makevars
    echo "CXX=g++"              >> ~/.R/Makevars
    echo "CXX1X=g++ -std=c++0x" >> ~/.R/Makevars
fi

if [ "${COMPILER}" = "clang" ]; then
    echo "CC=clang -std=gnu99"      >> ~/.R/Makevars
    echo "CXX=clang++"              >> ~/.R/Makevars
    echo "CXX1X=clang++ -std=c++0x" >> ~/.R/Makevars
fi

最终结果基本相同,但恕我直言,将“设置”分开是比较干净的。逻辑成为自己的脚本,完全脱离了环境变量。它还可以更容易地构建R矩阵构建,因为Travis自动将renv的排列组合在一起(无需手动操作')。

我想我使用的before-install.sh脚本可以清理/制作得更加通用,但我还没有必要这样做。