diff --git a/CHANGELOG.md b/CHANGELOG.md index d9f90c6ad..bd3a368d8 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 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/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..3c4e5325b --- /dev/null +++ b/src/Sentry.Unity.Editor/NamedBuildTargets.cs @@ -0,0 +1,23 @@ +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 +{ + // `GetSubtarget` throws on platforms without a subtarget, e.g. Android. + internal static NamedBuildTarget FromBuildReport(BuildReport report) => + 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 + ? 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..b98df038e 100644 --- a/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs +++ b/src/Sentry.Unity.Editor/Native/BuildPostProcess.cs @@ -7,16 +7,21 @@ 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; -public static class BuildPostProcess +internal class BuildPostProcess : IPostprocessBuildWithReport { - [PostProcessBuild(1)] - public static void OnPostProcessBuild(BuildTarget target, string executablePath) + public int callbackOrder => 1; + + public void OnPostprocessBuild(BuildReport report) => + OnPostProcessBuild(report.summary.platform, report.summary.outputPath, + NamedBuildTargets.FromBuildReport(report)); + + private static void OnPostProcessBuild(BuildTarget target, string executablePath, NamedBuildTarget namedBuildTarget) { var targetGroup = BuildPipeline.GetBuildTargetGroup(target); var isSupportedGroup = targetGroup is BuildTargetGroup.Standalone @@ -46,7 +51,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..d3fe048ff --- /dev/null +++ b/test/Sentry.Unity.Editor.Tests/NamedBuildTargetsTests.cs @@ -0,0 +1,18 @@ +using NUnit.Framework; +using UnityEditor; +using UnityEditor.Build; + +namespace Sentry.Unity.Editor.Tests; + +public class NamedBuildTargetsTests +{ + [Test] + [TestCase(StandaloneBuildSubtarget.Player, "Standalone")] + [TestCase(StandaloneBuildSubtarget.Server, "Server")] + public void From_Standalone_RespectsSubtarget(StandaloneBuildSubtarget subtarget, string expected) + { + var actual = NamedBuildTargets.From(BuildTargetGroup.Standalone, subtarget); + + Assert.AreEqual(expected, actual.TargetName); + } +}