与 C++ 规则集成

报告问题 查看源代码 每夜 build · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

本页介绍了如何在不同级别与 C++ 规则集成。

访问 C++ 工具链

由于正在将 C++ 规则迁移到平台工具链,因此您应使用 @bazel_tools//tools/cpp:toolchain_utils.bzl 中提供的辅助函数,该函数在工具链处于停用和启用状态时均可正常运行。如需在规则中依赖于 C++ 工具链,请添加一个名为 _cc_toolchainLabel 属性,并将其指向 @bazel_tools//tools/cpp:current_cc_toolchaincc_toolchain_alias 规则的实例,指向当前所选的 C++ 工具链)。然后,在规则实现中,使用 find_cpp_toolchain(ctx) 获取 CcToolchainInfo。您可以在 rules_cc 示例中找到完整的有效示例。

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

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

C++ 规则使用特殊方式根据功能配置构建命令行。如需构建命令行,您需要满足以下条件:

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

您可以在 rules_cc 示例中找到完整的有效示例。

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

大多数 C++ 规则都提供 CcInfo,这是一个包含 CompilationContextLinkingContext 的提供程序。通过这些信息,您可以访问所有传递头文件或要关联的库等信息。通过 CcInfoCcToolchainInfo 自定义 Starlark 规则,应该能够获取所需的所有信息。

如果自定义 Starlark 规则提供了 CcInfo,则会向 C++ 规则发出信号,表明它们也可以依赖于它。不过,请注意,如果您只需通过图表将 CcInfo 传播到随后使用它的二进制规则,请将 CcInfo 封装在其他提供程序中。例如,如果 java_library 规则想要将原生依赖项向上传播到 java_binary,则不应直接提供 CcInfo(依赖于 java_librarycc_binary 没有意义),而应将其封装在 JavaCcInfo 等中。

您可以在 rules_cc 示例中找到完整的有效示例。

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

尚不稳定;API 稳定后,本部分将更新。请关注 #4570 以了解最新信息。