C++ 如何使用MATRIX_EVAL启用基于编译器的生成矩阵行?

C++ 如何使用MATRIX_EVAL启用基于编译器的生成矩阵行?,c++,gcc,travis-ci,ubsan,C++,Gcc,Travis Ci,Ubsan,我们的Travis包含一行,该行使用未定义的行为消毒剂生成: matrix: - BUILD_MODE="all" - BUILD_MODE="no-asm" - BUILD_MODE="asan" - BUILD_MODE="ubsan" GCC对UBsan要求4.9或5.0,这导致我们在Trusty上的测试失败: ... $ gcc --version gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4 Copyright

我们的Travis包含一行,该行使用未定义的行为消毒剂生成:

  matrix:
    - BUILD_MODE="all"
    - BUILD_MODE="no-asm"
    - BUILD_MODE="asan"
    - BUILD_MODE="ubsan"
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.
Travis有一个叫做MATRIX_EVAL的东西,看起来像某种选择器。我认为它可以用来启用或禁用构建矩阵中的一行,但我不清楚如何使用它。文档位于,但解释得不好。也可以在Travis文档中看到


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

好吧,这很尴尬。我是那个把公关写进文档的人——因为对合并公关的评论而偶然发现了这一点

在此上下文中,MATRIX_EVAL只是一个环境变量——请注意,它是在每个MATRIX.include的env中指定的。在的上下文中,每个构建矩阵条目共有的before_install步骤只运行eval${matrix_eval}


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

好吧,这很尴尬。我是那个把公关写进文档的人——因为对合并公关的评论而偶然发现了这一点

在此上下文中,MATRIX_EVAL只是一个环境变量——请注意,它是在每个MATRIX.include的env中指定的。在的上下文中,每个构建矩阵条目共有的before_install步骤只运行eval${matrix_eval}


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

Thank@Pockets。当你说。。。在脚本步骤中添加一个以BUILD_模式为条件的shell脚本,您的意思是类似于MATRIX_EVAL$BUILD_MODE=X&&$GCC_VERSION-ge 4.9吗?如果没有,那你能告诉我你的意思吗?很抱歉问你。我几乎没有Travis技能,所以我经常在简单的任务中挣扎。shell script conditional只是指在shell脚本中编写一个条件,即在脚本步骤中,执行类似于if[[$BUILD_MODE=ubsan&&$GCC_VERSION-lt 4.9]]的操作;然后:;否则,生成和运行二进制文件;菲。您还可以使用类似switch语句的行为。请注意,GCC_版本不是默认设置的,所以您必须自己编写测试,而且版本号不能解释为浮动。谢谢@pocket。当你说。。。在脚本步骤中添加一个以BUILD_模式为条件的shell脚本,您的意思是类似于MATRIX_EVAL$BUILD_MODE=X&&$GCC_VERSION-ge 4.9吗?如果没有,那你能告诉我你的意思吗?很抱歉问你。我几乎没有Travis技能,所以我经常在简单的任务中挣扎。shell script conditional只是指在shell脚本中编写一个条件,即在脚本步骤中,执行类似于if[[$BUILD_MODE=ubsan&&$GCC_VERSION-lt 4.9]]的操作;然后:;否则,生成和运行二进制文件;菲。您还可以使用类似switch语句的行为。请注意,默认情况下并没有设置GCC_版本,所以您必须自己编写测试,而且版本号不能解释为浮动。