// 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;
}
}
}