6

我希望为主要用 C++ 编写的项目集成一个重要的跨平台构建系统。到目前为止,我已经评估了 Cmake 和 Scons,虽然它们都代表了对 (GNU) make 的改进,但在我尝试使用这些工具的上下文中,这两种方法似乎既不优雅也不透明。这让我想到了 Boost Build (Bjam),我很受鼓舞的是,鉴于我的项目依赖于 Boost,bjam 应该已经可用于任何可行的目标平台。

我在尝试为库的单元测试巧妙地集成代码覆盖率时遇到了困难......以最终集成到构建服务器(如 Jenkins)中。虽然我愿意以 Bjam 最佳/标准实践为指导,但我认为我需要三个不同的“变体”:

  • release - 仅构建优化的静态库
  • debug - 构建非优化的静态库和单元测试
  • 覆盖 - 构建支持覆盖的库并与未启用覆盖的单元测试链接。

本质上,除了标准的调试和发布版本之外,我还想要一个专用的调试版本,它还可以收集覆盖率数据。

我需要使用(至少)g++ 和 msvc 构建......并且仅使用 g++ 使用 gcov 开关。这意味着我的库目标需要与单元测试可执行目标不同的“编译器标志”......并且仅适用于我的一个编译器套件......并且仅适用于一个变体。

我不清楚如何最好地使用 Bjam 来实现这一点——不过,我怀疑它应该是一个相当常见的用例。Bjam 是否明确支持 gcov 覆盖分析(可能使用 lcov 呈现结果)?如果没有,任何人都可以推荐一种支持上述(简化)方案的策略吗?

4

2 回答 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 ;

覆盖数据是在测试运行时创建的,然后我使用 gcov 在 bjam 之外利用它。

于 2015-01-06T15:12:45.297 回答
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

于 2012-05-27T00:59:22.547 回答