本页介绍了如何在各种级别上与 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++ 命令行 flag 传递给在后台调用 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 的提供方。通过这些,您可以访问所有传递性标头或要链接的库等信息。自定义 Starlark 规则应能够从 CcInfo 和 CcToolchainInfo 中获取所需的所有信息。
如果自定义 Starlark 规则提供 CcInfo,则表示 C++ 规则也可以依赖于它。不过,请注意,如果您只需要通过图将 CcInfo 传播到随后使用它的二进制规则,请将 CcInfo 封装在不同的提供程序中。例如,如果 java_library 规则想要
将原生依赖项传播到 java_binary,则不应直接提供
CcInfo(cc_binary 依赖于 java_library 没有意义),
而应将其封装在 JavaCcInfo 中。
如需查看完整的有效示例,请参阅 rules_cc 示例。
重复使用 C++ 规则的逻辑和操作
尚未稳定;此部分将在 API 稳定后更新。如需了解最新信息,请关注 #4570。