我們特拉維斯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或更高時啓用構建?
謝謝@Pockets。當你說,*「...在腳本步驟」*中添加一個條件符合BUILD_MODE的shell腳本,你的意思是像'MATRIX_EVAL(「$ BUILD_MODE」=「X」&&「$ GCC_VERSION」-ge「4.9」) '?如果不是,那麼你能告訴我你的意思嗎?對不起,問。我的Travis技能很少,所以我經常爲簡單的任務而苦惱。 – jww
「shell script conditional」只是意味着在shell腳本中寫入一個條件,即在腳本步驟中,執行類似'if [[「$ BUILD_MODE」= ubsan &&「$ GCC_VERSION」-lt 4.9]];然後 :;否則make && ./run_binary; fi'。你也可以使用'case'來進行switch語句行爲。請注意'GCC_VERSION'沒有默認設置,所以你必須以某種方式自己編寫測試(也不能將版本號解釋爲浮點數)。 – Pockets