Bjam 进行 gcov 覆盖率分析?

6

我想要为一个主要由C++编写的项目集成一个非平凡的跨平台构建系统。目前,我已经评估了Cmake和Scons,虽然它们都比(GNU) make有所改进,但在我试图使用这些工具的背景下,它们似乎既不优雅也不透明。这让我想到了Boost Build (Bjam),我很鼓舞,因为我的项目依赖于Boost,在任何可行的目标平台上应该都可以使用bjam。

我遇到了困难,试图为一个库的单元测试整洁地集成代码覆盖率...并最终集成到像Jenkins这样的构建服务器中。虽然我愿意通过Bjam的最佳/标准做法来指导,但我认为我需要三个不同的“变体”:

  • 发布版 - 只构建优化的静态库
  • 调试版 - 构建非优化的静态库和单元测试
  • 覆盖率版 - 构建带覆盖率功能的库,并与不带覆盖率功能的单元测试链接。

基本上,除了标准的调试和发布构建之外,我还希望拥有一个特殊用途的调试构建,可以收集覆盖数据。

我需要使用(至少)g++和msvc进行构建...并仅在g++中使用gcov开关。这意味着我的库目标需要不同的“编译器标志”来匹配单元测试可执行文件目标...而且只针对其中一个编译套件...以及只有一个变体。

我不清楚如何最好地使用Bjam实现此目标,虽然我怀疑它应该是一个相当常见的用例。Bjam是否明确支持gcov覆盖分析(可能使用lcov呈现结果)?如果没有,还有人可以推荐一种支持上述(简化的)场景的策略吗?

2个回答

1

我有同样的需求,基本上我在我的Jamroot文件中添加了以下行来定义自己的覆盖率变量。

variant coverage : debug : <cxxflags>--profile-arcs <cxxflags>--test-coverage <cxxflags>--coverage <link>shared ;
lib gcov : : <name>gcov : ;

unit-test mytest : tests/mytest.cpp libboost_unit_test : <variant>coverage:<library>gcov ;

测试运行时会生成覆盖率数据,我会在 bjam 之外使用 gcov 将其利用。

1

我非常有信心回答你的第一个问题——即bjam是否明确支持gcov——是肯定的“不”,因为像调试和发布构建配置一样,bjam会认为这是用户定义的特性变体

对于bjam,看起来有几种方法可以实现您想要的功能:

  1. 定义自己的特性变体,然后更新任何自定义标志的CONFIG_COMMAND。

  2. 定义/重新定义工具集

对于CMake,请考虑遵循ITK的模式:

http://cmake.org/Wiki/ITK/Policy_and_Procedure_for_Adding_Dashboards#Configuring_GCOV_Coverage


谢谢您提供的这些指针...我本来希望能找到一个样例,至少能够在gcc/gcov下正常工作... - aSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接