工具鍊解決方案實作詳細資料

注意:本節適用於 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 中的強制執行平台有效,即使不是最高優先順序,系統也會使用該平台。

注意:如果強制執行的平台無效 (因為沒有有效的工具鍊,或因為規則或目標的執行限制),系統會改用優先順序最高的有效執行平台。