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

hrb*_*str 10 c++ gcc r rcpp travis-ci

Travis-CI 对Ubuntu 的官方R项目构建支持使用(在本问题时)gcc版本4.6.

CRAN使用gcc4.9,一些在CRAN上构建良好的软件包不会在Travis上构建gcc4.6.

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

hrb*_*str 8

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

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

gcc在下面的示例中使用了5,但您可以使用工具链测试版本中提供的任何版本.理想情况下,人们应该模仿CRAN的gcc版本,这可能是特拉维斯人可能会考虑为R版本默认的东西.

.travis.yml关一样开始:

language: r
warnings_are_errors: true
sudo: required

env:
 global:
   - CRAN: http://cran.rstudio.com
Run Code Online (Sandbox Code Playgroud)

我添加了一个矩阵构建配置来添加新的包源以及指定需要安装的包.我将它留在矩阵配置中,因为我将尝试(最终)添加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
Run Code Online (Sandbox Code Playgroud)

接下来,我确保将自动默认编译器设置为更新,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
Run Code Online (Sandbox Code Playgroud)

base64字符串等于:

VER=-5
CC=gcc$(VER) -std=c11
CXX=g++$(VER)
SHLIB_CXXLD=g++$(VER)
FC=gfortran
F77=gfortran
Run Code Online (Sandbox Code Playgroud)

而这只是(IMO)更清洁.

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

经过这些修改.travis.yml配置,ndjson内置精细.


Kev*_*hey 7

为了提供替代方法,我在我的一个软件包中使用了自定义shell脚本sourcetools.我的目标是确保使用(现在很古老的)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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

最终结果基本相同,但恕我直言,将"设置"逻辑分离为完全由环境变量驱动的自己的脚本更为清晰.这也使得它更容易构建R矩阵的构建,因为特拉维斯自动组合的排列renv这里(不需要使用"手"做到这一点).

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

  • 六分之一,另外六分之一.[其他一些travis文件](https://github.com/skystrife/cpptoml/blob/master/.travis.yml)使用矩阵在同一个文件中执行此操作.我想我觉得更干净了.因人而异.最重要的是,我们可以做这些事情非常酷. (3认同)
  • 好的设置Sir Ushey!(我现在很高兴我开始这个FAQ-ish自我回答的问答,因为除了GitHub回购中的生产配置之外,这个信息确实没有记录在任何地方:-) (2认同)