From ab76da0cac48daf7222aedc85c64059edcdec177 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Tue, 13 Oct 2026 18:47:18 +0200 Subject: [PATCH 1/4] respect the server --- .../Il2CppBuildPreProcess.cs | 3 +-- .../MonoLinkerProcessor.cs | 7 +------ src/Sentry.Unity.Editor/NamedBuildTargets.cs | 20 +++++++++++++++++++ .../Native/BuildPostProcess.cs | 19 ++++++++++++++---- .../NamedBuildTargetsTests.cs | 19 ++++++++++++++++++ 5 files changed, 56 insertions(+), 12 deletions(-) create mode 100644 src/Sentry.Unity.Editor/NamedBuildTargets.cs create mode 100644 test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs diff --git a/src/Sentry.Unity.Editor/Il2CppBuildPreProcess.cs b/src/Sentry.Unity.Editor/Il2CppBuildPreProcess.cs index 133d1dbcd..95f6e0239 100644 --- a/src/Sentry.Unity.Editor/Il2CppBuildPreProcess.cs +++ b/src/Sentry.Unity.Editor/Il2CppBuildPreProcess.cs @@ -17,8 +17,7 @@ internal class Il2CppBuildPreProcess : IPreprocessBuildWithReport public void OnPreprocessBuild(BuildReport report) { - var namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(report.summary.platformGroup); - if (PlayerSettings.GetScriptingBackend(namedBuildTarget) != ScriptingImplementation.IL2CPP) + if (PlayerSettings.GetScriptingBackend(NamedBuildTargets.FromBuildReport(report)) != ScriptingImplementation.IL2CPP) { return; } diff --git a/src/Sentry.Unity.Editor/MonoLinkerProcessor.cs b/src/Sentry.Unity.Editor/MonoLinkerProcessor.cs index 09234924a..6b3365eec 100644 --- a/src/Sentry.Unity.Editor/MonoLinkerProcessor.cs +++ b/src/Sentry.Unity.Editor/MonoLinkerProcessor.cs @@ -29,12 +29,7 @@ internal class MonoLinkerProcessor : IUnityLinkerProcessor public string? GenerateAdditionalLinkXmlFile(BuildReport report, UnityLinkerBuildPipelineData data) { - var summary = report.summary; - var namedBuildTarget = summary.platformGroup == BuildTargetGroup.Standalone - && summary.GetSubtarget() == StandaloneBuildSubtarget.Server - ? NamedBuildTarget.Server - : NamedBuildTarget.FromBuildTargetGroup(summary.platformGroup); - if (PlayerSettings.GetScriptingBackend(namedBuildTarget) != ScriptingImplementation.Mono2x) + if (PlayerSettings.GetScriptingBackend(NamedBuildTargets.FromBuildReport(report)) != ScriptingImplementation.Mono2x) { return null; } diff --git a/src/Sentry.Unity.Editor/NamedBuildTargets.cs b/src/Sentry.Unity.Editor/NamedBuildTargets.cs new file mode 100644 index 000000000..3ce1eb506 --- /dev/null +++ b/src/Sentry.Unity.Editor/NamedBuildTargets.cs @@ -0,0 +1,20 @@ +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; + +namespace Sentry.Unity.Editor; + +/// +/// Dedicated Server builds report BuildTargetGroup.Standalone but have their own player settings, +/// i.e. scripting backend, under NamedBuildTarget.Server. +/// +internal static class NamedBuildTargets +{ + internal static NamedBuildTarget FromBuildReport(BuildReport report) => + From(report.summary.platformGroup, report.summary.GetSubtarget()); + + internal static NamedBuildTarget From(BuildTargetGroup group, StandaloneBuildSubtarget subtarget) => + group == BuildTargetGroup.Standalone && subtarget == StandaloneBuildSubtarget.Server + ? NamedBuildTarget.Server + : NamedBuildTarget.FromBuildTargetGroup(group); +} diff --git a/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs b/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs index 0b8592b18..414aab19b 100644 --- a/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs +++ b/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs @@ -7,16 +7,28 @@ using UnityEngine; using UnityEditor; using UnityEditor.Build; -using UnityEditor.Callbacks; +using UnityEditor.Build.Reporting; using System.Diagnostics; using System.Linq; namespace Sentry.Unity.Editor.Native; +internal class BuildPostProcessor : IPostprocessBuildWithReport +{ + public int callbackOrder => 1; + + public void OnPostprocessBuild(BuildReport report) => + BuildPostProcess.OnPostProcessBuild(report.summary.platform, report.summary.outputPath, + NamedBuildTargets.FromBuildReport(report)); +} + public static class BuildPostProcess { - [PostProcessBuild(1)] - public static void OnPostProcessBuild(BuildTarget target, string executablePath) + public static void OnPostProcessBuild(BuildTarget target, string executablePath) => + OnPostProcessBuild(target, executablePath, + NamedBuildTarget.FromBuildTargetGroup(BuildPipeline.GetBuildTargetGroup(target))); + + internal static void OnPostProcessBuild(BuildTarget target, string executablePath, NamedBuildTarget namedBuildTarget) { var targetGroup = BuildPipeline.GetBuildTargetGroup(target); var isSupportedGroup = targetGroup is BuildTargetGroup.Standalone @@ -46,7 +58,6 @@ or BuildTargetGroup.Switch return; } - var namedBuildTarget = NamedBuildTarget.FromBuildTargetGroup(targetGroup); var isMono = PlayerSettings.GetScriptingBackend(namedBuildTarget) == ScriptingImplementation.Mono2x; // The executable path resolves to the following when pointing Unity into a `build/platform/` directory: diff --git a/test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs b/test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs new file mode 100644 index 000000000..d9bedbeb8 --- /dev/null +++ b/test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs @@ -0,0 +1,19 @@ +using NUnit.Framework; +using UnityEditor; +using UnityEditor.Build; + +namespace Sentry.Unity.Editor.Tests; + +public class NamedBuildTargetsTests +{ + [Test] + [TestCase(BuildTargetGroup.Standalone, StandaloneBuildSubtarget.Player, "Standalone")] + [TestCase(BuildTargetGroup.Standalone, StandaloneBuildSubtarget.Server, "Server")] + [TestCase(BuildTargetGroup.Android, StandaloneBuildSubtarget.Server, "Android")] + public void From_ReturnsExpectedNamedBuildTarget(BuildTargetGroup group, StandaloneBuildSubtarget subtarget, string expected) + { + var actual = NamedBuildTargets.From(group, subtarget); + + Assert.AreEqual(expected, actual.TargetName); + } +} From b3164f33c8a954456e70e02f8b085e0df6e716cc Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Tue, 13 Oct 2026 18:59:04 +0200 Subject: [PATCH 2/4] updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9f90c6ad..448a177d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ ### Fixes - The SDK now preserves the types Mono's HTTP stack needs, even with high stripping level. ([#2858](https://github.com/getsentry/sentry-unity/pull/2858)) +- When building for dedicated server, the SDK now relies on the actual scripting backend to set up IL2CPP line number and native support and to set up the automatic debug symbol upload ([#2882](https://github.com/getsentry/sentry-unity/pull/2882)) ### Dependencies From 42e8ca196736fc341d7923cea6f9f527a7d39f94 Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 14 Oct 2026 10:29:38 +0200 Subject: [PATCH 3/4] fix build target lookup --- CHANGELOG.md | 2 +- src/Sentry.Unity.Editor/NamedBuildTargets.cs | 5 ++++- test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs | 9 ++++----- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 448a177d6..bd3a368d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ ### Fixes - The SDK now preserves the types Mono's HTTP stack needs, even with high stripping level. ([#2858](https://github.com/getsentry/sentry-unity/pull/2858)) -- When building for dedicated server, the SDK now relies on the actual scripting backend to set up IL2CPP line number and native support and to set up the automatic debug symbol upload ([#2882](https://github.com/getsentry/sentry-unity/pull/2882)) +- When targeting a dedicated server, the SDK now relies on the actual scripting backend to set up IL2CPP line number and native support and to set up the automatic debug symbol upload ([#2882](https://github.com/getsentry/sentry-unity/pull/2882)) ### Dependencies diff --git a/src/Sentry.Unity.Editor/NamedBuildTargets.cs b/src/Sentry.Unity.Editor/NamedBuildTargets.cs index 3ce1eb506..3c4e5325b 100644 --- a/src/Sentry.Unity.Editor/NamedBuildTargets.cs +++ b/src/Sentry.Unity.Editor/NamedBuildTargets.cs @@ -10,8 +10,11 @@ namespace Sentry.Unity.Editor; /// internal static class NamedBuildTargets { + // `GetSubtarget` throws on platforms without a subtarget, e.g. Android. internal static NamedBuildTarget FromBuildReport(BuildReport report) => - From(report.summary.platformGroup, report.summary.GetSubtarget()); + report.summary.platformGroup == BuildTargetGroup.Standalone + ? From(BuildTargetGroup.Standalone, report.summary.GetSubtarget()) + : NamedBuildTarget.FromBuildTargetGroup(report.summary.platformGroup); internal static NamedBuildTarget From(BuildTargetGroup group, StandaloneBuildSubtarget subtarget) => group == BuildTargetGroup.Standalone && subtarget == StandaloneBuildSubtarget.Server diff --git a/test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs b/test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs index d9bedbeb8..d3fe048ff 100644 --- a/test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs +++ b/test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs @@ -7,12 +7,11 @@ namespace Sentry.Unity.Editor.Tests; public class NamedBuildTargetsTests { [Test] - [TestCase(BuildTargetGroup.Standalone, StandaloneBuildSubtarget.Player, "Standalone")] - [TestCase(BuildTargetGroup.Standalone, StandaloneBuildSubtarget.Server, "Server")] - [TestCase(BuildTargetGroup.Android, StandaloneBuildSubtarget.Server, "Android")] - public void From_ReturnsExpectedNamedBuildTarget(BuildTargetGroup group, StandaloneBuildSubtarget subtarget, string expected) + [TestCase(StandaloneBuildSubtarget.Player, "Standalone")] + [TestCase(StandaloneBuildSubtarget.Server, "Server")] + public void From_Standalone_RespectsSubtarget(StandaloneBuildSubtarget subtarget, string expected) { - var actual = NamedBuildTargets.From(group, subtarget); + var actual = NamedBuildTargets.From(BuildTargetGroup.Standalone, subtarget); Assert.AreEqual(expected, actual.TargetName); } From b236d54a253bc3f4ae856655ad6e2c202f276c4f Mon Sep 17 00:00:00 2001 From: bitsandfoxes Date: Wed, 14 Oct 2026 10:34:19 +0200 Subject: [PATCH 4/4] removed abstraction --- src/Sentry.Unity.Editor/Native/BuildPostProcess.cs | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs b/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs index 414aab19b..b98df038e 100644 --- a/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs +++ b/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs @@ -13,22 +13,15 @@ namespace Sentry.Unity.Editor.Native; -internal class BuildPostProcessor : IPostprocessBuildWithReport +internal class BuildPostProcess : IPostprocessBuildWithReport { public int callbackOrder => 1; public void OnPostprocessBuild(BuildReport report) => - BuildPostProcess.OnPostProcessBuild(report.summary.platform, report.summary.outputPath, + OnPostProcessBuild(report.summary.platform, report.summary.outputPath, NamedBuildTargets.FromBuildReport(report)); -} - -public static class BuildPostProcess -{ - public static void OnPostProcessBuild(BuildTarget target, string executablePath) => - OnPostProcessBuild(target, executablePath, - NamedBuildTarget.FromBuildTargetGroup(BuildPipeline.GetBuildTargetGroup(target))); - internal static void OnPostProcessBuild(BuildTarget target, string executablePath, NamedBuildTarget namedBuildTarget) + private static void OnPostProcessBuild(BuildTarget target, string executablePath, NamedBuildTarget namedBuildTarget) { var targetGroup = BuildPipeline.GetBuildTargetGroup(target); var isSupportedGroup = targetGroup is BuildTargetGroup.Standalone