与 C++ 规则集成

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

访问 C++ 工具链

您应使用 @rules_cc//cc:find_cc_toolchain.bzl 中提供的帮助程序函数,以依赖于 Starlark 规则中的 CC 工具链。

如需依赖于规则中的 C++ 工具链,请将 toolchains 参数设置为 use_cc_toolchain()。然后,在规则实现中,使用 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++ 规则和/或 C++ 规则可以依赖的 Starlark 规则

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

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

如需查看完整的有效示例,请参阅 rules_cc 示例

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

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