多平台应用
原理
Coco 对覆盖率数据与源代码的一致性进行严格检查。例如,无法将早期项目版本的执行报告(.csexe 文件)导入,也不能将旧版本的覆盖率信息导入到新的仪表化数据库(.csmes 文件)。这可以防止一些使用错误和不一致测试指标的产生。
一致性分析包括验证项目中每个仪表化源文件未进行修改。这在建程和导入或合并覆盖率数据时完成。如果 C 预处理器在不同的构建中产生不同的文件——这可能在某些文件以调试模式构建而其他以发布模式构建时发生——Coco 会检测到它,并将类似 #1
或 #2
的后缀添加到文件名中,并要求测试两个版本以实现完全覆盖率。
可以在多个平台上编译程序,然后合并覆盖率数据。这需要每个构建的源代码完全一致。如果不一致,Coco 会拒绝合并。
我们使用一个小示例来说明这是如何工作的。项目仅包含一个源文件,project.cpp
,我们在 Microsoft® Windows 和 Linux™ 上构建它。
在 Linux 上,我们用以下命令编译项目
$ csg++ /home/me/project.cpp -o project-unix
将生成 project-unix.csmes
文件,测试可以像平常一样执行并导入。
在 Windows 上,我们用以下命令编译项目
C:\code> cscl C:\Home\me\project.cpp /Feproject-windows.exe
将生成 project-windows.exe.csmes
文件。
使用 cmmerge 可以合并覆盖率信息
$ cmmerge -o project.csmes project-unix.csmes project-windows.exe.csmes
遗憾的是,这个操作还不够,因为 project.csmes
文件将包含两个 project.cpp
文件
/home/me/project.cpp
C:\Home\me\project.cpp
必须告诉 Coco 这两个文件是相同的。为此,我们使用 cmedit 将两个绝对文件名更改为相同的名称
$ cmedit project.csmes --rename="/home/me/,/PRJ/" --rename="C:\Home\me\,/PRJ/" --verbose
这两个规则将基本目录 /home/me/
和 C:\Home\me\
更名为 /PRJ/
以指向单个源文件:/PRJ/project.cpp
。现在可以合并来自两个平台的覆盖率信息。
限制
代码生成器
在有些构建过程中,使用代码生成器,如 flex
/bison
,或者对于 Qt 产品,使用元对象编译器 (moc)。然后代码生成器需要在每个平台上生成相同的源代码以使编辑工作。
如果不是这种情况,cmedit 将拒绝重命名操作,因为它假定项目不是从相同的源代码生成的。解决方案是明确跳过自动生成的文件。
以 moc
为例。qmake
生成名为 moc_*.cpp
的文件。技巧可能包括使用 --force
开关来跳过发生冲突的文件的重命名操作
$ cmedit project.csmes --force --rename="/home/me/,/PRJ/" --rename="C:\Home\me\,/PRJ/" --verbose
结果,所有源文件都在一个名为 PRJ
的目录中合并,除了检测到冲突的 moc 文件。然后需要在每个平台上分别处理这些 moc 文件。
平台相关宏
一般来说,C 宏展开成平台相关代码,因此应避免使用。如果平台之间的宏展开不同,Coco 将通过在源文件中添加 #1
或 #2
来创建重复,因此需要覆盖两种源代码版本。
有一些常见的陷阱,您需要知道以避免冲突
__FILE__
宏可能会生成不希望的差异,因为它可能包含绝对源文件名。要解决这个问题,因为这个宏经常在断言中使用,最简单的解决方案是只与发布构建一起工作。另一个解决方案是确保传递给编译器的源文件名不是绝对文件名。在这种情况下,在大多数平台上,__FILE__
不会展开成源文件的绝对路径。NULL
宏在各个平台上也可能不同。有时它被展开为(void*)0
,有时被展开为__null
。正确的解决方案是避免与NULL
进行比较,并使用 C++ 扩展std::nullptr
。
Coco v7.2.0©2024 Qt 公司 Ltd.
Qt 及相关标志是芬兰和/或全球其他国家的 Qt 公司的商标。所有其他商标均为其各自所有者的财产。