前言

本节介绍如何将 C/C++test 与 Bazel 构建集成以运行静态分析和代码覆盖率。

前提条件

将 C/C++test 安装程序添加为 Bazel 本地资源库

C/C++test 的干净安装不会立即作为 Bazel 本地资源库工作。需按照以下步骤将 C/C++test 安装目录添加为 Bazel 本地资源库。

  1. 将位于 integration/bazel 目录的 WORKSPACE.bazel 和 BUILD.bazel 文件放到 C/C++test 安装程序的根目录中。
    cd <INSTALL_DIR>
    mv integration/bazel/WORKSPACE.bazel .
    mv integration/bazel/BUILD.bazel .
    注意:确保文件已移动并且没有副本保留在 integration/bazel 目录中。
  2. 在您的项目根目录中打开 Bazel WORKSPACE 文件
  3. 在您的 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 文件

  1. 运行 "@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 项目打开的必要文件。

  2. 将项目导入您的 Eclipse 工作空间并运行分析。

    cpptestcli -data /path/to/workspace -import . -config "builtin://Recommended Rules"
    • 生成 BDF 不会产生任何项目工件,即可执行文件、对象、生成的源。
    • 为项目自动生成的代码位于 bazel-build 子目录中。
    • bazel clean 将删除此目录的内容并使 BDF 失效。
    • 重建目标可以解决 BDF 中丢失的引用。

生成包含代码覆盖率的可执行文件

按照以下步骤生成包含代码覆盖率插桩的测试二进制文件。 

  1. 运行 "@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”文件扩展名的使用是任意的。)
    • 该集成不会运行插桩的可执行文件。
  2. 执行插桩的二进制文件。

    ./bazel-bin/hello-world.elf
  3. 将项目导入到您的 Eclipse 工作空间中,生成覆盖率报告。

    cpptestcli -data /path/to/workspace -import . -config "builtin://Load Application Coverage"

注意:

配置覆盖率插桩工具(cpptestcc)

您可以使用 .psrc 配置文件配置覆盖率插桩工具(cpptestcc)。

  1. 将该 .psrc 示例文件复制到项目中。

    cp <INSTALL_DIR>/integration/bazel/cpptestcc-bazel.psrc <PROJECT_ROOT>/cpptestcc-bazel.psrc
  2. 根据需要修改 cpptestcc-bazel.psrc 的内容。有关选项列表,请参阅 cpptestcc 命令行参考或运行:
    cpptestcc -help
  3. 在 BUILD.bazel 文件中定义引用 cpptestcc-bazel.psrc 文件的“cpptestcc-bazel-psrc”文件组。

    filegroup(name = "cpptestcc-bazel-psrc", srcs = ["cpptestcc-bazel.psrc"], visibility = ["//visibility:public"])
  4. 在执行“@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//:target=//main:hello-world

--@cpptest//:psrc_file=<CUSTOM_PSRC_FILEGROUP>

指定 .psrc 配置文件的文件组;请参阅配置覆盖率插桩工具(cpptestcc)
默认值:无
示例:--@cpptest//:psrc_file=//:cpptestcc-bazel-psrc

在使用此选项之前,应确保在 BUILD.bazel 文件中定义了引用 .psrc 配置文件的文件组。例如:
filegroup(name = "cpptestcc-bazel-psrc", srcs = ["cpptestcc-bazel.psrc"], visibility = ["//visibility:public"])
更多信息,请参阅 <INSTALL_DIR>/integration/bazel/cpptestcc-bazel.psrc 文件。

"@cpptest//:bdf" Rule Arguments

选项说明
--@cpptest//:project-name=<NEW_PROJECT_NAME>

更改生成的 BDF 文件的名称。
默认值:"$(basename $(bazel info workspace))" - 包含 WORKSPACE 文件的目录的名称。
示例:--@cpptest//:project-name="foo"
运行的 bdf 目标将生成文件“foo.bdf”。

--@cpptest//:missing-bazel-dirs="external","<DIRS>"

指定解析过程中发现的目录路径的开头。在 BDF 中,该路径将以“bazel-[project-name]”为前缀。
默认值:"external" (required)
示例:--@cpptest//:missing-bazel-dirs="external","another_includes_dir"
在解析过程中发现的以“external”或“another__dir”开头的任何目录的路径都将在 BDF 中加上“bazel-[project-name]”。

“@cpptest//:coverage”规则参数

选项说明
--@cpptest//:compiler-config=<COMPILER_CONFIGURATION_NAME>

指定编译器配置。
除非已在 .psrc 文件中指定编译器配置,否则必须指定此参数;请参阅配置覆盖率插桩工具(cpptestcc)
默认值:无
示例: --@cpptest//:compiler-config=clang_12_0

--@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 插桩和编译的所有阶段启用详细的控制台输出。
默认值:False

--@cpptest//:quiet

在执行过程中抑制 cpptest 引擎输出的所有控制台文本。
默认值:False

--@cpptest//:project-name=<NEW_PROJECT_NAME>

更改 Eclipse 项目文件的名称:.project 和 .parasoft。
默认值:"$(basename $(bazel info workspace))" - 包含 WORKSPACE 文件的目录的名称。
示例:--@cpptest//:project-name="foo"
顶层目录中的 .project 文件将包含:"<name>foo</name>"
顶层目录中的 .parasoft 文件将包含: "project.path=/foo"
/foo//...  - 项目的配置条目

--@cpptest//:project-workspace=<PROJECT_WORKSPACE>

提供用于分析和报告的临时 Eclipse 工作空间的位置。
默认值:/tmp
示例: --@cpptest//:project-workspace=/tmp/project_name