注意:本節適用於 Bazel 開發人員,規則作者不需要瞭解。
多個 SkyFunction 類別會實作工具鍊解析程序:
RegisteredToolchainsFunction和RegisteredExecutionPlatformsFunction,根據目前的設定和 WORKSPACE 檔案,尋找可用的工具鍊和執行平台。SingleToolchainResolutionFunction為每個執行平台解決單一工具鍊類型。也就是說,系統會根據下列條件,為每個執行平台找出最適合使用的已註冊工具鍊:- 請檢查
target_compatible_with屬性,確認工具鍊和目標平台是否相容。 - 請檢查
exec_compatible_with屬性,確認工具鍊和執行平台是否相容。 - 如果留下多個工具鍊,請選擇優先順序最高的工具鍊 (最先註冊的工具鍊)。
- 請檢查
ToolchainResolutionFunction會針對每個要求的工具鍊類型呼叫SingleToolchainResolutionFunction,然後判斷要使用的最佳執行平台。- 首先,請移除沒有每個要求工具鍊類型有效工具鍊的執行平台。
- 如果有多個執行平台,請選擇優先順序最高的平台 (最先註冊的平台)。
- 如果執行平台已由工具鍊轉換設定,系統會先選取該平台,如下所述。
如「工具鍊和設定」一節所述,目標到工具鍊的依附元件會使用特殊設定,強制兩者使用相同的執行平台。雖然名稱為「工具鍊轉換」,但這並非以設定轉換的形式實作,而是以 ConfiguredTargetKey 的特殊子類別實作,稱為 ToolchainDependencyConfiguredTargetKey。除了 ConfiguredTargetKey 中的其他資料,這個子類別也會保留執行平台的標籤。ToolchainResolutionFunction 考慮要使用哪個執行平台時,即使 ToolchainDependencyConfiguredTargetKey 中的強制執行平台並非最高優先順序,只要有效就會使用。
注意:如果強制執行的平台無效 (因為沒有有效的工具鍊,或因為規則或目標的執行限制),系統會改用優先順序最高的有效執行平台。