我真的希望能够使用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内置精细.
为了提供替代方法,我在我的一个软件包中使用了自定义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矩阵的构建,因为特拉维斯自动组合的排列r和env这里(不需要使用"手"做到这一点).
我想before-install.sh我使用的脚本可以清理/制作更一般,但我还没有必要这样做.