diff --git a/Documentation/UnifiedBuild/Unified-Build-Controls.md b/Documentation/UnifiedBuild/Unified-Build-Controls.md
index 809d94443d7..872e1416761 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 00000000000..84b2020b612
--- /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 00000000000..9eba3fad9b4
--- /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 b19ed1c3e57..0b1d6c41d43 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 76e314d1fad..a94d4e5acac 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)"