工具链解析实现详情

报告问题 查看来源 每晚 · 7.2。 · 7.1敬上 · 7.0 · 6.5 条 · 6.4

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

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