Наш Трэвис построить матрицу включает строку, которая строится с помощью дезинфицирующего средства Undefined Behavior:
matrix:
- BUILD_MODE="all"- BUILD_MODE="no-asm"- BUILD_MODE="asan"- BUILD_MODE="ubsan"
GCC требует 4,9 (или, возможно, 5,0) для UBsan, и это приводит к сбою нашего теста на Trusty:
...
$ 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
который выглядит как своего рода селектор. Я думаю, что это может быть использовано для включения или отключения строки в матрице сборки, но мне не ясно, как ее использовать. Документация находится на добавить документацию для обновления gcc и clang, но это не объяснили хорошо. Также см Построение проекта C в документах Трэвис.
Как мы используем MATRIX_EVAL
включить строку UBsan, когда GCC 4,9 или выше? Или, может быть, если MATRIX_EVAL
это неправильный инструмент, тогда как мы скажем Трэвису включить сборку, когда GCC 4.9 или выше?
Что ж это неловко. Я тот, кто написал этот пиар в документах — наткнулся на это из-за комментария о слитном пиаре.
MATRIX_EVAL
в этом контексте это просто переменная окружения — обратите внимание, что она указана в env
каждого matrix.include
, В контексте связанная документация, before_install
шаг, общий для каждой записи матрицы сборки, просто выполняется eval "${MATRIX_EVAL}"
,
Другими словами, MATRIX_EVAL
ничего особенного Это всего лишь один из способов определения условного поведения в записи матрицы построения Travis. От .travis.yml
файл, который вы связали, решение будет просто добавить сценарий оболочки при условии BUILD_MODE
в script
шаг.
Других решений пока нет …