162 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Diagnostics;
 | |
| using System.IO;
 | |
| using UnrealBuildTool;
 | |
| 
 | |
| public class UnrealSharpCore : ModuleRules
 | |
| {
 | |
| 	private readonly string _managedPath;
 | |
| 	private readonly string _managedBinariesPath;
 | |
| 	private readonly string _engineGluePath;
 | |
| 	
 | |
| 	public UnrealSharpCore(ReadOnlyTargetRules Target) : base(Target)
 | |
| 	{
 | |
| 		PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
 | |
| 		_managedPath = Path.Combine(PluginDirectory, "Managed");
 | |
| 		_managedBinariesPath = Path.Combine(PluginDirectory, "Binaries", "Managed");
 | |
| 		_engineGluePath = Path.Combine(_managedPath, "UnrealSharp", "UnrealSharp", "Generated");
 | |
| 		
 | |
| 		PublicDefinitions.Add("GENERATED_GLUE_PATH=" + _engineGluePath.Replace("\\","/"));
 | |
| 		PublicDefinitions.Add("PLUGIN_PATH=" + PluginDirectory.Replace("\\","/"));
 | |
| 		PublicDefinitions.Add("BUILDING_EDITOR=" + (Target.bBuildEditor ? "1" : "0"));
 | |
| 		
 | |
| 		PublicDependencyModuleNames.AddRange(
 | |
| 			new string[]
 | |
| 			{
 | |
| 				"Core",
 | |
| 			}
 | |
| 			);
 | |
| 		
 | |
| 		PrivateDependencyModuleNames.AddRange(
 | |
| 			new string[]
 | |
| 			{
 | |
| 				"CoreUObject",
 | |
| 				"Engine",
 | |
| 				"Slate",
 | |
| 				"SlateCore", 
 | |
| 				"Boost", 
 | |
| 				"XmlParser",
 | |
| 				"Json", 
 | |
| 				"Projects",
 | |
| 				"UMG", 
 | |
| 				"DeveloperSettings", 
 | |
| 				"UnrealSharpProcHelper", 
 | |
| 				"EnhancedInput", 
 | |
| 				"UnrealSharpUtilities",
 | |
| 				"GameplayTags", 
 | |
| 				"AIModule",
 | |
| 				"UnrealSharpBinds",
 | |
| 				"FieldNotification",
 | |
| 				"InputCore",
 | |
| 			}
 | |
| 			);
 | |
| 
 | |
|         PublicIncludePaths.AddRange(new string[] { ModuleDirectory });
 | |
|         PublicDefinitions.Add("ForceAsEngineGlue=1");
 | |
| 
 | |
|         IncludeDotNetHeaders();
 | |
| 
 | |
| 		if (Target.bBuildEditor)
 | |
| 		{
 | |
| 			PrivateDependencyModuleNames.AddRange(new string[]
 | |
| 			{
 | |
| 				"UnrealEd", 
 | |
| 				"EditorSubsystem",
 | |
| 				"BlueprintGraph",
 | |
| 				"BlueprintEditorLibrary"
 | |
| 			});
 | |
| 			
 | |
| 			PublishSolution(Path.Combine(_managedPath, "UnrealSharpPrograms"));
 | |
| 		}
 | |
| 		
 | |
| 		if (Target.bGenerateProjectFiles && Directory.Exists(_engineGluePath))
 | |
| 		{
 | |
| 			PublishSolution(Path.Combine(_managedPath, "UnrealSharp"));
 | |
| 		}
 | |
| 	}
 | |
| 	
 | |
| 	private void IncludeDotNetHeaders()
 | |
| 	{
 | |
| 		PublicSystemIncludePaths.Add(Path.Combine(_managedPath, "DotNetRuntime", "inc"));
 | |
| 	}
 | |
| 	
 | |
| 	public static string FindDotNetExecutable()
 | |
| 	{
 | |
| 		const string DOTNET_WIN = "dotnet.exe";
 | |
| 		const string DOTNET_UNIX = "dotnet";
 | |
| 
 | |
| 		string dotnetExe = OperatingSystem.IsWindows() ? DOTNET_WIN : DOTNET_UNIX;
 | |
| 
 | |
| 		string pathVariable = Environment.GetEnvironmentVariable("PATH");
 | |
|     
 | |
| 		if (pathVariable == null)
 | |
| 		{
 | |
| 			return null;
 | |
| 		}
 | |
|     
 | |
| 		string[] paths = pathVariable.Split(Path.PathSeparator);
 | |
|     
 | |
| 		foreach (string path in paths)
 | |
| 		{
 | |
| 			// This is a hack to avoid using the dotnet.exe from the Unreal Engine installation directory.
 | |
| 			// Can't use the dotnet.exe from the Unreal Engine installation directory because it's .NET 6.0
 | |
| 			if (!path.Contains(@"\dotnet\"))
 | |
| 			{
 | |
| 				continue;
 | |
| 			}
 | |
| 			
 | |
| 			var dotnetExePath = Path.Combine(path, dotnetExe);
 | |
| 			
 | |
| 			if (File.Exists(dotnetExePath))
 | |
| 			{
 | |
| 				return dotnetExePath;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		if ( OperatingSystem.IsMacOS() ) 
 | |
| 		{
 | |
| 			if (File.Exists("/usr/local/share/dotnet/dotnet")) 
 | |
| 			{
 | |
| 				return "/usr/local/share/dotnet/dotnet";
 | |
| 			}
 | |
| 			if (File.Exists("/opt/homebrew/bin/dotnet")) 
 | |
| 			{
 | |
| 				return "/opt/homebrew/bin/dotnet";
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		throw new Exception($"Couldn't find {dotnetExe} in PATH!");
 | |
| 	}
 | |
| 
 | |
| 	void PublishSolution(string projectRootDirectory)
 | |
| 	{
 | |
| 		if (!Directory.Exists(projectRootDirectory))
 | |
| 		{
 | |
| 			throw new Exception($"Couldn't find project root directory: {projectRootDirectory}");
 | |
| 		}
 | |
| 
 | |
|         Console.WriteLine($"Start publish solution: {projectRootDirectory}");
 | |
| 
 | |
|         string dotnetPath = FindDotNetExecutable();
 | |
| 		
 | |
| 		Process process = new Process();
 | |
| 		process.StartInfo.FileName = dotnetPath;
 | |
| 		process.StartInfo.WorkingDirectory = projectRootDirectory;
 | |
| 		
 | |
| 		process.StartInfo.ArgumentList.Add("publish");
 | |
| 		process.StartInfo.ArgumentList.Add($"\"{projectRootDirectory}\"");
 | |
| 		
 | |
| 		process.StartInfo.ArgumentList.Add($"-p:PublishDir=\"{_managedBinariesPath}\"");
 | |
| 		
 | |
| 		process.Start();
 | |
| 		process.WaitForExit();
 | |
| 		
 | |
| 		if (process.ExitCode != 0)
 | |
| 		{
 | |
| 			Console.WriteLine($"Failed to publish solution: {projectRootDirectory}");
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 |