// Copyright Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.IO;
using EpicGames.Core;
namespace UnrealBuildTool
{
///
/// Stores information about a compiled binary or module, including the build products and intermediate folders.
///
class PrecompiledManifest
{
///
/// List of files produced by compiling the module. These are within the module output directory.
///
public List OutputFiles = new List();
///
/// Default constructor
///
public PrecompiledManifest()
{
}
///
/// Read a receipt from disk.
///
/// Filename to read from
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;
}
///
/// Try to read a manifest from disk, failing gracefully if it can't be read.
///
/// Filename to read from
/// If successful, the manifest that was read
/// True if successful
public static bool TryRead(FileReference Location, [NotNullWhen(true)] out PrecompiledManifest? Manifest)
{
if (!FileReference.Exists(Location))
{
Manifest = null;
return false;
}
try
{
Manifest = Read(Location);
return true;
}
catch (Exception)
{
Manifest = null;
return false;
}
}
///
/// Write the receipt to disk.
///
/// Output filename
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();
}
FileReference.WriteAllBytesIfDifferent(Location, MemoryStream.ToArray());
}
}
}