Files
UnrealEngineUWP/Engine/Source/Programs/UnrealBuildTool/System/PrecompiledManifest.cs
ben marsh d8b6de1e2f UBT: Prevent DebugGame compile environment from having different ORIGINAL_FILE_NAME macro to the development build environment. This is only needed when compiling resources for binaries. Also prevent the precompiled manifest being written to if it doesn't change.
#rb none
#jira UE-69434

#ROBOMERGE-OWNER: ryan.vance
#ROBOMERGE-AUTHOR: ben.marsh
#ROBOMERGE-SOURCE: CL 4877079 in //UE4/Release-4.22/... via CL 4877081
#ROBOMERGE-BOT: DEVVR (Main -> Dev-VR)

[CL 4877087 by ben marsh in Dev-VR branch]
2019-02-01 23:05:09 -05:00

106 lines
2.8 KiB
C#

// Copyright 1998-2019 Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tools.DotNETCommon;
namespace UnrealBuildTool
{
/// <summary>
/// Stores information about a compiled binary or module, including the build products and intermediate folders.
/// </summary>
class PrecompiledManifest
{
/// <summary>
/// List of files produced by compiling the module. These are within the module output directory.
/// </summary>
public List<FileReference> OutputFiles = new List<FileReference>();
/// <summary>
/// Default constructor
/// </summary>
public PrecompiledManifest()
{
}
/// <summary>
/// Read a receipt from disk.
/// </summary>
/// <param name="Location">Filename to read from</param>
public static PrecompiledManifest Read(FileReference Location)
{
DirectoryReference BaseDir = Location.Directory;
PrecompiledManifest Manifest = new PrecompiledManifest();
JsonObject RawObject = JsonObject.Read(Location);
string[] OutputFiles = RawObject.GetStringArrayField("OutputFiles");
foreach(string OutputFile in OutputFiles)
{
Manifest.OutputFiles.Add(FileReference.Combine(BaseDir, OutputFile));
}
return Manifest;
}
/// <summary>
/// Try to read a manifest from disk, failing gracefully if it can't be read.
/// </summary>
/// <param name="Location">Filename to read from</param>
/// <param name="Manifest">If successful, the manifest that was read</param>
/// <returns>True if successful</returns>
public static bool TryRead(FileReference Location, out PrecompiledManifest Manifest)
{
if (!FileReference.Exists(Location))
{
Manifest = null;
return false;
}
try
{
Manifest = Read(Location);
return true;
}
catch (Exception)
{
Manifest = null;
return false;
}
}
/// <summary>
/// Write the receipt to disk.
/// </summary>
/// <param name="Location">Output filename</param>
public void WriteIfModified(FileReference Location)
{
DirectoryReference BaseDir = Location.Directory;
MemoryStream MemoryStream = new MemoryStream();
using (JsonWriter Writer = new JsonWriter(new StreamWriter(MemoryStream)))
{
Writer.WriteObjectStart();
string[] OutputFileStrings = new string[OutputFiles.Count];
for(int Idx = 0; Idx < OutputFiles.Count; Idx++)
{
OutputFileStrings[Idx] = OutputFiles[Idx].MakeRelativeTo(BaseDir);
}
Writer.WriteStringArrayField("OutputFiles", OutputFileStrings);
Writer.WriteObjectEnd();
}
byte[] Data = MemoryStream.ToArray();
if(!FileReference.Exists(Location) || !Utils.ByteArraysEqual(Data, FileReference.ReadAllBytes(Location)))
{
FileReference.WriteAllBytes(Location, Data);
}
}
}
}