2016-09-27 7 views
5

Travis-CIのofficial R project buildのサポートは、この質問の時点でgccバージョン4.6です。Travis-CI Rプロジェクトビルド用の代替コンパイラの使用

CRANはgcc 4.9を使用し、CRANでうまくいくいくつかのパッケージはgcc 4.6のTravisで構築されません。

Rプロジェクト/パッケージビルド用のデフォルトのgccコンパイラを、CRANビルドとより密接にミラー化するにはどうすればよいですか?

答えて

5

私は本当にTravisを使ってndjsonパッケージをテストすることができたが、私が使っているC++ライブラリはgcc 4.6にコンパイルされません。

ndjsonパッケージは、(R-oldrel Windows上で私を少し気にしませんを除く)CRANとCRAN builds are fineあるので、私はRはトラヴィスに使用するコンパイラを変更する方法を必要としていました。

私はgcc 5を以下の例で使用していますが、toolchain test buildsで利用可能な任意のバージョンを使用できます。理想的には、CRANのgccバージョンを模倣する必要があります。これはTravisの人々がRビルドのデフォルトを検討するかもしれないものかもしれません。同じオフ

.travis.yml開始:

language: r 
warnings_are_errors: true 
sudo: required 

env: 
global: 
    - CRAN: http://cran.rstudio.com 

は、私は新しいパッケージソースを追加するだけでなく、インストールするために必要なパッケージ(複数可)を指定するには、行列のビルド構成を追加しました。 clangを(ついに)追加しようとしているので、私は行列構成でそれを残しました。

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文字列をに相当:

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を作成することによって、それを使用することを二重に確認作られてことを確認しました:

VER=-5 
CC=gcc$(VER) -std=c11 
CXX=g++$(VER) 
SHLIB_CXXLD=g++$(VER) 
FC=gfortran 
F77=gfortran 

このように(IMO)クリーナーです。

は理論的には、私がしなければならなかっただろうすべてが作成されMakevars(すなわちデフォルトupdate-alternativesgccを変更する必要はない)が、それはではなく、実際の依存関係をインストールするときトラヴィスがMakevarsgcc設定を使用していることが判明しましたパッケージビルド自体。だから、update-alternativesが必要です。私はまた、-std=c11を追加して、いくつかの依存関係をコンパイルするようにしなければなりませんでした(ビルドエラーなし)。

.travis.yml構成のこれらの変更の後に、ndjsonが正常に構築されました。

+1

eonsのためにそれをしています。例えば、[here](https://github.com/eddelbuettel/rcppcctz/blob/master/.travis.yml)や他のいくつかのreposを参照してください。 –

+1

Aye。他人を助けようとしています。 – hrbrmstr

+1

これは本当にシェルスクリプトのようなものです。あなたのPPAを追加するには、ゴールデンです。しかし、それは、以前に使用されていたトラビスのスタイルを必要とするかもしれません。例:[here](https://github.com/eddelbuettel/rquantlib/blob/master/.travis.yml)を参照してください。 –

4

代わりに、私は自分のパッケージsourcetoolsの1つでカスタムシェルスクリプトを使用します。私の目標は、パッケージが(今の古代の)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 

最終的な結果は、基本的には同じであるが、それは、独自に「セットアップ」のロジックを分離するために、ややクリーナーですIMHO環境変数から完全に追い出されたスクリプトです。また、Travisはrenvの順列を自動的に組み合わせます(手で行う必要はありません)ので、R行列の構築を簡単に行うことができます。

私が使用しているbefore-install.shスクリプトは、より一般的なクリーンアップ/作成が可能だと思いますが、まだそれを行う必要はありませんでした。

+2

Nice setup Sir Ushey! (この情報は実際にGitHub reposのプロダクション設定以外にはどこにも書かれていないので、このFAQ-ish自己回答のQ&Aを始めてうれしく思います:-) – hrbrmstr

+2

6人中6人、もう1人は6人です。 [他のいくつかのtravisファイル](https://github.com/skystrife/cpptoml/blob/master/.travis.yml)は、同じファイル内でこれを行列を使って行います。私はそれがきれいだと思う。 YMMV。主なことは、私たちがこれらのことを行うことができることは非常に涼しいことです。 –