2016-09-27 36 views

回答

5

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

ndjson在CRAN和CRAN builds are fine(除了在Windows上的R-oldrel不打扰我一个位),所以我需要一种方法来改变的是R上特拉维斯使用的编译器。

我在下面的示例中使用了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 

基于64位串相当于:

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

这就是(IMO)更清洁的方式。

从理论上讲,所有我将不得不做的是创造Makevars(即没有更改默认gccupdate-alternatives),但事实证明,特拉维斯安装的依赖关系,但不是实际时使用的Makevarsgcc设置包自己构建。所以,update-alternatives是必要的。我还必须添加-std=c11以确保编译的一些依赖项(构建错误而不是它)。

经过对.travis.yml配置的这些修改,ndjson内置良好。

+1

当然。一直在做这个为eons,见例如[这里](https://github.com/eddelbuettel/rcppcctz/blob/master/.travis.yml)和其他几个回购。 –

+1

是的。只是想帮助别人。 – hrbrmstr

+1

好的是,它确实就像shell脚本。另外一个很好的方面就是......添加您自己的PPA。但是,这可能需要以前使用Travis的风格,而这种风格恰好适用。参见例如[这里](https://github.com/eddelbuettel/rquantlib/blob/master/.travis.yml)。 –

4

只是为了给出一种替代方法,我在我的一个软件包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 

最终的结果是基本一致的,但恕我直言,这是有些清洁剂的“设置”逻辑分离到它自己的脚本完全由环境变量驱动。由于Travis自动将renv的排列组合在一起(无需“手动”),因此它还使构建R矩阵构建变得更加容易。

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

+2

好设置先生Ushey! (我现在很高兴我开始了这个FAQ-ish自我回答问答,因为除了GitHub回购协议中的产品配置,这个信息没有任何记录:-) – hrbrmstr

+2

其中六个,其他六个。 [其他一些Travis文件](https://github.com/skystrife/cpptoml/blob/master/.travis.yml)使用矩阵在同一个文件中执行此操作。我觉得我找到了更清洁的人。因人而异。最主要的是,我们可以做这些事情是非常酷的。 –

相关问题