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

标签 c++ gcc travis-ci ubsan

我们的特拉维斯 build matrix包括使用未定义行为 sanitizer 构建的行:

  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.

Travis 有一个叫做 MATRIX_EVAL 的东西,它看起来像某种选择器。我认为它可以用于启用或禁用构建矩阵中的一行,但我不清楚如何使用它。文档位于 add documentation for upgrading gcc and clang ,但它没有很好地解释。另见 Building a C Project在 Travis 文档中。

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

最佳答案

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

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

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

关于c++ - 如何使用 MATRIX_EVAL 启用基于编译器的构建矩阵行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44213719/

相关文章:

引用 vector 中的 unordered_map 时出现 C++11 段错误

c++ - std::map at 函数总是抛出异常

continuous-integration - Travis-ci 是否可以触发另一个存储库的构建?

python - 在 Mac 上构建通用二进制文件 - 强制单个编译器子进程

r - 如何在 Travis CI 上为 R 包运行 covr::codecov()

c++ - Travis-CI Complex Makefile 失败

c++ - 如何使字符串相等?

c++ - 编译用 QT 编写的项目时出现链接器错误

c - 如何在 Linux 终端中优化 C 编译生成的可执行文件

linux - 使用 Yocto SDK 的链接问题(对 `_rtld_global_ro' 的 undefined reference )