Travis-CI对Ubuntu的official R project build支持使用(在本期问题时)gcc
版本4.6。
CRAN使用gcc
4.9,在CRAN上构建正常的一些软件包不会在gcc
4.6的Travis上构建。
如何更改R项目/包构建的默认gcc
编译器以更接近地镜像CRAN构建?
答案 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自动将r
和env
的排列组合在一起(无需手动操作')。
我想我使用的before-install.sh
脚本可以清理/制作得更加通用,但我还没有必要这样做。