2017-06-13 86 views
1

我有几块C++代码(模板,宏等),它们在使用某些方法时不能编译。手工编写一段代码不会编译和验证它不能编译的代码很容易,但这不是自动的。看起来Bazel应该能够编译一段代码并自动验证它不能作为bazel test的一部分进行编译,而这看起来像是C++代码的一个相当常见的情况。有一种内在的方式来做到这一点?如何确认某些代码不能与Bazel编译?

我试图避免滚动生成一个shell脚本调用C++编译器,因为处理所有巴泽勒传递给C++工具链是真的很辛苦的观点我自己的云雀规则。目前,bazelbuild/bazel#146和其他一些相关的问题意味着所有的信息都不可用。

回答

1

编写创建临时工作空间,并在其中建立和C++文件的测试,则测试内部调用巴泽勒,并验证其退出代码和stderr输出。

我们做类似的事情全部用巴泽勒自己的集成测试的时间。看到一个完整的例子在提交e78ad83:所述测试数据取决于巴泽勒本身,设置了一个工作区模拟,并建立文件并运行巴泽勒作为子进程,然后断言其标准输出(在这种情况下:的bazel info server_pid结果)。 (注:其中的一些源文件被从那时起更新,所以看的最新版本)

+0

每[讨论邮件列表(https://groups.google.com/d/topic/bazel-discuss/ tTdB8bye4Q /讨论),这不是我正在寻找的,但它很接近。我希望避免重复或想出如何重用自定义CROSSTOOL,bazel.rc等,但听起来这是不可能的。一旦C++ Skylark API更完整,这应该很容易解决,但现在这是一个好的,因为它得到。谢谢! –

1

也许只是创建使用的代码错误的方式cc_binary目标的测试,然后写一个shell脚本或其他工具来调用巴泽勒建立和检查返回代码。不是最干净的方式。

所以shell脚本将使一堆调用巴泽尔做这样的事情的。至少你不必弄清楚Bazel编译的编译器,但是你失去了对Bazel的完美集成测试。

bazel build //tests:test_that_should_fail_at_compile_time 
if [ $? != 0 ]; then 
    echo "Test Passed!" 
fi