mirror of https://github.com/crazytuzi/CoreCLR
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
7.4 KiB
270 lines
7.4 KiB
|
3 months ago
|
using System;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.IO;
|
||
|
|
using EpicGames.Core;
|
||
|
|
using UnrealBuildTool;
|
||
|
|
|
||
|
|
public class CoreCLR : ModuleRules
|
||
|
|
{
|
||
|
|
public CoreCLR(ReadOnlyTargetRules Target) : base(Target)
|
||
|
|
{
|
||
|
|
Type = ModuleType.External;
|
||
|
|
|
||
|
|
const int MajorVersion = 10;
|
||
|
|
|
||
|
|
const int MinorVersion = 0;
|
||
|
|
|
||
|
|
const int PatchVersion = 4;
|
||
|
|
|
||
|
|
PublicDefinitions.AddRange(new string[]
|
||
|
|
{
|
||
|
|
$"DOTNET_MAJOR_VERSION={MajorVersion}",
|
||
|
|
$"DOTNET_MINOR_VERSION={MinorVersion}",
|
||
|
|
$"DOTNET_PATCH_VERSION={PatchVersion}"
|
||
|
|
});
|
||
|
|
|
||
|
|
var bUseRelease = true;
|
||
|
|
|
||
|
|
var bIsDebug = !bUseRelease &&
|
||
|
|
(Target.Configuration == UnrealTargetConfiguration.Debug ||
|
||
|
|
Target.Configuration == UnrealTargetConfiguration.DebugGame);
|
||
|
|
|
||
|
|
var CoreCLRConfiguration = bIsDebug ? "Debug" : "Release";
|
||
|
|
|
||
|
|
PublicDefinitions.Add($"CORECLR_CONFIGURATION=TEXT(\"{CoreCLRConfiguration}\")");
|
||
|
|
|
||
|
|
PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "src"));
|
||
|
|
|
||
|
|
var LibraryPath = Path.Combine(ModuleDirectory, "lib", CoreCLRConfiguration);
|
||
|
|
|
||
|
|
var SharedPath = $"shared/Microsoft.NETCore.App/{MajorVersion}.{MinorVersion}.{PatchVersion}";
|
||
|
|
|
||
|
|
if (Target.Platform == UnrealTargetPlatform.Win64)
|
||
|
|
{
|
||
|
|
var PlatformLibraryPath = Path.Combine(LibraryPath, Target.Platform.ToString());
|
||
|
|
|
||
|
|
RuntimeDependencies.Add("$(BinaryOutputDir)/hostfxr.dll",
|
||
|
|
Path.Combine(PlatformLibraryPath, "hostfxr.dll"));
|
||
|
|
|
||
|
|
RuntimeDependencies.Add("$(BinaryOutputDir)/CoreCLR.runtimeconfig.json",
|
||
|
|
Path.Combine(PlatformLibraryPath, "CoreCLR.runtimeconfig.json"));
|
||
|
|
|
||
|
|
RuntimeDependencies.Add("$(BinaryOutputDir)/mscordaccore_amd64_amd64_42.42.42.42424.dll",
|
||
|
|
Path.Combine(PlatformLibraryPath, "mscordaccore_amd64_amd64_42.42.42.42424.dll"));
|
||
|
|
|
||
|
|
var SharedDirectory = $"$(BinaryOutputDir)/{SharedPath}";
|
||
|
|
|
||
|
|
var Files = GetFiles(Path.Combine(PlatformLibraryPath, "net"));
|
||
|
|
|
||
|
|
foreach (var File in Files)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/{Path.GetFileName(File)}", File);
|
||
|
|
}
|
||
|
|
|
||
|
|
var DynamicLinkLibraries = new[]
|
||
|
|
{
|
||
|
|
"coreclr.dll",
|
||
|
|
"hostpolicy.dll",
|
||
|
|
"clrgc.dll",
|
||
|
|
"clrgcexp.dll",
|
||
|
|
"clrjit.dll",
|
||
|
|
"clretwrc.dll",
|
||
|
|
"mscordaccore.dll",
|
||
|
|
"mscordbi.dll",
|
||
|
|
"mscorrc.dll",
|
||
|
|
"Microsoft.DiaSymReader.Native.amd64.dll",
|
||
|
|
"System.IO.Compression.Native.dll",
|
||
|
|
"msquic.dll"
|
||
|
|
};
|
||
|
|
|
||
|
|
foreach (var DynamicLinkLibrary in DynamicLinkLibraries)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/{DynamicLinkLibrary}",
|
||
|
|
Path.Combine(PlatformLibraryPath, DynamicLinkLibrary));
|
||
|
|
}
|
||
|
|
|
||
|
|
if (bIsDebug)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/clrinterpreter.dll",
|
||
|
|
Path.Combine(PlatformLibraryPath, "clrinterpreter.dll"));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (Target.Platform == UnrealTargetPlatform.Linux || Target.Platform == UnrealTargetPlatform.LinuxArm64)
|
||
|
|
{
|
||
|
|
var PlatformLibraryPath = Path.Combine(LibraryPath,
|
||
|
|
Target.Platform == UnrealTargetPlatform.Linux ? "Linux_x86_64" : "Linux_aarch64");
|
||
|
|
|
||
|
|
RuntimeDependencies.Add("$(BinaryOutputDir)/libhostfxr.so",
|
||
|
|
Path.Combine(PlatformLibraryPath, "libhostfxr.so"));
|
||
|
|
|
||
|
|
RuntimeDependencies.Add("$(BinaryOutputDir)/CoreCLR.runtimeconfig.json",
|
||
|
|
Path.Combine(PlatformLibraryPath, "CoreCLR.runtimeconfig.json"));
|
||
|
|
|
||
|
|
var SharedDirectory = $"$(BinaryOutputDir)/{SharedPath}";
|
||
|
|
|
||
|
|
var Files = GetFiles(Path.Combine(PlatformLibraryPath, "net"));
|
||
|
|
|
||
|
|
foreach (var File in Files)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/{Path.GetFileName(File)}", File);
|
||
|
|
}
|
||
|
|
|
||
|
|
var SharedObjects = new[]
|
||
|
|
{
|
||
|
|
"libcoreclr.so",
|
||
|
|
"libhostpolicy.so",
|
||
|
|
"libclrgc.so",
|
||
|
|
"libclrgcexp.so",
|
||
|
|
"libclrjit.so",
|
||
|
|
"libcoreclrtraceptprovider.so",
|
||
|
|
"libmscordaccore.so",
|
||
|
|
"libmscordbi.so",
|
||
|
|
"libSystem.Globalization.Native.so",
|
||
|
|
"libSystem.IO.Compression.Native.so",
|
||
|
|
"libSystem.Native.so",
|
||
|
|
"libSystem.Net.Security.Native.so",
|
||
|
|
"libSystem.Security.Cryptography.Native.OpenSsl.so"
|
||
|
|
};
|
||
|
|
|
||
|
|
foreach (var SharedObject in SharedObjects)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/{SharedObject}",
|
||
|
|
Path.Combine(PlatformLibraryPath, SharedObject));
|
||
|
|
}
|
||
|
|
|
||
|
|
if (bIsDebug)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/libclrinterpreter.so",
|
||
|
|
Path.Combine(PlatformLibraryPath, "libclrinterpreter.so"));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else if (Target.Platform == UnrealTargetPlatform.Mac)
|
||
|
|
{
|
||
|
|
var PlatformLibraryPath = Path.Combine(LibraryPath,
|
||
|
|
#if UE_5_2_OR_LATER
|
||
|
|
Target.Architecture.bIsX64
|
||
|
|
#else
|
||
|
|
Target.Architecture == "x86_64" || Target.Architecture == "x64"
|
||
|
|
#endif
|
||
|
|
|
||
|
|
? "macOS_x86_64"
|
||
|
|
: "macOS_arm64");
|
||
|
|
|
||
|
|
RuntimeDependencies.Add("$(BinaryOutputDir)/libhostfxr.dylib",
|
||
|
|
Path.Combine(PlatformLibraryPath, "libhostfxr.dylib"));
|
||
|
|
|
||
|
|
RuntimeDependencies.Add("$(BinaryOutputDir)/CoreCLR.runtimeconfig.json",
|
||
|
|
Path.Combine(PlatformLibraryPath, "CoreCLR.runtimeconfig.json"));
|
||
|
|
|
||
|
|
var SharedDirectory = $"$(BinaryOutputDir)/{SharedPath}";
|
||
|
|
|
||
|
|
var Files = GetFiles(Path.Combine(PlatformLibraryPath, "net"));
|
||
|
|
|
||
|
|
foreach (var File in Files)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/{Path.GetFileName(File)}", File);
|
||
|
|
}
|
||
|
|
|
||
|
|
var DynamicLibraries = new[]
|
||
|
|
{
|
||
|
|
"libcoreclr.dylib",
|
||
|
|
"libhostpolicy.dylib",
|
||
|
|
"libclrgc.dylib",
|
||
|
|
"libclrgcexp.dylib",
|
||
|
|
"libclrjit.dylib",
|
||
|
|
"libmscordaccore.dylib",
|
||
|
|
"libmscordbi.dylib",
|
||
|
|
"libSystem.Globalization.Native.dylib",
|
||
|
|
"libSystem.IO.Compression.Native.dylib",
|
||
|
|
"libSystem.Native.dylib",
|
||
|
|
"libSystem.Net.Security.Native.dylib",
|
||
|
|
"libSystem.Security.Cryptography.Native.Apple.dylib"
|
||
|
|
};
|
||
|
|
|
||
|
|
foreach (var DynamicLibrary in DynamicLibraries)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/{DynamicLibrary}",
|
||
|
|
Path.Combine(PlatformLibraryPath, DynamicLibrary));
|
||
|
|
}
|
||
|
|
|
||
|
|
if (bIsDebug)
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add($"{SharedDirectory}/libclrinterpreter.dylib",
|
||
|
|
Path.Combine(PlatformLibraryPath, "libclrinterpreter.dylib"));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!Target.bBuildEditor)
|
||
|
|
{
|
||
|
|
CopyInterop();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private void CopyInterop()
|
||
|
|
{
|
||
|
|
var PublishDirectory = GetPublishDirectory();
|
||
|
|
|
||
|
|
var InteropFilePath = Path.Combine(
|
||
|
|
Target.ProjectFile.Directory.FullName,
|
||
|
|
"Content", PublishDirectory, "Interop.dll");
|
||
|
|
|
||
|
|
if (File.Exists(InteropFilePath))
|
||
|
|
{
|
||
|
|
RuntimeDependencies.Add("$(BinaryOutputDir)/Interop.dll", InteropFilePath);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
private string GetPublishDirectory()
|
||
|
|
{
|
||
|
|
var SettingFilePath = Path.Combine(Target.ProjectFile.Directory.FullName,
|
||
|
|
"Config", "DefaultUnrealCSharpSetting.ini");
|
||
|
|
|
||
|
|
if (File.Exists(SettingFilePath))
|
||
|
|
{
|
||
|
|
var SettingConfigFile = new ConfigFile(new FileReference(SettingFilePath));
|
||
|
|
|
||
|
|
if (SettingConfigFile.TryGetSection("/Script/UnrealCSharpCore.UnrealCSharpSetting", out var Section))
|
||
|
|
{
|
||
|
|
var HierarchySection = new ConfigHierarchySection(new List<ConfigFileSection> { Section });
|
||
|
|
|
||
|
|
if (HierarchySection.TryGetValue("PublishDirectory", out var Value))
|
||
|
|
{
|
||
|
|
const string Prefix = "Path=\"";
|
||
|
|
|
||
|
|
var Index = Value.IndexOf(Prefix, StringComparison.Ordinal);
|
||
|
|
|
||
|
|
if (Index >= 0)
|
||
|
|
{
|
||
|
|
Index += Prefix.Length;
|
||
|
|
|
||
|
|
var EndIndex = Value.IndexOf('"', Index);
|
||
|
|
|
||
|
|
if (EndIndex > Index)
|
||
|
|
{
|
||
|
|
return Value.Substring(Index, EndIndex - Index);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return "Script";
|
||
|
|
}
|
||
|
|
|
||
|
|
private static IEnumerable<string> GetFiles(string InDirectory, string InPattern = "*.*")
|
||
|
|
{
|
||
|
|
var Files = new List<string>();
|
||
|
|
|
||
|
|
foreach (var File in Directory.GetFiles(InDirectory, InPattern))
|
||
|
|
{
|
||
|
|
Files.Add(File);
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach (var File in Directory.GetDirectories(InDirectory))
|
||
|
|
{
|
||
|
|
Files.AddRange(GetFiles(File, InPattern));
|
||
|
|
}
|
||
|
|
|
||
|
|
return Files;
|
||
|
|
}
|
||
|
|
}
|