工具链解析实现详情

报告问题 查看源代码

注意:本部分面向 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 的强制执行平台有效,那么即使它不是最高优先级,系统也会使用该平台。

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