为Travis-CI R项目构建使用替代编译器
Using an alternate compiler for Travis-CI R project builds
Travis-CI的官方R项目在Ubuntu上使用(在这个问题出现的时候)gcc
4.6版本。
CRAN使用gcc
4.9,一些在CRAN上运行良好的包将无法在gcc
4.6的Travis上运行。
如何更改R项目/包构建的默认gcc
编译器以更紧密地镜像CRAN构建?
我真的希望能够使用Travis来测试我的ndjson
包,但是我使用的c++库在gcc
4.6下无法编译。
ndjson
包在CRAN上是, CRAN构建很好(除了Windows上的R -oldrel,这一点也不困扰我),所以我需要一种方法来改变R在Travis上使用的编译器。
我在下面的例子中使用 gcc
.5,但是您可以使用工具链测试构建中可用的任何版本。理想情况下,应该模仿CRAN的gcc
版本,这可能是Travis的人可能会考虑将其默认为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
(即不需要用update-alternatives
更改默认的gcc
),但事实证明Travis在安装依赖项时使用了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
最终结果基本上是相同的,但在我看来,将"设置"逻辑分离到完全脱离环境变量的自己的脚本中是更干净的。这也使得构建R矩阵更容易,因为Travis在这里自动组合了r
和env
的排列(不需要"手工")。
我想象我使用的before-install.sh
脚本可以被清理/更通用,但我还没有需要这样做。
- VS 2017 使用交叉编译器构建 x64 项目
- 使用Bazel构建具有不同编译器/链接器选项的C/C++依赖关系
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- C++使用较新的编译器构建应用程序,而无需重新构建库
- 无法构建 quazip。MOC 编译器不会运行。命令行未找到相关类
- 如何使用Visual Studio编译器使用cgo构建库?
- 在Travis中为CMAKE构建指定编译器版本
- 是否有编译器标志可以使较新的 gcc 版本像旧版本一样构建
- 尝试将Winelib与标准macOS构建工具一起使用:得到奇怪的编译器错误
- 构建 C/C++ 代码时的 Gradle 编译器输出
- 尝试使用VC++编译器构建Qt应用程序:"type_traits":没有这样的文件或目录
- 如何安全地部署使用升级的编译器构建的应用程序
- 如何使用 Solaris Studio 12.4 编译器构建 Boost V1.57
- 如何使用 cmake 使用不同的编译器构建多个可执行文件
- 如何用open64编译器构建boost库
- 编译器是用以前版本的编译器构建的吗?
- Sublime Text:编译器构建选项
- Netbeans首次编译器构建错误
- 用Intel编译器构建Boost库