我正在使用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
函数。 / p>
答案 0 :(得分:1)
不幸的是,似乎没有直接而干净的方法来做到这一点。
从一端 函数是生成测试驱动程序:a(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语言实现)。这个命令真的很愚蠢 - 它不会检查所需的函数是否真的存在(如果smth错误,你会得到编译错误)。根本没有灵活定制输出源文件的方法。所有这一切都是从源文件列表中删除路径和扩展,并使用序号configure_file()
将其替换为提到的模板...
所以,我个人认为根本没有理由使用它。这就是为什么我在上面评论中提到的模块中完成相同(但更好;)的工作。
如果您仍想使用该命令,如果您想使用Boost UTF,则生成的测试驱动程序完全无用。您需要提供自己的initialization function(并且它不是main()
),您可以在其中手动将测试用例注册到主测试套件中(或将测试组织到更复杂的树中)。在这种情况下,绝对没有理由使用create_test_sourcelist
!您可以从中获得的所有内容都是需要提供给add_executable()
的源列表...但是更容易做到set()
...这个命令甚至无法帮助您要调用的测试函数列表(实际上没有扩展名的文件名列表)(它在内部使用而不是导出)。你还想使用那个命令吗?