本页介绍了如何在不同级别上与 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++ 规则使用一种基于功能配置的特殊方式来构建命令行。如需构建命令行,您需要以下各项:
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
(cc_binary
依赖于 java_library
没有意义),而应将其封装在 JavaCcInfo
中。
您可以在 rules_cc 示例中找到完整的有效示例。
重用 C++ 规则的逻辑和操作
尚未稳定;API 稳定后,本部分将进行更新。请关注 #4570,了解最新信息。