Files
UnrealEngineUWP/Engine/Source/Programs/AutomationTool/AutomationUtils/ProcessUtils.cs

1058 lines
33 KiB
C#
Raw Normal View History

// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Threading;
using System.Diagnostics;
using System.Management;
using System.Runtime.InteropServices;
UBT Utils.cs (New logging system) * Allows us to use built-in Trace providers (console, file, etc) directly and still use our custom formatting. * Fat comments explaining why Trace.WriteXXX functions should not be used directly in our system. * Fixes thread safety by using Trace.WriteXXX under the hood after formatting, which uses a global lock (except on Mono, where a bug appears to be preventing this. Simulating the call on that platform). * No need for TraceEvent overloads, which saves us the extra parameter cruft. * Removed non-varargs overloads of Log functions (technically a bit slower, but these are already small messages). * No longer needed VerbosityFilter and ConsoleListener classes. * Avoid calling GetSource() if we aren't outputting the source. * Avoid formatting the string if it won't pass the verbosity level. * Consolidated all of UAT and UBT options into this class, so they could fully share the implementation. UBT BuildConfiguration.cs * Added LogFilename (and --log=<file> arg) that enables logging to a file. * Added static ctor guard that asserts if someone tries to read a config before we have loaded config files and parsed config-override commandlines. It's a poor man's hack, but better than nothing! UBT UEBuildConfiguration.cs * Same static ctor guard as above. UBT UnrealBuildTools.cs (initialization refactoring) * In general I tried to de-mystify some of the rationale behind our startup code via fat comments. * Broke main into 3 stages: 1. "early code" that should not try to read a config value. * Very little code here. Mostly setting the current directory. * Does an early init of logging to ensure logging is around, but config values won't be ready. 2. "Init Configuration code" that loads config files and parses command lines that may override them. * I isolated two locations in startup that parsed long sets of switches and moved ones that trivially affected BuildConfiguration and UEBuildConfiguration in here. Those two locations seemed to have mostly copies of the same switches, indicating serious param parsing issues at some point in time. * This allows switches to override config files more easily than the patchwork of re-parsing that was currently used (particularly for -verbose). * I did a cursory examination of later code that indicated this double (actually, triple) parsing was no longer necessary with the refactors above. Any insight into why things may have ended up this way would be helpful. 3. "Post Init code" that is actually the meat of UBT. * I left this code largely untouched. * Removed 2 of 3 different command line logging statements. * Removed two redundant parses of config overrides (ParseBuildConfigurationFlags). * Guarded all of main in a try/catch block to ensure no exceptions can leak from UBT without returning a valid error code. It ALMOST already did this, but only covered the part surrounded by the Mutex. * There was a perplexing bit that redundantly called XmlConfigLoader.Reset<> (line 683) that I struggled to understand. It turns out UEBuildConfiguration was sensitive to the current directory being set before files were loaded, and the old code called XmlConfigLoader.Init() super early, which required it to be called again after the current directory was set (see UEBuldConfiguration.UEThirdPartySourceDirectory for the cause). After my changes, I verified as best I could that these calls are no longer needed and removed them. XmlConfigLoader.cs * Add support for Properties in XmlConfigLoader. AutomationTool Program.cs * Guard logging shutdown code in try/finally so it can't be missed. AutomationTool Log.cs * Uses new logging system from UBT * Removed unnecessary classes (VerbosityFilter, AutomationConsoleTraceListener, and AutomationFileTraceListener) * Console trace logic is handled by UBT code now, moved UTF8Output handling to InitLogging. * A custom TraceListener for file logging was unnecessary. * Logic to handle creating the log file and retry loops was move into InitLogging, and the result passed to a regular TextFileTraceListener. * Logic to handle copying the log on shutdown was moved to a ShutdownLogging function. #codereview:robert.manuszewski,michael.trepka,kellan.carr [CL 2526245 by Wes Hunt in Main branch]
2015-04-26 18:19:28 -04:00
using System.Runtime.CompilerServices;
namespace AutomationTool
{
public enum CtrlTypes
{
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT,
CTRL_CLOSE_EVENT,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT
}
public interface IProcess
{
void StopProcess(bool KillDescendants = true);
bool HasExited { get; }
string GetProcessName();
}
/// <summary>
/// Tracks all active processes.
/// </summary>
public sealed class ProcessManager
{
public delegate bool CtrlHandlerDelegate(CtrlTypes EventType);
// @todo: Add mono support
[DllImport("Kernel32")]
public static extern bool SetConsoleCtrlHandler(CtrlHandlerDelegate Handler, bool Add);
/// <summary>
/// List of active (running) processes.
/// </summary>
private static List<IProcess> ActiveProcesses = new List<IProcess>();
/// <summary>
/// Synchronization object
/// </summary>
private static object SyncObject = new object();
/// <summary>
/// Creates a new process and adds it to the tracking list.
/// </summary>
/// <returns>New Process objects</returns>
public static ProcessResult CreateProcess(string AppName, bool bAllowSpew, string LogName, Dictionary<string, string> Env = null, UnrealBuildTool.LogEventType SpewVerbosity = UnrealBuildTool.LogEventType.Console)
{
var NewProcess = HostPlatform.Current.CreateProcess(LogName);
if (Env != null)
{
foreach (var EnvPair in Env)
{
if (NewProcess.StartInfo.EnvironmentVariables.ContainsKey(EnvPair.Key))
{
NewProcess.StartInfo.EnvironmentVariables.Remove(EnvPair.Key);
}
if (!String.IsNullOrEmpty(EnvPair.Value))
{
NewProcess.StartInfo.EnvironmentVariables.Add(EnvPair.Key, EnvPair.Value);
}
}
}
var Result = new ProcessResult(AppName, NewProcess, bAllowSpew, LogName, SpewVerbosity: SpewVerbosity);
AddProcess(Result);
return Result;
}
public static void AddProcess(IProcess Proc)
{
lock (SyncObject)
{
ActiveProcesses.Add(Proc);
}
}
public static void RemoveProcess(IProcess Proc)
{
lock (SyncObject)
{
ActiveProcesses.Remove(Proc);
}
}
public static bool CanBeKilled(string ProcessName)
{
return !HostPlatform.Current.DontKillProcessList.Contains(ProcessName, StringComparer.InvariantCultureIgnoreCase);
}
/// <summary>
/// Kills all running processes.
/// </summary>
public static void KillAll()
{
List<IProcess> ProcessesToKill = new List<IProcess>();
lock (SyncObject)
{
foreach (var ProcResult in ActiveProcesses)
{
if (!ProcResult.HasExited)
{
ProcessesToKill.Add(ProcResult);
}
}
ActiveProcesses.Clear();
}
// Remove processes that can't be killed
for (int ProcessIndex = ProcessesToKill.Count - 1; ProcessIndex >= 0; --ProcessIndex )
{
var ProcessName = ProcessesToKill[ProcessIndex].GetProcessName();
if (!String.IsNullOrEmpty(ProcessName) && !CanBeKilled(ProcessName))
{
CommandUtils.LogLog("Ignoring process \"{0}\" because it can't be killed.", ProcessName);
ProcessesToKill.RemoveAt(ProcessIndex);
}
}
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
if(ProcessesToKill.Count > 0)
{
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
CommandUtils.LogLog("Trying to kill {0} spawned processes.", ProcessesToKill.Count);
foreach (var Proc in ProcessesToKill)
{
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
CommandUtils.LogLog(" {0}", Proc.GetProcessName());
}
if (CommandUtils.IsBuildMachine)
{
for (int Cnt = 0; Cnt < 9; Cnt++)
{
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
bool AllDone = true;
foreach (var Proc in ProcessesToKill)
{
try
{
if (!Proc.HasExited)
{
AllDone = false;
CommandUtils.LogLog("Waiting for process: {0}", Proc.GetProcessName());
}
}
catch (Exception)
{
CommandUtils.LogWarning("Exception Waiting for process");
AllDone = false;
}
}
try
{
if (ProcessResult.HasAnyDescendants(Process.GetCurrentProcess()))
{
AllDone = false;
CommandUtils.Log("Waiting for descendants of main process...");
}
}
catch (Exception Ex)
{
CommandUtils.LogWarning("Exception Waiting for descendants of main process. " + Ex);
AllDone = false;
}
if (AllDone)
{
break;
}
Thread.Sleep(10000);
}
}
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
foreach (var Proc in ProcessesToKill)
{
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
var ProcName = Proc.GetProcessName();
try
{
if (!Proc.HasExited)
{
CommandUtils.LogLog("Killing process: {0}", ProcName);
Proc.StopProcess(false);
}
}
catch (Exception Ex)
{
CommandUtils.LogWarning("Exception while trying to kill process {0}:", ProcName);
CommandUtils.LogWarning(LogUtils.FormatException(Ex));
}
}
try
{
if (CommandUtils.IsBuildMachine && ProcessResult.HasAnyDescendants(Process.GetCurrentProcess()))
{
CommandUtils.LogLog("current process still has descendants, trying to kill them...");
ProcessResult.KillAllDescendants(Process.GetCurrentProcess());
}
}
catch (Exception)
{
CommandUtils.LogWarning("Exception killing descendants of main process");
}
}
}
}
#region ProcessResult Helper Class
/// <summary>
/// Class containing the result of process execution.
/// </summary>
public class ProcessResult : IProcess
{
private string Source = "";
private int ProcessExitCode = -1;
private StringBuilder ProcessOutput = new StringBuilder();
private bool AllowSpew = true;
private UnrealBuildTool.LogEventType SpewVerbosity = UnrealBuildTool.LogEventType.Console;
private string AppName = String.Empty;
private Process Proc = null;
private AutoResetEvent OutputWaitHandle = new AutoResetEvent(false);
private AutoResetEvent ErrorWaitHandle = new AutoResetEvent(false);
private object ProcSyncObject;
public ProcessResult(string InAppName, Process InProc, bool bAllowSpew, string LogName, UnrealBuildTool.LogEventType SpewVerbosity = UnrealBuildTool.LogEventType.Console)
{
AppName = InAppName;
ProcSyncObject = new object();
Proc = InProc;
Source = LogName;
AllowSpew = bAllowSpew;
this.SpewVerbosity = SpewVerbosity;
if (Proc != null)
{
Proc.EnableRaisingEvents = false;
}
}
~ProcessResult()
{
if(Proc != null)
{
Proc.Dispose();
}
}
/// <summary>
/// Removes a process from the list of tracked processes.
/// </summary>
public void OnProcessExited()
{
ProcessManager.RemoveProcess(this);
}
UBT Utils.cs (New logging system) * Allows us to use built-in Trace providers (console, file, etc) directly and still use our custom formatting. * Fat comments explaining why Trace.WriteXXX functions should not be used directly in our system. * Fixes thread safety by using Trace.WriteXXX under the hood after formatting, which uses a global lock (except on Mono, where a bug appears to be preventing this. Simulating the call on that platform). * No need for TraceEvent overloads, which saves us the extra parameter cruft. * Removed non-varargs overloads of Log functions (technically a bit slower, but these are already small messages). * No longer needed VerbosityFilter and ConsoleListener classes. * Avoid calling GetSource() if we aren't outputting the source. * Avoid formatting the string if it won't pass the verbosity level. * Consolidated all of UAT and UBT options into this class, so they could fully share the implementation. UBT BuildConfiguration.cs * Added LogFilename (and --log=<file> arg) that enables logging to a file. * Added static ctor guard that asserts if someone tries to read a config before we have loaded config files and parsed config-override commandlines. It's a poor man's hack, but better than nothing! UBT UEBuildConfiguration.cs * Same static ctor guard as above. UBT UnrealBuildTools.cs (initialization refactoring) * In general I tried to de-mystify some of the rationale behind our startup code via fat comments. * Broke main into 3 stages: 1. "early code" that should not try to read a config value. * Very little code here. Mostly setting the current directory. * Does an early init of logging to ensure logging is around, but config values won't be ready. 2. "Init Configuration code" that loads config files and parses command lines that may override them. * I isolated two locations in startup that parsed long sets of switches and moved ones that trivially affected BuildConfiguration and UEBuildConfiguration in here. Those two locations seemed to have mostly copies of the same switches, indicating serious param parsing issues at some point in time. * This allows switches to override config files more easily than the patchwork of re-parsing that was currently used (particularly for -verbose). * I did a cursory examination of later code that indicated this double (actually, triple) parsing was no longer necessary with the refactors above. Any insight into why things may have ended up this way would be helpful. 3. "Post Init code" that is actually the meat of UBT. * I left this code largely untouched. * Removed 2 of 3 different command line logging statements. * Removed two redundant parses of config overrides (ParseBuildConfigurationFlags). * Guarded all of main in a try/catch block to ensure no exceptions can leak from UBT without returning a valid error code. It ALMOST already did this, but only covered the part surrounded by the Mutex. * There was a perplexing bit that redundantly called XmlConfigLoader.Reset<> (line 683) that I struggled to understand. It turns out UEBuildConfiguration was sensitive to the current directory being set before files were loaded, and the old code called XmlConfigLoader.Init() super early, which required it to be called again after the current directory was set (see UEBuldConfiguration.UEThirdPartySourceDirectory for the cause). After my changes, I verified as best I could that these calls are no longer needed and removed them. XmlConfigLoader.cs * Add support for Properties in XmlConfigLoader. AutomationTool Program.cs * Guard logging shutdown code in try/finally so it can't be missed. AutomationTool Log.cs * Uses new logging system from UBT * Removed unnecessary classes (VerbosityFilter, AutomationConsoleTraceListener, and AutomationFileTraceListener) * Console trace logic is handled by UBT code now, moved UTF8Output handling to InitLogging. * A custom TraceListener for file logging was unnecessary. * Logic to handle creating the log file and retry loops was move into InitLogging, and the result passed to a regular TextFileTraceListener. * Logic to handle copying the log on shutdown was moved to a ShutdownLogging function. #codereview:robert.manuszewski,michael.trepka,kellan.carr [CL 2526245 by Wes Hunt in Main branch]
2015-04-26 18:19:28 -04:00
/// <summary>
/// Log output of a remote process at a given severity.
/// To pretty up the output, we use a custom source so it will say the source of the process instead of this method name.
/// </summary>
/// <param name="Verbosity"></param>
/// <param name="Message"></param>
[MethodImplAttribute(MethodImplOptions.NoInlining)]
private void LogOutput(UnrealBuildTool.LogEventType Verbosity, string Message)
{
UBT Utils.cs (New logging system) * Allows us to use built-in Trace providers (console, file, etc) directly and still use our custom formatting. * Fat comments explaining why Trace.WriteXXX functions should not be used directly in our system. * Fixes thread safety by using Trace.WriteXXX under the hood after formatting, which uses a global lock (except on Mono, where a bug appears to be preventing this. Simulating the call on that platform). * No need for TraceEvent overloads, which saves us the extra parameter cruft. * Removed non-varargs overloads of Log functions (technically a bit slower, but these are already small messages). * No longer needed VerbosityFilter and ConsoleListener classes. * Avoid calling GetSource() if we aren't outputting the source. * Avoid formatting the string if it won't pass the verbosity level. * Consolidated all of UAT and UBT options into this class, so they could fully share the implementation. UBT BuildConfiguration.cs * Added LogFilename (and --log=<file> arg) that enables logging to a file. * Added static ctor guard that asserts if someone tries to read a config before we have loaded config files and parsed config-override commandlines. It's a poor man's hack, but better than nothing! UBT UEBuildConfiguration.cs * Same static ctor guard as above. UBT UnrealBuildTools.cs (initialization refactoring) * In general I tried to de-mystify some of the rationale behind our startup code via fat comments. * Broke main into 3 stages: 1. "early code" that should not try to read a config value. * Very little code here. Mostly setting the current directory. * Does an early init of logging to ensure logging is around, but config values won't be ready. 2. "Init Configuration code" that loads config files and parses command lines that may override them. * I isolated two locations in startup that parsed long sets of switches and moved ones that trivially affected BuildConfiguration and UEBuildConfiguration in here. Those two locations seemed to have mostly copies of the same switches, indicating serious param parsing issues at some point in time. * This allows switches to override config files more easily than the patchwork of re-parsing that was currently used (particularly for -verbose). * I did a cursory examination of later code that indicated this double (actually, triple) parsing was no longer necessary with the refactors above. Any insight into why things may have ended up this way would be helpful. 3. "Post Init code" that is actually the meat of UBT. * I left this code largely untouched. * Removed 2 of 3 different command line logging statements. * Removed two redundant parses of config overrides (ParseBuildConfigurationFlags). * Guarded all of main in a try/catch block to ensure no exceptions can leak from UBT without returning a valid error code. It ALMOST already did this, but only covered the part surrounded by the Mutex. * There was a perplexing bit that redundantly called XmlConfigLoader.Reset<> (line 683) that I struggled to understand. It turns out UEBuildConfiguration was sensitive to the current directory being set before files were loaded, and the old code called XmlConfigLoader.Init() super early, which required it to be called again after the current directory was set (see UEBuldConfiguration.UEThirdPartySourceDirectory for the cause). After my changes, I verified as best I could that these calls are no longer needed and removed them. XmlConfigLoader.cs * Add support for Properties in XmlConfigLoader. AutomationTool Program.cs * Guard logging shutdown code in try/finally so it can't be missed. AutomationTool Log.cs * Uses new logging system from UBT * Removed unnecessary classes (VerbosityFilter, AutomationConsoleTraceListener, and AutomationFileTraceListener) * Console trace logic is handled by UBT code now, moved UTF8Output handling to InitLogging. * A custom TraceListener for file logging was unnecessary. * Logic to handle creating the log file and retry loops was move into InitLogging, and the result passed to a regular TextFileTraceListener. * Logic to handle copying the log on shutdown was moved to a ShutdownLogging function. #codereview:robert.manuszewski,michael.trepka,kellan.carr [CL 2526245 by Wes Hunt in Main branch]
2015-04-26 18:19:28 -04:00
UnrealBuildTool.Log.WriteLine(1, Source, Verbosity, Message);
}
/// <summary>
/// Manually dispose of Proc and set it to null.
/// </summary>
public void DisposeProcess()
{
if(Proc != null)
{
Proc.Dispose();
Proc = null;
}
}
/// <summary>
/// Process.OutputDataReceived event handler.
/// </summary>
/// <param name="sender">Sender</param>
/// <param name="e">Event args</param>
public void StdOut(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
if (AllowSpew)
{
LogOutput(SpewVerbosity, e.Data);
}
ProcessOutput.Append(e.Data);
ProcessOutput.Append(Environment.NewLine);
}
else
{
OutputWaitHandle.Set();
}
}
/// <summary>
/// Process.ErrorDataReceived event handler.
/// </summary>
/// <param name="sender">Sender</param>
/// <param name="e">Event args</param>
public void StdErr(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
if (AllowSpew)
{
LogOutput(SpewVerbosity, e.Data);
}
ProcessOutput.Append(e.Data);
ProcessOutput.Append(Environment.NewLine);
}
else
{
ErrorWaitHandle.Set();
}
}
/// <summary>
/// Convenience operator for getting the exit code value.
/// </summary>
/// <param name="Result"></param>
/// <returns>Process exit code.</returns>
public static implicit operator int(ProcessResult Result)
{
return Result.ExitCode;
}
/// <summary>
/// Gets or sets the process exit code.
/// </summary>
public int ExitCode
{
get { return ProcessExitCode; }
set { ProcessExitCode = value; }
}
/// <summary>
/// Gets all std output the process generated.
/// </summary>
public string Output
{
get { return ProcessOutput.ToString(); }
}
public bool HasExited
{
get
{
bool bHasExited = true;
lock (ProcSyncObject)
{
if (Proc != null)
{
bHasExited = Proc.HasExited;
if (bHasExited)
{
ExitCode = Proc.ExitCode;
}
}
}
return bHasExited;
}
}
public Process ProcessObject
{
get { return Proc; }
}
/// <summary>
/// Thread-safe way of getting the process name
/// </summary>
/// <returns>Name of the process this object represents</returns>
public string GetProcessName()
{
string Name = null;
lock (ProcSyncObject)
{
try
{
if (Proc != null && !Proc.HasExited)
{
Name = Proc.ProcessName;
}
}
catch
{
// Ignore all exceptions
}
}
if (String.IsNullOrEmpty(Name))
{
Name = "[EXITED] " + AppName;
}
return Name;
}
/// <summary>
/// Object iterface.
/// </summary>
/// <returns>String representation of this object.</returns>
public override string ToString()
{
return ExitCode.ToString();
}
public void WaitForExit()
{
bool bProcTerminated = false;
bool bStdOutSignalReceived = false;
bool bStdErrSignalReceived = false;
// Make sure the process objeect is valid.
lock (ProcSyncObject)
{
bProcTerminated = (Proc == null);
}
// Keep checking if we got all output messages until the process terminates.
if (!bProcTerminated)
{
// Check messages
int MaxWaitUntilMessagesReceived = 120;
while (MaxWaitUntilMessagesReceived > 0 && !(bStdOutSignalReceived && bStdErrSignalReceived))
{
if (!bStdOutSignalReceived)
{
bStdOutSignalReceived = OutputWaitHandle.WaitOne(500);
}
if (!bStdErrSignalReceived)
{
bStdErrSignalReceived = ErrorWaitHandle.WaitOne(500);
}
// Check if the process terminated
lock (ProcSyncObject)
{
bProcTerminated = (Proc == null) || Proc.HasExited;
}
if (bProcTerminated)
{
// Process terminated but make sure we got all messages, don't wait forever though
MaxWaitUntilMessagesReceived--;
}
}
if (!(bStdOutSignalReceived && bStdErrSignalReceived))
{
CommandUtils.LogLog("Waited for a long time for output of {0}, some output may be missing; we gave up.", AppName);
}
// Double-check if the process terminated
lock (ProcSyncObject)
{
bProcTerminated = (Proc == null) || Proc.HasExited;
}
if (!bProcTerminated)
{
// The process did not terminate yet but we've read all output messages, wait until the process terminates
Proc.WaitForExit();
}
}
}
/// <summary>
/// Finds child processes of the current process.
/// </summary>
/// <param name="ProcessId"></param>
/// <param name="PossiblyRelatedId"></param>
/// <param name="VisitedPids"></param>
/// <returns></returns>
private static bool IsOurDescendant(Process ProcessToKill, int PossiblyRelatedId, HashSet<int> VisitedPids)
{
// check if we're the parent of it or its parent is our descendant
try
{
VisitedPids.Add(PossiblyRelatedId);
Process Parent = null;
using (ManagementObject ManObj = new ManagementObject(string.Format("win32_process.handle='{0}'", PossiblyRelatedId)))
{
ManObj.Get();
int ParentId = Convert.ToInt32(ManObj["ParentProcessId"]);
if (ParentId == 0 || VisitedPids.Contains(ParentId))
{
return false;
}
Parent = Process.GetProcessById(ParentId); // will throw an exception if not spawned by us or not running
}
if (Parent != null)
{
return Parent.Id == ProcessToKill.Id || IsOurDescendant(ProcessToKill, Parent.Id, VisitedPids); // could use ParentId, but left it to make the above var used
}
else
{
return false;
}
}
catch (Exception)
{
// This can happen if the pid is no longer valid which is ok.
return false;
}
}
/// <summary>
/// Kills all child processes of the specified process.
/// </summary>
/// <param name="ProcessId">Process id</param>
public static void KillAllDescendants(Process ProcessToKill)
{
bool bKilledAChild;
do
{
bKilledAChild = false;
// For some reason Process.GetProcesses() sometimes returns the same process twice
// So keep track of all processes we already tried to kill
var KilledPids = new HashSet<int>();
var AllProcs = Process.GetProcesses();
foreach (Process KillCandidate in AllProcs)
{
var VisitedPids = new HashSet<int>();
if (ProcessManager.CanBeKilled(KillCandidate.ProcessName) &&
!KilledPids.Contains(KillCandidate.Id) &&
IsOurDescendant(ProcessToKill, KillCandidate.Id, VisitedPids))
{
KilledPids.Add(KillCandidate.Id);
CommandUtils.LogLog("Trying to kill descendant pid={0}, name={1}", KillCandidate.Id, KillCandidate.ProcessName);
try
{
KillCandidate.Kill();
bKilledAChild = true;
}
catch (Exception Ex)
{
Copying //UE4/Dev-Build to //UE4/Main (Source: //UE4/Dev-Build @ 2944521) ========================== MAJOR FEATURES + CHANGES ========================== Change 2909886 on 2016/03/15 by Matthew.Griffin Adding a build exception to give a message instead of crashing when trying to generate all project files from an installed build. Change 2911727 on 2016/03/16 by Matthew.Griffin Added Platform Type and Architecture to Installed Platform Info Reworked the different IsValid... functions to use lamdas to reduce duplicated code looping and checking receipts Moved the code to write config file entries into InstalledPlatformInfo so that it can be reused by anyone wanting to make installed builds Added temporary hack to write Android architecture until I can get it from build process Change 2913692 on 2016/03/17 by Ben.Marsh UAT: Move script to archive a build for UGS into a public folder. Change 2915445 on 2016/03/18 by Ben.Marsh UAT: Reduce the number of redundant log warnings/errors after a reported build failure, and simplify calls to ParallelExecutor which don't need retrying. Change 2915450 on 2016/03/18 by Ben.Marsh UAT: Suppress warning messages trying to kill child processes if the operation failed because it's already exited. Change 2925830 on 2016/03/29 by Matthew.Griffin Added new selective download tags Added a test for whether installed platforms are missing required files so that we can try to open the launcher to the installer settings Change 2926437 on 2016/03/29 by Ben.Marsh PR #2210: Fix "Rebuild.bat" for paths with parentheses (Contributed by amcofi) Change 2927399 on 2016/03/30 by Matthew.Griffin Updating use of PDBCopy to look in VS2015 folder and fall back to VS2013 version if it doesn't exist. Change 2933093 on 2016/04/05 by Ben.Marsh PR #2232: Updated copyright text to 2016 (Contributed by erikbye) Change 2936221 on 2016/04/07 by Matthew.Griffin Adding checks on architecture for android config options Change 2938021 on 2016/04/08 by Ben.Marsh UAT: Prevent UnauthorizedAccessException when enumerating crash files on Mac from a restricted user account. Change 2939332 on 2016/04/11 by Matthew.Griffin Added AdditionalBundleResources to external file list so that they should be included in Launcher releases Change 2939767 on 2016/04/11 by Ben.Marsh BuildGraph: Add a -preprocess option, which will cause the preprocessed and culled graph out to an XML file for debugging. Change 2941611 on 2016/04/12 by Ben.Marsh UAT: Prevent warning about commands requiring P4 if -p4 is specified on the command line. Change 2942037 on 2016/04/13 by Ben.Marsh UBT: Only print 'Detailed Action Stats' message footer if there were any detailed action stats. Change 2942640 on 2016/04/13 by Ben.Marsh GUBP: Trigger GitHub promotions by triggering a new procedure rather than scanning for labels. Change 2942728 on 2016/04/13 by Ben.Marsh BuildGraph: Rename "AgentGroup" to "Agent" for consistency with XML. Change 2942735 on 2016/04/13 by Ben.Marsh BuildGraph: Few renames to match class names (Build.cs -> BuildGraph.cs, AgentGroup.cs -> Agent.cs) Change 2943568 on 2016/04/14 by Ben.Marsh EC: Print out the log folder at the start of each job. Change 2944421 on 2016/04/14 by Ben.Marsh EC: Add GitHub dashboard page which shows the current syncing state #lockdown Nick.Penwarden [CL 2944733 by Ben Marsh in Main branch]
2016-04-14 20:35:31 -04:00
if(!KillCandidate.HasExited)
{
CommandUtils.LogWarning("Failed to kill descendant:");
CommandUtils.LogWarning(LogUtils.FormatException(Ex));
}
}
break; // exit the loop as who knows what else died, so let's get processes anew
}
}
} while (bKilledAChild);
}
/// <summary>
/// returns true if this process has any descendants
/// </summary>
/// <param name="ProcessToCheck">Process to check</param>
public static bool HasAnyDescendants(Process ProcessToCheck)
{
Process[] AllProcs = Process.GetProcesses();
foreach (Process KillCandidate in AllProcs)
{
Merging //UE4/Release-4.11 to //UE4/Main (Up to CL#2897738) ========================== MAJOR FEATURES + CHANGES ========================== Change 2875445 on 2016/02/22 by Matthew.Griffin Added UE4.natvis to Visual Studio Projects #jira UE-27153 Change 2875456 on 2016/02/22 by Keith.Judge Fix custom stencil shaders on Xbox One #jira UES-1387 Change 2875524 on 2016/02/22 by Robert.Manuszewski More log info when saving shader temp files fails. Increased the number of attemps when moving a file fails. #jira UE-20945 Change 2875698 on 2016/02/22 by Rolando.Caloca UE4.11 - Add new bool for RHIs (unused currently) #jira UE-24967 Change 2875897 on 2016/02/22 by Taizyd.Korambayil #jira UE-20324 Re-imported Cloth Skeletal Meshes to Fix odd Circle Highlights Change 2875922 on 2016/02/22 by Mieszko.Zielinski Fixed BP-implemented EQS generators crashing when trying to add generated value of wrong type #UE4 #jira UE-25034 #rb Lukasz.Furman Change 2875960 on 2016/02/22 by Michael.Trepka Added a way to disable right click emulation on Mac and used it in TabNavigator to fix issues with its widgets not reacting to clicking #jira UE-21895 Change 2875984 on 2016/02/22 by Michael.Schoell Split output struct pins will no longer give a warning about override pins being removed. #jira UE-27150 - Format Text nodes and split nodes reporting warning that override pins are removed. Change 2876169 on 2016/02/22 by Ben.Marsh Changes to support building UHT plugins with the binary release. * Add source code and target files for UHT to binary distribution * Fix UBT deleting build products if we're only compiling a single module. * Fix UBT exception setting up compile environment when a module doesn't have any source files set to build. * Include DLL import libraries for UHT in the build * Add support for compiling UHT modules in BuildPluginCommand. Stages an empty host project to allow UHT to load any enabled plugins. Change 2876219 on 2016/02/22 by Rolando.Caloca UE4.11 - Integration from 2874609 #jira UE-24967 PC: Update D3D12 RHI - Implement _RenderThread versions of Create, Lock and Unlock Index/Vertex Buffer. Only synchronize threads on Readback - Limit GPU starvation on CPU bound scenarios by flushing work when the GPU is idle - Change texture streaming system to correctly account for placed textures. Also fix texture sizes so they accurately represent the real size of the allocation the GPU. - Disable API shader blobs - Add the ability to easily change allocation stategy for a given pool, also add a simple linear allocator and a 'Multi-Buddy Allocator' for efficiency in different scenarios - Pool Fences to prevent creation and destruction every frame when using Async Compute - Implement _RenderThread versions of CreateShaderResourceView and CreateUnorderedAccessView Change 2876232 on 2016/02/22 by Rolando.Caloca UE4.11 - Integration from 2876173 #jira UE-24967 PC: Update D3D12 RHI - Fix ResizeBuffers() failing due to dangling references to the backbuffer if deferred deletion is used. - Reorder when pending FRHIResources are deleted. This still needs to flush all pending deletes and ignore the deferred deletion queue otherwise some items may still be left in the engine's queue. - Fix UT build error due to missing FPlatformMisc::GetGPUDriverInfo() Change 2876366 on 2016/02/22 by Douglas.Copeland Adding Skeletal Meshes for Import Test Case #jira UE-24473 Change 2876401 on 2016/02/22 by Peter.Sauerbrei fix for WindowsClient build from UFE and Project Launcher #jira UE-23897 Change 2876456 on 2016/02/22 by Ben.Marsh Use a more hierarchical directory structure for packaged builds, rather than just dumping everything in the root. Now defaults to <Share>\\PackagedBuilds\\<Branch>\\<CL>\\<ProjectName>_<Platform>_<Configuration>. Change 2876507 on 2016/02/22 by Nick.Shin use HOME (osx) and USERPROFILE (windows) on appropriate target platform #jira UE-26414 -- Mac is missing .emscripten file necessary for packaging or launching onto HTML5 Change 2876537 on 2016/02/22 by Dan.Oconnor Removed dubious fix for an old bug, no longer needed but I havn't figured out what has changed. This fixes a crash on Replace References, but does not reintroduce UE-9497 #jira UE-24891 Change 2876545 on 2016/02/22 by Chad.Taylor SteamVR camera late-update fix #jira UE-27254 Change 2876825 on 2016/02/22 by Dan.Oconnor Unfortunate edge case in lifetime of UEdGraph's schema, schema is assigned after construction so its modification is in the undo buffer, and we clear it after undoing. #jira UE-25956 Change 2876878 on 2016/02/22 by Nick.Whiting PSVR HMD Server support #jira UE-27262 [CL 2905127 by Matthew Griffin in Main branch]
2016-03-11 09:55:03 -05:00
// Silently skip InvalidOperationExceptions here, because it depends on the process still running. It may have terminated.
string ProcessName;
try
{
ProcessName = KillCandidate.ProcessName;
}
catch(InvalidOperationException)
{
continue;
}
// Check if it's still running
HashSet<int> VisitedPids = new HashSet<int>();
if (ProcessManager.CanBeKilled(ProcessName) && IsOurDescendant(ProcessToCheck, KillCandidate.Id, VisitedPids))
{
CommandUtils.LogLog("Descendant pid={0}, name={1}", KillCandidate.Id, ProcessName);
return true;
}
}
return false;
}
public void StopProcess(bool KillDescendants = true)
{
if (Proc != null)
{
Process ProcToKill = null;
// At this point any call to Proc memebers will result in an exception
// so null the object.
var ProcToKillName = GetProcessName();
lock (ProcSyncObject)
{
ProcToKill = Proc;
Proc = null;
}
// Now actually kill the process and all its descendants if requested
if (KillDescendants)
{
KillAllDescendants(ProcToKill);
}
try
{
ProcToKill.Kill();
ProcToKill.WaitForExit(60000);
if (!ProcToKill.HasExited)
{
CommandUtils.LogLog("Process {0} failed to exit.", ProcToKillName);
}
else
{
CommandUtils.LogLog("Process {0} successfully exited.", ProcToKillName);
OnProcessExited();
}
ProcToKill.Close();
}
catch (Exception Ex)
{
CommandUtils.LogWarning("Exception while trying to kill process {0}:", ProcToKillName);
CommandUtils.LogWarning(LogUtils.FormatException(Ex));
}
}
}
}
#endregion
public partial class CommandUtils
{
#region Statistics
private static Dictionary<string, int> ExeToTimeInMs = new Dictionary<string, int>();
public static void AddRunTime(string Exe, int TimeInMs)
{
string Base = Path.GetFileName(Exe);
if (!ExeToTimeInMs.ContainsKey(Base))
{
ExeToTimeInMs.Add(Base, TimeInMs);
}
else
{
ExeToTimeInMs[Base] += TimeInMs;
}
}
public static void PrintRunTime()
{
foreach (var Item in ExeToTimeInMs)
{
LogVerbose("Run: Total {0}s to run " + Item.Key, Item.Value / 1000);
}
ExeToTimeInMs.Clear();
}
#endregion
[Flags]
public enum ERunOptions
{
None = 0,
AllowSpew = 1 << 0,
AppMustExist = 1 << 1,
NoWaitForExit = 1 << 2,
NoStdOutRedirect = 1 << 3,
NoLoggingOfRunCommand = 1 << 4,
UTF8Output = 1 << 5,
/// When specified with AllowSpew, the output will be TraceEventType.Verbose instead of TraceEventType.Information
SpewIsVerbose = 1 << 6,
Summary: running UAT from VS is simpler and faster. UEB-261 - Ensure that compiling AutomationTool in VS will compile all other Automation Projects * Just set AutomationTool as your startup project and pass the command to execute. * VS will build the script modules at build time, instead of every time at runtime. * To make this happen, "UBT.exe -ProjectFiles" now generates a companion AutomationTool.csproj.References that make AutomationTool depend on all Automation modules. * AutomationTool.exe defaults to not building script modules at runtime. Pass -compile if you want to dynamically build them. * Without the .references file, AutomationTool will only build itself and you will need to pass -compile. * RunUAT.bat still works that same, defaulting to runtime compilation and supporting -nocompile flag. It then passes -compile (or nothing) to AutomationTool. Other * All Automation projects target .Net 4.5. Some already were and had hard dependencies on them (Rocket and SyncGithub -> Octokit). Now that AutomationTool directly depends on them, everything had to use .Net 4.5. * Decoupled logic for -NoCompile and -NoCompileEditor. The flags are still confusing, but -NoCompile is no longer linked to -NoCompileEditor. * Had to leave in stub support in UAT for -NoCompile else RunUAT.bat passes it along and UAT complains that it doesn't understand it. * Added a CommandUtils.Run option to support run command, but still output the run duration. * Reduced the verbosity when UAT.proj is run from dozens of lines per module to a single Module -> Output line. It was looking like there were problems, but it was just msbuild spew. #codereview:ben.marsh [CL 2615060 by Wes Hunt in Main branch]
2015-07-09 10:15:37 -04:00
/// <summary>
/// If NoLoggingOfRunCommand is set, it normally suppresses the run duration output. This turns it back on.
/// </summary>
LoggingOfRunDuration = 1 << 7,
Default = AllowSpew | AppMustExist,
}
/// <summary>
/// Runs external program.
/// </summary>
/// <param name="App">Program filename.</param>
/// <param name="CommandLine">Commandline</param>
/// <param name="Input">Optional Input for the program (will be provided as stdin)</param>
/// <param name="Options">Defines the options how to run. See ERunOptions.</param>
/// <param name="Env">Environment to pass to program.</param>
/// <returns>Object containing the exit code of the program as well as it's stdout output.</returns>
public static ProcessResult Run(string App, string CommandLine = null, string Input = null, ERunOptions Options = ERunOptions.Default, Dictionary<string, string> Env = null)
{
App = ConvertSeparators(PathSeparator.Default, App);
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2959429) ========================== MAJOR FEATURES + CHANGES ========================== Change 2945275 on 2016/04/15 by Ben.Marsh BuildCommonTools: Stop forcing the DeleteBuildProducts flag to true; just respect the -Clean parameter from the command line. Change 2946668 on 2016/04/18 by Ben.Marsh EC: Prevent lookbehind for UBT error strings on Mac. Change 2952657 on 2016/04/22 by Ben.Marsh UGS: Require the user to explicitly choose to show *.uprojectdirs files, to discourage people from selecting the first thing they see in a synced branch. The uprojectdirs workflow is only used by Engine QA, but catches a lot of people out. Change 2954256 on 2016/04/25 by Ben.Marsh EC: Fix lines starting with error: and warning: being swallowed by the postprocessor. Also remove confusing 4 line look-behind on generic error and warning messages. Change 2954449 on 2016/04/25 by Ben.Marsh Use the original application name for log files (and for the prefix in stdout), rather than the application name after the host platform has modified it. Prevents UAT/UBT calls showing up with a "mono: " prefix on Mac, rather than "AutomationTool:" or "UnrealBuildTool:". Change 2955885 on 2016/04/26 by Ben.Marsh BuildGraph: Allow passing -Clean on the command line to propagate to UE4Build, impacting how targets are compiled as well as clearing the cached BuildGraph state. Add a second parameter, -ClearHistory, to just wipe the history of completed nodes. Change 2955919 on 2016/04/26 by Chad.Garyet Fixed timestamp resolution to check for two seconds instead of two ticks. This was causing mac builders to throw false positives on file changes Change 2956118 on 2016/04/26 by Ben.Marsh BuildGraph: Add support for conditional blocks in BuildGraph scripts, either with a simple condition, or picking from a list of options. Two new elements can be added anywhere in scripts: <Do If="..."> <!-- Inner elements --> </Do> <Choose> <Option If="..."> <!-- Inner elements --> </Option> <Option If="..."> <!-- Inner elements --> </Option> <Otherwise> <!-- Inner elements --> </Otherwise> </Choose> Change 2956792 on 2016/04/26 by Ben.Marsh EC: Prevent scheduled builds being queued up, and starting at times other than the times they're scheduled for. Prevents builds which have just been added to the stream settings from starting immediately, and prevents full builds starting during the day (as soon as the first change is made). Change 2957131 on 2016/04/26 by Ben.Marsh EC: Increase the precedence of the stack trace matcher. Change 2957419 on 2016/04/27 by Ben.Marsh EC: Skip the "end: stack for UAT" line in postp. Change 2957588 on 2016/04/27 by Ben.Marsh Core: Change formatting for callstacks for crashes and ensures so that EC can parse them from logs more easily. Change 2958047 on 2016/04/27 by Ben.Marsh BuildGraph: Feature to generate reports as part of build graph scripts. Reports operate similarly to triggers, but just provide a summary of completed jobsteps without offering to run a downstream job. Syntax is similar to declaring aggregates: <Report Name="Summary" Requires="Node1;Node2"/> Change 2958188 on 2016/04/27 by Ben.Marsh BuildGraph: Automatically generate a report when a preflight completes. Change 2959053 on 2016/04/28 by Ben.Marsh BuildGraph: Move the CleanTempStorage commandlet into BuildGraph, and add support for cleaning out new-style temp storage directories (which do not contain TempManifest files). Change 2959429 on 2016/04/28 by Ben.Marsh UAT: Add a script to describe a stream being copied up to its parent. To use, just run the UAT command "StreamCopyDescription -Stream=//UE4/Dev-Build". Optionally specify -Changes=//UE4/OtherStream/Engine/... #lockdown Nick.Penwarden [CL 2959583 by Ben Marsh in Main branch]
2016-04-28 14:13:21 -04:00
// Get the log name before allowing the platform to modify the app/command-line. We want mono apps to be written to a log named after the application and appear with the application prefix rather than "mono:".
string LogName = Path.GetFileNameWithoutExtension(App);
HostPlatform.Current.SetupOptionsForRun(ref App, ref Options, ref CommandLine);
if (App == "ectool" || App == "zip" || App == "xcodebuild")
{
Options &= ~ERunOptions.AppMustExist;
}
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3047776) #lockdown Nick.Penwarden #rb none ========================== MAJOR FEATURES + CHANGES ========================== Change 3021930 on 2016/06/21 by Ben.Marsh BuildGraph: Better diagnostic message if the source directory for copies does not exist. Change 3022391 on 2016/06/21 by Ben.Marsh Rework copy task slightly so that all code paths result in files being tagged. Change 3026592 on 2016/06/24 by Ben.Marsh BuildGraph: Add a ForEach element, which will assign a local property to each of a semicolon separated list of values, and expand the elements within it. Added an example in Properties.xml. Change 3028708 on 2016/06/27 by Matthew.Griffin Converting Engine build process to BuildGraph script Added Tag Receipts task to retrieve list of build products/dependencies from *.target files. Changed Pak File task so that you can specify an existing response file, rather than creating one from the file list. Changed base task so that you can resolve filespec from a list of file patterns if you already have them separated, which was the case with wildcards in runtime dependencies. Added EngineMajorVersion, EngineMinorVersion and EnginePatchVersion as default properties available to BuildGraph Added FinalizeInstalledBuild command to write out InstalledBuild.txt file and config entries for installed platforms Included .exe.config and exe.mdb files to build products of CsCompile task if they exist Added TagReferences option to CsCompile so that you can get any external references projects have that need to be included when staging Added RunOptions parameter to SpawnTask, so that you can specify these for the exe you want to run Added missing Runtime Dependency for ICU on Mac Change 3030209 on 2016/06/28 by Matthew.Griffin Renamed EngineBuild.xml to InstalledEngineBuild.xml to make its purpose more clear. Removed reference to xcodeunlock.sh from Mac Installed build dependencies as the file itself has been deleted. Added myself to list of notifiers for failures in the UE4 Binary build. Change 3034068 on 2016/06/30 by Ben.Marsh BuildGraph: Change scoping rules for properties. Local properties can no longer shadow global properties with the same name (or vice versa), and local properties are always modified in the scope that they were first declared, rather than being re-declared in a narrower scope. Change 3034070 on 2016/06/30 by Ben.Marsh BuildGraph: Warn when referencing a property which is not defined, and add new attributes to the <Property> element to set the default value for a property if it's not already set, and validating that it's one of a list of valid values if it is (eg. <Property Name="WithWin64" Restrict="true;false" Default="false"/>). Change 3034110 on 2016/06/30 by Matthew.Griffin Updated Installed Build so that properties are consistently named Exceptions and that the right versions are used Added Filter and Exception properties for each target platform to add any files that can't be figured out via dependencies Added Default values for various properties used across Engine build scripts - IsReleaseBranch, IsPreflight, OutputDir, BuildLabel, WithWin64 etc. Tagged Generated Includes from each target so that they can be included in Installed Build Added additional Android architectures to Shipping build Changed SwarmCoordinator to build for Any CPU Removed Local HostPlatform property from DDC nodes Changed Installed Build target platforms to use Do blocks so that we only have to check With... property once Reordered stripping and signing process so that we use the Exception check in less places Change 3035499 on 2016/07/01 by Ben.Marsh BuildGraph: Remove the <Local> element, and just make all <Property> declarations scoped. Also add an error if a property is later declared in a parent scope, since the earlier assignment won't be visible to the later one. Change 3035520 on 2016/07/01 by Ben.Marsh BuildGraph: Add support for <, <=, >, >= operators in condition expressions. Change 3035666 on 2016/07/01 by Matthew.Griffin Added more parameters to Chunk and Label Build tasks Updated all remaining uses of Local to Property in Installed Build script Made sure Feature Packs use paths compatible with Mac and also changed the node to use a ForEach element Change 3037020 on 2016/07/04 by Matthew.Griffin Ensured that TempStorageFileList uses forward slashes as its path separators so that it's easily used on Mac and Windows Was causing the results of the Make Feature Packs node to be tagged using Windows style paths, meaning they would throw an error if you tried to copy them on Mac Change 3037052 on 2016/07/04 by Ben.Marsh Move FJsonValue::ErrorMessage into cpp file, since it depends on the log class defined in Json.h (which includes it). Change 3037283 on 2016/07/05 by Matthew.Griffin Removed EnterScope and LeaveScope from ReadGraphBody so that included files are treated as being in the same scope (allows use of properties across files) Change 3037547 on 2016/07/05 by Ben.Marsh UAT: Allow CommandUtils.Run() to check directories listed in the PATH environment variable for the executable before failing. Change 3037552 on 2016/07/05 by Ben.Marsh BuildGraph: Add an <Unzip> task, which extracts a zip file to an output directory. Change 3039109 on 2016/07/06 by Matthew.Griffin Moved tagging of UAT build products to the Installed Build step as it's the only thing that needs them Moved Strip and Sign filters to the filters file, made sure they're used for all operations and added stripping back to UE4Editor nodes Changed BuildPatchTool to be built in shipping mode Changed all C# projects to be compiled for AnyCPU as they ended up in different output folders otherwise Added all files referenced by C# projects to avoid having to filter them manually Changed filters to get files included for Linux closer to the old pattern Changed Build DDC command to ignore empty entries in FeaturePacks list, don't want to fail the process if a list begins with a ; Changed UE4Game to use shipping PhysX libs for Shipping builds Added glut32.dll as a Runtime Dependency for PhysX Added libsteam_api.so as a Runtime Dependency for Steamworks on Linux Change 3039676 on 2016/07/06 by Ben.Marsh Core: Move definitions for FORCEINLINE'd FMath functions into UnrealMathUtility. Prevents link errors if including one without the other. Change 3039681 on 2016/07/06 by Ben.Marsh Core: Move implementation of GetTypeHash(FTimespan) into CPP file, to remove implicit dependency on the inline implementation of GetTypeHash(int64) being included. Change 3039735 on 2016/07/06 by Ben.Marsh Core: Move USE_DELEGATE_TRYGETBOUNDFUNCTIONNAME into a separate header, so delegate headers can be included separately. Change 3039878 on 2016/07/06 by Ben.Marsh Core: Move FOperatorFunctionID out of TOperatorJumpTable to allow MSVC to compile it and catch errors before the template is instantiated. Change 3040156 on 2016/07/06 by Ben.Marsh Core: Move FDateTime::GetTypeHash() into cpp file to eliminate dependency on TypeHash.h being included before it. Change 3041009 on 2016/07/07 by Matthew.Griffin Changed UE4Game to only use shipping PhysX libraries on Windows Change 3041015 on 2016/07/07 by Leigh.Swift UBT: Support creating C# programs that will be included in the UE4.sln Programs list. To have your program listed, remove the sln file that may have been created for you, and add a file named "UE4CSharp.prog" next to your csproj file. Change 3041234 on 2016/07/07 by Matthew.Griffin Added building of Launcher Samples to BuildGraph system Added Command to Build Sample projects, which distills to temp directory, builds DDC if needed and then chunks/posts to MCP Change 3041244 on 2016/07/07 by Ben.Marsh Core: Change PlatformIncludes.h to include all the individual PlatformMemory.h, PlatformTime.h, etc... headers rather than including separate per-platform headers which include them all. Makes it much easier to optimize header file usage, and eliminates redundant typedefs in the individual Platform*.h files. Also fixes some headers that previously didn't compile. Change 3042518 on 2016/07/08 by Matthew.Griffin Added content modifiers to those notified about Sample failures Throw exception if RocketPromoteBuild tries to promote all samples Throw exceptions for missing parameters in BuildLauncherSample command, corrected EngineDir parameter name. Change 3042545 on 2016/07/08 by Ben.Marsh Core: Push/Pop defines for MAX_uint8, MAX_uint16, MAX_uint32, MAX_int32 around Windows.h includes, so we don't need to be careful about the order in which we include NumericLimits.h. Change 3042546 on 2016/07/08 by Ben.Marsh Core: Put standard CRT includes into their own header, so we can include it without taking all of PlatformIncludes.h (and make any platform-specific additions as needed) Change 3042548 on 2016/07/08 by Ben.Marsh Core: Include PlatformCompilerSetup headers from Platform.h, as well as all the defaults for non-platform overriden defines. Allows including Platform.h to get all the basic types, defines and compile environment set up without having to include a large number of system headers or unnecessary functionality. Change 3044424 on 2016/07/11 by Ben.Marsh Merge fixes for QFE installer (CL 3044412) from 4.11 branch. Change 3044584 on 2016/07/11 by Ben.Marsh Core: Move FMath::FormatIntToHumanReadable() to UnrealMath.cpp, since it's a very large/expensive function to try to inline (and introduce a FString dependency for) Change 3044603 on 2016/07/11 by Matthew.Griffin Added PS4 and XboxOne to installed build as options that will always be disabled by default Standardised some of the agent names Removed logging from the Installed Build nodes as it takes a huge amount of time to write out the list for little reward Change 3044608 on 2016/07/11 by Ben.Marsh Core: Split out definition of SIMD VectorRegister class into its own header, so it's not forcibly included with UnrealMathUtility. Change 3044638 on 2016/07/11 by Matthew.Griffin Added internal build jobs for all games with compile, cook and package nodes. Added Documentation, Localization and NonUnity steps. Change 3045959 on 2016/07/12 by Matthew.Griffin Removed Aggregates from Installed Build script as they weren't used/necessary. Change 3045961 on 2016/07/12 by Matthew.Griffin Fixed various issues with Full Build Switch to build non-client/server configurations for some games Included PS4 and Xbox game targets in our internal monolithics aggregate Added Requirements for steps that need UHT, SCW etc. Added list of Packaged Game Nodes that we can build up as they're defined Added targets that were previously in the Internal Tools nodes Changed APIDocTool to build Release as that's what the solution uses and made use of the path created for it Removed -clean from the NonUnity targets as that doesn't actually build anything Changed mail notifications so that individual nodes are used for content modifiers, not every preceeding node too Change 3047068 on 2016/07/12 by Ben.Marsh BuildGraph: Reduce the amount of log output when compiling a C# project; use /verbosity:minimal and /nolog, as Visual Studio does. Change 3047298 on 2016/07/12 by Ben.Marsh EC: Add a workspace setting specifying that it should be synced incrementally. Change 3047626 on 2016/07/13 by Matthew.Griffin Added PackageToNetwork property, which will default to false, which determines whether to put staged builds on the P: drive or within the LocalBuilds folder of the root dir Also changed WorldExplorers to use P:/Builds/Friday instead of WEX, as no one is now clearing up the WEX folder regularly Change 3047762 on 2016/07/13 by Matthew.Griffin Added -nodebuginfo to all compile tasks with -precompile to reduce the size of libs produced Added plugin intermediates to list of files excluded from installed build [CL 3047809 by Ben Marsh in Main branch]
2016-07-13 09:16:28 -04:00
// Check if the application exists, including the PATH directories.
if (Options.HasFlag(ERunOptions.AppMustExist) && !FileExists(Options.HasFlag(ERunOptions.NoLoggingOfRunCommand) ? true : false, App))
{
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 3047776) #lockdown Nick.Penwarden #rb none ========================== MAJOR FEATURES + CHANGES ========================== Change 3021930 on 2016/06/21 by Ben.Marsh BuildGraph: Better diagnostic message if the source directory for copies does not exist. Change 3022391 on 2016/06/21 by Ben.Marsh Rework copy task slightly so that all code paths result in files being tagged. Change 3026592 on 2016/06/24 by Ben.Marsh BuildGraph: Add a ForEach element, which will assign a local property to each of a semicolon separated list of values, and expand the elements within it. Added an example in Properties.xml. Change 3028708 on 2016/06/27 by Matthew.Griffin Converting Engine build process to BuildGraph script Added Tag Receipts task to retrieve list of build products/dependencies from *.target files. Changed Pak File task so that you can specify an existing response file, rather than creating one from the file list. Changed base task so that you can resolve filespec from a list of file patterns if you already have them separated, which was the case with wildcards in runtime dependencies. Added EngineMajorVersion, EngineMinorVersion and EnginePatchVersion as default properties available to BuildGraph Added FinalizeInstalledBuild command to write out InstalledBuild.txt file and config entries for installed platforms Included .exe.config and exe.mdb files to build products of CsCompile task if they exist Added TagReferences option to CsCompile so that you can get any external references projects have that need to be included when staging Added RunOptions parameter to SpawnTask, so that you can specify these for the exe you want to run Added missing Runtime Dependency for ICU on Mac Change 3030209 on 2016/06/28 by Matthew.Griffin Renamed EngineBuild.xml to InstalledEngineBuild.xml to make its purpose more clear. Removed reference to xcodeunlock.sh from Mac Installed build dependencies as the file itself has been deleted. Added myself to list of notifiers for failures in the UE4 Binary build. Change 3034068 on 2016/06/30 by Ben.Marsh BuildGraph: Change scoping rules for properties. Local properties can no longer shadow global properties with the same name (or vice versa), and local properties are always modified in the scope that they were first declared, rather than being re-declared in a narrower scope. Change 3034070 on 2016/06/30 by Ben.Marsh BuildGraph: Warn when referencing a property which is not defined, and add new attributes to the <Property> element to set the default value for a property if it's not already set, and validating that it's one of a list of valid values if it is (eg. <Property Name="WithWin64" Restrict="true;false" Default="false"/>). Change 3034110 on 2016/06/30 by Matthew.Griffin Updated Installed Build so that properties are consistently named Exceptions and that the right versions are used Added Filter and Exception properties for each target platform to add any files that can't be figured out via dependencies Added Default values for various properties used across Engine build scripts - IsReleaseBranch, IsPreflight, OutputDir, BuildLabel, WithWin64 etc. Tagged Generated Includes from each target so that they can be included in Installed Build Added additional Android architectures to Shipping build Changed SwarmCoordinator to build for Any CPU Removed Local HostPlatform property from DDC nodes Changed Installed Build target platforms to use Do blocks so that we only have to check With... property once Reordered stripping and signing process so that we use the Exception check in less places Change 3035499 on 2016/07/01 by Ben.Marsh BuildGraph: Remove the <Local> element, and just make all <Property> declarations scoped. Also add an error if a property is later declared in a parent scope, since the earlier assignment won't be visible to the later one. Change 3035520 on 2016/07/01 by Ben.Marsh BuildGraph: Add support for <, <=, >, >= operators in condition expressions. Change 3035666 on 2016/07/01 by Matthew.Griffin Added more parameters to Chunk and Label Build tasks Updated all remaining uses of Local to Property in Installed Build script Made sure Feature Packs use paths compatible with Mac and also changed the node to use a ForEach element Change 3037020 on 2016/07/04 by Matthew.Griffin Ensured that TempStorageFileList uses forward slashes as its path separators so that it's easily used on Mac and Windows Was causing the results of the Make Feature Packs node to be tagged using Windows style paths, meaning they would throw an error if you tried to copy them on Mac Change 3037052 on 2016/07/04 by Ben.Marsh Move FJsonValue::ErrorMessage into cpp file, since it depends on the log class defined in Json.h (which includes it). Change 3037283 on 2016/07/05 by Matthew.Griffin Removed EnterScope and LeaveScope from ReadGraphBody so that included files are treated as being in the same scope (allows use of properties across files) Change 3037547 on 2016/07/05 by Ben.Marsh UAT: Allow CommandUtils.Run() to check directories listed in the PATH environment variable for the executable before failing. Change 3037552 on 2016/07/05 by Ben.Marsh BuildGraph: Add an <Unzip> task, which extracts a zip file to an output directory. Change 3039109 on 2016/07/06 by Matthew.Griffin Moved tagging of UAT build products to the Installed Build step as it's the only thing that needs them Moved Strip and Sign filters to the filters file, made sure they're used for all operations and added stripping back to UE4Editor nodes Changed BuildPatchTool to be built in shipping mode Changed all C# projects to be compiled for AnyCPU as they ended up in different output folders otherwise Added all files referenced by C# projects to avoid having to filter them manually Changed filters to get files included for Linux closer to the old pattern Changed Build DDC command to ignore empty entries in FeaturePacks list, don't want to fail the process if a list begins with a ; Changed UE4Game to use shipping PhysX libs for Shipping builds Added glut32.dll as a Runtime Dependency for PhysX Added libsteam_api.so as a Runtime Dependency for Steamworks on Linux Change 3039676 on 2016/07/06 by Ben.Marsh Core: Move definitions for FORCEINLINE'd FMath functions into UnrealMathUtility. Prevents link errors if including one without the other. Change 3039681 on 2016/07/06 by Ben.Marsh Core: Move implementation of GetTypeHash(FTimespan) into CPP file, to remove implicit dependency on the inline implementation of GetTypeHash(int64) being included. Change 3039735 on 2016/07/06 by Ben.Marsh Core: Move USE_DELEGATE_TRYGETBOUNDFUNCTIONNAME into a separate header, so delegate headers can be included separately. Change 3039878 on 2016/07/06 by Ben.Marsh Core: Move FOperatorFunctionID out of TOperatorJumpTable to allow MSVC to compile it and catch errors before the template is instantiated. Change 3040156 on 2016/07/06 by Ben.Marsh Core: Move FDateTime::GetTypeHash() into cpp file to eliminate dependency on TypeHash.h being included before it. Change 3041009 on 2016/07/07 by Matthew.Griffin Changed UE4Game to only use shipping PhysX libraries on Windows Change 3041015 on 2016/07/07 by Leigh.Swift UBT: Support creating C# programs that will be included in the UE4.sln Programs list. To have your program listed, remove the sln file that may have been created for you, and add a file named "UE4CSharp.prog" next to your csproj file. Change 3041234 on 2016/07/07 by Matthew.Griffin Added building of Launcher Samples to BuildGraph system Added Command to Build Sample projects, which distills to temp directory, builds DDC if needed and then chunks/posts to MCP Change 3041244 on 2016/07/07 by Ben.Marsh Core: Change PlatformIncludes.h to include all the individual PlatformMemory.h, PlatformTime.h, etc... headers rather than including separate per-platform headers which include them all. Makes it much easier to optimize header file usage, and eliminates redundant typedefs in the individual Platform*.h files. Also fixes some headers that previously didn't compile. Change 3042518 on 2016/07/08 by Matthew.Griffin Added content modifiers to those notified about Sample failures Throw exception if RocketPromoteBuild tries to promote all samples Throw exceptions for missing parameters in BuildLauncherSample command, corrected EngineDir parameter name. Change 3042545 on 2016/07/08 by Ben.Marsh Core: Push/Pop defines for MAX_uint8, MAX_uint16, MAX_uint32, MAX_int32 around Windows.h includes, so we don't need to be careful about the order in which we include NumericLimits.h. Change 3042546 on 2016/07/08 by Ben.Marsh Core: Put standard CRT includes into their own header, so we can include it without taking all of PlatformIncludes.h (and make any platform-specific additions as needed) Change 3042548 on 2016/07/08 by Ben.Marsh Core: Include PlatformCompilerSetup headers from Platform.h, as well as all the defaults for non-platform overriden defines. Allows including Platform.h to get all the basic types, defines and compile environment set up without having to include a large number of system headers or unnecessary functionality. Change 3044424 on 2016/07/11 by Ben.Marsh Merge fixes for QFE installer (CL 3044412) from 4.11 branch. Change 3044584 on 2016/07/11 by Ben.Marsh Core: Move FMath::FormatIntToHumanReadable() to UnrealMath.cpp, since it's a very large/expensive function to try to inline (and introduce a FString dependency for) Change 3044603 on 2016/07/11 by Matthew.Griffin Added PS4 and XboxOne to installed build as options that will always be disabled by default Standardised some of the agent names Removed logging from the Installed Build nodes as it takes a huge amount of time to write out the list for little reward Change 3044608 on 2016/07/11 by Ben.Marsh Core: Split out definition of SIMD VectorRegister class into its own header, so it's not forcibly included with UnrealMathUtility. Change 3044638 on 2016/07/11 by Matthew.Griffin Added internal build jobs for all games with compile, cook and package nodes. Added Documentation, Localization and NonUnity steps. Change 3045959 on 2016/07/12 by Matthew.Griffin Removed Aggregates from Installed Build script as they weren't used/necessary. Change 3045961 on 2016/07/12 by Matthew.Griffin Fixed various issues with Full Build Switch to build non-client/server configurations for some games Included PS4 and Xbox game targets in our internal monolithics aggregate Added Requirements for steps that need UHT, SCW etc. Added list of Packaged Game Nodes that we can build up as they're defined Added targets that were previously in the Internal Tools nodes Changed APIDocTool to build Release as that's what the solution uses and made use of the path created for it Removed -clean from the NonUnity targets as that doesn't actually build anything Changed mail notifications so that individual nodes are used for content modifiers, not every preceeding node too Change 3047068 on 2016/07/12 by Ben.Marsh BuildGraph: Reduce the amount of log output when compiling a C# project; use /verbosity:minimal and /nolog, as Visual Studio does. Change 3047298 on 2016/07/12 by Ben.Marsh EC: Add a workspace setting specifying that it should be synced incrementally. Change 3047626 on 2016/07/13 by Matthew.Griffin Added PackageToNetwork property, which will default to false, which determines whether to put staged builds on the P: drive or within the LocalBuilds folder of the root dir Also changed WorldExplorers to use P:/Builds/Friday instead of WEX, as no one is now clearing up the WEX folder regularly Change 3047762 on 2016/07/13 by Matthew.Griffin Added -nodebuginfo to all compile tasks with -precompile to reduce the size of libs produced Added plugin intermediates to list of files excluded from installed build [CL 3047809 by Ben Marsh in Main branch]
2016-07-13 09:16:28 -04:00
bool bExistsInPath = false;
if(!App.Contains(Path.DirectorySeparatorChar) && !App.Contains(Path.AltDirectorySeparatorChar))
{
string[] PathDirectories = Environment.GetEnvironmentVariable("PATH").Split(Path.PathSeparator);
foreach(string PathDirectory in PathDirectories)
{
string TryApp = Path.Combine(PathDirectory, App);
if(FileExists(Options.HasFlag(ERunOptions.NoLoggingOfRunCommand), TryApp))
{
App = TryApp;
bExistsInPath = true;
break;
}
}
}
if(!bExistsInPath)
{
throw new AutomationException("BUILD FAILED: Couldn't find the executable to Run: {0}", App);
}
}
var StartTime = DateTime.UtcNow;
UnrealBuildTool.LogEventType SpewVerbosity = Options.HasFlag(ERunOptions.SpewIsVerbose) ? UnrealBuildTool.LogEventType.Verbose : UnrealBuildTool.LogEventType.Console;
if (!Options.HasFlag(ERunOptions.NoLoggingOfRunCommand))
{
LogWithVerbosity(SpewVerbosity,"Run: " + App + " " + (String.IsNullOrEmpty(CommandLine) ? "" : CommandLine));
}
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2959429) ========================== MAJOR FEATURES + CHANGES ========================== Change 2945275 on 2016/04/15 by Ben.Marsh BuildCommonTools: Stop forcing the DeleteBuildProducts flag to true; just respect the -Clean parameter from the command line. Change 2946668 on 2016/04/18 by Ben.Marsh EC: Prevent lookbehind for UBT error strings on Mac. Change 2952657 on 2016/04/22 by Ben.Marsh UGS: Require the user to explicitly choose to show *.uprojectdirs files, to discourage people from selecting the first thing they see in a synced branch. The uprojectdirs workflow is only used by Engine QA, but catches a lot of people out. Change 2954256 on 2016/04/25 by Ben.Marsh EC: Fix lines starting with error: and warning: being swallowed by the postprocessor. Also remove confusing 4 line look-behind on generic error and warning messages. Change 2954449 on 2016/04/25 by Ben.Marsh Use the original application name for log files (and for the prefix in stdout), rather than the application name after the host platform has modified it. Prevents UAT/UBT calls showing up with a "mono: " prefix on Mac, rather than "AutomationTool:" or "UnrealBuildTool:". Change 2955885 on 2016/04/26 by Ben.Marsh BuildGraph: Allow passing -Clean on the command line to propagate to UE4Build, impacting how targets are compiled as well as clearing the cached BuildGraph state. Add a second parameter, -ClearHistory, to just wipe the history of completed nodes. Change 2955919 on 2016/04/26 by Chad.Garyet Fixed timestamp resolution to check for two seconds instead of two ticks. This was causing mac builders to throw false positives on file changes Change 2956118 on 2016/04/26 by Ben.Marsh BuildGraph: Add support for conditional blocks in BuildGraph scripts, either with a simple condition, or picking from a list of options. Two new elements can be added anywhere in scripts: <Do If="..."> <!-- Inner elements --> </Do> <Choose> <Option If="..."> <!-- Inner elements --> </Option> <Option If="..."> <!-- Inner elements --> </Option> <Otherwise> <!-- Inner elements --> </Otherwise> </Choose> Change 2956792 on 2016/04/26 by Ben.Marsh EC: Prevent scheduled builds being queued up, and starting at times other than the times they're scheduled for. Prevents builds which have just been added to the stream settings from starting immediately, and prevents full builds starting during the day (as soon as the first change is made). Change 2957131 on 2016/04/26 by Ben.Marsh EC: Increase the precedence of the stack trace matcher. Change 2957419 on 2016/04/27 by Ben.Marsh EC: Skip the "end: stack for UAT" line in postp. Change 2957588 on 2016/04/27 by Ben.Marsh Core: Change formatting for callstacks for crashes and ensures so that EC can parse them from logs more easily. Change 2958047 on 2016/04/27 by Ben.Marsh BuildGraph: Feature to generate reports as part of build graph scripts. Reports operate similarly to triggers, but just provide a summary of completed jobsteps without offering to run a downstream job. Syntax is similar to declaring aggregates: <Report Name="Summary" Requires="Node1;Node2"/> Change 2958188 on 2016/04/27 by Ben.Marsh BuildGraph: Automatically generate a report when a preflight completes. Change 2959053 on 2016/04/28 by Ben.Marsh BuildGraph: Move the CleanTempStorage commandlet into BuildGraph, and add support for cleaning out new-style temp storage directories (which do not contain TempManifest files). Change 2959429 on 2016/04/28 by Ben.Marsh UAT: Add a script to describe a stream being copied up to its parent. To use, just run the UAT command "StreamCopyDescription -Stream=//UE4/Dev-Build". Optionally specify -Changes=//UE4/OtherStream/Engine/... #lockdown Nick.Penwarden [CL 2959583 by Ben Marsh in Main branch]
2016-04-28 14:13:21 -04:00
ProcessResult Result = ProcessManager.CreateProcess(App, Options.HasFlag(ERunOptions.AllowSpew), LogName, Env, SpewVerbosity:SpewVerbosity);
Process Proc = Result.ProcessObject;
bool bRedirectStdOut = (Options & ERunOptions.NoStdOutRedirect) != ERunOptions.NoStdOutRedirect;
Proc.StartInfo.FileName = App;
Proc.StartInfo.Arguments = String.IsNullOrEmpty(CommandLine) ? "" : CommandLine;
Proc.StartInfo.UseShellExecute = false;
if (bRedirectStdOut)
{
Proc.StartInfo.RedirectStandardOutput = true;
Proc.StartInfo.RedirectStandardError = true;
Proc.OutputDataReceived += Result.StdOut;
Proc.ErrorDataReceived += Result.StdErr;
}
Proc.StartInfo.RedirectStandardInput = Input != null;
Proc.StartInfo.CreateNoWindow = true;
if ((Options & ERunOptions.UTF8Output) == ERunOptions.UTF8Output)
{
Proc.StartInfo.StandardOutputEncoding = new System.Text.UTF8Encoding(false, false);
}
Proc.Start();
if (bRedirectStdOut)
{
Proc.BeginOutputReadLine();
Proc.BeginErrorReadLine();
}
if (String.IsNullOrEmpty(Input) == false)
{
Proc.StandardInput.WriteLine(Input);
Proc.StandardInput.Close();
}
if (!Options.HasFlag(ERunOptions.NoWaitForExit))
{
Result.WaitForExit();
var BuildDuration = (DateTime.UtcNow - StartTime).TotalMilliseconds;
AddRunTime(App, (int)(BuildDuration));
Result.ExitCode = Proc.ExitCode;
Summary: running UAT from VS is simpler and faster. UEB-261 - Ensure that compiling AutomationTool in VS will compile all other Automation Projects * Just set AutomationTool as your startup project and pass the command to execute. * VS will build the script modules at build time, instead of every time at runtime. * To make this happen, "UBT.exe -ProjectFiles" now generates a companion AutomationTool.csproj.References that make AutomationTool depend on all Automation modules. * AutomationTool.exe defaults to not building script modules at runtime. Pass -compile if you want to dynamically build them. * Without the .references file, AutomationTool will only build itself and you will need to pass -compile. * RunUAT.bat still works that same, defaulting to runtime compilation and supporting -nocompile flag. It then passes -compile (or nothing) to AutomationTool. Other * All Automation projects target .Net 4.5. Some already were and had hard dependencies on them (Rocket and SyncGithub -> Octokit). Now that AutomationTool directly depends on them, everything had to use .Net 4.5. * Decoupled logic for -NoCompile and -NoCompileEditor. The flags are still confusing, but -NoCompile is no longer linked to -NoCompileEditor. * Had to leave in stub support in UAT for -NoCompile else RunUAT.bat passes it along and UAT complains that it doesn't understand it. * Added a CommandUtils.Run option to support run command, but still output the run duration. * Reduced the verbosity when UAT.proj is run from dozens of lines per module to a single Module -> Output line. It was looking like there were problems, but it was just msbuild spew. #codereview:ben.marsh [CL 2615060 by Wes Hunt in Main branch]
2015-07-09 10:15:37 -04:00
if (!Options.HasFlag(ERunOptions.NoLoggingOfRunCommand) || Options.HasFlag(ERunOptions.LoggingOfRunDuration))
{
LogWithVerbosity(SpewVerbosity,"Run: Took {0}s to run {1}, ExitCode={2}", BuildDuration / 1000, Path.GetFileName(App), Result.ExitCode);
}
Result.OnProcessExited();
Result.DisposeProcess();
}
else
{
Result.ExitCode = -1;
}
return Result;
}
/// <summary>
/// Gets a logfile name for a RunAndLog call
/// </summary>
/// <param name="Env">Environment to use.</param>
/// <param name="App">Executable to run</param>
/// <param name="LogName">Name of the logfile ( if null, executable name is used )</param>
/// <returns>The log file name.</returns>
public static string GetRunAndLogOnlyName(CommandEnvironment Env, string App, string LogName = null)
{
if (LogName == null)
{
LogName = Path.GetFileNameWithoutExtension(App);
}
return LogUtils.GetUniqueLogName(CombinePaths(Env.LogFolder, LogName));
}
/// <summary>
/// Runs external program and writes the output to a logfile.
/// </summary>
/// <param name="Env">Environment to use.</param>
/// <param name="App">Executable to run</param>
/// <param name="CommandLine">Commandline to pass on to the executable</param>
/// <param name="LogName">Name of the logfile ( if null, executable name is used )</param>
/// <param name="Input">Optional Input for the program (will be provided as stdin)</param>
/// <param name="Options">Defines the options how to run. See ERunOptions.</param>
public static void RunAndLog(CommandEnvironment Env, string App, string CommandLine, string LogName = null, int MaxSuccessCode = 0, string Input = null, ERunOptions Options = ERunOptions.Default, Dictionary<string, string> EnvVars = null)
{
RunAndLog(App, CommandLine, GetRunAndLogOnlyName(Env, App, LogName), MaxSuccessCode, Input, Options, EnvVars);
}
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
/// <summary>
/// Exception class for child process commands failing
/// </summary>
public class CommandFailedException : AutomationException
{
public CommandFailedException(string Message) : base(Message)
{
}
public CommandFailedException(ExitCode ExitCode, string Message) : base(ExitCode, Message)
{
}
}
/// <summary>
/// Runs external program and writes the output to a logfile.
/// </summary>
/// <param name="App">Executable to run</param>
/// <param name="CommandLine">Commandline to pass on to the executable</param>
/// <param name="Logfile">Full path to the logfile, where the application output should be written to.</param>
/// <param name="Input">Optional Input for the program (will be provided as stdin)</param>
/// <param name="Options">Defines the options how to run. See ERunOptions.</param>
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
public static string RunAndLog(string App, string CommandLine, string Logfile = null, int MaxSuccessCode = 0, string Input = null, ERunOptions Options = ERunOptions.Default, Dictionary<string, string> EnvVars = null)
{
ProcessResult Result = Run(App, CommandLine, Input, Options, EnvVars);
if (Result.Output.Length > 0 && Logfile != null)
{
WriteToFile(Logfile, Result.Output);
}
else if (Logfile == null)
{
Logfile = "[No logfile specified]";
}
else
{
Logfile = "[None!, no output produced]";
}
if (Result > MaxSuccessCode || Result < 0)
{
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
throw new CommandFailedException((ExitCode)Result.ExitCode, String.Format("Command failed (Result:{3}): {0} {1}. See logfile for details: '{2}' ",
App, CommandLine, Path.GetFileName(Logfile), Result.ExitCode));
}
if (Result.Output.Length > 0)
{
return Result.Output;
}
return "";
}
/// <summary>
/// Runs external program and writes the output to a logfile.
/// </summary>
/// <param name="App">Executable to run</param>
/// <param name="CommandLine">Commandline to pass on to the executable</param>
/// <param name="Logfile">Full path to the logfile, where the application output should be written to.</param>
/// <returns>Whether the program executed successfully or not.</returns>
public static string RunAndLog(string App, string CommandLine, out int SuccessCode, string Logfile = null, Dictionary<string, string> EnvVars = null)
{
ProcessResult Result = Run(App, CommandLine, Env: EnvVars);
SuccessCode = Result.ExitCode;
if (Result.Output.Length > 0 && Logfile != null)
{
WriteToFile(Logfile, Result.Output);
}
if (!String.IsNullOrEmpty(Result.Output))
{
return Result.Output;
}
return "";
}
/// <summary>
/// Runs external program and writes the output to a logfile.
/// </summary>
/// <param name="Env">Environment to use.</param>
/// <param name="App">Executable to run</param>
/// <param name="CommandLine">Commandline to pass on to the executable</param>
/// <param name="LogName">Name of the logfile ( if null, executable name is used )</param>
/// <returns>Whether the program executed successfully or not.</returns>
public static string RunAndLog(CommandEnvironment Env, string App, string CommandLine, out int SuccessCode, string LogName = null, Dictionary<string, string> EnvVars = null)
{
return RunAndLog(App, CommandLine, out SuccessCode, GetRunAndLogOnlyName(Env, App, LogName), EnvVars);
}
/// <summary>
/// Runs UAT recursively
/// </summary>
/// <param name="Env">Environment to use.</param>
/// <param name="CommandLine">Commandline to pass on to the executable</param>
public static string RunUAT(CommandEnvironment Env, string CommandLine)
{
Copying //UE4/Dev-Build to //UE4/Main ========================== MAJOR FEATURES + CHANGES ========================== Change 2864843 on 2016/02/12 by Ben.Marsh Add individual 'status', 'outcome', and 'error_code' fields to parsed jobsteps. Should fix grid view not being able to display 'pending' icons. Change 2865161 on 2016/02/12 by Ben.Marsh Stop storing a reference to UEBuildTarget from UEBuildModule. It creates an awkward cyclic data dependency, and makes it easy for people to write lazy code that just reaches into the internal state of the build. Change 2865643 on 2016/02/12 by Ben.Marsh Rename UEBuildModuleType to UHTModuleType, and move implementation into ExternalExecution. Change 2874408 on 2016/02/19 by Ben.Marsh Automatically sort nodes in the dashboard grid view by a weight derived from the node's order in the build graph, summed across all the jobs in which it was present. Change 2879572 on 2016/02/24 by Ben.Marsh Allow spoofing a Git merge from a given commit, using a changelist description containing the tag "git merge <branch> <changelist>", where <branch> is the name of a branch on Git (eg. master, 4.11, etc..), and <changelist> is the changelist being merged in. Change 2883216 on 2016/02/26 by Ben.Marsh Prevent Jira tickets being incorrectly updated with 'Main CL' fields which are after the 'Fix CL' fields. Change 2883755 on 2016/02/26 by Ben.Marsh Fix solution files having a Shipping configuration, even when -NoShippingConfigs is passed on the command line. Change 2886223 on 2016/02/29 by Ben.Marsh Ignore SignTool errors - we can recover from them. Change 2887414 on 2016/03/01 by Ben.Marsh Dump all the *.crash files produced while running commandlets, to make it easier to diagnose build system crashes cooking on Mac. Change 2888235 on 2016/03/01 by Ben.Marsh Add overloads for methods in FileFilter which take FileReference and DirectoryReference objects. Change 2889602 on 2016/03/02 by Ben.Marsh Treat shaders as code in UGS. Don't sync them as part of content-only syncs, and don't allow syncing past them without updated binaries. Change 2889610 on 2016/03/02 by Ben.Marsh Fix setting for using incremental builds not being saved. Also hide command to do incremental builds if the 'use incremental builds' option is not checked. Change 2891866 on 2016/03/03 by Matthew.Griffin Removed Rocket specific batch files and made sure installed build won't try to include them Removed last use of RocketGenerateProjectFiles.sh by using UBT directly instead Change 2893349 on 2016/03/03 by Ben.Marsh Add derived ReplicatedBranch to support mirroring the VR editor branch to GitHub. Change 2894703 on 2016/03/04 by Ben.Marsh Include *.usf when looking for the last code changelist. Also update version to 1.68. Change 2897991 on 2016/03/07 by Ben.Marsh Copy the changelist number to the clipboard when the user presses Ctrl-C. Update version number to 1.69. Change 2898005 on 2016/03/07 by Ben.Marsh Minor changes to support BuildGraph: * UE4Build now has a static function that can update version files. * Adding FileReference/DirectoryReference methods to FileFilter and CommandUtils. * FileFilter treats any pattern containing a slash as implictly starting from the root directory, unless it begins with "...". Change 2898095 on 2016/03/07 by Ben.Marsh UAT - Don't retry builds if we're using local executor; we don't encounter failures due to timeouts. Change 2898248 on 2016/03/07 by Ben.Marsh UBT - Add the standard game include paths back in to plugin modules. Existing game code relies on this. Change 2898615 on 2016/03/08 by Matthew.Griffin Removed last uses of RunningRocket function All seemed to be overly cautious about people using an Installed build to do non standard things, don't see any ill effects in the most common circumstances. Change 2898681 on 2016/03/08 by Matthew.Griffin Removed Automation.RunningRocket function as there are no more uses Changed the majority of comments referencing Rocket mode that are now either about the engine being installed or from the Launcher etc. #lockdown Nick.Penwarden [CL 2898813 by Matthew Griffin in Main branch]
2016-03-08 09:00:48 -05:00
// We want to redirect the output from recursive UAT calls into our normal log folder, but prefix everything with a unique identifier. To do so, we set the EnvVarNames.LogFolder environment
// variable to a subfolder of it, then copy its contents into the main folder with a prefix after it's finished. Start by finding a base name we can use to identify the output of this run.
string BaseLogSubdir = "Recur";
if (!String.IsNullOrEmpty(CommandLine))
{
int Space = CommandLine.IndexOf(" ");
if (Space > 0)
{
BaseLogSubdir = BaseLogSubdir + "_" + CommandLine.Substring(0, Space);
}
else if (CommandLine.Contains("-profile"))
{
string PathToProfile = CommandLine.Substring(CommandLine.IndexOf('=') + 1);
BaseLogSubdir = BaseLogSubdir + "_" + (Path.GetFileNameWithoutExtension(PathToProfile));
}
else
{
BaseLogSubdir = BaseLogSubdir + "_" + CommandLine;
}
}
BaseLogSubdir = BaseLogSubdir.Trim();
Copying //UE4/Dev-Build to //UE4/Main ========================== MAJOR FEATURES + CHANGES ========================== Change 2864843 on 2016/02/12 by Ben.Marsh Add individual 'status', 'outcome', and 'error_code' fields to parsed jobsteps. Should fix grid view not being able to display 'pending' icons. Change 2865161 on 2016/02/12 by Ben.Marsh Stop storing a reference to UEBuildTarget from UEBuildModule. It creates an awkward cyclic data dependency, and makes it easy for people to write lazy code that just reaches into the internal state of the build. Change 2865643 on 2016/02/12 by Ben.Marsh Rename UEBuildModuleType to UHTModuleType, and move implementation into ExternalExecution. Change 2874408 on 2016/02/19 by Ben.Marsh Automatically sort nodes in the dashboard grid view by a weight derived from the node's order in the build graph, summed across all the jobs in which it was present. Change 2879572 on 2016/02/24 by Ben.Marsh Allow spoofing a Git merge from a given commit, using a changelist description containing the tag "git merge <branch> <changelist>", where <branch> is the name of a branch on Git (eg. master, 4.11, etc..), and <changelist> is the changelist being merged in. Change 2883216 on 2016/02/26 by Ben.Marsh Prevent Jira tickets being incorrectly updated with 'Main CL' fields which are after the 'Fix CL' fields. Change 2883755 on 2016/02/26 by Ben.Marsh Fix solution files having a Shipping configuration, even when -NoShippingConfigs is passed on the command line. Change 2886223 on 2016/02/29 by Ben.Marsh Ignore SignTool errors - we can recover from them. Change 2887414 on 2016/03/01 by Ben.Marsh Dump all the *.crash files produced while running commandlets, to make it easier to diagnose build system crashes cooking on Mac. Change 2888235 on 2016/03/01 by Ben.Marsh Add overloads for methods in FileFilter which take FileReference and DirectoryReference objects. Change 2889602 on 2016/03/02 by Ben.Marsh Treat shaders as code in UGS. Don't sync them as part of content-only syncs, and don't allow syncing past them without updated binaries. Change 2889610 on 2016/03/02 by Ben.Marsh Fix setting for using incremental builds not being saved. Also hide command to do incremental builds if the 'use incremental builds' option is not checked. Change 2891866 on 2016/03/03 by Matthew.Griffin Removed Rocket specific batch files and made sure installed build won't try to include them Removed last use of RocketGenerateProjectFiles.sh by using UBT directly instead Change 2893349 on 2016/03/03 by Ben.Marsh Add derived ReplicatedBranch to support mirroring the VR editor branch to GitHub. Change 2894703 on 2016/03/04 by Ben.Marsh Include *.usf when looking for the last code changelist. Also update version to 1.68. Change 2897991 on 2016/03/07 by Ben.Marsh Copy the changelist number to the clipboard when the user presses Ctrl-C. Update version number to 1.69. Change 2898005 on 2016/03/07 by Ben.Marsh Minor changes to support BuildGraph: * UE4Build now has a static function that can update version files. * Adding FileReference/DirectoryReference methods to FileFilter and CommandUtils. * FileFilter treats any pattern containing a slash as implictly starting from the root directory, unless it begins with "...". Change 2898095 on 2016/03/07 by Ben.Marsh UAT - Don't retry builds if we're using local executor; we don't encounter failures due to timeouts. Change 2898248 on 2016/03/07 by Ben.Marsh UBT - Add the standard game include paths back in to plugin modules. Existing game code relies on this. Change 2898615 on 2016/03/08 by Matthew.Griffin Removed last uses of RunningRocket function All seemed to be overly cautious about people using an Installed build to do non standard things, don't see any ill effects in the most common circumstances. Change 2898681 on 2016/03/08 by Matthew.Griffin Removed Automation.RunningRocket function as there are no more uses Changed the majority of comments referencing Rocket mode that are now either about the engine being installed or from the Launcher etc. #lockdown Nick.Penwarden [CL 2898813 by Matthew Griffin in Main branch]
2016-03-08 09:00:48 -05:00
// Check if there are already log files which start with this prefix, and try to uniquify it if until there aren't.
int Index = 0;
string DirOnlyName = BaseLogSubdir;
string LogSubdir = CombinePaths(CmdEnv.LogFolder, DirOnlyName, "");
while (true)
{
var ExistingFiles = FindFiles(DirOnlyName + "*", false, CmdEnv.LogFolder);
if (ExistingFiles.Length == 0)
{
break;
}
Index++;
if (Index == 1000)
{
throw new AutomationException("Couldn't seem to create a log subdir {0}", LogSubdir);
}
DirOnlyName = String.Format("{0}_{1}_", BaseLogSubdir, Index);
LogSubdir = CombinePaths(CmdEnv.LogFolder, DirOnlyName, "");
}
Copying //UE4/Dev-Build to //UE4/Main ========================== MAJOR FEATURES + CHANGES ========================== Change 2864843 on 2016/02/12 by Ben.Marsh Add individual 'status', 'outcome', and 'error_code' fields to parsed jobsteps. Should fix grid view not being able to display 'pending' icons. Change 2865161 on 2016/02/12 by Ben.Marsh Stop storing a reference to UEBuildTarget from UEBuildModule. It creates an awkward cyclic data dependency, and makes it easy for people to write lazy code that just reaches into the internal state of the build. Change 2865643 on 2016/02/12 by Ben.Marsh Rename UEBuildModuleType to UHTModuleType, and move implementation into ExternalExecution. Change 2874408 on 2016/02/19 by Ben.Marsh Automatically sort nodes in the dashboard grid view by a weight derived from the node's order in the build graph, summed across all the jobs in which it was present. Change 2879572 on 2016/02/24 by Ben.Marsh Allow spoofing a Git merge from a given commit, using a changelist description containing the tag "git merge <branch> <changelist>", where <branch> is the name of a branch on Git (eg. master, 4.11, etc..), and <changelist> is the changelist being merged in. Change 2883216 on 2016/02/26 by Ben.Marsh Prevent Jira tickets being incorrectly updated with 'Main CL' fields which are after the 'Fix CL' fields. Change 2883755 on 2016/02/26 by Ben.Marsh Fix solution files having a Shipping configuration, even when -NoShippingConfigs is passed on the command line. Change 2886223 on 2016/02/29 by Ben.Marsh Ignore SignTool errors - we can recover from them. Change 2887414 on 2016/03/01 by Ben.Marsh Dump all the *.crash files produced while running commandlets, to make it easier to diagnose build system crashes cooking on Mac. Change 2888235 on 2016/03/01 by Ben.Marsh Add overloads for methods in FileFilter which take FileReference and DirectoryReference objects. Change 2889602 on 2016/03/02 by Ben.Marsh Treat shaders as code in UGS. Don't sync them as part of content-only syncs, and don't allow syncing past them without updated binaries. Change 2889610 on 2016/03/02 by Ben.Marsh Fix setting for using incremental builds not being saved. Also hide command to do incremental builds if the 'use incremental builds' option is not checked. Change 2891866 on 2016/03/03 by Matthew.Griffin Removed Rocket specific batch files and made sure installed build won't try to include them Removed last use of RocketGenerateProjectFiles.sh by using UBT directly instead Change 2893349 on 2016/03/03 by Ben.Marsh Add derived ReplicatedBranch to support mirroring the VR editor branch to GitHub. Change 2894703 on 2016/03/04 by Ben.Marsh Include *.usf when looking for the last code changelist. Also update version to 1.68. Change 2897991 on 2016/03/07 by Ben.Marsh Copy the changelist number to the clipboard when the user presses Ctrl-C. Update version number to 1.69. Change 2898005 on 2016/03/07 by Ben.Marsh Minor changes to support BuildGraph: * UE4Build now has a static function that can update version files. * Adding FileReference/DirectoryReference methods to FileFilter and CommandUtils. * FileFilter treats any pattern containing a slash as implictly starting from the root directory, unless it begins with "...". Change 2898095 on 2016/03/07 by Ben.Marsh UAT - Don't retry builds if we're using local executor; we don't encounter failures due to timeouts. Change 2898248 on 2016/03/07 by Ben.Marsh UBT - Add the standard game include paths back in to plugin modules. Existing game code relies on this. Change 2898615 on 2016/03/08 by Matthew.Griffin Removed last uses of RunningRocket function All seemed to be overly cautious about people using an Installed build to do non standard things, don't see any ill effects in the most common circumstances. Change 2898681 on 2016/03/08 by Matthew.Griffin Removed Automation.RunningRocket function as there are no more uses Changed the majority of comments referencing Rocket mode that are now either about the engine being installed or from the Launcher etc. #lockdown Nick.Penwarden [CL 2898813 by Matthew Griffin in Main branch]
2016-03-08 09:00:48 -05:00
// Get the stdout log file for this run, and create the subdirectory for all the other log output
string LogFile = CombinePaths(CmdEnv.LogFolder, DirOnlyName + ".log");
LogVerbose("Recursive UAT Run, in log folder {0}, main log file {1}", LogSubdir, LogFile);
CreateDirectory(LogSubdir);
Copying //UE4/Dev-Build to //UE4/Main ========================== MAJOR FEATURES + CHANGES ========================== Change 2864843 on 2016/02/12 by Ben.Marsh Add individual 'status', 'outcome', and 'error_code' fields to parsed jobsteps. Should fix grid view not being able to display 'pending' icons. Change 2865161 on 2016/02/12 by Ben.Marsh Stop storing a reference to UEBuildTarget from UEBuildModule. It creates an awkward cyclic data dependency, and makes it easy for people to write lazy code that just reaches into the internal state of the build. Change 2865643 on 2016/02/12 by Ben.Marsh Rename UEBuildModuleType to UHTModuleType, and move implementation into ExternalExecution. Change 2874408 on 2016/02/19 by Ben.Marsh Automatically sort nodes in the dashboard grid view by a weight derived from the node's order in the build graph, summed across all the jobs in which it was present. Change 2879572 on 2016/02/24 by Ben.Marsh Allow spoofing a Git merge from a given commit, using a changelist description containing the tag "git merge <branch> <changelist>", where <branch> is the name of a branch on Git (eg. master, 4.11, etc..), and <changelist> is the changelist being merged in. Change 2883216 on 2016/02/26 by Ben.Marsh Prevent Jira tickets being incorrectly updated with 'Main CL' fields which are after the 'Fix CL' fields. Change 2883755 on 2016/02/26 by Ben.Marsh Fix solution files having a Shipping configuration, even when -NoShippingConfigs is passed on the command line. Change 2886223 on 2016/02/29 by Ben.Marsh Ignore SignTool errors - we can recover from them. Change 2887414 on 2016/03/01 by Ben.Marsh Dump all the *.crash files produced while running commandlets, to make it easier to diagnose build system crashes cooking on Mac. Change 2888235 on 2016/03/01 by Ben.Marsh Add overloads for methods in FileFilter which take FileReference and DirectoryReference objects. Change 2889602 on 2016/03/02 by Ben.Marsh Treat shaders as code in UGS. Don't sync them as part of content-only syncs, and don't allow syncing past them without updated binaries. Change 2889610 on 2016/03/02 by Ben.Marsh Fix setting for using incremental builds not being saved. Also hide command to do incremental builds if the 'use incremental builds' option is not checked. Change 2891866 on 2016/03/03 by Matthew.Griffin Removed Rocket specific batch files and made sure installed build won't try to include them Removed last use of RocketGenerateProjectFiles.sh by using UBT directly instead Change 2893349 on 2016/03/03 by Ben.Marsh Add derived ReplicatedBranch to support mirroring the VR editor branch to GitHub. Change 2894703 on 2016/03/04 by Ben.Marsh Include *.usf when looking for the last code changelist. Also update version to 1.68. Change 2897991 on 2016/03/07 by Ben.Marsh Copy the changelist number to the clipboard when the user presses Ctrl-C. Update version number to 1.69. Change 2898005 on 2016/03/07 by Ben.Marsh Minor changes to support BuildGraph: * UE4Build now has a static function that can update version files. * Adding FileReference/DirectoryReference methods to FileFilter and CommandUtils. * FileFilter treats any pattern containing a slash as implictly starting from the root directory, unless it begins with "...". Change 2898095 on 2016/03/07 by Ben.Marsh UAT - Don't retry builds if we're using local executor; we don't encounter failures due to timeouts. Change 2898248 on 2016/03/07 by Ben.Marsh UBT - Add the standard game include paths back in to plugin modules. Existing game code relies on this. Change 2898615 on 2016/03/08 by Matthew.Griffin Removed last uses of RunningRocket function All seemed to be overly cautious about people using an Installed build to do non standard things, don't see any ill effects in the most common circumstances. Change 2898681 on 2016/03/08 by Matthew.Griffin Removed Automation.RunningRocket function as there are no more uses Changed the majority of comments referencing Rocket mode that are now either about the engine being installed or from the Launcher etc. #lockdown Nick.Penwarden [CL 2898813 by Matthew Griffin in Main branch]
2016-03-08 09:00:48 -05:00
// Run UAT with the log folder redirected through the environment
string App = CmdEnv.UATExe;
Log("Running {0} {1}", App, CommandLine);
var OSEnv = new Dictionary<string, string>();
OSEnv.Add(AutomationTool.EnvVarNames.LogFolder, LogSubdir);
OSEnv.Add("uebp_UATMutexNoWait", "1");
if (!IsBuildMachine)
{
OSEnv.Add(AutomationTool.EnvVarNames.LocalRoot, ""); // if we don't clear this out, it will think it is a build machine; it will rederive everything
}
ProcessResult Result = Run(App, CommandLine, null, ERunOptions.Default, OSEnv);
if (Result.Output.Length > 0)
{
WriteToFile(LogFile, Result.Output);
}
else
{
WriteToFile(LogFile, "[None!, no output produced]");
}
Copying //UE4/Dev-Build to //UE4/Main ========================== MAJOR FEATURES + CHANGES ========================== Change 2864843 on 2016/02/12 by Ben.Marsh Add individual 'status', 'outcome', and 'error_code' fields to parsed jobsteps. Should fix grid view not being able to display 'pending' icons. Change 2865161 on 2016/02/12 by Ben.Marsh Stop storing a reference to UEBuildTarget from UEBuildModule. It creates an awkward cyclic data dependency, and makes it easy for people to write lazy code that just reaches into the internal state of the build. Change 2865643 on 2016/02/12 by Ben.Marsh Rename UEBuildModuleType to UHTModuleType, and move implementation into ExternalExecution. Change 2874408 on 2016/02/19 by Ben.Marsh Automatically sort nodes in the dashboard grid view by a weight derived from the node's order in the build graph, summed across all the jobs in which it was present. Change 2879572 on 2016/02/24 by Ben.Marsh Allow spoofing a Git merge from a given commit, using a changelist description containing the tag "git merge <branch> <changelist>", where <branch> is the name of a branch on Git (eg. master, 4.11, etc..), and <changelist> is the changelist being merged in. Change 2883216 on 2016/02/26 by Ben.Marsh Prevent Jira tickets being incorrectly updated with 'Main CL' fields which are after the 'Fix CL' fields. Change 2883755 on 2016/02/26 by Ben.Marsh Fix solution files having a Shipping configuration, even when -NoShippingConfigs is passed on the command line. Change 2886223 on 2016/02/29 by Ben.Marsh Ignore SignTool errors - we can recover from them. Change 2887414 on 2016/03/01 by Ben.Marsh Dump all the *.crash files produced while running commandlets, to make it easier to diagnose build system crashes cooking on Mac. Change 2888235 on 2016/03/01 by Ben.Marsh Add overloads for methods in FileFilter which take FileReference and DirectoryReference objects. Change 2889602 on 2016/03/02 by Ben.Marsh Treat shaders as code in UGS. Don't sync them as part of content-only syncs, and don't allow syncing past them without updated binaries. Change 2889610 on 2016/03/02 by Ben.Marsh Fix setting for using incremental builds not being saved. Also hide command to do incremental builds if the 'use incremental builds' option is not checked. Change 2891866 on 2016/03/03 by Matthew.Griffin Removed Rocket specific batch files and made sure installed build won't try to include them Removed last use of RocketGenerateProjectFiles.sh by using UBT directly instead Change 2893349 on 2016/03/03 by Ben.Marsh Add derived ReplicatedBranch to support mirroring the VR editor branch to GitHub. Change 2894703 on 2016/03/04 by Ben.Marsh Include *.usf when looking for the last code changelist. Also update version to 1.68. Change 2897991 on 2016/03/07 by Ben.Marsh Copy the changelist number to the clipboard when the user presses Ctrl-C. Update version number to 1.69. Change 2898005 on 2016/03/07 by Ben.Marsh Minor changes to support BuildGraph: * UE4Build now has a static function that can update version files. * Adding FileReference/DirectoryReference methods to FileFilter and CommandUtils. * FileFilter treats any pattern containing a slash as implictly starting from the root directory, unless it begins with "...". Change 2898095 on 2016/03/07 by Ben.Marsh UAT - Don't retry builds if we're using local executor; we don't encounter failures due to timeouts. Change 2898248 on 2016/03/07 by Ben.Marsh UBT - Add the standard game include paths back in to plugin modules. Existing game code relies on this. Change 2898615 on 2016/03/08 by Matthew.Griffin Removed last uses of RunningRocket function All seemed to be overly cautious about people using an Installed build to do non standard things, don't see any ill effects in the most common circumstances. Change 2898681 on 2016/03/08 by Matthew.Griffin Removed Automation.RunningRocket function as there are no more uses Changed the majority of comments referencing Rocket mode that are now either about the engine being installed or from the Launcher etc. #lockdown Nick.Penwarden [CL 2898813 by Matthew Griffin in Main branch]
2016-03-08 09:00:48 -05:00
// Copy everything into the main log folder, using the prefix we decided on earlier.
LogVerbose("Flattening log folder {0}", LogSubdir);
var Files = FindFiles("*", true, LogSubdir);
string MyLogFolder = CombinePaths(CmdEnv.LogFolder, "");
foreach (var ThisFile in Files)
{
if (!ThisFile.StartsWith(MyLogFolder, StringComparison.InvariantCultureIgnoreCase))
{
throw new AutomationException("Can't rebase {0} because it doesn't start with {1}", ThisFile, MyLogFolder);
}
string NewFilename = ThisFile.Substring(MyLogFolder.Length).Replace("/", "_").Replace("\\", "_");
NewFilename = CombinePaths(CmdEnv.LogFolder, NewFilename);
if (FileExists_NoExceptions(NewFilename))
{
throw new AutomationException("Destination log file already exists? {0}", NewFilename);
}
CopyFile(ThisFile, NewFilename);
if (!FileExists_NoExceptions(NewFilename))
{
throw new AutomationException("Destination log file could not be copied {0}", NewFilename);
}
DeleteFile_NoExceptions(ThisFile);
}
DeleteDirectory_NoExceptions(LogSubdir);
if (Result != 0)
{
Copying //UE4/Dev-Build to //UE4/Dev-Main (Source: //UE4/Dev-Build @ 2982165) ========================== MAJOR FEATURES + CHANGES ========================== Change 2963214 on 2016/05/02 by Ben.Marsh BuildGraph: Allow specifying optional dependencies for a node, indicating that the build products from an upstream node are desired, but should not block the node from running. Change 2972295 on 2016/05/10 by Ben.Marsh EC: Remove spacing in notification emails to reduce size, and help prevent gmail from truncating messages. Also allow mailing notification emails when doing a dry run, and reading stream settings from another branch. Change 2976096 on 2016/05/12 by Ben.Marsh EC: Store properties for the last succeeded builds, including the list of users that were notified about it. Change 2976390 on 2016/05/12 by Ben.Marsh EC: Add a separate line to the notification email summary with a link to edit settings, and pass the missing ec-update parameter to set the last build status. Change 2976441 on 2016/05/12 by Ben.Marsh UAT: Remove log file copy on builders after UAT failure. This is done outside the EC step that originally did it now. Change 2976456 on 2016/05/12 by Ben.Marsh BuildGraph: Catch exceptions thrown by child processes failing when building or running UAT commands, and return failure normally without dumping callstacks. Change 2978440 on 2016/05/16 by Ben.Marsh EC: Age out entries from the "latest builds" list after a week. There's no obvious way to tell if a node has been removed, but a periodic cleanup should keep the build notifications list in check. Change 2979446 on 2016/05/16 by Ben.Marsh Rename ambiguous headers which exist with the same name in different paths. Change 2979839 on 2016/05/16 by Ben.Marsh UE4: Renaming HTML5 SocketSubsystem files to eliminate ambiguities. Change 2979852 on 2016/05/16 by Ben.Marsh UE4: Use explicit relative paths for public headers in PortalServiceInterfaces modules which do not have unique names Change 2980113 on 2016/05/17 by Ben.Marsh UE4: Fix include paths for HTML5 SocketSubsystem files. Change 2980117 on 2016/05/17 by Ben.Marsh UE4: Remove reference to private PCH from Oculus common code. Change 2980186 on 2016/05/17 by Ben.Marsh UAT: Add a -StopOnErrors parameter to UE4Build, which is propagated to XGE. Change 2980879 on 2016/05/17 by Ben.Marsh UE4: Fixup Lightmass to use LightmassPCH.h rather than stdafx.h Change 2981117 on 2016/05/17 by Ben.Marsh Portal: Use a unique name for the Portal PCH, rather than just calling it PrivatePCH.h Change 2981839 on 2016/05/18 by Ben.Marsh Replace ambiguous D3D11/D3D12 includes with direct includes for the current platform. #lockdown Nick.Penwarden [CL 2982178 by Ben Marsh in Main branch]
2016-05-18 13:26:45 -04:00
throw new CommandFailedException(String.Format("Recursive UAT Command failed (Result:{3}): {0} {1}. See logfile for details: '{2}' ",
App, CommandLine, Path.GetFileName(LogFile), Result.ExitCode));
}
return LogFile;
}
protected delegate bool ProcessLog(string LogText);
/// <summary>
/// Keeps reading a log file as it's being written to by another process until it exits.
/// </summary>
/// <param name="LogFilename">Name of the log file.</param>
/// <param name="LogProcess">Process that writes to the log file.</param>
/// <param name="OnLogRead">Callback used to process the recently read log contents.</param>
protected static void LogFileReaderProcess(string LogFilename, ProcessResult LogProcess, ProcessLog OnLogRead = null)
{
while (!FileExists(LogFilename) && !LogProcess.HasExited)
{
Log("Waiting for logging process to start...");
Thread.Sleep(2000);
}
Thread.Sleep(1000);
using (FileStream ProcessLog = File.Open(LogFilename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
StreamReader LogReader = new StreamReader(ProcessLog);
bool bKeepReading = true;
// Read until the process has exited.
while (!LogProcess.HasExited && bKeepReading)
{
while (!LogReader.EndOfStream && bKeepReading)
{
string Output = LogReader.ReadToEnd();
if (Output != null && OnLogRead != null)
{
bKeepReading = OnLogRead(Output);
}
}
while (LogReader.EndOfStream && !LogProcess.HasExited && bKeepReading)
{
Thread.Sleep(250);
// Tick the callback so that it can respond to external events
if (OnLogRead != null)
{
bKeepReading = OnLogRead(null);
}
}
}
}
}
}
}