2016-09-27 16 views
5

ट्रैविस-सीआई के official R project build उबंटू उपयोग (इस प्रश्न के समय) पर gcc संस्करण 4.6 पर समर्थन बनाता है।ट्रेविस-सीआई आर परियोजना के लिए वैकल्पिक कंपाइलर का उपयोग

सीआरएएन gcc 4.9 का उपयोग करता है और सीआरएएन पर ठीक बनाने वाले कुछ पैकेज gcc 4.6 के साथ ट्रैविस पर नहीं बनाएंगे।

आर प्रोजेक्ट/पैकेज के लिए डिफ़ॉल्ट gcc कंपाइलर कैसे बदलता है और अधिक बारीक दर्पण सीआरएएन बनाता है?

उत्तर

5

मैं वास्तव में ट्रेविस का उपयोग अपने ndjson पैकेज का परीक्षण करने में सक्षम होना चाहता था लेकिन सी ++ लाइब्रेरी जिसका उपयोग मैं कर रहा हूं, gcc 4.6 के तहत संकलित नहीं होगा।

ndjson पैकेज क्रैन और क्रैन builds are fine (Windows पर आर-oldrel जो मुझे थोड़ा परेशान नहीं करता है के लिए छोड़कर) पर है, इसलिए मैं संकलक कि आर ट्रैविस पर उपयोग करता है को बदलने के तरीके की जरूरत है।

मैं नीचे दिए गए उदाहरण में gcc 5 का उपयोग कर रहा हूं, लेकिन आप toolchain test builds में उपलब्ध किसी भी संस्करण का उपयोग कर सकते हैं। आदर्श रूप में, किसी को सीआरएएन के gcc संस्करण की नकल करनी चाहिए और यह कुछ ऐसा हो सकता है जो ट्रेविस लोग आर बिल्ड के लिए डिफ़ॉल्ट बनाने पर विचार कर सकते हैं। एक ही बंद

.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 करने के लिए सेट है और यह भी दोगुना सुनिश्चित करें कि आर बनाने एक स्थानीय Makevars द्वारा यह प्रयोग करेंगे बना है बनाया :

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

और यह इस तरह से (आईएमओ) क्लीनर है।

सिद्धांत रूप में, सब मुझे क्या करना पड़ता था बनाने है Makevars (यानी डिफ़ॉल्ट update-alternatives साथ gcc बदलने की जरूरत नहीं है), लेकिन यह पता चला ट्रैविस Makevarsgcc सेटिंग थे कि जब लेकिन वास्तविक के लिए नहीं निर्भरता स्थापित करने पैकेज खुद का निर्माण। तो, update-alternatives आवश्यक है। मुझे कुछ निर्भरताओं को संकलित करने के लिए -std=c11 भी जोड़ना पड़ा था (निर्माण को गलत तरीके से बनाया गया था)।

.travis.yml कॉन्फ़िगरेशन में इन संशोधनों के बाद, ndjson ठीक बनाया गया।

+1

निश्चित रूप से। ईन्स के लिए ऐसा कर रहे थे, उदाहरण के लिए [यहां] (https://github.com/eddelbuettel/rcppcctz/blob/master/.travis.yml) और कुछ अन्य रिपो में देखें। –

+1

ऐ। बस दूसरों की मदद करने की कोशिश कर रहा है। – hrbrmstr

+1

अच्छा यह है कि यह वास्तव में शैल स्क्रिप्टिंग की तरह है। सुनहरा एक अतिरिक्त टुकड़ा है .... अपने स्वयं के पीपीए जोड़ें। लेकिन इसके लिए ट्रैविस के उपयोग की पिछली शैली की आवश्यकता हो सकती है जो पसंद करते हैं। उदाहरण के लिए देखें [यहां] (https://github.com/eddelbuettel/rquantlib/blob/master/.travis.yml)। –

4

बस एक वैकल्पिक दृष्टिकोण देने के लिए, मैं अपने पैकेजों में से एक में कस्टम शेल स्क्रिप्ट का उपयोग करता हूं sourcetools। मेरा लक्ष्य यह सुनिश्चित करना था कि पैकेज (अब प्राचीन) जीसीसी-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 यह कुछ हद तक अपने आप ही में 'सेटअप' तर्क अलग करने के लिए क्लीनर है स्क्रिप्ट जो पर्यावरण चर के पूरी तरह से संचालित है। यह आर मैट्रिक्स बिल्ड का निर्माण करना भी आसान बनाता है, क्योंकि ट्रैविस स्वचालित रूप से r और env के क्रमपरिवर्तन को जोड़ता है (इसे 'हाथ से करने की आवश्यकता नहीं है)।

मुझे कल्पना है कि before-install.sh स्क्रिप्ट का उपयोग मैं साफ़/साफ कर सकता हूं, लेकिन मुझे अभी तक ऐसा करने की आवश्यकता नहीं है।

+2

अच्छा सेटअप सर उस्सी! (और अब मैं बहुत खुश हूं कि मैंने यह अक्सर पूछे जाने वाले प्रश्न-आईएसएच ने उत्तर दिया - क्यू एंड ए का उत्तर दिया क्योंकि यह जानकारी वास्तव में गिटहब रिपोज़ में उत्पादन कॉन्फ़िगरेशन के अलावा कहीं भी दस्तावेज नहीं है :-) – hrbrmstr

+2

छः में से एक दर्जन। [कुछ अन्य ट्रैविस फाइलें] (https://github.com/skystrife/cpptoml/blob/master/.travis.yml) मैट्रिक्स का उपयोग करके, उसी फ़ाइल में ऐसा करें। मुझे लगता है कि मुझे वह क्लीनर मिल गया है। YMMV। मुख्य बात यह है कि यह बहुत अच्छा है कि हम इन चीजों को कर सकते हैं। –

संबंधित मुद्दे