前言
本节介绍如何将 C/C++test 与 Bazel 构建集成以运行静态分析和代码覆盖率。
前提条件
- C/C++test for Linux(不支持 Windows)
- Bazel 4.0+ 版本
将 C/C++test 安装程序添加为 Bazel 本地资源库
C/C++test 的干净安装不会立即作为 Bazel 本地资源库工作。需按照以下步骤将 C/C++test 安装目录添加为 Bazel 本地资源库。
- 将位于
integration/bazel
目录的 WORKSPACE.bazel 和 BUILD.bazel 文件放到 C/C++test 安装程序的根目录中。注意:确保文件已移动并且没有副本保留在cd <INSTALL_DIR> mv integration/bazel/WORKSPACE.bazel . mv integration/bazel/BUILD.bazel .
integration/bazel
目录中。 - 在您的项目根目录中打开 Bazel WORKSPACE 文件。
在您的 WORKSPACE 文件中将 C/C++test 安装目录注册为 Bazel 本地资源库。
local_repository(name = "cpptest", path = "<INSTALL_DIR>")
构建目标示例
以下示例将用于后续步骤:
cc_binary( name = "hello-world", srcs = ["hello-world.cc"], deps = [ ":hello-greet", ], )
生成 BDF 文件
运行 "
@cpptest
//:bdf
" 规则生成 BDF 文件。bazel run @cpptest//:bdf --@cpptest//:target=//:hello-world --@cpptest//:compiler-config=gcc_10-64 --@cpptest//:project-name=HelloWorld
将在您的项目根目录中生成一个 BDF 文件。该集成还会生成使 C/C++test Professional 能够将您的项目作为 C/C++test 项目打开的必要文件。
将项目导入您的 Eclipse 工作空间并运行分析。
cpptestcli -data /path/to/workspace -import . -config "builtin://Recommended Rules"
- 生成 BDF 不会产生任何项目工件,即可执行文件、对象、生成的源。
- 为项目自动生成的代码位于
bazel-build
子目录中。 bazel clean
将删除此目录的内容并使 BDF 失效。- 重建目标可以解决 BDF 中丢失的引用。
生成包含代码覆盖率的可执行文件
按照以下步骤生成包含代码覆盖率插桩的测试二进制文件。
运行 "@cpptest//:coverage" 规则,生成插桩的二进制文件。
bazel run @cpptest//:coverage --@cpptest//:target=//:hello-world --@cpptest//:compiler-config=gcc_10-64 --@cpptest//:line-coverage
- 生成的可执行文件格式为“<TARGET_NAME>.elf”,并且位于 bazel-bin 目录中通常生成二进制文件的位置旁边。在上面的示例中,该文件为“hello-world.elf”。(“.elf”文件扩展名的使用是任意的。)
- 该集成不会运行插桩的可执行文件。
执行插桩的二进制文件。
./bazel-bin/hello-world.elf
将项目导入到您的 Eclipse 工作空间中,生成覆盖率报告。
cpptestcli -data /path/to/workspace -import . -config "builtin://Load Application Coverage"
注意:
- 如果您遇到内存分配的问题,请参阅在 C/C++test 中使用 Bazel 构建时无法分配内存该怎么办?。
- IDE 中可能不会显示第三方和外部源的覆盖率。
配置覆盖率插桩工具(cpptestcc)
您可以使用 .psrc 配置文件配置覆盖率插桩工具(cpptestcc)。
将该 .psrc 示例文件复制到项目中。
cp <INSTALL_DIR>/integration/bazel/cpptestcc-bazel.psrc <PROJECT_ROOT>/cpptestcc-bazel.psrc
- 根据需要修改 cpptestcc-bazel.psrc 的内容。有关选项列表,请参阅 cpptestcc 命令行参考或运行:
cpptestcc -help
在 BUILD.bazel 文件中定义引用 cpptestcc-bazel.psrc 文件的“cpptestcc-bazel-psrc”文件组。
filegroup(name = "cpptestcc-bazel-psrc", srcs = ["cpptestcc-bazel.psrc"], visibility = ["//visibility:public"])
在执行“@cpptest//:coverage”规则时,使用“--@cpptest//:psrc_file”选项与“cpptestcc-bazel-psrc”文件组。
bazel run @cpptest//:coverage --@cpptest//:target=//:hello-world --@cpptest//:psrc_file=//:cpptestcc-bazel-psrc
C/C++test Bazel 规则的配置选项
常见参数
选项 | 说明 |
---|---|
--@cpptest//:target=<TARGET> | 指定要分析的目标规则。应指定类型为“cc_*”或属于该类型派生类型的项目规则。 |
--@cpptest//:psrc_file=<CUSTOM_PSRC_FILEGROUP> | 指定 .psrc 配置文件的文件组;请参阅配置覆盖率插桩工具(cpptestcc)。 |
"@cpptest//:bdf" Rule Arguments
选项 | 说明 |
---|---|
--@cpptest//:project-name=<NEW_PROJECT_NAME> | 更改生成的 BDF 文件的名称。 |
--@cpptest//:missing-bazel-dirs="external","<DIRS>" | 指定解析过程中发现的目录路径的开头。在 BDF 中,该路径将以“bazel-[project-name]”为前缀。 |
“@cpptest//:coverage”规则参数
选项 | 说明 |
---|---|
--@cpptest//:compiler-config=<COMPILER_CONFIGURATION_NAME> | 指定编译器配置。 |
--@cpptest//:line-coverage --@cpptest//:mcdc-coverage --@cpptest//:optimized-line-coverage --@cpptest//:function-coverage --@cpptest//:optimized-function-coverage --@cpptest//:statement-coverage --@cpptest//:optimized-statement-coverage --@cpptest//:block-coverage --@cpptest//:optimized-block-coverage --@cpptest//:simple-condition-coverage --@cpptest//:optimized-simple-condition-coverage --@cpptest//:path-coverage --@cpptest//:decision-coverage --@cpptest//:optimized-decision-coverage --@cpptest//:call-coverage --@cpptest//:optimized-call-coverage | 启用特定的覆盖率指标。 除非已在 .psrc 文件中指定,否则必须指定此参数;请参阅配置覆盖率插桩工具(cpptestcc)。
|
--@cpptest//:verbose | 为 cpptestcc 插桩和编译的所有阶段启用详细的控制台输出。 |
--@cpptest//:quiet | 在执行过程中抑制 cpptest 引擎输出的所有控制台文本。 |
--@cpptest//:project-name=<NEW_PROJECT_NAME> | 更改 Eclipse 项目文件的名称:.project 和 .parasoft。 |
--@cpptest//:project-workspace=<PROJECT_WORKSPACE> | 提供用于分析和报告的临时 Eclipse 工作空间的位置。 |