1

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

  matrix:
    - BUILD_MODE="all"
    - BUILD_MODE="no-asm"
    - BUILD_MODE="asan"
    - BUILD_MODE="ubsan"

对于 UBsan,GCC 需要 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看起来像某种选择器的东西。我认为它可以用来启用或禁用构建矩阵中的一行,但我不清楚如何使用它。该文档位于添加用于升级 gcc 和 clang的文档,但没有很好地解释。另请参阅Travis 文档中的构建 C 项目

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

4

1 回答 1

5

嗯,这是尴尬。我是那个将 PR 写入文档的人 - 由于对合并 PR 的评论而偶然发现了这一点。

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

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

于 2017-05-29T06:58:27.567 回答