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