本页介绍了如何在各种级别集成 C++ 规则。
访问 C++ 工具链
由于 C++ 规则持续迁移到平台和工具链,您应该使用位于 @bazel_tools//tools/cpp:toolchain_utils.bzl 中的辅助函数,该函数在停用和启用工具链时都适用。如需在规则中依赖于 C++ 工具链,请添加名为 _cc_toolchain
的 Label
属性,并将其指向 @bazel_tools//tools/cpp:current_cc_toolchain
(cc_toolchain_alias
规则的实例,它指向当前选定的 C++ 工具链)。然后,在规则实现中,使用 find_cpp_toolchain(ctx)
获取 CcToolchainInfo
。如需查看完整的有效示例,请参阅 rules_cc 示例。
使用 C++ 工具链生成命令行和环境变量
通常,您会与 C++ 工具链集成,以获得与 C++ 规则相同的命令行标记,但不直接使用 C++ 操作。这是因为在编写我们自己的操作时,这些操作的行为必须与 C++ 工具链一致 - 例如,将 C++ 命令行标志传递给在后台调用 C++ 编译器的工具。
C++ 规则使用一种基于功能配置构建命令行的特殊方式。如需构建命令行,您需要以下内容:
features
和action_configs
- 它们来自CcToolchainConfigInfo
并封装在CcToolchainInfo
中FeatureConfiguration
- 由 cc_common.configure_features 返回- cc 工具链配置变量 - 由 cc_common.create_compile_variables 或 cc_common.create_link_variables 返回。
此外,还有特定于工具的 getter,例如 compiler_executable。
首选 get_tool_for_action
而不是这些,因为特定于工具的 getter 最终会被移除。
如需查看完整的有效示例,请参阅 rules_cc 示例。
实现依赖于 C++ 规则和/或 C++ 规则可以依赖的 Starlark 规则
大多数 C++ 规则都提供 CcInfo
,这是一个包含 CompilationContext
和 LinkingContext
的提供程序。通过这种方式,可以访问要链接的所有传递标头或库等信息。通过 CcInfo
和 CcToolchainInfo
自定义 Starlark 规则应该能够获取他们需要的所有信息。
如果自定义 Starlark 规则提供 CcInfo
,则会向 C++ 规则表明也可以依赖于该规则。但请注意,如果您只需要通过图将 CcInfo
传播到随后使用它的二进制规则,请将 CcInfo
封装在另一个提供程序中。例如,如果 java_library
规则想要将原生依赖项向上传播到 java_binary
,则它不应直接提供 CcInfo
(依赖于 java_library
的 cc_binary
没有意义),而应将其封装在如 JavaCcInfo
中。
如需查看完整的有效示例,请参阅 rules_cc 示例。
重复使用 C++ 规则的逻辑和操作
尚不稳定;此部分会在 API 稳定后更新。如需了解最新信息,请关注 #4570。