我有几个C ++代码(模板,宏等),这些代码在某些方面使用时无法编译。手工编写一段代码来完成不应该编译和验证它的事情并不容易编译,但这并不是自动化的。似乎Bazel应该能够编译一段代码并自动验证它不会编译为bazel test
的一部分,这似乎是C ++代码相当常见的情况。是否有内置的方法来做到这一点?
我试图避免滚动我自己的Skylark规则,该规则生成一个调用C ++编译器的shell脚本,因为处理Bazel传递给C ++工具链的所有参数真的很难。目前,bazelbuild/bazel#146和其他一些相关问题意味着所有信息都无法使用。
答案 0 :(得分:1)
也许只是使用代码以与cc_binary目标错误的方式创建测试,然后编写shell脚本或其他工具来调用Bazel来构建它们并检查返回代码。不是最干净的方式。
所以shell脚本会对Bazel做一堆调用。至少你不必弄清楚Bazel做的编译器调用,但你失去了对Bazel的良好集成测试。
bazel build //tests:test_that_should_fail_at_compile_time
if [ $? != 0 ]; then
echo "Test Passed!"
fi
答案 1 :(得分:0)
编写一个测试,在其中创建一个临时工作空间和BUILD和C ++文件,然后在测试中调用Bazel,并验证其退出代码和stderr输出。
我们一直在用Bazel自己的集成测试做类似的事情。请参阅commit e78ad83中的完整示例:测试数据 - 依赖于Bazel本身,设置模拟工作区和BUILD文件并运行Bazel作为子进程,然后断言其stdout(在这种情况下:{{{{ 1}})。 (注意:从那时起,其中一些源文件已更新,请查看最新版本。)