注意:本部分面向 Bazel 开发者,规则作者不需要。
多个 SkyFunction 类会实现工具链解析流程:
RegisteredToolchainsFunction
和RegisteredExecutionPlatformsFunction
可根据当前配置和 WORKSPACE 文件查找可用的工具链和执行平台。SingleToolchainResolutionFunction
会为每个执行平台解析一种工具链类型。也就是说,对于每个执行平台,它都会根据以下条件找到要使用的最佳注册工具链:- 通过检查
target_compatible_with
属性,确保工具链和目标平台兼容。 - 通过检查
exec_compatible_with
属性,确保工具链和执行平台兼容。 - 如果保留多个工具链,请选择优先级最高的那个(先注册的那个)。
- 通过检查
ToolchainResolutionFunction
会针对每个请求的工具链类型调用SingleToolchainResolutionFunction
,然后确定要使用的最佳执行平台。- 首先,移除每个请求的工具链类型没有有效工具链的任何执行平台。
- 如果剩下多个执行平台,请选择优先级最高的平台(最先注册的版本)。
- 如果执行平台已由工具链过渡设置,则会首先选择执行平台,如下所述。
如工具链和配置中所述,从目标到工具链的依赖项使用特殊配置,强制对这两个平台执行平台相同。尽管名称为“工具链转换”,但它并未作为配置转换实现,而是作为 ConfiguredTargetKey
的特殊子类(名为 ToolchainDependencyConfiguredTargetKey
。
除了 ConfiguredTargetKey
中的其他数据外,此子类还包含执行平台的标签。当 ToolchainResolutionFunction
正在考虑使用哪个执行平台时,如果 ToolchainDependencyConfiguredTargetKey
的强制执行平台有效,即使该平台不是最高优先级,也会使用。
注意:如果强制执行平台无效(由于没有有效的工具链,或者由于规则或目标执行的执行限制),则优先级最高的有效执行平台。