工具链解析实现详情

报告问题 查看源代码 每夜 build · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

注意:本部分面向 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 是有效的,即使 如果不是最高优先级,则会发生此错误。

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