You've already forked UnrealEngineUWP
mirror of
https://github.com/izzy2lost/UnrealEngineUWP.git
synced 2026-03-26 18:15:20 -07:00
Mostly a find/replace, though I have looked through the changes and attempted to update references to other things as necessary (eg. renaming IOS plist files for IOS). I'm not set up to test on any platforms other than windows, and was hoping to get your blessing to submit and give QA enough time as possible to uncover issues before the next milestone release. Particular things that I know I'm not sure about: - Android references /UE4Game/ paths everywhere (for paths on device, I think). I have no idea if I've got them all. - I've renamed the iOS mobileprovisions, but I don't know if they need regenerating for the new app name. - Likewise, not sure what needs to be updated for icon bundles on iOS. Things that have not been changed: - Windows still uses IDI_UE4ICON for its icon - UE4CommandLine.txt - There's still a UE4Game module which is used by content-only projects #rb none [CL 14301890 by Ben Marsh in ue5-main branch]
197 lines
9.4 KiB
C#
197 lines
9.4 KiB
C#
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Tools.DotNETCommon;
|
|
using UnrealBuildTool;
|
|
|
|
namespace AutomationTool
|
|
{
|
|
/// <summary>
|
|
/// Commandlet to finalize the creation of an installed build - creating an InstalledBuild.txt file and writing
|
|
/// out installed platform entries for all platforms/configurations where a UnrealGame .target file can be found
|
|
/// </summary>
|
|
[Help("Command to perform additional steps to prepare an installed build.")]
|
|
[Help("OutputDir=<RootDirectory>", "Root Directory of the installed build data (required)")]
|
|
[Help("ContentOnlyPlatforms=<PlatformNameList>", "List of platforms that should be marked as only supporting content projects (optional)")]
|
|
[Help("Platforms=<PlatformList>)", "List of platforms to add")]
|
|
[Help("<Platform>Architectures=<ArchitectureList>)", "List of architectures that are used for a given platform (optional)")]
|
|
[Help("<Platform>GPUArchitectures=<GPUArchitectureList>)", "List of GPU architectures that are used for a given platform (optional)")]
|
|
[Help("AnalyticsTypeOverride=<TypeName>", "Name to give this build for analytics purposes (optional)")]
|
|
class FinalizeInstalledBuild : BuildCommand
|
|
{
|
|
/// <summary>
|
|
/// Entry point for the commandlet
|
|
/// </summary>
|
|
public override void ExecuteBuild()
|
|
{
|
|
string OutputDir = ParseRequiredStringParam("OutputDir");
|
|
List<UnrealTargetPlatform> Platforms = ParsePlatformsParamValue("Platforms");
|
|
List<UnrealTargetPlatform> ContentOnlyPlatforms = ParsePlatformsParamValue("ContentOnlyPlatforms");
|
|
string AnalyticsTypeOverride = ParseParamValue("AnalyticsTypeOverride");
|
|
|
|
// Write InstalledBuild.txt to indicate Engine is installed
|
|
string InstalledBuildFile = CommandUtils.CombinePaths(OutputDir, "Engine/Build/InstalledBuild.txt");
|
|
CommandUtils.CreateDirectory(CommandUtils.GetDirectoryName(InstalledBuildFile));
|
|
CommandUtils.WriteAllText(InstalledBuildFile, "");
|
|
|
|
// Write InstalledBuild.txt to indicate Engine is installed
|
|
string Project = ParseParamValue("Project");
|
|
if(Project != null)
|
|
{
|
|
string InstalledProjectBuildFile = CommandUtils.CombinePaths(OutputDir, "Engine/Build/InstalledProjectBuild.txt");
|
|
CommandUtils.CreateDirectory(CommandUtils.GetDirectoryName(InstalledProjectBuildFile));
|
|
CommandUtils.WriteAllText(InstalledProjectBuildFile, new FileReference(Project).MakeRelativeTo(new DirectoryReference(OutputDir)));
|
|
}
|
|
|
|
string OutputEnginePath = Path.Combine(OutputDir, "Engine");
|
|
string OutputBaseEnginePath = Path.Combine(OutputEnginePath, "Config", "BaseEngine.ini");
|
|
FileAttributes OutputAttributes = FileAttributes.ReadOnly;
|
|
List<String> IniLines = new List<String>();
|
|
|
|
// Should always exist but if not, we don't need extra line
|
|
if (File.Exists(OutputBaseEnginePath))
|
|
{
|
|
OutputAttributes = File.GetAttributes(OutputBaseEnginePath);
|
|
IniLines.Add("");
|
|
}
|
|
else
|
|
{
|
|
CommandUtils.CreateDirectory(CommandUtils.GetDirectoryName(OutputBaseEnginePath));
|
|
CommandUtils.WriteAllText(OutputBaseEnginePath, "");
|
|
OutputAttributes = File.GetAttributes(OutputBaseEnginePath) | OutputAttributes;
|
|
}
|
|
|
|
// Create list of platform configurations installed in a Rocket build
|
|
List<InstalledPlatformInfo.InstalledPlatformConfiguration> InstalledConfigs = new List<InstalledPlatformInfo.InstalledPlatformConfiguration>();
|
|
|
|
// Add the editor platform, otherwise we'll never be able to run UAT
|
|
string EditorArchitecture = PlatformExports.GetDefaultArchitecture(HostPlatform.Current.HostEditorPlatform, null);
|
|
InstalledConfigs.Add(new InstalledPlatformInfo.InstalledPlatformConfiguration(UnrealTargetConfiguration.Development, HostPlatform.Current.HostEditorPlatform, TargetRules.TargetType.Editor, EditorArchitecture, "", EProjectType.Unknown, false));
|
|
InstalledConfigs.Add(new InstalledPlatformInfo.InstalledPlatformConfiguration(UnrealTargetConfiguration.DebugGame, HostPlatform.Current.HostEditorPlatform, TargetRules.TargetType.Editor, EditorArchitecture, "", EProjectType.Unknown, false));
|
|
|
|
foreach (UnrealTargetPlatform CodeTargetPlatform in Platforms)
|
|
{
|
|
string Architecture = PlatformExports.GetDefaultArchitecture(CodeTargetPlatform, null);
|
|
|
|
// Try to parse additional Architectures from the command line
|
|
string Architectures = ParseParamValue(CodeTargetPlatform.ToString() + "Architectures");
|
|
string GPUArchitectures = ParseParamValue(CodeTargetPlatform.ToString() + "GPUArchitectures");
|
|
|
|
// Build a list of pre-compiled architecture combinations for this platform if any
|
|
List<string> AllArchNames;
|
|
|
|
if (!String.IsNullOrWhiteSpace(Architectures) && !String.IsNullOrWhiteSpace(GPUArchitectures))
|
|
{
|
|
AllArchNames = (from Arch in Architectures.Split('+')
|
|
from GPUArch in GPUArchitectures.Split('+')
|
|
select "-" + Arch + "-" + GPUArch).ToList();
|
|
}
|
|
else if (!String.IsNullOrWhiteSpace(Architectures))
|
|
{
|
|
AllArchNames = Architectures.Split('+').ToList();
|
|
}
|
|
// if there aren't any, use the default
|
|
else
|
|
{
|
|
AllArchNames = new List<string>() { Architecture };
|
|
}
|
|
|
|
// Check whether this platform should only be used for content based projects
|
|
EProjectType ProjectType = ContentOnlyPlatforms.Contains(CodeTargetPlatform) ? EProjectType.Content : EProjectType.Any;
|
|
|
|
// Allow Content only platforms to be shown as options in all projects
|
|
bool bCanBeDisplayed = ProjectType == EProjectType.Content;
|
|
foreach (UnrealTargetConfiguration CodeTargetConfiguration in Enum.GetValues(typeof(UnrealTargetConfiguration)))
|
|
{
|
|
Dictionary<String, TargetType> Targets = new Dictionary<string, TargetType>() {
|
|
{ "UnrealGame", TargetType.Game },
|
|
{ "UnrealClient", TargetType.Client },
|
|
{ "UnrealServer", TargetType.Server }
|
|
};
|
|
foreach (KeyValuePair<string, TargetType> Target in Targets)
|
|
{
|
|
string CurrentTargetName = Target.Key;
|
|
TargetType CurrentTargetType = Target.Value;
|
|
|
|
// Need to check for development receipt as we use that for the Engine code in DebugGame
|
|
UnrealTargetConfiguration EngineConfiguration = (CodeTargetConfiguration == UnrealTargetConfiguration.DebugGame) ? UnrealTargetConfiguration.Development : CodeTargetConfiguration;
|
|
|
|
// Android has multiple architecture flavors built without receipts, so use the default arch target instead
|
|
if (CodeTargetPlatform == UnrealTargetPlatform.Android)
|
|
{
|
|
FileReference ReceiptFileName = TargetReceipt.GetDefaultPath(new DirectoryReference(OutputEnginePath), CurrentTargetName, CodeTargetPlatform, EngineConfiguration, Architecture);
|
|
if (FileReference.Exists(ReceiptFileName))
|
|
{
|
|
// Strip the output folder so that this can be used on any machine
|
|
string RelativeReceiptFileName = ReceiptFileName.MakeRelativeTo(new DirectoryReference(OutputDir));
|
|
|
|
// Blindly append all of the architecture names
|
|
if (AllArchNames.Count > 0)
|
|
{
|
|
foreach (string Arch in AllArchNames)
|
|
{
|
|
InstalledConfigs.Add(new InstalledPlatformInfo.InstalledPlatformConfiguration(CodeTargetConfiguration, CodeTargetPlatform, CurrentTargetType, Arch, RelativeReceiptFileName, ProjectType, bCanBeDisplayed));
|
|
}
|
|
}
|
|
// if for some reason we didn't specify any flavors, just add the default one.
|
|
else
|
|
{
|
|
InstalledConfigs.Add(new InstalledPlatformInfo.InstalledPlatformConfiguration(CodeTargetConfiguration, CodeTargetPlatform, CurrentTargetType, Architecture, RelativeReceiptFileName, ProjectType, bCanBeDisplayed));
|
|
}
|
|
}
|
|
}
|
|
// If we're not Android, check the existence of the target receipts for each architecture specified.
|
|
else
|
|
{
|
|
foreach (string Arch in AllArchNames)
|
|
{
|
|
FileReference ReceiptFileName = TargetReceipt.GetDefaultPath(new DirectoryReference(OutputEnginePath), CurrentTargetName, CodeTargetPlatform, EngineConfiguration, Arch);
|
|
if (FileReference.Exists(ReceiptFileName))
|
|
{
|
|
string RelativeReceiptFileName = ReceiptFileName.MakeRelativeTo(new DirectoryReference(OutputDir));
|
|
InstalledConfigs.Add(new InstalledPlatformInfo.InstalledPlatformConfiguration(CodeTargetConfiguration, CodeTargetPlatform, CurrentTargetType, Arch, RelativeReceiptFileName, ProjectType, bCanBeDisplayed));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
UnrealBuildTool.InstalledPlatformInfo.WriteConfigFileEntries(InstalledConfigs, ref IniLines);
|
|
|
|
if (!String.IsNullOrEmpty(AnalyticsTypeOverride))
|
|
{
|
|
// Write Custom Analytics type setting
|
|
IniLines.Add("");
|
|
IniLines.Add("[Analytics]");
|
|
IniLines.Add(String.Format("UE4TypeOverride=\"{0}\"", AnalyticsTypeOverride));
|
|
}
|
|
|
|
// Make sure we can write to the the config file
|
|
File.SetAttributes(OutputBaseEnginePath, OutputAttributes & ~FileAttributes.ReadOnly);
|
|
File.AppendAllLines(OutputBaseEnginePath, IniLines);
|
|
File.SetAttributes(OutputBaseEnginePath, OutputAttributes);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Parse an argument containing a list of platforms
|
|
/// </summary>
|
|
/// <param name="Name">Name of the argument</param>
|
|
/// <returns>List of platforms</returns>
|
|
List<UnrealTargetPlatform> ParsePlatformsParamValue(string Name)
|
|
{
|
|
string PlatformsString = ParseParamValue(Name);
|
|
if (String.IsNullOrWhiteSpace(PlatformsString))
|
|
{
|
|
return new List<UnrealTargetPlatform>();
|
|
}
|
|
else
|
|
{
|
|
return PlatformsString.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries).Select(x => UnrealTargetPlatform.Parse(x)).ToList();
|
|
}
|
|
}
|
|
}
|
|
} |