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