diff --git a/src/Tasks/Microsoft.NET.Build.Tasks/ResolveReadyToRunCompilers.cs b/src/Tasks/Microsoft.NET.Build.Tasks/ResolveReadyToRunCompilers.cs index 716a7f37c3cf..5d21bc96e846 100644 --- a/src/Tasks/Microsoft.NET.Build.Tasks/ResolveReadyToRunCompilers.cs +++ b/src/Tasks/Microsoft.NET.Build.Tasks/ResolveReadyToRunCompilers.cs @@ -143,21 +143,14 @@ private bool ValidateCrossgen2Support() bool version5 = crossgen2PackVersion.Major < 6; bool isSupportedTarget = ExtractTargetPlatformAndArchitecture(_targetRuntimeIdentifier, out _targetPlatform, out _targetArchitecture); - string targetOS = _targetPlatform switch - { - "linux" => "linux", - "linux-musl" => "linux", - "osx" => "osx", - "win" => "windows", - _ => null - }; // In .NET 5 Crossgen2 supported only the following host->target compilation scenarios: // win-x64 -> win-x64 // linux-x64 -> linux-x64 // linux-musl-x64 -> linux-musl-x64 + string targetOS = null; isSupportedTarget = isSupportedTarget && - targetOS != null && + GetCrossgen2TargetOS(out targetOS) && (!version5 || _targetRuntimeIdentifier == _hostRuntimeIdentifier) && GetCrossgen2ComponentsPaths(version5); @@ -188,6 +181,48 @@ private bool ValidateCrossgen2Support() return true; } + private bool GetCrossgen2TargetOS(out string targetOS) + { + targetOS = null; + + // Determine targetOS based on target rid. + // Use the runtime graph to support non-portable target rids. + var runtimeGraph = new RuntimeGraphCache(this).GetRuntimeGraph(RuntimeGraphPath); + string portablePlatform = NuGetUtils.GetBestMatchingRid( + runtimeGraph, + _targetPlatform, + new[] { "linux", "linux-musl", "osx", "win" }, + out _); + + // For source-build, allow the bootstrap SDK rid to be unknown to the runtime repo graph. + if (portablePlatform == null && _targetRuntimeIdentifier == _hostRuntimeIdentifier) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + portablePlatform = "linux"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + portablePlatform = "win"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + portablePlatform = "osx"; + } + } + + targetOS = portablePlatform switch + { + "linux" => "linux", + "linux-musl" => "linux", + "osx" => "osx", + "win" => "windows", + _ => null + }; + + return targetOS != null; + } + private ITaskItem GetNETCoreAppRuntimePack() { return GetNETCoreAppPack(RuntimePacks, MetadataKeys.FrameworkName);