工具链解析实现详情

注意 :本部分面向 Bazel 开发者,规则编写者无需阅读。

有几个 SkyFunction 类实现了 工具链解析 流程:

  1. RegisteredToolchainsFunctionRegisteredExecutionPlatformsFunction 会根据当前 配置和 WORKSPACE 文件查找可用的工具链和执行平台。

  2. SingleToolchainResolutionFunction 会为每个执行平台解析单个工具链类型。也就是说,它会根据以下条件为每个执行平台找到要使用的最佳注册工具链:

    1. 通过检查 target_compatible_with 属性,确保工具链和目标平台兼容。
    2. 通过检查 exec_compatible_with 属性,确保工具链和执行平台兼容。
    3. 如果剩余多个工具链,请选择优先级最高的工具链(最先注册的工具链)。
  3. ToolchainResolutionFunction 会为每个请求的工具链类型调用 SingleToolchainResolutionFunction,然后 确定要使用的最佳执行平台。

    1. 首先,移除没有适用于每个请求的工具链类型的有效工具链的任何执行平台。
    2. 如果剩余多个执行平台,请选择优先级最高的执行平台(最先注册的执行平台)。
      1. 如果执行平台已通过工具链转换设置,则系统会先选择该平台,如下所述。

工具链和配置中所述, 从目标到工具链的依赖项使用特殊配置,该配置 会强制执行平台对于两者都是相同的。尽管名称为 "工具链转换",但它并非作为配置 转换实现,而是作为 ConfiguredTargetKey的特殊子类实现,称为 ToolchainDependencyConfiguredTargetKey。除了 ConfiguredTargetKey 中的其他数据之外,此子类还包含执行平台的标签。当 ToolchainResolutionFunction 考虑要使用哪个执行平台时,如果 ToolchainDependencyConfiguredTargetKey 中的强制执行平台有效,即使它不是优先级最高的平台,也会使用该平台。

注意 :如果强制执行平台无效(因为没有有效的工具链,或者因为规则或目标的执行限制),则系统会改用优先级最高的有效执行平台。