Как использовать MATRIX_EVAL для включения строки матрицы построения на основе компилятора?

Наша матрица сборки Travis включает строку, которая строится с помощью дезинфицирующего средства 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 в документации Travis.

Как мы можем использовать MATRIX_EVAL для включения строки UBsan, когда GCC 4.9 или выше? Или, может быть, если MATRIX_EVAL — неправильный инструмент, то как мы можем сказать Трэвису включить сборку, когда GCC 4.9 или выше?


person jww    schedule 27.05.2017    source источник


Ответы (1)


Что ж это неловко. Я тот, кто записал этот PR в документы - наткнулся на это из-за комментария к объединенному PR.

MATRIX_EVAL в этом контексте — это просто переменная среды — обратите внимание, что она указана в env каждого matrix.include. В контексте связанная документация, шаг before_install, общий для каждой записи матрицы сборки, просто запускает eval "${MATRIX_EVAL}".

Другими словами, в MATRIX_EVAL нет ничего особенного. Это всего лишь один из способов определения условного поведения в записи матрицы сборки Travis. Из файла .travis.yml, который вы связали, решением будет просто добавление сценария оболочки с условием BUILD_MODE на шаге script.

person Pockets    schedule 29.05.2017
comment
Спасибо @Pockets. Когда вы говорите ... добавление сценария оболочки с условием BUILD_MODE на этапе сценария, вы имеете в виду что-то вроде MATRIX_EVAL("$BUILD_MODE"="X" && "$GCC_VERSION" -ge "4.9")? Если нет, то не могли бы вы показать мне, что вы имеете в виду? Извините, что спрашиваю. У меня очень мало навыков работы с Трэвисом, поэтому я часто сталкиваюсь с трудностями при выполнении простых задач. - person jww; 30.05.2017
comment
Условие сценария оболочки просто означает написать условное выражение в сценарии оболочки, то есть на шаге вашего сценария сделайте что-то вроде if [[ "$BUILD_MODE" = ubsan && "$GCC_VERSION" -lt 4.9 ]]; then :; else make && ./run_binary; fi. Вы также можете использовать case для поведения, подобного оператору switch. Обратите внимание, что GCC_VERSION не установлено по умолчанию, поэтому вам придется каким-то образом написать этот тест самостоятельно (также номера версий не могут интерпретироваться как числа с плавающей запятой). - person Pockets; 31.05.2017