如何使用MATRIX_EVAL基于编译器启用构建矩阵行?

jww*_*jww 1 c++ gcc travis-ci ubsan

我们的Travis 构建矩阵包括使用Undefined Behavior sanitizer构建的行:

  matrix:
    - BUILD_MODE="all"
    - BUILD_MODE="no-asm"
    - BUILD_MODE="asan"
    - BUILD_MODE="ubsan"
Run Code Online (Sandbox Code Playgroud)

GCC要求UBsan为4.9(或者5.0),并且它导致我们的测试在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.
Run Code Online (Sandbox Code Playgroud)

Travis有一些MATRIX_EVAL看起来像某种选择器的东西.我认为它可以用于启用或禁用构建矩阵中的行,但我不清楚如何使用它.该文档是添加gcc和clang升级的文档,但没有得到很好的解释.另请参阅Travis文档中的构建C项目.

MATRIX_EVAL当GCC为4.9或更高时,我们如何使用启用UBsan行?或者,如果MATRIX_EVAL是错误的工具,那么当GCC为4.9或更高时,我们如何告诉Travis启用构建?

Poc*_*ets 5

嗯,这是尴尬.我是那个将PR写入文档的人 - 因为对合并的公关的评论而偶然发现了这一点.

MATRIX_EVAL在这种情况下,它只是一个环境变量 - 注意它是在env每个变量中指定的matrix.include.在链接文档的上下文中,before_install每个构建矩阵条目的公共步骤都会运行eval "${MATRIX_EVAL}".

换句话说,MATRIX_EVAL没什么特别的.这只是在Travis构建矩阵条目中定义条件行为的一种方法.从.travis.yml您链接的文件中,解决方案只是BUILD_MODEscript步骤中添加一个条件的shell脚本.