在Ubuntu上使用Travis-CI的official R project build支持(在此问题发生时)gcc
版本4.6。使用替代编译器为Travis-CI R项目构建
CRAN使用gcc
4.9并且一些在CRAN上构建良好的包将不会在Travis上构建,其中包含gcc
4.6。
如何更改R项目/包构建的默认gcc
编译器以更接近镜像CRAN构建?
在Ubuntu上使用Travis-CI的official R project build支持(在此问题发生时)gcc
版本4.6。使用替代编译器为Travis-CI R项目构建
CRAN使用gcc
4.9并且一些在CRAN上构建良好的包将不会在Travis上构建,其中包含gcc
4.6。
如何更改R项目/包构建的默认gcc
编译器以更接近镜像CRAN构建?
我真的很想能够使用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
(即没有更改默认gcc
与update-alternatives
),但事实证明,特拉维斯安装的依赖关系,但不是实际时使用的Makevars
gcc
设置包自己构建。所以,update-alternatives
是必要的。我还必须添加-std=c11
以确保编译的一些依赖项(构建错误而不是它)。
经过对.travis.yml
配置的这些修改,ndjson
内置良好。
只是为了给出一种替代方法,我在我的一个软件包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自动将r
和env
的排列组合在一起(无需“手动”),因此它还使构建R矩阵构建变得更加容易。
我想我使用的before-install.sh
脚本可以清理/制作得更一般,但我还没有这个必要。
好设置先生Ushey! (我现在很高兴我开始了这个FAQ-ish自我回答问答,因为除了GitHub回购协议中的产品配置,这个信息没有任何记录:-) – hrbrmstr
其中六个,其他六个。 [其他一些Travis文件](https://github.com/skystrife/cpptoml/blob/master/.travis.yml)使用矩阵在同一个文件中执行此操作。我觉得我找到了更清洁的人。因人而异。最主要的是,我们可以做这些事情是非常酷的。 –
当然。一直在做这个为eons,见例如[这里](https://github.com/eddelbuettel/rcppcctz/blob/master/.travis.yml)和其他几个回购。 –
是的。只是想帮助别人。 – hrbrmstr
好的是,它确实就像shell脚本。另外一个很好的方面就是......添加您自己的PPA。但是,这可能需要以前使用Travis的风格,而这种风格恰好适用。参见例如[这里](https://github.com/eddelbuettel/rquantlib/blob/master/.travis.yml)。 –