From 02e36978171e99eafa9f906bd03b4b1ee9a17638 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Fri, 20 Jan 2023 15:42:32 +0100 Subject: [PATCH] Fix using proper engine native module for importing symbols --- Source/Engine/Scripting/ManagedCLR/MCore.cpp | 9 +++++++-- Source/Engine/Scripting/Scripting.Build.cs | 11 +++++++++++ Source/Tools/Flax.Build/Build/EngineTarget.cs | 5 ++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/Source/Engine/Scripting/ManagedCLR/MCore.cpp b/Source/Engine/Scripting/ManagedCLR/MCore.cpp index 89384b342..d65c04a0e 100644 --- a/Source/Engine/Scripting/ManagedCLR/MCore.cpp +++ b/Source/Engine/Scripting/ManagedCLR/MCore.cpp @@ -135,9 +135,14 @@ bool MCore::LoadEngine() return false; // Prepare managed side - const StringAnsi hostExecutable(Platform::GetExecutableFilePath()); CoreCLR::CallStaticMethodByName(TEXT("Init")); - CoreCLR::RegisterNativeLibrary("FlaxEngine", hostExecutable.Get()); +#ifdef MCORE_MAIN_MODULE_NAME + // MCORE_MAIN_MODULE_NAME define is injected by Scripting.Build.cs on platforms that use separate shared library for engine symbols + const StringAnsi flaxLibraryPath(Platform::GetMainDirectory() / TEXT(MACRO_TO_STR(MCORE_MAIN_MODULE_NAME))); +#else + const StringAnsi flaxLibraryPath(Platform::GetExecutableFilePath()); +#endif + CoreCLR::RegisterNativeLibrary("FlaxEngine", flaxLibraryPath.Get()); MRootDomain = New("Root"); MDomains.Add(MRootDomain); diff --git a/Source/Engine/Scripting/Scripting.Build.cs b/Source/Engine/Scripting/Scripting.Build.cs index 284210854..2fd4b54df 100644 --- a/Source/Engine/Scripting/Scripting.Build.cs +++ b/Source/Engine/Scripting/Scripting.Build.cs @@ -16,9 +16,20 @@ public class Scripting : EngineModule if (EngineConfiguration.WithCSharp(options)) { if (EngineConfiguration.WithDotNet(options)) + { options.PublicDependencies.Add("nethost"); + + if (options.Target is EngineTarget engineTarget && engineTarget.UseSeparateMainExecutable(options)) + { + // Build target doesn't support linking again main executable (eg. Linux) thus additional shared library is used for the engine (eg. libFlaxEditor.so) + var fileName = options.Platform.GetLinkOutputFileName(engineTarget.OutputName, LinkerOutput.SharedLibrary); + options.CompileEnv.PreprocessorDefinitions.Add("MCORE_MAIN_MODULE_NAME=" + fileName); + } + } else + { options.PublicDependencies.Add("mono"); + } } options.PrivateDependencies.Add("Utilities"); diff --git a/Source/Tools/Flax.Build/Build/EngineTarget.cs b/Source/Tools/Flax.Build/Build/EngineTarget.cs index 0a6c6b1d1..e673e77e3 100644 --- a/Source/Tools/Flax.Build/Build/EngineTarget.cs +++ b/Source/Tools/Flax.Build/Build/EngineTarget.cs @@ -125,7 +125,10 @@ namespace Flax.Build #endif } - private bool UseSeparateMainExecutable(BuildOptions buildOptions) + /// + /// Returns true if this build target should use separate (aka main-only) executable file and separate runtime (in shared library). Used on platforms that don't support linking again executable file but only shared library (see HasExecutableFileReferenceSupport). + /// + public bool UseSeparateMainExecutable(BuildOptions buildOptions) { return UseSymbolsExports && OutputType == TargetOutputType.Executable && !buildOptions.Platform.HasExecutableFileReferenceSupport && !Configuration.BuildBindingsOnly; }