与 C++ 规则集成

报告问题 查看源代码

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

访问 C++ 工具链

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

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

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

C++ 规则使用一种基于功能配置构建命令行的特殊方式。如需构建命令行,您需要具备以下几项:

仍然存在特定于工具的 getter,例如 compiler_executable。最好使用 get_tool_for_action,而不要使用它们,因为工具专用 getter 最终将被移除。

完整的工作示例可在 rules_cc 示例中找到。

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

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

如果自定义 Starlark 规则提供 CcInfo,则表示 C++ 规则也可以依赖该规则。但请务必小心,如果您只需要通过图将 CcInfo 传播到随后使用它的二进制规则,请将 CcInfo 封装在另一个提供程序中。例如,如果 java_library 规则想要将原生依赖项传播到 java_binary,则不应直接提供 CcInfocc_binary 依赖于 java_library 没有意义),而应将其封装在 JavaCcInfo 中。

完整的工作示例可在 rules_cc 示例中找到。

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

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