| @ -0,0 +1,161 @@ | ||||
| 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}"); | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user