// Copyright Epic Games, Inc. All Rights Reserved. using IncludeTool.Support; using EpicGames.Core; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IncludeTool { /// /// Type of binary file /// enum BuildBinaryType { Executable, StaticLibrary, DynamicLinkLibrary, } /// /// Wrapper class for an target binary exported by UBT /// class BuildBinary { public FileReference File; public BuildBinaryType Type; public HashSet Modules; public override string ToString() { return File.ToString(); } } /// /// Type of PCH /// enum BuildModulePCHUsage { Default, NoPCHs, NoSharedPCHs, UseSharedPCHs, UseExplicitOrSharedPCHs } /// /// Wrapper class for a target module exported by UBT /// class BuildModule { public string Name; public BuildModulePCHUsage PCHUsage; public FileReference PrivatePCH; public FileReference SharedPCH; public DirectoryReference Directory; public HashSet PublicDependencyModules; public HashSet PublicIncludePathModules; public HashSet PrivateDependencyModules; public HashSet PrivateIncludePathModules; public HashSet CircularlyReferencedModules; public IEnumerable Dependencies { get { return PublicDependencyModules.Union(PrivateDependencyModules); } } public IEnumerable NonCircularDependencies { get { return Dependencies.Except(CircularlyReferencedModules); } } public override string ToString() { return Name; } } /// /// Wrapper class for an build target exported by UBT /// class BuildTarget { public string Name; public string Configuration; public string Platform; public FileReference ProjectFile; public List Binaries = new List(); public List Modules = new List(); public Dictionary NameToModule = new Dictionary(); public static BuildTarget Read(FileReference File) { JsonObject Object = JsonObject.Read(File); BuildTarget Target = new BuildTarget(); Target.Name = Object.GetStringField("Name"); Target.Configuration = Object.GetStringField("Configuration"); Target.Platform = Object.GetStringField("Platform"); string ProjectFile; if (Object.TryGetStringField("ProjectFile", out ProjectFile)) { Target.ProjectFile = new FileReference(ProjectFile); } JsonObject Modules = Object.GetObjectField("Modules"); Target.NameToModule = Modules.KeyNames.ToDictionary(x => x, x => new BuildModule { Name = x }, StringComparer.OrdinalIgnoreCase); Target.Modules.AddRange(Target.NameToModule.Values); foreach (BuildModule Module in Target.Modules) { JsonObject ModuleObject = Modules.GetObjectField(Module.Name); string PrivatePCH; if (ModuleObject.TryGetStringField("PrivatePCH", out PrivatePCH)) { Module.PrivatePCH = new FileReference(PrivatePCH); } string SharedPCH; if (ModuleObject.TryGetStringField("SharedPCH", out SharedPCH)) { Module.SharedPCH = new FileReference(SharedPCH); } Module.PCHUsage = ModuleObject.GetEnumField("PCHUsage"); Module.Directory = new DirectoryReference(ModuleObject.GetStringField("Directory")); Module.PublicDependencyModules = new HashSet(ModuleObject.GetStringArrayField("PublicDependencyModules").Select(x => Target.NameToModule[x])); Module.PublicIncludePathModules = new HashSet(ModuleObject.GetStringArrayField("PublicIncludePathModules").Select(x => Target.NameToModule[x])); Module.PrivateDependencyModules = new HashSet(ModuleObject.GetStringArrayField("PrivateDependencyModules").Select(x => Target.NameToModule[x])); Module.PrivateIncludePathModules = new HashSet(ModuleObject.GetStringArrayField("PrivateIncludePathModules").Select(x => Target.NameToModule[x])); Module.CircularlyReferencedModules = new HashSet(ModuleObject.GetStringArrayField("CircularlyReferencedModules").Select(x => Target.NameToModule[x])); } foreach (JsonObject BinaryObject in Object.GetObjectArrayField("Binaries")) { BuildBinary Binary = new BuildBinary(); Binary.File = new FileReference(BinaryObject.GetStringField("File")); Binary.Type = BinaryObject.GetEnumField("Type"); Binary.Modules = new HashSet(BinaryObject.GetStringArrayField("Modules").Select(x => Target.NameToModule[x])); Target.Binaries.Add(Binary); } return Target; } public override string ToString() { return Name; } } }