From 7fd278a68917130551ddd02e7d260f810932e4d5 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Tue, 15 Jul 2025 13:34:43 +0200 Subject: [PATCH] Fix .NET version to use selection for consoles with fixed setup --- Source/Editor/Cooker/CookingData.h | 9 ++------- Source/Editor/Cooker/GameCooker.cpp | 8 ++++++++ .../Cooker/Platform/GDK/GDKPlatformTools.cpp | 5 +++++ .../Editor/Cooker/Platform/GDK/GDKPlatformTools.h | 1 + Source/Editor/Cooker/PlatformTools.h | 14 ++++++++++++++ Source/Editor/Cooker/Steps/CompileScriptsStep.cpp | 2 +- Source/Editor/Cooker/Steps/DeployDataStep.cpp | 13 ++++++++----- .../Cooker/Steps/PrecompileAssembliesStep.cpp | 2 +- 8 files changed, 40 insertions(+), 14 deletions(-) diff --git a/Source/Editor/Cooker/CookingData.h b/Source/Editor/Cooker/CookingData.h index 13db5bb3f..1ecfaf353 100644 --- a/Source/Editor/Cooker/CookingData.h +++ b/Source/Editor/Cooker/CookingData.h @@ -20,13 +20,6 @@ class PlatformTools; #define GAME_BUILD_DOTNET_RUNTIME_MAX_VER 9 #endif -#if OFFICIAL_BUILD -// Use the fixed .NET SDK version in packaged builds for compatibility (FlaxGame is precompiled with it) -#define GAME_BUILD_DOTNET_VER TEXT("-dotnet=" MACRO_TO_STR(GAME_BUILD_DOTNET_RUNTIME_MIN_VER)) -#else -#define GAME_BUILD_DOTNET_VER TEXT("") -#endif - /// /// Game building options. Used as flags. /// @@ -374,6 +367,8 @@ public: /// void GetBuildPlatformName(const Char*& platform, const Char*& architecture) const; + String GetDotnetCommandArg() const; + public: /// diff --git a/Source/Editor/Cooker/GameCooker.cpp b/Source/Editor/Cooker/GameCooker.cpp index db8ded610..c204efac5 100644 --- a/Source/Editor/Cooker/GameCooker.cpp +++ b/Source/Editor/Cooker/GameCooker.cpp @@ -312,6 +312,14 @@ void CookingData::GetBuildPlatformName(const Char*& platform, const Char*& archi } } +String CookingData::GetDotnetCommandArg() const +{ + int32 version = Tools->GetDotnetVersion(); + if (version == 0) + return String::Empty; + return String::Format(TEXT("-dotnet={}"), version); +} + void CookingData::StepProgress(const String& info, const float stepProgress) const { const float singleStepProgress = 1.0f / (StepsCount + 1); diff --git a/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.cpp b/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.cpp index eea89a794..f9a8f1b82 100644 --- a/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.cpp +++ b/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.cpp @@ -195,4 +195,9 @@ bool GDKPlatformTools::OnPostProcess(CookingData& data, GDKPlatformSettings* pla return false; } +int32 GDKPlatformTools::GetDotnetVersion() const +{ + return GAME_BUILD_DOTNET_RUNTIME_MIN_VER; +} + #endif diff --git a/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.h b/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.h index 11763fce4..d2c137664 100644 --- a/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.h +++ b/Source/Editor/Cooker/Platform/GDK/GDKPlatformTools.h @@ -26,6 +26,7 @@ public: public: // [PlatformTools] + int32 GetDotnetVersion() const override; DotNetAOTModes UseAOT() const override; bool OnDeployBinaries(CookingData& data) override; }; diff --git a/Source/Editor/Cooker/PlatformTools.h b/Source/Editor/Cooker/PlatformTools.h index 9d6a50aa9..dfe7b6ffb 100644 --- a/Source/Editor/Cooker/PlatformTools.h +++ b/Source/Editor/Cooker/PlatformTools.h @@ -70,6 +70,20 @@ public: /// virtual ArchitectureType GetArchitecture() const = 0; + /// + /// Gets the .Net version to use for the cooked game. + /// + virtual int32 GetDotnetVersion() const + { +#if OFFICIAL_BUILD + // Use the fixed .NET SDK version in packaged builds for compatibility (FlaxGame is precompiled with it) + return GAME_BUILD_DOTNET_RUNTIME_MIN_VER; +#else + // Use the highest version found on a system (Flax.Build will decide) + return 0; +#endif + } + /// /// Gets the value indicating whenever platform requires AOT (needs C# assemblies to be precompiled). /// diff --git a/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp b/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp index eaf5b2863..c0a8e452a 100644 --- a/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp +++ b/Source/Editor/Cooker/Steps/CompileScriptsStep.cpp @@ -189,7 +189,7 @@ bool CompileScriptsStep::Perform(CookingData& data) const String logFile = data.CacheDirectory / TEXT("CompileLog.txt"); auto args = String::Format( TEXT("-log -logfile=\"{4}\" -build -mutex -buildtargets={0} -platform={1} -arch={2} -configuration={3} -aotMode={5} {6}"), - target, platform, architecture, configuration, logFile, ToString(data.Tools->UseAOT()), GAME_BUILD_DOTNET_VER); + target, platform, architecture, configuration, logFile, ToString(data.Tools->UseAOT()), data.GetDotnetCommandArg()); #if PLATFORM_WINDOWS if (data.Platform == BuildPlatform::LinuxX64) #elif PLATFORM_LINUX diff --git a/Source/Editor/Cooker/Steps/DeployDataStep.cpp b/Source/Editor/Cooker/Steps/DeployDataStep.cpp index ac271ab7d..b5b24c251 100644 --- a/Source/Editor/Cooker/Steps/DeployDataStep.cpp +++ b/Source/Editor/Cooker/Steps/DeployDataStep.cpp @@ -88,7 +88,7 @@ bool DeployDataStep::Perform(CookingData& data) { // Ask Flax.Build to provide .NET SDK location for the current platform String sdks; - bool failed = ScriptsBuilder::RunBuildTool(String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printSDKs {}"), GAME_BUILD_DOTNET_VER), data.CacheDirectory); + bool failed = ScriptsBuilder::RunBuildTool(String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printSDKs {}"), data.GetDotnetCommandArg()), data.CacheDirectory); failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks); int32 idx = sdks.Find(TEXT("DotNetSdk, "), StringSearchCase::CaseSensitive); if (idx != -1) @@ -200,7 +200,7 @@ bool DeployDataStep::Perform(CookingData& data) String sdks; const Char *platformName, *archName; data.GetBuildPlatformName(platformName, archName); - String args = String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printDotNetRuntime -platform={} -arch={} {}"), platformName, archName, GAME_BUILD_DOTNET_VER); + String args = String::Format(TEXT("-log -logMessagesOnly -logFileWithConsole -logfile=SDKs.txt -printDotNetRuntime -platform={} -arch={} {}"), platformName, archName, data.GetDotnetCommandArg()); bool failed = ScriptsBuilder::RunBuildTool(args, data.CacheDirectory); failed |= File::ReadAllText(data.CacheDirectory / TEXT("SDKs.txt"), sdks); Array parts; @@ -244,10 +244,13 @@ bool DeployDataStep::Perform(CookingData& data) } if (version.IsEmpty()) { + int32 minVer = GAME_BUILD_DOTNET_RUNTIME_MIN_VER, maxVer = GAME_BUILD_DOTNET_RUNTIME_MAX_VER; if (srcDotnetFromEngine) { // Detect version from runtime files inside Engine Platform folder - for (int32 i = GAME_BUILD_DOTNET_RUNTIME_MAX_VER; i >= GAME_BUILD_DOTNET_RUNTIME_MIN_VER; i--) + if (data.Tools->GetDotnetVersion() != 0) + minVer = maxVer = data.Tools->GetDotnetVersion(); + for (int32 i = maxVer; i >= minVer; i--) { // Check runtime files inside Engine Platform folder String testPath1 = srcDotnet / String::Format(TEXT("lib/net{}.0"), i); @@ -262,7 +265,7 @@ bool DeployDataStep::Perform(CookingData& data) } if (version.IsEmpty()) { - data.Error(String::Format(TEXT("Failed to find supported .NET {} version for the current host platform."), GAME_BUILD_DOTNET_RUNTIME_MIN_VER)); + data.Error(String::Format(TEXT("Failed to find supported .NET {} version (min {}) for the current host platform."), maxVer, minVer)); return true; } } @@ -364,7 +367,7 @@ bool DeployDataStep::Perform(CookingData& data) const String logFile = data.CacheDirectory / TEXT("StripDotnetLibs.txt"); String args = String::Format( TEXT("-log -logfile=\"{}\" -runDotNetClassLibStripping -mutex -binaries=\"{}\" {}"), - logFile, data.DataOutputPath, GAME_BUILD_DOTNET_VER); + logFile, data.DataOutputPath, data.GetDotnetCommandArg()); for (const String& define : data.CustomDefines) { args += TEXT(" -D"); diff --git a/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.cpp b/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.cpp index 1c8e321aa..1a4f67c01 100644 --- a/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.cpp +++ b/Source/Editor/Cooker/Steps/PrecompileAssembliesStep.cpp @@ -69,7 +69,7 @@ bool PrecompileAssembliesStep::Perform(CookingData& data) const String logFile = data.CacheDirectory / TEXT("AOTLog.txt"); String args = String::Format( TEXT("-log -logfile=\"{}\" -runDotNetAOT -mutex -platform={} -arch={} -configuration={} -aotMode={} -binaries=\"{}\" -intermediate=\"{}\" {}"), - logFile, platform, architecture, configuration, ToString(aotMode), data.DataOutputPath, data.ManagedCodeOutputPath, GAME_BUILD_DOTNET_VER); + logFile, platform, architecture, configuration, ToString(aotMode), data.DataOutputPath, data.ManagedCodeOutputPath, data.GetDotnetCommandArg()); if (!buildSettings.SkipUnusedDotnetLibsPackaging) args += TEXT(" -skipUnusedDotnetLibs=false"); // Run AOT on whole class library (not just used libs) for (const String& define : data.CustomDefines)