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}"); | |||
|  | 		} | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | 
 |