本页介绍了如何在各个级别集成 C++ 规则。
访问 C++ 工具链
由于
持续迁移 C++规则
平台和
工具链,
应使用
@bazel_tools//tools/cpp:toolchain_utils.bzl,
在停用和启用工具链时都能正常运行。使用 C++
工具链,请添加
Label
名为 _cc_toolchain
的属性,并将它指向
@bazel_tools//tools/cpp:current_cc_toolchain
(一个
cc_toolchain_alias
规则,该规则指向当前选定的 C++ 工具链)。
然后在规则实施过程中
find_cpp_toolchain(ctx)
以获取
CcToolchainInfo
。
如需查看完整的工作示例,
“Rules_cc”示例中的“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”示例中的“Rules_cc”。
实现依赖于 C++ 规则和/或 C++ 规则可以依赖的 Starlark 规则
大多数 C++规则都提供
CcInfo
,
包含 CompilationContext
的提供程序
和
LinkingContext
。
通过这些 API,可以访问所有传递标头等信息
要关联的库从 CcInfo
开始,从 CcToolchainInfo
自定义
Starlark 规则应该能够获取所需的所有信息。
如果自定义 Starlark 规则提供 CcInfo
,它会向 C++ 规则发送一个信号,
他们也会依赖它不过,如果您只需要让 Google Cloud
CcInfo
通过图传递给二元规则,然后利用该规则使用它,换行
CcInfo
在其他提供商中。例如,如果需要java_library
规则
将原生依赖项传播到 java_binary
,它不应提供
直接 CcInfo
(cc_binary
依赖于 java_library
没有意义),
应将其封装在 JavaCcInfo
中。
如需查看完整的工作示例, “Rules_cc”示例中的“Rules_cc”。
重复使用 C++ 规则的逻辑和操作
尚不稳定;在该 API 稳定后,此部分将更新。关注 #4570 代表最新版本 信息。