static void AddPluginToAgenda(UE4Build.BuildAgenda Agenda, string PluginFileName, PluginDescriptor Plugin, string TargetName, TargetRules.TargetType TargetType, UnrealTargetPlatform Platform, UnrealTargetConfiguration Configuration, List<string> ReceiptFileNames, string InAdditionalArgs) { // Find a list of modules that need to be built for this plugin List<string> ModuleNames = new List<string>(); foreach(ModuleDescriptor Module in Plugin.Modules) { bool bBuildDeveloperTools = (TargetType == TargetRules.TargetType.Editor || TargetType == TargetRules.TargetType.Program); bool bBuildEditor = (TargetType == TargetRules.TargetType.Editor); if(Module.IsCompiledInConfiguration(Platform, TargetType, bBuildDeveloperTools, bBuildEditor)) { ModuleNames.Add(Module.Name); } } // Add these modules to the build agenda if(ModuleNames.Count > 0) { string Arguments = String.Format("-plugin {0}", CommandUtils.MakePathSafeToUseWithCommandLine(PluginFileName)); foreach(string ModuleName in ModuleNames) { Arguments += String.Format(" -module {0}", ModuleName); } string ReceiptFileName = BuildReceipt.GetDefaultPath(Path.GetDirectoryName(PluginFileName), TargetName, Platform, Configuration, ""); Arguments += String.Format(" -receipt {0}", CommandUtils.MakePathSafeToUseWithCommandLine(ReceiptFileName)); ReceiptFileNames.Add(ReceiptFileName); if(!String.IsNullOrEmpty(InAdditionalArgs)) { Arguments += InAdditionalArgs; } Agenda.AddTarget(TargetName, Platform, Configuration, InAddArgs: Arguments); } }
/// <summary> /// Constructs a PluginInfo object /// </summary> /// <param name="InFileName"></param> /// <param name="InLoadedFrom">Where this pl</param> public PluginInfo(string InFileName, PluginLoadedFrom InLoadedFrom) { Name = Path.GetFileNameWithoutExtension(InFileName); FileName = Path.GetFullPath(InFileName); Directory = Path.GetDirectoryName(FileName); Descriptor = PluginDescriptor.FromFile(FileName); LoadedFrom = InLoadedFrom; }
/// <summary> /// Constructs a PluginInfo object /// </summary> /// <param name="InFile"></param> /// <param name="InLoadedFrom">Where this pl</param> public PluginInfo(FileReference InFile, PluginLoadedFrom InLoadedFrom) { Name = Path.GetFileNameWithoutExtension(InFile.FullName); File = InFile; Directory = File.Directory; Descriptor = PluginDescriptor.FromFile(File, InLoadedFrom == PluginLoadedFrom.GameProject); LoadedFrom = InLoadedFrom; }
/// <summary> /// Creates a plugin descriptor from a file on disk /// </summary> /// <param name="FileName">The filename to read</param> /// <returns>New plugin descriptor</returns> public static PluginDescriptor FromFile(string FileName) { JsonObject RawObject = JsonObject.FromFile(FileName); try { PluginDescriptor Descriptor = new PluginDescriptor(); // Read the version if(!RawObject.TryGetIntegerField("FileVersion", out Descriptor.FileVersion)) { if(!RawObject.TryGetIntegerField("PluginFileVersion", out Descriptor.FileVersion)) { throw new BuildException("Plugin descriptor file '{0}' does not contain a valid FileVersion entry", FileName); } } // Check it's not newer than the latest version we can parse if(Descriptor.FileVersion > (int)PluginDescriptorVersion.Latest) { throw new BuildException( "Plugin descriptor file '{0}' appears to be in a newer version ({1}) of the file format that we can load (max version: {2}).", FileName, Descriptor.FileVersion, (int)PluginDescriptorVersion.Latest); } // Read the other fields RawObject.TryGetIntegerField("Version", out Descriptor.Version); RawObject.TryGetStringField("VersionName", out Descriptor.VersionName); RawObject.TryGetStringField("FriendlyName", out Descriptor.FriendlyName); RawObject.TryGetStringField("Description", out Descriptor.Description); if (!RawObject.TryGetStringField("Category", out Descriptor.Category)) { // Category used to be called CategoryPath in .uplugin files RawObject.TryGetStringField("CategoryPath", out Descriptor.Category); } // Due to a difference in command line parsing between Windows and Mac, we shipped a few Mac samples containing // a category name with escaped quotes. Remove them here to make sure we can list them in the right category. if (Descriptor.Category != null && Descriptor.Category.Length >= 2 && Descriptor.Category.StartsWith("\"") && Descriptor.Category.EndsWith("\"")) { Descriptor.Category = Descriptor.Category.Substring(1, Descriptor.Category.Length - 2); } RawObject.TryGetStringField("CreatedBy", out Descriptor.CreatedBy); RawObject.TryGetStringField("CreatedByURL", out Descriptor.CreatedByURL); RawObject.TryGetStringField("DocsURL", out Descriptor.DocsURL); RawObject.TryGetStringField("MarketplaceURL", out Descriptor.MarketplaceURL); JsonObject[] ModulesArray; if(RawObject.TryGetObjectArrayField("Modules", out ModulesArray)) { Descriptor.Modules = Array.ConvertAll(ModulesArray, x => ModuleDescriptor.FromJsonObject(x)); } RawObject.TryGetBoolField("EnabledByDefault", out Descriptor.bEnabledByDefault); RawObject.TryGetBoolField("CanContainContent", out Descriptor.bCanContainContent); RawObject.TryGetBoolField("IsBetaVersion", out Descriptor.bIsBetaVersion); RawObject.TryGetBoolField("Installed", out Descriptor.bInstalled); return Descriptor; } catch(JsonParseException ParseException) { throw new JsonParseException("{0} (in {1})", ParseException.Message, FileName); } }
void CompilePluginWithUBT(FileReference HostProjectFile, FileReference HostProjectPluginFile, PluginDescriptor Plugin, string TargetName, TargetRules.TargetType TargetType, UnrealTargetPlatform Platform, UnrealTargetConfiguration Configuration, List<string> ReceiptFileNames, string InAdditionalArgs) { // Find a list of modules that need to be built for this plugin List<string> ModuleNames = new List<string>(); foreach(ModuleDescriptor Module in Plugin.Modules) { bool bBuildDeveloperTools = (TargetType == TargetRules.TargetType.Editor || TargetType == TargetRules.TargetType.Program); bool bBuildEditor = (TargetType == TargetRules.TargetType.Editor); if(Module.IsCompiledInConfiguration(Platform, TargetType, bBuildDeveloperTools, bBuildEditor)) { ModuleNames.Add(Module.Name); } } // Add these modules to the build agenda if(ModuleNames.Count > 0) { string Arguments = "";// String.Format("-plugin {0}", CommandUtils.MakePathSafeToUseWithCommandLine(PluginFile.FullName)); foreach(string ModuleName in ModuleNames) { Arguments += String.Format(" -module {0}", ModuleName); } string Architecture = UEBuildPlatform.GetBuildPlatform(Platform).CreateContext(HostProjectFile).GetActiveArchitecture(); string ReceiptFileName = TargetReceipt.GetDefaultPath(HostProjectPluginFile.Directory.FullName, TargetName, Platform, Configuration, Architecture); Arguments += String.Format(" -receipt {0}", CommandUtils.MakePathSafeToUseWithCommandLine(ReceiptFileName)); ReceiptFileNames.Add(ReceiptFileName); if(!String.IsNullOrEmpty(InAdditionalArgs)) { Arguments += InAdditionalArgs; } CommandUtils.RunUBT(CmdEnv, UE4Build.GetUBTExecutable(), String.Format("{0} {1} {2}{3} {4}", TargetName, Platform, Configuration, (HostProjectFile == null)? "" : String.Format(" -project=\"{0}\"", HostProjectFile.FullName), Arguments)); } }
FileReference[] CompilePlugin(FileReference HostProjectFile, FileReference HostProjectPluginFile, PluginDescriptor Plugin, List<UnrealTargetPlatform> HostPlatforms, List<UnrealTargetPlatform> TargetPlatforms, string AdditionalArgs) { List<string> ReceiptFileNames = new List<string>(); // Build the host platforms if(HostPlatforms.Count > 0) { CommandUtils.Log("Building plugin for host platforms: {0}", String.Join(", ", HostPlatforms)); foreach (UnrealTargetPlatform HostPlatform in HostPlatforms) { if (Plugin.bCanBeUsedWithUnrealHeaderTool) { CompilePluginWithUBT(null, HostProjectPluginFile, Plugin, "UnrealHeaderTool", TargetRules.TargetType.Program, HostPlatform, UnrealTargetConfiguration.Development, ReceiptFileNames, String.Format("{0} -plugin {1}", AdditionalArgs, CommandUtils.MakePathSafeToUseWithCommandLine(HostProjectPluginFile.FullName))); } CompilePluginWithUBT(HostProjectFile, HostProjectPluginFile, Plugin, "UE4Editor", TargetRules.TargetType.Editor, HostPlatform, UnrealTargetConfiguration.Development, ReceiptFileNames, AdditionalArgs); } } // Add the game targets if(TargetPlatforms.Count > 0) { CommandUtils.Log("Building plugin for target platforms: {0}", String.Join(", ", TargetPlatforms)); foreach (UnrealTargetPlatform TargetPlatform in TargetPlatforms) { CompilePluginWithUBT(HostProjectFile, HostProjectPluginFile, Plugin, "UE4Game", TargetRules.TargetType.Game, TargetPlatform, UnrealTargetConfiguration.Development, ReceiptFileNames, null); CompilePluginWithUBT(HostProjectFile, HostProjectPluginFile, Plugin, "UE4Game", TargetRules.TargetType.Game, TargetPlatform, UnrealTargetConfiguration.Shipping, ReceiptFileNames, null); } } // Package the plugin to the output folder List<BuildProduct> BuildProducts = GetBuildProductsFromReceipts(UnrealBuildTool.UnrealBuildTool.EngineDirectory, HostProjectFile.Directory, ReceiptFileNames); return BuildProducts.Select(x => new FileReference(x.Path)).ToArray(); }
/// <summary> /// Creates a plugin descriptor from a file on disk /// </summary> /// <param name="FileName">The filename to read</param> /// <returns>New plugin descriptor</returns> public static PluginDescriptor FromFile(FileReference FileName) { JsonObject RawObject = JsonObject.Read(FileName.FullName); try { PluginDescriptor Descriptor = new PluginDescriptor(); // Read the version if (!RawObject.TryGetIntegerField("FileVersion", out Descriptor.FileVersion)) { if (!RawObject.TryGetIntegerField("PluginFileVersion", out Descriptor.FileVersion)) { throw new BuildException("Plugin descriptor file '{0}' does not contain a valid FileVersion entry", FileName); } } // Check it's not newer than the latest version we can parse if (Descriptor.FileVersion > (int)PluginDescriptorVersion.Latest) { throw new BuildException("Plugin descriptor file '{0}' appears to be in a newer version ({1}) of the file format that we can load (max version: {2}).", FileName, Descriptor.FileVersion, (int)PluginDescriptorVersion.Latest); } // Read the other fields RawObject.TryGetIntegerField("Version", out Descriptor.Version); RawObject.TryGetStringField("VersionName", out Descriptor.VersionName); RawObject.TryGetStringField("FriendlyName", out Descriptor.FriendlyName); RawObject.TryGetStringField("Description", out Descriptor.Description); if (!RawObject.TryGetStringField("Category", out Descriptor.Category)) { // Category used to be called CategoryPath in .uplugin files RawObject.TryGetStringField("CategoryPath", out Descriptor.Category); } // Due to a difference in command line parsing between Windows and Mac, we shipped a few Mac samples containing // a category name with escaped quotes. Remove them here to make sure we can list them in the right category. if (Descriptor.Category != null && Descriptor.Category.Length >= 2 && Descriptor.Category.StartsWith("\"") && Descriptor.Category.EndsWith("\"")) { Descriptor.Category = Descriptor.Category.Substring(1, Descriptor.Category.Length - 2); } RawObject.TryGetStringField("CreatedBy", out Descriptor.CreatedBy); RawObject.TryGetStringField("CreatedByURL", out Descriptor.CreatedByURL); RawObject.TryGetStringField("DocsURL", out Descriptor.DocsURL); RawObject.TryGetStringField("MarketplaceURL", out Descriptor.MarketplaceURL); RawObject.TryGetStringField("SupportURL", out Descriptor.SupportURL); JsonObject[] ModulesArray; if (RawObject.TryGetObjectArrayField("Modules", out ModulesArray)) { Descriptor.Modules = Array.ConvertAll(ModulesArray, x => ModuleDescriptor.FromJsonObject(x)); } RawObject.TryGetBoolField("EnabledByDefault", out Descriptor.bEnabledByDefault); RawObject.TryGetBoolField("CanContainContent", out Descriptor.bCanContainContent); RawObject.TryGetBoolField("IsBetaVersion", out Descriptor.bIsBetaVersion); RawObject.TryGetBoolField("Installed", out Descriptor.bInstalled); RawObject.TryGetBoolField("CanBeUsedWithUnrealHeaderTool", out Descriptor.bCanBeUsedWithUnrealHeaderTool); return(Descriptor); } catch (JsonParseException ParseException) { throw new JsonParseException("{0} (in {1})", ParseException.Message, FileName); } }