多平台应用

原理

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 公司的商标。所有其他商标均为其各自所有者的财产。