与 C++ 规则集成

报告问题 查看来源 每晚 · 7.2。 · 7.1敬上 · 7.0 · 6.5 · 6.4

本页介绍了如何在各个级别集成 C++ 规则。

访问 C++ 工具链

由于 持续迁移 C++规则 平台工具链, 应使用 @bazel_tools//tools/cpp:toolchain_utils.bzl, 在停用和启用工具链时都能正常运行。使用 C++ 工具链,请添加 Label 名为 _cc_toolchain 的属性,并将它指向 @bazel_tools//tools/cpp:current_cc_toolchain(一个 cc_toolchain_alias 规则,该规则指向当前选定的 C++ 工具链)。 然后在规则实施过程中 find_cpp_toolchain(ctx) 以获取 CcToolchainInfo。 如需查看完整的工作示例, “Rules_cc”示例中的“Rules_cc”

使用 C++ 工具链生成命令行和环境变量

通常,您会与 C++ 工具链集成,以获得相同的 命令行标志(如 C++ 规则一样),但不直接使用 C++ 操作。 这是因为在编写我们自己的操作时,它们必须 与 C++ 工具链一致 - 例如,传递 C++ 命令行 标志传递给在后台调用 C++ 编译器的工具。

C++ 规则使用一种特殊的方式来根据功能 配置。如需构建命令行,请执行以下操作: 您需要以下内容:

还有工具专用的 getter,例如 compiler_executable: 首选 get_tool_for_action,而不是这些,因为特定于工具的 getter 会 最终会被移除。

如需查看完整的工作示例, “Rules_cc”示例中的“Rules_cc”

实现依赖于 C++ 规则和/或 C++ 规则可以依赖的 Starlark 规则

大多数 C++规则都提供 CcInfo, 包含 CompilationContext 的提供程序 和 LinkingContext。 通过这些 API,可以访问所有传递标头等信息 要关联的库从 CcInfo 开始,从 CcToolchainInfo 自定义 Starlark 规则应该能够获取所需的所有信息。

如果自定义 Starlark 规则提供 CcInfo,则会向 C++ 规则发送一个信号, 他们也会依赖它不过,如果您只需要让 Google Cloud CcInfo 通过图传递给二元规则,然后利用该规则使用它,换行 CcInfo在其他提供商中。例如,如果需要java_library规则 将原生依赖项传播到 java_binary,它不应提供 直接 CcInfocc_binary 依赖于 java_library 没有意义), 应将其封装在 JavaCcInfo 中。

如需查看完整的工作示例, “Rules_cc”示例中的“Rules_cc”

重复使用 C++ 规则的逻辑和操作

尚不稳定;在该 API 稳定后,此部分将更新。关注 #4570 代表最新版本 信息。