diff --git a/eng/pipelines/templates/stages/vmr-build.yml b/eng/pipelines/templates/stages/vmr-build.yml
index bdede627acf5..f5ba03ffc93b 100644
--- a/eng/pipelines/templates/stages/vmr-build.yml
+++ b/eng/pipelines/templates/stages/vmr-build.yml
@@ -379,7 +379,7 @@ stages:
vmrBranch: ${{ variables.VmrBranch }}
pool: ${{ parameters.pool_Windows }}
targetOS: windows
- targetArchitecture: x64
+ targetArchitecture: x86
useDevVersions: true # Use dev versions for CI validation of the experience.
runTests: false # Temporarily do not run tests. The nuget comparison fails for some non-obvious reason and needs further investigation. Mostly, I'm not sure why it ever passed. https://github.com/dotnet/sdk/issues/42920
diff --git a/src/SourceBuild/content/repo-projects/Directory.Build.props b/src/SourceBuild/content/repo-projects/Directory.Build.props
index 6d200e0e2799..8f134097e901 100644
--- a/src/SourceBuild/content/repo-projects/Directory.Build.props
+++ b/src/SourceBuild/content/repo-projects/Directory.Build.props
@@ -81,6 +81,9 @@
$(BuildArgs) /p:DotNetBuildOrchestrator=true
+
+ $(BuildArgs) /p:TargetRid=$(TargetRid)
+
$(BuildArgs) /p:DotNetBuildPass=$(DotNetBuildPass)
diff --git a/src/SourceBuild/content/repo-projects/Directory.Build.targets b/src/SourceBuild/content/repo-projects/Directory.Build.targets
index c554a1082169..c6e5077c20e6 100644
--- a/src/SourceBuild/content/repo-projects/Directory.Build.targets
+++ b/src/SourceBuild/content/repo-projects/Directory.Build.targets
@@ -37,8 +37,6 @@
- $(BuildScript) $(BuildActions) $(BuildArgs)
-
$(ArtifactsLogRepoDir)$(RepositoryName).log
@@ -449,6 +447,20 @@
+
+
+
+ $(BuildArgs) /p:DotNetBuildTargetRidOnly=true
+
+ $(BuildScript) $(BuildActions) $(BuildArgs)
+
+
+
+ SetSourceBuiltSdkOverrides;
+ SetBuildProperties">
@@ -734,6 +747,7 @@
$(BuildArgs) $(FlagParameterPrefix)officialBuildId $(OfficialBuildId)
$(BuildArgs) $(FlagParameterPrefix)officialSkipTests true
@@ -19,8 +20,8 @@
$(BuildArgs) $(FlagParameterPrefix)officialSourceBranchName placeholder
$(BuildArgs) $(FlagParameterPrefix)officialVisualStudioDropAccessToken placeholder
+
- $(BuildArgs) /p:TargetRid=$(TargetRid)
$(BuildArgs) /p:TreatWarningsAsErrors=false
$(BuildArgs) /p:ApplyPartialNgenOptimization=false
$(BuildArgs) /p:EnablePartialNgenOptimization=false
diff --git a/src/SourceBuild/content/repo-projects/runtime.proj b/src/SourceBuild/content/repo-projects/runtime.proj
index 5c187068e132..d1e2e17126ef 100644
--- a/src/SourceBuild/content/repo-projects/runtime.proj
+++ b/src/SourceBuild/content/repo-projects/runtime.proj
@@ -8,7 +8,6 @@
$(BuildArgs) $(FlagParameterPrefix)arch $(TargetArchitecture)
$(BuildArgs) $(FlagParameterPrefix)os $(TargetOS)
- $(BuildArgs) /p:TargetRid=$(TargetRid)
$(BuildArgs) /p:DotNetBuildRuntimeWasmEnableThreads=true
$(BuildArgs) /p:DotNetBuildRuntimeNativeAOTRuntimePack=true
$(BuildArgs) /p:DotNetBuildMonoEnableLLVM=$(DotNetBuildMonoEnableLLVM)
diff --git a/src/SourceBuild/content/repo-projects/sdk.proj b/src/SourceBuild/content/repo-projects/sdk.proj
index 7f34a2f370f9..f5f7cc67e817 100644
--- a/src/SourceBuild/content/repo-projects/sdk.proj
+++ b/src/SourceBuild/content/repo-projects/sdk.proj
@@ -1,4 +1,4 @@
-
+
true
@@ -6,7 +6,6 @@
$(BuildArgs) -nativeToolsOnMachine
$(BuildArgs) /p:PackageProjectUrl=https://github.com/dotnet/sdk
$(BuildArgs) /p:PortableRid=$(PortableRid)
- $(BuildArgs) /p:TargetRid=$(TargetRid)
$(BuildArgs) $(FlagParameterPrefix)v $(LogVerbosity)
diff --git a/src/SourceBuild/patches/arcade/0001-set-rid-for-project-for-live-runtime.patch b/src/SourceBuild/patches/arcade/0001-set-rid-for-project-for-live-runtime.patch
new file mode 100644
index 000000000000..54d57dab139a
--- /dev/null
+++ b/src/SourceBuild/patches/arcade/0001-set-rid-for-project-for-live-runtime.patch
@@ -0,0 +1,150 @@
+From 0b326d7d0d266808c6109282c6417d26835ef648 Mon Sep 17 00:00:00 2001
+From: Jeremy Koritzinsky
+Date: Thu, 2 Jan 2025 12:19:02 -0800
+Subject: [PATCH] Infer the projects runtime identifier as the vertical's RID
+ when doing a vertical build and filter down RID lists to the target RID in
+ such a scenario.
+
+Backport: https://github.com/dotnet/arcade/pull/15371
+
+---
+ .../UnifiedBuild/Unified-Build-Controls.md | 1 +
+ .../tools/BeforeNETSdkTargets.targets | 4 +
+ ...ifierInference.BeforeNETSdkTargets.targets | 79 +++++++++++++++++++
+ .../tools/Settings.props | 1 +
+ .../SourceBuildArcadeBuild.targets | 1 +
+ 5 files changed, 86 insertions(+)
+ create mode 100644 src/Microsoft.DotNet.Arcade.Sdk/tools/BeforeNETSdkTargets.targets
+ create mode 100644 src/Microsoft.DotNet.Arcade.Sdk/tools/RuntimeIdentifierInference.BeforeNETSdkTargets.targets
+
+diff --git a/Documentation/UnifiedBuild/Unified-Build-Controls.md b/Documentation/UnifiedBuild/Unified-Build-Controls.md
+index 809d94443..872e14167 100644
+--- a/Documentation/UnifiedBuild/Unified-Build-Controls.md
++++ b/Documentation/UnifiedBuild/Unified-Build-Controls.md
+@@ -135,6 +135,7 @@ These controls may be used for **infrastructure or product purposes**.
+ | -------- | -------- | -------- | -------- |
+ | DotNetBuildWithOnlineSources | "true", "false", "" | "false" by default when `SourceOnly` switch is active. | When "true", do not remove non-local input sources. Infrastructure switch only. This switch is only exposed at the orchestrator level.This replaces the existing `DotNetBuildOffline` switch. |
+ | DotNetBuildSourceOnly | "true", "false", "" | "" | When "true", build only from source. Online sources may remain unless `DotNetBuildOffline` is set to true. This is both an infrastructure and a product switch.
This is roughly equivalent to `DotNetBuildFromSource` in the current infrastructure, though other controls may be better suited. |
++| DotNetBuildTargetRidOnly | "true", "false", "" | "" | When not set, defaults to "true" if the repository build transitively depends on dotnet/runtime and `DotNetBuildOrchestrator` == "true"; otherwise "false". When "true", builds projects for the current `TargetRid` instead of using the current runtime identifier. |
+
+ ### Output Controls
+
+diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/BeforeNETSdkTargets.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/BeforeNETSdkTargets.targets
+new file mode 100644
+index 000000000..84b2020b6
+--- /dev/null
++++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/BeforeNETSdkTargets.targets
+@@ -0,0 +1,4 @@
++
++
++
++
+diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/RuntimeIdentifierInference.BeforeNETSdkTargets.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/RuntimeIdentifierInference.BeforeNETSdkTargets.targets
+new file mode 100644
+index 000000000..9eba3fad9
+--- /dev/null
++++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/RuntimeIdentifierInference.BeforeNETSdkTargets.targets
+@@ -0,0 +1,79 @@
++
++
++
++ <_EnableArcadeRuntimeIdentifierInference Condition="'$(_EnableArcadeRuntimeIdentifierInference)' == ''">$(EnableArcadeRuntimeIdentifierInference)
++
++
++ <_EnableArcadeRuntimeIdentifierInference Condition="'$(_EnableArcadeRuntimeIdentifierInference)' == '' and '$(RuntimeIdentifier)' != ''">false
++
++
++ <_RidAgnosticProject Condition="('$(OutputType)' == 'Library' or '$(IsTestProject)' == 'true') and '$(RuntimeIdentifiers)' == ''">true
++
++
++ <_EnableArcadeRuntimeIdentifierInference Condition="'$(_EnableArcadeRuntimeIdentifierInference)' == '' and ('$(IsRidAgnostic)' == 'true' or '$(_RidAgnosticProject)' == 'true')">false
++
++
++ <_BuildFlavorRequiredRid
++ Condition="
++ '$(SelfContained)' == 'true' or
++ ('$(_IsPublishing)' == 'true' and
++ (
++ '$(PublishReadyToRun)' == 'true' or
++ '$(PublishSingleFile)' == 'true' or
++ '$(PublishAot)' == 'true'
++ )
++ )">true
++ <_EnableArcadeRuntimeIdentifierInference Condition="'$(_EnableArcadeRuntimeIdentifierInference)' == '' and '$(_BuildFlavorRequiredRid)' != 'true'">false
++
++
++ <_EnableArcadeRuntimeIdentifierInference Condition="'$(_EnableArcadeRuntimeIdentifierInference)' == '' and '$(DotNetBuildTargetRidOnly)' == 'true'">true
++
++ <_EnableArcadeRuntimeIdentifierFilters Condition="'$(EnableArcadeRuntimeIdentifierFilters)' != ''">$(EnableArcadeRuntimeIdentifierFilters)
++
++
++ <_EnableArcadeRuntimeIdentifierFilters Condition="'$(_EnableArcadeRuntimeIdentifierFilters)' == '' and '$(_EnableArcadeRuntimeIdentifierInference)' == 'true'">$(_EnableArcadeRuntimeIdentifierFilters)
++
++
++
++
++ false
++ $(TargetRid)
++
++
++ true
++
++
++
++
++ <_ExplicitlySpecifiedRuntimeIdentifiers>;$(RuntimeIdentifiers);
++
++
++ <_FilterRuntimeIdentifier>$(TargetRid)
++
++ <_FilterRuntimeIdentifier Condition="'$(BaseOS)' != ''">$(BaseOS)
++
++
++ <_SuppressAllTargets Condition="'$(DisableArcadeExcludeFromBuildSupport)' != 'true' and $(_ExplicitlySpecifiedRuntimeIdentifiers).Contains(';$(_FilterRuntimeIdentifier);')) == 'false'">true
++
++
++ $(RuntimeIdentifier)
++
++
+diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/Settings.props b/src/Microsoft.DotNet.Arcade.Sdk/tools/Settings.props
+index b19ed1c3e..0b1d6c41d 100644
+--- a/src/Microsoft.DotNet.Arcade.Sdk/tools/Settings.props
++++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/Settings.props
+@@ -6,6 +6,7 @@
+ <_ArcadeOverriddenCustomBeforeMicrosoftCommonCrossTargetingTargets>$(CustomBeforeMicrosoftCommonCrossTargetingTargets)
+ $(MSBuildThisFileDirectory)BeforeCommonTargets.targets
+ $(MSBuildThisFileDirectory)BeforeCommonTargets.CrossTargeting.targets
++ $(BeforeMicrosoftNETSdkTargets);$(MSBuildThisFileDirectory)BeforeNETSdkTargets.targets
+
+diff --git a/src/Microsoft.DotNet.Arcade.Sdk/tools/SourceBuild/SourceBuildArcadeBuild.targets b/src/Microsoft.DotNet.Arcade.Sdk/tools/SourceBuild/SourceBuildArcadeBuild.targets
+index 76e314d1f..a94d4e5ac 100644
+--- a/src/Microsoft.DotNet.Arcade.Sdk/tools/SourceBuild/SourceBuildArcadeBuild.targets
++++ b/src/Microsoft.DotNet.Arcade.Sdk/tools/SourceBuild/SourceBuildArcadeBuild.targets
+@@ -55,6 +55,7 @@
+ - DotNetBuildSourceOnly - Build from source only. Pass through outer build value if present. -->
+ $(InnerBuildArgs) /p:DotNetBuildInnerRepo=true
+ $(InnerBuildArgs) /p:DotNetBuildSourceOnly=$(DotNetBuildSourceOnly)
++ $(InnerBuildArgs) /p:DotNetBuildTargetRidOnly=$(DotNetBuildTargetRidOnly)
+
+ $(InnerBuildArgs) /p:RepoRoot="$(InnerSourceBuildRepoRoot)$(_DirSeparatorEscapedCharForExecArg)"
+
diff --git a/src/SourceBuild/patches/roslyn/0001-Use-BaseOS-instead-of-TargetRid-when-its-available.patch b/src/SourceBuild/patches/roslyn/0001-Use-BaseOS-instead-of-TargetRid-when-its-available.patch
new file mode 100644
index 000000000000..cf2d19f1ce75
--- /dev/null
+++ b/src/SourceBuild/patches/roslyn/0001-Use-BaseOS-instead-of-TargetRid-when-its-available.patch
@@ -0,0 +1,34 @@
+From fe7b6d17a00a69b6bb8cb25d640af56f74a60032 Mon Sep 17 00:00:00 2001
+From: Jeremy Koritzinsky
+Date: Tue, 21 Jan 2025 11:31:58 -0800
+Subject: [PATCH] Use BaseOS instead of TargetRid when its available.
+
+In Source Build, BaseOS is the portable runtime identifier for TargetRid.
+
+Backport: https://github.com/dotnet/roslyn/pull/76838
+
+---
+ .../Microsoft.CodeAnalysis.LanguageServer.csproj | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/Microsoft.CodeAnalysis.LanguageServer.csproj b/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/Microsoft.CodeAnalysis.LanguageServer.csproj
+index 9b556fcdb8f..a76305b4a29 100644
+--- a/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/Microsoft.CodeAnalysis.LanguageServer.csproj
++++ b/src/LanguageServer/Microsoft.CodeAnalysis.LanguageServer/Microsoft.CodeAnalysis.LanguageServer.csproj
+@@ -45,12 +45,13 @@
+ $(ArtifactsDir)/LanguageServer/$(Configuration)/$(TargetFramework)/neutral
+
+
+-
+ $(TargetRid)
+- win-x64;win-arm64;linux-x64;linux-arm64;linux-musl-x64;linux-musl-arm64;osx-x64;osx-arm64
++ $(BaseOS)
++ win-x64;win-arm64;linux-x64;linux-arm64;linux-musl-x64;linux-musl-arm64;osx-x64;osx-arm64
+
+ true
+