2017-05-27 26 views
1

我們特拉維斯build matrix包括行與未定義行爲建立消毒:如何使用MATRIX_EVAL啓用基於編譯器的構建矩陣行?

matrix: 
    - BUILD_MODE="all" 
    - BUILD_MODE="no-asm" 
    - BUILD_MODE="asan" 
    - BUILD_MODE="ubsan" 

GCC需要4.9(或者5.0)的UBsan,其引起我們的測試失敗的忠實的:

... 
$ gcc --version 
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 
Copyright (C) 2013 Free Software Foundation, Inc. 
... 

g++ -DNDEBUG -g2 -O2 -fPIC -march=native -pipe -fsanitize=undefined -DCRYPTOPP_COVERAGE -c cryptlib.cpp 
g++: error: unrecognized command line option ‘-fsanitize=undefined’ 
make: *** [cryptlib.o] Error 1 

The command "make "$BUILD_MODE" && ./cryptest.exe v && ./cryptest.exe tv all" exited with 2. 

特拉維斯有一種叫MATRIX_EVAL的東西,看起來像某種選擇器。我認爲它可以用來啓用或禁用構建矩陣中的一行,但不清楚如何使用它。該文檔在add documentation for upgrading gcc and clang,但它沒有解釋得很好。另請參閱Travis文檔中的Building a C Project

當GCC爲4.9或更高時,我們如何使用MATRIX_EVAL來啓用UBsan行?或者,如果MATRIX_EVAL是錯誤的工具,那麼我們如何告訴Travis在GCC爲4.9或更高時啓用構建?

回答

5

好吧,這很尷尬。我是將公關寫入文檔的人 - 由於對合並的公關發表了評論而偶然發現了這一點。

MATRIX_EVAL在這種情況下只是一個環境變量 - 注意它在env的每個matrix.include中指定。在linked documentation的情況下,每個構建矩陣條目通用的before_install步驟僅運行eval "${MATRIX_EVAL}"

換句話說,MATRIX_EVAL沒什麼特別的。這只是在Travis構建矩陣條目中定義條件行爲的一種方法。從鏈接的.travis.yml文件中,該解決方案只需在的script步驟中添加一個shell腳本。

+0

謝謝@Pockets。當你說,*「...在腳本步驟」*中添加一個條件符合BUILD_MODE的shell腳本,你的意思是像'MATRIX_EVAL(「$ BUILD_MODE」=「X」&&「$ GCC_VERSION」-ge「4.9」) '?如果不是,那麼你能告訴我你的意思嗎?對不起,問。我的Travis技能很少,所以我經常爲簡單的任務而苦惱。 – jww

+0

「shell script conditional」只是意味着在shell腳本中寫入一個條件,即在腳本步驟中,執行類似'if [[「$ BUILD_MODE」= ubsan &&「$ GCC_VERSION」-lt 4.9]];然後 :;否則make && ./run_binary; fi'。你也可以使用'case'來進行switch語句行爲。請注意'GCC_VERSION'沒有默認設置,所以你必須以某種方式自己編寫測試(也不能將版本號解釋爲浮點數)。 – Pockets

相關問題