// 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
{
///
/// Contains information about a target required to deploy it. Written at build time, and read back in when UBT needs to run the deploy step.
///
class UEBuildDeployTarget
{
///
/// Path to the project file
///
public readonly FileReference ProjectFile;
///
/// Path to the .target.cs
///
public readonly FileReference TargetFile;
///
/// The shared app name for this target (eg. UE4Editor)
///
public readonly string AppName;
///
/// The name of this target
///
public readonly string TargetName;
///
/// Type of the target to build
///
public readonly TargetType TargetType;
///
/// The platform being built
///
public readonly UnrealTargetPlatform Platform;
///
/// The configuration being built
///
public readonly UnrealTargetConfiguration Configuration;
///
/// The output path
///
public FileReference OutputPath
{
get
{
if (OutputPaths.Count != 1)
{
throw new BuildException("Attempted to use UEBuildDeployTarget.OutputPath property, but there are multiple (or no) OutputPaths. You need to handle multiple in the code that called this (size = {0})", OutputPaths.Count);
}
return OutputPaths[0];
}
}
///
/// The full list of output paths, for platforms that support building multiple binaries simultaneously
///
public readonly List OutputPaths;
///
/// Path to the directory for engine intermediates. May be under the project directory if not being built for the shared build environment.
///
public readonly DirectoryReference EngineIntermediateDirectory;
///
/// The project directory, or engine directory for targets without a project file.
///
public readonly DirectoryReference ProjectDirectory;
///
/// Path to the generated build receipt.
///
public readonly FileReference BuildReceiptFileName;
///
/// Whether incremental linking is enabled (disables icon update on Windows)
///
public readonly bool bUseIncrementalLinking;
///
/// If true, then a stub IPA will be generated when compiling is done (minimal files needed for a valid IPA)
///
public readonly bool bCreateStubIPA;
///
/// Which architectures to deploy for on Android
///
public readonly string[] AndroidArchitectures;
///
/// Which GPU architectures to deploy for on Android
///
public readonly string[] AndroidGPUArchitectures;
///
/// Which GPU architectures to deploy for on Lumin
///
public readonly string[] LuminGPUArchitectures;
///
/// Construct the deployment info from a target
///
/// The target being built
public UEBuildDeployTarget(UEBuildTarget Target)
{
this.ProjectFile = Target.ProjectFile;
this.TargetFile = Target.TargetRulesFile;
this.AppName = Target.AppName;
this.TargetName = Target.TargetName;
this.TargetType = Target.TargetType;
this.Platform = Target.Platform;
this.Configuration = Target.Configuration;
this.OutputPaths = new List(Target.OutputPaths);
this.EngineIntermediateDirectory = Target.EngineIntermediateDirectory;
this.ProjectDirectory = Target.ProjectDirectory;
this.BuildReceiptFileName = Target.ReceiptFileName;
this.bUseIncrementalLinking = Target.Rules.bUseIncrementalLinking;
this.bCreateStubIPA = Target.Rules.bCreateStubIPA;
this.AndroidArchitectures = Target.Rules.AndroidPlatform.Architectures.ToArray();
this.AndroidGPUArchitectures = Target.Rules.AndroidPlatform.GPUArchitectures.ToArray();
this.LuminGPUArchitectures = Target.Rules.LuminPlatform.GPUArchitectures.ToArray();
}
///
/// Read the deployment info from a file on disk
///
/// Path to the file to read
public UEBuildDeployTarget(FileReference Location)
{
using (BinaryReader Reader = new BinaryReader(File.Open(Location.FullName, FileMode.Open, FileAccess.Read, FileShare.Read)))
{
ProjectFile = Reader.ReadFileReference();
TargetFile = Reader.ReadFileReference();
AppName = Reader.ReadString();
TargetName = Reader.ReadString();
TargetType = (TargetType)Reader.ReadInt32();
Platform = (UnrealTargetPlatform)Reader.ReadInt32();
Configuration = (UnrealTargetConfiguration)Reader.ReadInt32();
OutputPaths = Reader.ReadList(() => Reader.ReadFileReference());
EngineIntermediateDirectory = Reader.ReadDirectoryReference();
ProjectDirectory = Reader.ReadDirectoryReference();
BuildReceiptFileName = Reader.ReadFileReference();
bUseIncrementalLinking = Reader.ReadBoolean();
bCreateStubIPA = Reader.ReadBoolean();
AndroidArchitectures = Reader.ReadStringArray();
AndroidGPUArchitectures = Reader.ReadStringArray();
LuminGPUArchitectures = Reader.ReadStringArray();
}
}
///
/// Write the deployment info to a file on disk
///
/// File to write to
public void Write(FileReference Location)
{
DirectoryReference.CreateDirectory(Location.Directory);
using (BinaryWriter Writer = new BinaryWriter(File.Open(Location.FullName, FileMode.Create, FileAccess.Write, FileShare.Read)))
{
Writer.Write(ProjectFile);
Writer.Write(TargetFile);
Writer.Write(AppName);
Writer.Write(TargetName);
Writer.Write((Int32)TargetType);
Writer.Write((Int32)Platform);
Writer.Write((Int32)Configuration);
Writer.Write(OutputPaths, Item => Writer.Write(Item));
Writer.Write(EngineIntermediateDirectory);
Writer.Write(ProjectDirectory);
Writer.Write(BuildReceiptFileName);
Writer.Write(bUseIncrementalLinking);
Writer.Write(bCreateStubIPA);
Writer.Write(AndroidArchitectures);
Writer.Write(AndroidGPUArchitectures);
Writer.Write(LuminGPUArchitectures);
}
}
}
}