【问题标题】:Boost.Tests: Specify function name instead of mainBoost.Tests:指定函数名而不是 main
【发布时间】:2015-06-26 07:20:00
【问题描述】:

我正在使用 cmake 构建系统开发一个项目。默认情况下,CMake 有一个很好的框架,可以从一组 C/C++ 代码生成单个可执行文件。 cmake 函数称为create_test_sourcelist。它的作用是生成一个带有单个主入口点的 C/C++ 调度程序,该入口点将调用其他 C/C++ 代码。

因此,我有一堆带有函数签名的 C/C++ 文件,例如:int TestFunctionality1(int argc, char *argv[]),我想保持原样,除非它当然意味着更多的工作。

如何保持这个系统并开始使用 BOOST_CHECK ?我不知道如何指定实际的主入口点不称为int main(int argc, char *argv[])。

我的目标是有一个与 Jenkins 集成的框架,因为该项目已经使用了 Boost,我相信这应该是可行的,而无需重新编写现有的 CMake 测试套件并将所有测试更改为独立的 main 函数。

【问题讨论】:

标签: boost jenkins cmake boost-test ctest


【解决方案1】:

不幸的是,似乎没有直接而干净的方法来做到这一点。

一方面create_test_sourcelist唯一有用的功能是生成一个测试驱动程序:一个(stupid非常简单,天真和缺乏破解/扩展能力)基于${cmake-prefix}/share/cmake/Templates/TestDriver.cxx.in的C/C++翻译单元(并且没有办法选择其他模板)。

另一方面,Boost UTF 提供了自己的test runner(相当于 CMake 术语中的 测试驱动程序),但在任何变体(静态、动态、单头)中,它都包含定义对于main() 以某种方式或其他方式(即使在external test runner 的情况下)。

...所以你最终会得到两个 main() 函数,并且无法选择一个。

深入研究create_test_sourcelist 的来源我真的很想知道为什么他们将其实现为命令而不是序数(外部)cmake 模块——它没有做任何特殊的事情(不能使用CMake 语言)。这个命令真的很愚蠢——它不检查所需的函数是否真的存在(如果有错误,你会得到编译错误)。根本没有办法灵活定制输出源文件。所做的只是从源文件列表中剥离路径和扩展名,并使用序数 configure_file() 将其替换为提到的模板...

所以,我个人认为根本没有理由使用它。这就是为什么我在上面评论中提到的模块中完成了相同(但更好;)的工作。

如果你还想使用那个命令,如果你想使用 Boost UTF,生成的测试驱动完全没用。无论如何,您都需要提供自己的initialization function(而不是main()),您可以在其中手动将测试用例注册到主测试套件中(或将测试组织到更复杂的树中)。在那种情况下,绝对没有理由使用create_test_sourcelist!您可以从中获得的只是需要提供给add_executable() 的源列表……但使用set() 执行此操作要容易得多……此命令甚至无法通过测试函数列表帮助您(实际上没有扩展名的文件名列表)调用(它在内部使用而不是导出)。你还想使用那个命令吗??

【讨论】:

  • 您应该将您的 boost 模块直接贡献给主要的 cmake 模块,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-17
  • 2011-06-06
相关资源
最近更新 更多