2015-03-27 08:02:21 -04:00
// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved.
using System ;
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.IO ;
using AutomationTool ;
using UnrealBuildTool ;
namespace Rocket
{
public class RocketBuild : GUBP . GUBPNodeAdder
{
static readonly string [ ] CurrentTemplates =
{
"TP_FirstPerson" ,
"TP_FirstPersonBP" ,
"TP_Flying" ,
"TP_FlyingBP" ,
"TP_Rolling" ,
"TP_RollingBP" ,
"TP_SideScroller" ,
"TP_SideScrollerBP" ,
"TP_ThirdPerson" ,
"TP_ThirdPersonBP" ,
"TP_TopDown" ,
"TP_TopDownBP" ,
"TP_TwinStick" ,
"TP_TwinStickBP" ,
"TP_Vehicle" ,
"TP_VehicleBP" ,
"TP_Puzzle" ,
"TP_PuzzleBP" ,
"TP_2DSideScroller" ,
"TP_2DSideScrollerBP" ,
"TP_VehicleAdv" ,
"TP_VehicleAdvBP" ,
} ;
static readonly string [ ] CurrentFeaturePacks =
{
"FP_FirstPerson" ,
"FP_FirstPersonBP" ,
"TP_Flying" ,
"TP_FlyingBP" ,
"TP_Rolling" ,
"TP_RollingBP" ,
"TP_SideScroller" ,
"TP_SideScrollerBP" ,
"TP_ThirdPerson" ,
"TP_ThirdPersonBP" ,
"TP_TopDown" ,
"TP_TopDownBP" ,
"TP_TwinStick" ,
"TP_TwinStickBP" ,
"TP_Vehicle" ,
"TP_VehicleBP" ,
"TP_Puzzle" ,
"TP_PuzzleBP" ,
"TP_2DSideScroller" ,
"TP_2DSideScrollerBP" ,
"TP_VehicleAdv" ,
"TP_VehicleAdvBP" ,
"StarterContent" ,
"MobileStarterContent"
} ;
public RocketBuild ( )
{
}
public override void AddNodes ( GUBP bp , UnrealTargetPlatform HostPlatform )
{
if ( ! bp . BranchOptions . bNoInstalledEngine )
{
2015-04-10 13:56:50 -04:00
// Find all the target platforms for this host platform.
2015-03-27 08:02:21 -04:00
List < UnrealTargetPlatform > TargetPlatforms = GetTargetPlatforms ( bp , HostPlatform ) ;
2015-04-23 18:13:08 -04:00
// Get the temp directory for stripped files for this host
string StrippedDir = Path . GetFullPath ( CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , "Engine" , "Saved" , "Rocket" , HostPlatform . ToString ( ) ) ) ;
// Strip the host platform
if ( StripRocketNode . IsRequiredForPlatform ( HostPlatform ) )
{
bp . AddNode ( new StripRocketToolsNode ( HostPlatform , StrippedDir ) ) ;
bp . AddNode ( new StripRocketEditorNode ( HostPlatform , StrippedDir ) ) ;
}
2015-04-28 15:47:56 -04:00
// Strip all the target platforms that are built on this host
2015-04-23 18:13:08 -04:00
foreach ( UnrealTargetPlatform TargetPlatform in TargetPlatforms )
{
2015-04-28 15:47:56 -04:00
if ( GetSourceHostPlatform ( bp , HostPlatform , TargetPlatform ) = = HostPlatform & & StripRocketNode . IsRequiredForPlatform ( TargetPlatform ) )
2015-04-23 18:13:08 -04:00
{
2015-04-28 15:47:56 -04:00
bp . AddNode ( new StripRocketMonolithicsNode ( bp , HostPlatform , TargetPlatform , StrippedDir ) ) ;
2015-04-23 18:13:08 -04:00
}
}
2015-04-10 13:56:50 -04:00
// Build the DDC
bp . AddNode ( new BuildDerivedDataCacheNode ( HostPlatform , GetCookPlatforms ( HostPlatform , TargetPlatforms ) , CurrentFeaturePacks ) ) ;
// Generate a list of files that needs to be copied for each target platform
2015-04-28 15:47:56 -04:00
bp . AddNode ( new FilterRocketNode ( bp , HostPlatform , TargetPlatforms , CurrentFeaturePacks , CurrentTemplates ) ) ;
2015-04-10 13:56:50 -04:00
2015-04-25 10:33:07 -04:00
// Copy the install to the output directory
string LocalOutputDir = CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , "LocalBuilds" , "Rocket" , CommandUtils . GetGenericPlatformName ( HostPlatform ) ) ;
2015-04-28 15:47:56 -04:00
bp . AddNode ( new GatherRocketNode ( HostPlatform , TargetPlatforms , LocalOutputDir ) ) ;
2015-03-27 08:02:21 -04:00
// Add the aggregate node for the entire install
2015-04-10 13:56:50 -04:00
GUBP . GUBPNode PromotableNode = bp . FindNode ( GUBP . SharedAggregatePromotableNode . StaticGetFullName ( ) ) ;
PromotableNode . AddDependency ( FilterRocketNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-20 11:08:45 -04:00
PromotableNode . AddDependency ( BuildDerivedDataCacheNode . StaticGetFullName ( HostPlatform ) ) ;
2015-03-30 14:29:36 -04:00
// Add a node for GitHub promotions
if ( HostPlatform = = UnrealTargetPlatform . Win64 )
{
string GitConfigRelativePath = "Engine/Build/Git/UnrealBot.ini" ;
if ( CommandUtils . FileExists ( CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , GitConfigRelativePath ) ) )
{
bp . AddNode ( new BuildGitPromotable ( bp , HostPlatform , GitConfigRelativePath ) ) ;
2015-04-10 13:56:50 -04:00
PromotableNode . AddDependency ( BuildGitPromotable . StaticGetFullName ( HostPlatform ) ) ;
2015-03-30 14:29:36 -04:00
}
}
2015-04-23 13:26:28 -04:00
2015-04-25 10:33:07 -04:00
// Publish the install to the network
string RemoteOutputDir = CommandUtils . CombinePaths ( CommandUtils . RootSharedTempStorageDirectory ( ) , "Rocket" , "Automated" , GetBuildLabel ( ) , CommandUtils . GetGenericPlatformName ( HostPlatform ) ) ;
bp . AddNode ( new PublishRocketNode ( HostPlatform , LocalOutputDir , RemoteOutputDir ) ) ;
2015-04-28 15:47:56 -04:00
bp . AddNode ( new PublishRocketSymbolsNode ( bp , HostPlatform , TargetPlatforms , RemoteOutputDir + "Symbols" ) ) ;
2015-04-25 10:33:07 -04:00
2015-04-23 13:26:28 -04:00
// Add a dependency on this being published as part of the shared promotable being labeled
GUBP . SharedLabelPromotableSuccessNode LabelPromotableNode = ( GUBP . SharedLabelPromotableSuccessNode ) bp . FindNode ( GUBP . SharedLabelPromotableSuccessNode . StaticGetFullName ( ) ) ;
2015-04-25 10:33:07 -04:00
LabelPromotableNode . AddDependency ( PublishRocketNode . StaticGetFullName ( HostPlatform ) ) ;
LabelPromotableNode . AddDependency ( PublishRocketSymbolsNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-28 20:41:07 -04:00
// Add dependencies on a promotable to do these steps too
GUBP . WaitForSharedPromotionUserInput WaitForPromotionNode = ( GUBP . WaitForSharedPromotionUserInput ) bp . FindNode ( GUBP . WaitForSharedPromotionUserInput . StaticGetFullName ( true ) ) ;
WaitForPromotionNode . AddDependency ( PublishRocketNode . StaticGetFullName ( HostPlatform ) ) ;
WaitForPromotionNode . AddDependency ( PublishRocketSymbolsNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-28 20:46:43 -04:00
// Push everything behind the promotion triggers if we're doing things on the build machines
if ( ShouldDoSeriousThingsLikeP4CheckinAndPostToMCP ( ) | | bp . ParseParam ( "WithRocketPromotable" ) )
{
string WaitForTrigger = GUBP . WaitForSharedPromotionUserInput . StaticGetFullName ( false ) ;
GatherRocketNode GatherRocket = ( GatherRocketNode ) bp . FindNode ( GatherRocketNode . StaticGetFullName ( HostPlatform ) ) ;
GatherRocket . AddDependency ( WaitForTrigger ) ;
PublishRocketSymbolsNode PublishRocketSymbols = ( PublishRocketSymbolsNode ) bp . FindNode ( PublishRocketSymbolsNode . StaticGetFullName ( HostPlatform ) ) ;
PublishRocketSymbols . AddDependency ( WaitForTrigger ) ;
}
2015-03-27 08:02:21 -04:00
}
}
2015-04-10 13:56:50 -04:00
public static string GetBuildLabel ( )
{
return FEngineVersionSupport . FromVersionFile ( CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , @"Engine\Source\Runtime\Launch\Resources\Version.h" ) ) . ToString ( ) ;
}
2015-03-27 11:34:27 -04:00
public static List < UnrealTargetPlatform > GetTargetPlatforms ( GUBP bp , UnrealTargetPlatform HostPlatform )
2015-03-27 08:02:21 -04:00
{
List < UnrealTargetPlatform > TargetPlatforms = new List < UnrealTargetPlatform > ( ) ;
2015-04-16 11:49:34 -04:00
if ( ! bp . ParseParam ( "NoTargetPlatforms" ) )
2015-03-27 08:02:21 -04:00
{
2015-04-16 11:49:34 -04:00
// Always support the host platform
2015-03-27 08:02:21 -04:00
TargetPlatforms . Add ( HostPlatform ) ;
2015-04-16 11:49:34 -04:00
// Add other target platforms for each host platform
2015-03-27 08:02:21 -04:00
if ( HostPlatform = = UnrealTargetPlatform . Win64 )
{
TargetPlatforms . Add ( UnrealTargetPlatform . Win32 ) ;
}
2015-04-16 11:49:34 -04:00
if ( HostPlatform = = UnrealTargetPlatform . Win64 | | HostPlatform = = UnrealTargetPlatform . Mac )
2015-03-27 08:02:21 -04:00
{
TargetPlatforms . Add ( UnrealTargetPlatform . Android ) ;
}
2015-04-16 11:49:34 -04:00
if ( HostPlatform = = UnrealTargetPlatform . Win64 | | HostPlatform = = UnrealTargetPlatform . Mac )
2015-03-27 08:02:21 -04:00
{
TargetPlatforms . Add ( UnrealTargetPlatform . IOS ) ;
}
2015-04-16 11:49:34 -04:00
if ( HostPlatform = = UnrealTargetPlatform . Win64 )
2015-03-27 08:02:21 -04:00
{
TargetPlatforms . Add ( UnrealTargetPlatform . Linux ) ;
}
2015-04-21 15:42:57 -04:00
if ( HostPlatform = = UnrealTargetPlatform . Win64 | | HostPlatform = = UnrealTargetPlatform . Mac )
2015-03-27 08:02:21 -04:00
{
TargetPlatforms . Add ( UnrealTargetPlatform . HTML5 ) ;
}
2015-03-27 11:34:27 -04:00
2015-04-16 11:49:34 -04:00
// Remove any platforms that aren't available on this machine
2015-03-27 11:34:27 -04:00
TargetPlatforms . RemoveAll ( x = > ! bp . ActivePlatforms . Contains ( x ) ) ;
2015-04-16 11:49:34 -04:00
// Remove any platforms that aren't enabled on the command line
string TargetPlatformFilter = bp . ParseParamValue ( "TargetPlatforms" , null ) ;
if ( TargetPlatformFilter ! = null )
{
List < UnrealTargetPlatform > NewTargetPlatforms = new List < UnrealTargetPlatform > ( ) ;
foreach ( string TargetPlatformName in TargetPlatformFilter . Split ( new char [ ] { '+' } , StringSplitOptions . RemoveEmptyEntries ) )
{
UnrealTargetPlatform TargetPlatform ;
if ( ! Enum . TryParse ( TargetPlatformName , out TargetPlatform ) )
{
throw new AutomationException ( "Unknown target platform '{0}' specified on command line" ) ;
}
else if ( TargetPlatforms . Contains ( TargetPlatform ) )
{
NewTargetPlatforms . Add ( TargetPlatform ) ;
}
}
TargetPlatforms = NewTargetPlatforms ;
}
2015-03-27 08:02:21 -04:00
}
return TargetPlatforms ;
}
public static string GetCookPlatforms ( UnrealTargetPlatform HostPlatform , IEnumerable < UnrealTargetPlatform > TargetPlatforms )
{
// Always include the editor platform for cooking
List < string > CookPlatforms = new List < string > ( ) ;
CookPlatforms . Add ( Platform . Platforms [ HostPlatform ] . GetEditorCookPlatform ( ) ) ;
// Add all the target platforms
foreach ( UnrealTargetPlatform TargetPlatform in TargetPlatforms )
{
if ( TargetPlatform = = UnrealTargetPlatform . Android )
{
CookPlatforms . Add ( Platform . Platforms [ TargetPlatform ] . GetCookPlatform ( false , false , "ATC" ) ) ;
}
else
{
CookPlatforms . Add ( Platform . Platforms [ TargetPlatform ] . GetCookPlatform ( false , false , "" ) ) ;
}
}
return CommandUtils . CombineCommandletParams ( CookPlatforms . Distinct ( ) . ToArray ( ) ) ;
}
public static bool ShouldDoSeriousThingsLikeP4CheckinAndPostToMCP ( )
{
return CommandUtils . P4Enabled & & CommandUtils . AllowSubmit & & ! GUBP . bPreflightBuild ; // we don't do serious things in a preflight
}
public static UnrealTargetPlatform GetSourceHostPlatform ( GUBP bp , UnrealTargetPlatform HostPlatform , UnrealTargetPlatform TargetPlatform )
{
2015-04-21 15:42:57 -04:00
if ( TargetPlatform = = UnrealTargetPlatform . HTML5 & & HostPlatform = = UnrealTargetPlatform . Mac & & bp . HostPlatforms . Contains ( UnrealTargetPlatform . Win64 ) )
{
return UnrealTargetPlatform . Win64 ;
}
2015-03-27 08:02:21 -04:00
if ( TargetPlatform = = UnrealTargetPlatform . Android & & HostPlatform = = UnrealTargetPlatform . Mac & & bp . HostPlatforms . Contains ( UnrealTargetPlatform . Win64 ) )
{
return UnrealTargetPlatform . Win64 ;
}
if ( TargetPlatform = = UnrealTargetPlatform . IOS & & HostPlatform = = UnrealTargetPlatform . Win64 & & bp . HostPlatforms . Contains ( UnrealTargetPlatform . Mac ) )
{
return UnrealTargetPlatform . Mac ;
}
return HostPlatform ;
}
public static bool IsCodeTargetPlatform ( UnrealTargetPlatform HostPlatform , UnrealTargetPlatform TargetPlatform )
{
if ( TargetPlatform = = UnrealTargetPlatform . Linux )
{
return false ;
}
if ( HostPlatform = = UnrealTargetPlatform . Win64 & & TargetPlatform = = UnrealTargetPlatform . IOS )
{
return false ;
}
return true ;
}
}
2015-03-30 14:29:36 -04:00
public class BuildGitPromotable : GUBP . HostPlatformNode
{
string ConfigRelativePath ;
public BuildGitPromotable ( GUBP bp , UnrealTargetPlatform HostPlatform , string InConfigRelativePath ) : base ( HostPlatform )
{
ConfigRelativePath = InConfigRelativePath ;
foreach ( UnrealTargetPlatform OtherHostPlatform in bp . HostPlatforms )
{
AddDependency ( GUBP . RootEditorNode . StaticGetFullName ( OtherHostPlatform ) ) ;
AddDependency ( GUBP . ToolsNode . StaticGetFullName ( OtherHostPlatform ) ) ;
AddDependency ( GUBP . InternalToolsNode . StaticGetFullName ( OtherHostPlatform ) ) ;
}
}
public static string StaticGetFullName ( UnrealTargetPlatform HostPlatform )
{
return "BuildGitPromotable" + StaticGetHostPlatformSuffix ( HostPlatform ) ;
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform ) ;
}
public override void DoBuild ( GUBP bp )
{
// Create a filter for all the promoted binaries
FileFilter PromotableFilter = new FileFilter ( ) ;
2015-04-10 13:56:50 -04:00
PromotableFilter . AddRuleForFiles ( AllDependencyBuildProducts , CommandUtils . CmdEnv . LocalRoot , FileFilterType . Include ) ;
PromotableFilter . ReadRulesFromFile ( CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , ConfigRelativePath ) , "promotable" ) ;
PromotableFilter . ExcludeConfidentialFolders ( ) ;
2015-04-01 07:58:31 -04:00
2015-03-30 14:29:36 -04:00
// Copy everything that matches the filter to the promotion folder
string PromotableFolder = CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , "Engine" , "Saved" , "GitPromotable" ) ;
CommandUtils . DeleteDirectoryContents ( PromotableFolder ) ;
2015-04-10 13:56:50 -04:00
string [ ] PromotableFiles = CommandUtils . ThreadedCopyFiles ( CommandUtils . CmdEnv . LocalRoot , PromotableFolder , PromotableFilter , bIgnoreSymlinks : true ) ;
2015-03-30 14:29:36 -04:00
BuildProducts = new List < string > ( PromotableFiles ) ;
}
}
2015-04-23 18:13:08 -04:00
public abstract class StripRocketNode : GUBP . HostPlatformNode
2015-03-27 08:02:21 -04:00
{
2015-04-23 18:13:08 -04:00
public UnrealTargetPlatform TargetPlatform ;
public string StrippedDir ;
2015-04-24 20:29:44 -04:00
public List < string > NodesToStrip = new List < string > ( ) ;
2015-03-27 08:02:21 -04:00
2015-04-23 18:13:08 -04:00
public StripRocketNode ( UnrealTargetPlatform InHostPlatform , UnrealTargetPlatform InTargetPlatform , string InStrippedDir ) : base ( InHostPlatform )
2015-03-27 08:02:21 -04:00
{
2015-04-23 18:13:08 -04:00
TargetPlatform = InTargetPlatform ;
StrippedDir = InStrippedDir ;
2015-03-27 08:02:21 -04:00
}
2015-04-23 18:13:08 -04:00
public override abstract string GetFullName ( ) ;
2015-03-27 08:02:21 -04:00
2015-04-24 20:29:44 -04:00
public void AddNodeToStrip ( string NodeName )
{
NodesToStrip . Add ( NodeName ) ;
AddDependency ( NodeName ) ;
}
2015-04-23 18:13:08 -04:00
public static bool IsRequiredForPlatform ( UnrealTargetPlatform Platform )
2015-03-27 08:02:21 -04:00
{
2015-04-28 15:47:56 -04:00
return Platform ! = UnrealTargetPlatform . HTML5 ;
2015-03-27 08:02:21 -04:00
}
2015-04-10 13:56:50 -04:00
public override void DoBuild ( GUBP bp )
2015-03-27 08:02:21 -04:00
{
2015-04-10 13:56:50 -04:00
BuildProducts = new List < string > ( ) ;
2015-03-27 08:02:21 -04:00
2015-04-10 13:56:50 -04:00
string InputDir = Path . GetFullPath ( CommandUtils . CmdEnv . LocalRoot ) ;
string RulesFileName = CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , "Engine" , "Build" , "InstalledEngineFilters.ini" ) ;
2015-04-23 18:13:08 -04:00
// Read the filter for files on this platform
FileFilter StripFilter = new FileFilter ( ) ;
StripFilter . ReadRulesFromFile ( RulesFileName , "StripSymbols." + TargetPlatform . ToString ( ) , HostPlatform . ToString ( ) ) ;
// Apply the filter to the build products
List < string > SourcePaths = new List < string > ( ) ;
List < string > TargetPaths = new List < string > ( ) ;
2015-04-24 20:29:44 -04:00
foreach ( string NodeToStrip in NodesToStrip )
2015-03-27 08:02:21 -04:00
{
2015-04-24 20:29:44 -04:00
GUBP . GUBPNode Node = bp . FindNode ( NodeToStrip ) ;
foreach ( string DependencyBuildProduct in Node . BuildProducts )
2015-03-30 09:19:45 -04:00
{
2015-04-24 20:29:44 -04:00
string RelativePath = CommandUtils . StripBaseDirectory ( Path . GetFullPath ( DependencyBuildProduct ) , InputDir ) ;
if ( StripFilter . Matches ( RelativePath ) )
{
SourcePaths . Add ( CommandUtils . CombinePaths ( InputDir , RelativePath ) ) ;
TargetPaths . Add ( CommandUtils . CombinePaths ( StrippedDir , RelativePath ) ) ;
}
2015-03-30 09:19:45 -04:00
}
2015-03-27 08:02:21 -04:00
}
2015-04-23 18:13:08 -04:00
// Strip the files and add them to the build products
StripSymbols ( TargetPlatform , SourcePaths . ToArray ( ) , TargetPaths . ToArray ( ) ) ;
BuildProducts . AddRange ( TargetPaths ) ;
2015-04-10 13:56:50 -04:00
SaveRecordOfSuccessAndAddToBuildProducts ( ) ;
2015-03-27 08:02:21 -04:00
}
2015-03-27 11:34:27 -04:00
2015-04-10 13:56:50 -04:00
public static void StripSymbols ( UnrealTargetPlatform TargetPlatform , string [ ] SourceFileNames , string [ ] TargetFileNames )
2015-03-27 11:34:27 -04:00
{
2015-04-27 12:53:24 -04:00
IUEBuildPlatform Platform = UEBuildPlatform . GetBuildPlatform ( TargetPlatform ) ;
IUEToolChain ToolChain = UEToolChain . GetPlatformToolChain ( Platform . GetCPPTargetPlatform ( TargetPlatform ) ) ;
for ( int Idx = 0 ; Idx < SourceFileNames . Length ; Idx + + )
2015-03-27 11:34:27 -04:00
{
2015-04-27 12:53:24 -04:00
CommandUtils . CreateDirectory ( Path . GetDirectoryName ( TargetFileNames [ Idx ] ) ) ;
CommandUtils . Log ( "Stripping symbols: {0} -> {1}" , SourceFileNames [ Idx ] , TargetFileNames [ Idx ] ) ;
ToolChain . StripSymbols ( SourceFileNames [ Idx ] , TargetFileNames [ Idx ] ) ;
2015-03-27 11:34:27 -04:00
}
}
2015-03-27 08:02:21 -04:00
}
2015-04-23 18:13:08 -04:00
public class StripRocketToolsNode : StripRocketNode
{
public StripRocketToolsNode ( UnrealTargetPlatform InHostPlatform , string InStrippedDir )
: base ( InHostPlatform , InHostPlatform , InStrippedDir )
{
2015-04-24 20:29:44 -04:00
AddNodeToStrip ( GUBP . ToolsForCompileNode . StaticGetFullName ( HostPlatform ) ) ;
AddNodeToStrip ( GUBP . ToolsNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-23 18:13:08 -04:00
AgentSharingGroup = "ToolsGroup" + StaticGetHostPlatformSuffix ( InHostPlatform ) ;
}
public static string StaticGetFullName ( UnrealTargetPlatform InHostPlatform )
{
return "Strip" + GUBP . ToolsNode . StaticGetFullName ( InHostPlatform ) ;
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform ) ;
}
}
public class StripRocketEditorNode : StripRocketNode
{
public StripRocketEditorNode ( UnrealTargetPlatform InHostPlatform , string InStrippedDir )
: base ( InHostPlatform , InHostPlatform , InStrippedDir )
{
2015-04-24 20:29:44 -04:00
AddNodeToStrip ( GUBP . RootEditorNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-23 18:13:08 -04:00
AgentSharingGroup = "Editor" + StaticGetHostPlatformSuffix ( HostPlatform ) ;
}
public static string StaticGetFullName ( UnrealTargetPlatform InHostPlatform )
{
return "Strip" + GUBP . RootEditorNode . StaticGetFullName ( InHostPlatform ) ;
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform ) ;
}
}
public class StripRocketMonolithicsNode : StripRocketNode
{
BranchInfo . BranchUProject Project ;
bool bIsCodeTargetPlatform ;
2015-04-28 15:47:56 -04:00
public StripRocketMonolithicsNode ( GUBP bp , UnrealTargetPlatform InHostPlatform , UnrealTargetPlatform InTargetPlatform , string InStrippedDir ) : base ( InHostPlatform , InTargetPlatform , InStrippedDir )
2015-04-23 18:13:08 -04:00
{
2015-04-24 20:25:23 -04:00
Project = bp . Branch . BaseEngineProject ;
2015-04-28 15:47:56 -04:00
bIsCodeTargetPlatform = RocketBuild . IsCodeTargetPlatform ( InHostPlatform , InTargetPlatform ) ;
2015-04-23 18:13:08 -04:00
2015-04-24 20:25:23 -04:00
GUBP . GUBPNode Node = bp . FindNode ( GUBP . GamePlatformMonolithicsNode . StaticGetFullName ( HostPlatform , Project , InTargetPlatform , Precompiled : bIsCodeTargetPlatform ) ) ;
if ( String . IsNullOrEmpty ( Node . AgentSharingGroup ) )
{
Node . AgentSharingGroup = bp . Branch . BaseEngineProject . GameName + "_MonolithicsGroup_" + InTargetPlatform + StaticGetHostPlatformSuffix ( InHostPlatform ) ;
}
2015-04-24 20:29:44 -04:00
AddNodeToStrip ( Node . GetFullName ( ) ) ;
2015-04-23 18:13:08 -04:00
2015-04-24 20:25:23 -04:00
AgentSharingGroup = Node . AgentSharingGroup ;
2015-04-23 18:13:08 -04:00
}
2015-04-24 12:36:57 -04:00
public override string GetDisplayGroupName ( )
{
return Project . GameName + "_Monolithics" + ( bIsCodeTargetPlatform ? "_Precompiled" : "" ) ;
}
2015-04-23 18:13:08 -04:00
public static string StaticGetFullName ( UnrealTargetPlatform InHostPlatform , BranchInfo . BranchUProject InProject , UnrealTargetPlatform InTargetPlatform , bool bIsCodeTargetPlatform )
{
string Name = InProject . GameName + "_" + InTargetPlatform + "_Mono" ;
if ( bIsCodeTargetPlatform )
{
Name + = "_Precompiled" ;
}
return Name + "_Strip" + StaticGetHostPlatformSuffix ( InHostPlatform ) ;
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform , Project , TargetPlatform , bIsCodeTargetPlatform ) ;
}
}
2015-04-10 13:56:50 -04:00
public class FilterRocketNode : GUBP . HostPlatformNode
2015-03-27 08:02:21 -04:00
{
2015-04-10 13:56:50 -04:00
List < UnrealTargetPlatform > SourceHostPlatforms ;
List < UnrealTargetPlatform > TargetPlatforms ;
string [ ] CurrentFeaturePacks ;
string [ ] CurrentTemplates ;
public readonly string DepotManifestPath ;
2015-04-26 18:28:11 -04:00
public Dictionary < string , string > StrippedNodeManifestPaths = new Dictionary < string , string > ( ) ;
2015-03-27 08:02:21 -04:00
2015-04-28 15:47:56 -04:00
public FilterRocketNode ( GUBP bp , UnrealTargetPlatform InHostPlatform , List < UnrealTargetPlatform > InTargetPlatforms , string [ ] InCurrentFeaturePacks , string [ ] InCurrentTemplates )
2015-03-27 08:02:21 -04:00
: base ( InHostPlatform )
{
2015-04-10 13:56:50 -04:00
TargetPlatforms = new List < UnrealTargetPlatform > ( InTargetPlatforms ) ;
CurrentFeaturePacks = InCurrentFeaturePacks ;
CurrentTemplates = InCurrentTemplates ;
2015-04-26 18:28:11 -04:00
DepotManifestPath = CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , "Engine" , "Saved" , "Rocket" , HostPlatform . ToString ( ) , "Filter.txt" ) ;
2015-03-27 08:02:21 -04:00
2015-04-10 13:56:50 -04:00
// Add the editor
2015-03-27 08:02:21 -04:00
AddDependency ( GUBP . VersionFilesNode . StaticGetFullName ( ) ) ;
AddDependency ( GUBP . ToolsForCompileNode . StaticGetFullName ( HostPlatform ) ) ;
AddDependency ( GUBP . RootEditorNode . StaticGetFullName ( HostPlatform ) ) ;
AddDependency ( GUBP . ToolsNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-28 15:47:56 -04:00
// Add all the monolithic builds from their appropriate source host platform
2015-04-23 18:13:08 -04:00
foreach ( UnrealTargetPlatform TargetPlatform in TargetPlatforms )
2015-04-10 13:56:50 -04:00
{
2015-04-23 18:13:08 -04:00
UnrealTargetPlatform SourceHostPlatform = RocketBuild . GetSourceHostPlatform ( bp , HostPlatform , TargetPlatform ) ;
2015-04-28 15:47:56 -04:00
bool bIsCodeTargetPlatform = RocketBuild . IsCodeTargetPlatform ( SourceHostPlatform , TargetPlatform ) ;
2015-04-23 18:13:08 -04:00
AddDependency ( GUBP . GamePlatformMonolithicsNode . StaticGetFullName ( SourceHostPlatform , bp . Branch . BaseEngineProject , TargetPlatform , Precompiled : bIsCodeTargetPlatform ) ) ;
2015-04-28 15:47:56 -04:00
}
2015-04-23 18:13:08 -04:00
2015-04-28 15:47:56 -04:00
// Also add stripped symbols for all the target platforms that require it
List < string > StrippedNodeNames = new List < string > ( ) ;
foreach ( UnrealTargetPlatform TargetPlatform in TargetPlatforms )
{
2015-04-23 18:13:08 -04:00
if ( StripRocketNode . IsRequiredForPlatform ( TargetPlatform ) )
{
2015-04-28 15:47:56 -04:00
UnrealTargetPlatform SourceHostPlatform = RocketBuild . GetSourceHostPlatform ( bp , HostPlatform , TargetPlatform ) ;
string StripNode = StripRocketMonolithicsNode . StaticGetFullName ( SourceHostPlatform , bp . Branch . BaseEngineProject , TargetPlatform , RocketBuild . IsCodeTargetPlatform ( SourceHostPlatform , TargetPlatform ) ) ;
2015-04-23 18:13:08 -04:00
AddDependency ( StripNode ) ;
2015-04-26 18:28:11 -04:00
StrippedNodeNames . Add ( StripNode ) ;
2015-04-23 18:13:08 -04:00
}
2015-04-10 13:56:50 -04:00
}
// Add win64 tools on Mac, to get the win64 build of UBT, UAT and IPP
2015-03-27 08:02:21 -04:00
if ( HostPlatform = = UnrealTargetPlatform . Mac & & bp . HostPlatforms . Contains ( UnrealTargetPlatform . Win64 ) )
{
2015-04-10 13:56:50 -04:00
AddDependency ( GUBP . ToolsNode . StaticGetFullName ( UnrealTargetPlatform . Win64 ) ) ;
2015-03-27 08:02:21 -04:00
AddDependency ( GUBP . ToolsForCompileNode . StaticGetFullName ( UnrealTargetPlatform . Win64 ) ) ;
}
2015-04-10 13:56:50 -04:00
// Add all the feature packs
AddDependency ( GUBP . MakeFeaturePacksNode . StaticGetFullName ( GUBP . MakeFeaturePacksNode . GetDefaultBuildPlatform ( bp ) ) ) ;
// Find all the host platforms we need
SourceHostPlatforms = TargetPlatforms . Select ( x = > RocketBuild . GetSourceHostPlatform ( bp , HostPlatform , x ) ) . Distinct ( ) . ToList ( ) ;
if ( ! SourceHostPlatforms . Contains ( HostPlatform ) )
{
SourceHostPlatforms . Add ( HostPlatform ) ;
}
2015-04-23 18:13:08 -04:00
// Add the stripped host platforms
if ( StripRocketNode . IsRequiredForPlatform ( HostPlatform ) )
2015-04-10 13:56:50 -04:00
{
2015-04-23 18:13:08 -04:00
AddDependency ( StripRocketToolsNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-26 18:28:11 -04:00
StrippedNodeNames . Add ( StripRocketToolsNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-23 18:13:08 -04:00
AddDependency ( StripRocketEditorNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-26 18:28:11 -04:00
StrippedNodeNames . Add ( StripRocketEditorNode . StaticGetFullName ( HostPlatform ) ) ;
}
// Set all the stripped manifest paths
foreach ( string StrippedNodeName in StrippedNodeNames )
{
StrippedNodeManifestPaths . Add ( StrippedNodeName , Path . Combine ( Path . GetDirectoryName ( DepotManifestPath ) , "Filter_" + StrippedNodeName + ".txt" ) ) ;
2015-04-10 13:56:50 -04:00
}
2015-03-27 08:02:21 -04:00
}
public override int CISFrequencyQuantumShift ( GUBP bp )
{
2015-04-02 08:18:22 -04:00
return base . CISFrequencyQuantumShift ( bp ) + 2 ;
2015-03-27 08:02:21 -04:00
}
public static string StaticGetFullName ( UnrealTargetPlatform InHostPlatform )
{
2015-04-10 13:56:50 -04:00
return "FilterRocket" + StaticGetHostPlatformSuffix ( InHostPlatform ) ;
2015-03-27 08:02:21 -04:00
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform ) ;
}
public override void DoBuild ( GUBP bp )
{
2015-04-26 18:28:11 -04:00
BuildProducts = new List < string > ( ) ;
2015-03-27 08:02:21 -04:00
FileFilter Filter = new FileFilter ( ) ;
// Include all the editor products
2015-04-10 13:56:50 -04:00
AddRuleForBuildProducts ( Filter , bp , GUBP . ToolsForCompileNode . StaticGetFullName ( HostPlatform ) , FileFilterType . Include ) ;
AddRuleForBuildProducts ( Filter , bp , GUBP . RootEditorNode . StaticGetFullName ( HostPlatform ) , FileFilterType . Include ) ;
AddRuleForBuildProducts ( Filter , bp , GUBP . ToolsNode . StaticGetFullName ( HostPlatform ) , FileFilterType . Include ) ;
2015-03-27 08:02:21 -04:00
2015-04-27 12:57:52 -04:00
// Include win64 tools on Mac, to get the win64 build of UBT, UAT and IPP
if ( HostPlatform = = UnrealTargetPlatform . Mac & & bp . HostPlatforms . Contains ( UnrealTargetPlatform . Win64 ) )
{
AddRuleForBuildProducts ( Filter , bp , GUBP . ToolsNode . StaticGetFullName ( UnrealTargetPlatform . Win64 ) , FileFilterType . Include ) ;
AddRuleForBuildProducts ( Filter , bp , GUBP . ToolsForCompileNode . StaticGetFullName ( UnrealTargetPlatform . Win64 ) , FileFilterType . Include ) ;
}
2015-04-20 13:43:49 -04:00
// Include the editor headers
2015-04-27 12:57:52 -04:00
UnzipAndAddRuleForHeaders ( GUBP . RootEditorNode . StaticGetArchivedHeadersPath ( HostPlatform ) , Filter , FileFilterType . Include ) ;
2015-04-20 13:43:49 -04:00
2015-03-27 08:02:21 -04:00
// Include the build dependencies for every code platform
2015-04-28 15:47:56 -04:00
foreach ( UnrealTargetPlatform TargetPlatform in TargetPlatforms )
2015-03-27 08:02:21 -04:00
{
2015-04-28 15:47:56 -04:00
if ( RocketBuild . IsCodeTargetPlatform ( HostPlatform , TargetPlatform ) )
{
UnrealTargetPlatform SourceHostPlatform = RocketBuild . GetSourceHostPlatform ( bp , HostPlatform , TargetPlatform ) ;
string FileListPath = GUBP . GamePlatformMonolithicsNode . StaticGetBuildDependenciesPath ( SourceHostPlatform , bp . Branch . BaseEngineProject , TargetPlatform ) ;
Filter . AddRuleForFiles ( UnrealBuildTool . Utils . ReadClass < UnrealBuildTool . ExternalFileList > ( FileListPath ) . FileNames , CommandUtils . CmdEnv . LocalRoot , FileFilterType . Include ) ;
UnzipAndAddRuleForHeaders ( GUBP . GamePlatformMonolithicsNode . StaticGetArchivedHeadersPath ( SourceHostPlatform , bp . Branch . BaseEngineProject , TargetPlatform ) , Filter , FileFilterType . Include ) ;
}
2015-03-27 08:02:21 -04:00
}
// Add the monolithic binaries
2015-04-28 15:47:56 -04:00
foreach ( UnrealTargetPlatform TargetPlatform in TargetPlatforms )
2015-03-27 08:02:21 -04:00
{
2015-04-28 15:47:56 -04:00
UnrealTargetPlatform SourceHostPlatform = RocketBuild . GetSourceHostPlatform ( bp , HostPlatform , TargetPlatform ) ;
bool bIsCodeTargetPlatform = RocketBuild . IsCodeTargetPlatform ( SourceHostPlatform , TargetPlatform ) ;
AddRuleForBuildProducts ( Filter , bp , GUBP . GamePlatformMonolithicsNode . StaticGetFullName ( SourceHostPlatform , bp . Branch . BaseEngineProject , TargetPlatform , Precompiled : bIsCodeTargetPlatform ) , FileFilterType . Include ) ;
2015-03-27 08:02:21 -04:00
}
// Include the feature packs
foreach ( string CurrentFeaturePack in CurrentFeaturePacks )
{
BranchInfo . BranchUProject Project = bp . Branch . FindGameChecked ( CurrentFeaturePack ) ;
2015-04-10 13:56:50 -04:00
Filter . AddRuleForFile ( GUBP . MakeFeaturePacksNode . GetOutputFile ( Project ) , CommandUtils . CmdEnv . LocalRoot , FileFilterType . Include ) ;
2015-03-27 08:02:21 -04:00
}
// Include all the templates
foreach ( string Template in CurrentTemplates )
{
BranchInfo . BranchUProject Project = bp . Branch . FindGameChecked ( Template ) ;
2015-04-24 12:56:26 -04:00
Filter . Include ( "/" + Utils . StripBaseDirectory ( Path . GetDirectoryName ( Project . FilePath ) , CommandUtils . CmdEnv . LocalRoot ) . Replace ( '\\' , '/' ) + "/..." ) ;
2015-03-27 08:02:21 -04:00
}
2015-04-10 13:56:50 -04:00
// Include all the standard rules
2015-03-27 08:02:21 -04:00
string RulesFileName = CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , "Engine" , "Build" , "InstalledEngineFilters.ini" ) ;
2015-04-10 13:56:50 -04:00
Filter . ReadRulesFromFile ( RulesFileName , "CopyEditor" , HostPlatform . ToString ( ) ) ;
Filter . ReadRulesFromFile ( RulesFileName , "CopyTargetPlatforms" , HostPlatform . ToString ( ) ) ;
2015-03-27 08:02:21 -04:00
// Custom rules for each target platform
foreach ( UnrealTargetPlatform TargetPlaform in TargetPlatforms )
{
2015-03-27 11:34:27 -04:00
string SectionName = String . Format ( "CopyTargetPlatform.{0}" , TargetPlaform . ToString ( ) ) ;
2015-04-10 13:56:50 -04:00
Filter . ReadRulesFromFile ( RulesFileName , SectionName , HostPlatform . ToString ( ) ) ;
2015-03-27 08:02:21 -04:00
}
// Add the final exclusions for legal reasons.
2015-04-10 13:56:50 -04:00
Filter . ExcludeConfidentialPlatforms ( ) ;
Filter . ExcludeConfidentialFolders ( ) ;
2015-03-27 08:02:21 -04:00
2015-04-10 13:56:50 -04:00
// Run the filter on the stripped symbols, and remove those files from the copy filter
2015-04-26 18:28:11 -04:00
List < string > AllStrippedFiles = new List < string > ( ) ;
foreach ( KeyValuePair < string , string > StrippedNodeManifestPath in StrippedNodeManifestPaths )
2015-03-27 11:34:27 -04:00
{
2015-04-26 18:28:11 -04:00
List < string > StrippedFiles = new List < string > ( ) ;
StripRocketNode StripNode = ( StripRocketNode ) bp . FindNode ( StrippedNodeManifestPath . Key ) ;
2015-04-10 13:56:50 -04:00
foreach ( string BuildProduct in StripNode . BuildProducts )
{
if ( Utils . IsFileUnderDirectory ( BuildProduct , StripNode . StrippedDir ) )
{
string RelativePath = CommandUtils . StripBaseDirectory ( Path . GetFullPath ( BuildProduct ) , StripNode . StrippedDir ) ;
if ( Filter . Matches ( RelativePath ) )
{
StrippedFiles . Add ( RelativePath ) ;
2015-04-26 18:28:11 -04:00
AllStrippedFiles . Add ( RelativePath ) ;
2015-04-10 13:56:50 -04:00
Filter . Exclude ( "/" + RelativePath ) ;
}
}
}
2015-04-26 18:28:11 -04:00
WriteManifest ( StrippedNodeManifestPath . Value , StrippedFiles ) ;
BuildProducts . Add ( StrippedNodeManifestPath . Value ) ;
2015-03-27 11:34:27 -04:00
}
2015-04-10 13:56:50 -04:00
// Write the filtered list of depot files to disk, removing any symlinks
List < string > DepotFiles = Filter . ApplyToDirectory ( CommandUtils . CmdEnv . LocalRoot , true ) . ToList ( ) ;
WriteManifest ( DepotManifestPath , DepotFiles ) ;
2015-04-26 18:28:11 -04:00
BuildProducts . Add ( DepotManifestPath ) ;
2015-04-10 13:56:50 -04:00
// Sort the list of output files
SortedDictionary < string , bool > SortedFiles = new SortedDictionary < string , bool > ( StringComparer . InvariantCultureIgnoreCase ) ;
foreach ( string DepotFile in DepotFiles )
{
SortedFiles . Add ( DepotFile , false ) ;
}
2015-04-26 18:28:11 -04:00
foreach ( string StrippedFile in AllStrippedFiles )
2015-04-10 13:56:50 -04:00
{
SortedFiles . Add ( StrippedFile , true ) ;
}
// Write the list to the log
CommandUtils . Log ( "Files to be included in Rocket build:" ) ;
foreach ( KeyValuePair < string , bool > SortedFile in SortedFiles )
{
CommandUtils . Log ( " {0}{1}" , SortedFile . Key , SortedFile . Value ? " (stripped)" : "" ) ;
}
2015-03-27 08:02:21 -04:00
}
2015-04-10 13:56:50 -04:00
static void AddRuleForBuildProducts ( FileFilter Filter , GUBP bp , string NodeName , FileFilterType Type )
2015-03-27 08:02:21 -04:00
{
2015-04-10 13:56:50 -04:00
GUBP . GUBPNode Node = bp . FindNode ( NodeName ) ;
if ( Node = = null )
{
throw new AutomationException ( "Couldn't find node '{0}'" , NodeName ) ;
}
Filter . AddRuleForFiles ( Node . BuildProducts , CommandUtils . CmdEnv . LocalRoot , Type ) ;
2015-03-27 08:02:21 -04:00
}
2015-04-20 13:43:49 -04:00
static void UnzipAndAddRuleForHeaders ( string ZipFileName , FileFilter Filter , FileFilterType Type )
{
IEnumerable < string > FileNames = CommandUtils . UnzipFiles ( ZipFileName , CommandUtils . CmdEnv . LocalRoot ) ;
Filter . AddRuleForFiles ( FileNames , CommandUtils . CmdEnv . LocalRoot , FileFilterType . Include ) ;
}
2015-04-10 13:56:50 -04:00
public static void WriteManifest ( string FileName , IEnumerable < string > Files )
2015-03-27 08:02:21 -04:00
{
2015-04-10 13:56:50 -04:00
CommandUtils . CreateDirectory ( Path . GetDirectoryName ( FileName ) ) ;
CommandUtils . WriteAllLines ( FileName , Files . ToArray ( ) ) ;
}
}
2015-04-25 10:33:07 -04:00
public class GatherRocketNode : GUBP . HostPlatformNode
2015-04-10 13:56:50 -04:00
{
public readonly string OutputDir ;
2015-04-20 13:43:49 -04:00
public List < UnrealTargetPlatform > CodeTargetPlatforms ;
2015-04-10 13:56:50 -04:00
2015-04-26 18:28:11 -04:00
public GatherRocketNode ( UnrealTargetPlatform HostPlatform , List < UnrealTargetPlatform > InCodeTargetPlatforms , string InOutputDir ) : base ( HostPlatform )
2015-04-10 13:56:50 -04:00
{
OutputDir = InOutputDir ;
2015-04-20 13:43:49 -04:00
CodeTargetPlatforms = new List < UnrealTargetPlatform > ( InCodeTargetPlatforms ) ;
2015-04-10 13:56:50 -04:00
AddDependency ( FilterRocketNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-20 11:08:45 -04:00
AddDependency ( BuildDerivedDataCacheNode . StaticGetFullName ( HostPlatform ) ) ;
2015-04-25 10:33:07 -04:00
AgentSharingGroup = "RocketGroup" + StaticGetHostPlatformSuffix ( HostPlatform ) ;
2015-04-10 13:56:50 -04:00
}
public static string StaticGetFullName ( UnrealTargetPlatform HostPlatform )
{
2015-04-25 10:33:07 -04:00
return "GatherRocket" + StaticGetHostPlatformSuffix ( HostPlatform ) ;
2015-03-27 08:02:21 -04:00
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform ) ;
}
2015-04-10 13:56:50 -04:00
public override void DoBuild ( GUBP bp )
{
CommandUtils . DeleteDirectoryContents ( OutputDir ) ;
2015-04-20 13:43:49 -04:00
// Extract the editor headers
2015-04-27 22:28:19 -04:00
CommandUtils . UnzipFiles ( GUBP . RootEditorNode . StaticGetArchivedHeadersPath ( HostPlatform ) , CommandUtils . CmdEnv . LocalRoot ) ;
2015-04-20 13:43:49 -04:00
// Extract all the headers for code target platforms
foreach ( UnrealTargetPlatform CodeTargetPlatform in CodeTargetPlatforms )
{
UnrealTargetPlatform SourceHostPlatform = RocketBuild . GetSourceHostPlatform ( bp , HostPlatform , CodeTargetPlatform ) ;
string ZipFileName = GUBP . GamePlatformMonolithicsNode . StaticGetArchivedHeadersPath ( SourceHostPlatform , bp . Branch . BaseEngineProject , CodeTargetPlatform ) ;
CommandUtils . UnzipFiles ( ZipFileName , CommandUtils . CmdEnv . LocalRoot ) ;
}
2015-04-10 13:56:50 -04:00
// Copy the depot files to the output directory
FilterRocketNode FilterNode = ( FilterRocketNode ) bp . FindNode ( FilterRocketNode . StaticGetFullName ( HostPlatform ) ) ;
CopyManifestFilesToOutput ( FilterNode . DepotManifestPath , CommandUtils . CmdEnv . LocalRoot , OutputDir ) ;
2015-04-26 18:28:11 -04:00
// Copy the stripped files to the output directory
foreach ( KeyValuePair < string , string > StrippedManifestPath in FilterNode . StrippedNodeManifestPaths )
{
StripRocketNode StripNode = ( StripRocketNode ) bp . FindNode ( StrippedManifestPath . Key ) ;
CopyManifestFilesToOutput ( StrippedManifestPath . Value , StripNode . StrippedDir , OutputDir ) ;
}
2015-04-10 13:56:50 -04:00
2015-04-20 11:08:45 -04:00
// Copy the DDC to the output directory
BuildDerivedDataCacheNode DerivedDataCacheNode = ( BuildDerivedDataCacheNode ) bp . FindNode ( BuildDerivedDataCacheNode . StaticGetFullName ( HostPlatform ) ) ;
CopyManifestFilesToOutput ( DerivedDataCacheNode . SavedManifestPath , DerivedDataCacheNode . SavedDir , OutputDir ) ;
2015-04-15 15:00:33 -04:00
// Write the UE4CommandLine.txt file with the
string CommandLineFile = CommandUtils . CombinePaths ( OutputDir , "UE4CommandLine.txt" ) ;
CommandUtils . WriteAllText ( CommandLineFile , "-installedengine -rocket" ) ;
2015-04-10 13:56:50 -04:00
// Create a dummy build product
BuildProducts = new List < string > ( ) ;
SaveRecordOfSuccessAndAddToBuildProducts ( ) ;
}
static void CopyManifestFilesToOutput ( string ManifestPath , string InputDir , string OutputDir )
{
// Read the files from the manifest
CommandUtils . Log ( "Reading manifest: '{0}'" , ManifestPath ) ;
string [ ] Files = CommandUtils . ReadAllLines ( ManifestPath ) . Select ( x = > x . Trim ( ) ) . Where ( x = > x . Length > 0 ) . ToArray ( ) ;
// Create lists of source and target files
CommandUtils . Log ( "Preparing file lists..." ) ;
string [ ] SourceFiles = Files . Select ( x = > CommandUtils . CombinePaths ( InputDir , x ) ) . ToArray ( ) ;
string [ ] TargetFiles = Files . Select ( x = > CommandUtils . CombinePaths ( OutputDir , x ) ) . ToArray ( ) ;
// Copy everything
CommandUtils . ThreadedCopyFiles ( SourceFiles , TargetFiles ) ;
}
2015-03-27 08:02:21 -04:00
}
2015-04-25 10:33:07 -04:00
public class PublishRocketNode : GUBP . HostPlatformNode
{
string LocalDir ;
string PublishDir ;
public PublishRocketNode ( UnrealTargetPlatform HostPlatform , string InLocalDir , string InPublishDir ) : base ( HostPlatform )
{
LocalDir = InLocalDir ;
PublishDir = InPublishDir ;
AddDependency ( GatherRocketNode . StaticGetFullName ( HostPlatform ) ) ;
AgentSharingGroup = "RocketGroup" + StaticGetHostPlatformSuffix ( HostPlatform ) ;
}
public static string StaticGetFullName ( UnrealTargetPlatform HostPlatform )
{
return "PublishRocket" + StaticGetHostPlatformSuffix ( HostPlatform ) ;
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform ) ;
}
public override float Priority ( )
{
return - 10000.0f ; // Do this and PublishRocketSymbolsNode at the end
}
public override void DoBuild ( GUBP bp )
{
if ( RocketBuild . ShouldDoSeriousThingsLikeP4CheckinAndPostToMCP ( ) )
{
CommandUtils . ThreadedCopyFiles ( LocalDir , PublishDir ) ;
}
BuildProducts = new List < string > ( ) ;
SaveRecordOfSuccessAndAddToBuildProducts ( ) ;
}
}
public class PublishRocketSymbolsNode : GUBP . HostPlatformNode
2015-04-10 13:56:50 -04:00
{
string SymbolsOutputDir ;
2015-04-25 10:33:07 -04:00
public PublishRocketSymbolsNode ( GUBP bp , UnrealTargetPlatform HostPlatform , IEnumerable < UnrealTargetPlatform > TargetPlatforms , string InSymbolsOutputDir ) : base ( HostPlatform )
2015-04-10 13:56:50 -04:00
{
SymbolsOutputDir = InSymbolsOutputDir ;
2015-04-25 10:33:07 -04:00
AddDependency ( GUBP . WaitForSharedPromotionUserInput . StaticGetFullName ( false ) ) ;
2015-04-10 13:56:50 -04:00
AddDependency ( GUBP . ToolsForCompileNode . StaticGetFullName ( HostPlatform ) ) ;
AddDependency ( GUBP . RootEditorNode . StaticGetFullName ( HostPlatform ) ) ;
AddDependency ( GUBP . ToolsNode . StaticGetFullName ( HostPlatform ) ) ;
foreach ( UnrealTargetPlatform TargetPlatform in TargetPlatforms )
{
2015-04-28 15:47:56 -04:00
if ( HostPlatform = = RocketBuild . GetSourceHostPlatform ( bp , HostPlatform , TargetPlatform ) )
{
bool bIsCodeTargetPlatform = RocketBuild . IsCodeTargetPlatform ( HostPlatform , TargetPlatform ) ;
AddDependency ( GUBP . GamePlatformMonolithicsNode . StaticGetFullName ( HostPlatform , bp . Branch . BaseEngineProject , TargetPlatform , Precompiled : bIsCodeTargetPlatform ) ) ;
}
2015-04-10 13:56:50 -04:00
}
2015-04-25 10:33:07 -04:00
AgentSharingGroup = "RocketGroup" + StaticGetHostPlatformSuffix ( HostPlatform ) ;
2015-04-10 13:56:50 -04:00
}
public static string StaticGetFullName ( UnrealTargetPlatform HostPlatform )
{
2015-04-25 10:33:07 -04:00
return "PublishRocketSymbols" + StaticGetHostPlatformSuffix ( HostPlatform ) ;
2015-04-10 13:56:50 -04:00
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform ) ;
}
2015-04-25 10:33:07 -04:00
public override float Priority ( )
{
return - 100000.0f ; // Do this last; it's not mission critical
}
2015-04-10 13:56:50 -04:00
public override void DoBuild ( GUBP bp )
{
2015-04-25 10:33:07 -04:00
if ( RocketBuild . ShouldDoSeriousThingsLikeP4CheckinAndPostToMCP ( ) )
2015-04-10 13:56:50 -04:00
{
2015-04-25 10:33:07 -04:00
// Make a lookup for all the known debug extensions, and filter all the dependency build products against that
HashSet < string > DebugExtensions = new HashSet < string > ( Platform . Platforms . Values . SelectMany ( x = > x . GetDebugFileExtentions ( ) ) . Distinct ( ) . ToArray ( ) , StringComparer . InvariantCultureIgnoreCase ) ;
foreach ( string InputFileName in AllDependencyBuildProducts )
2015-04-10 13:56:50 -04:00
{
2015-04-25 10:33:07 -04:00
string Extension = Path . GetExtension ( InputFileName ) ;
if ( DebugExtensions . Contains ( Extension ) )
{
string OutputFileName = CommandUtils . MakeRerootedFilePath ( InputFileName , CommandUtils . CmdEnv . LocalRoot , SymbolsOutputDir ) ;
CommandUtils . CopyFile ( InputFileName , OutputFileName ) ;
}
2015-04-10 13:56:50 -04:00
}
}
// Add a dummy build product
BuildProducts = new List < string > ( ) ;
SaveRecordOfSuccessAndAddToBuildProducts ( ) ;
}
}
public class BuildDerivedDataCacheNode : GUBP . HostPlatformNode
2015-03-27 08:02:21 -04:00
{
string TargetPlatforms ;
string [ ] ProjectNames ;
2015-04-20 11:08:45 -04:00
public readonly string SavedDir ;
public readonly string SavedManifestPath ;
2015-03-27 08:02:21 -04:00
2015-04-10 13:56:50 -04:00
public BuildDerivedDataCacheNode ( UnrealTargetPlatform InHostPlatform , string InTargetPlatforms , string [ ] InProjectNames )
2015-03-27 08:02:21 -04:00
: base ( InHostPlatform )
{
TargetPlatforms = InTargetPlatforms ;
ProjectNames = InProjectNames ;
2015-04-20 11:08:45 -04:00
SavedDir = CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , "Engine" , "Saved" , "Rocket" , HostPlatform . ToString ( ) ) ;
SavedManifestPath = CommandUtils . CombinePaths ( SavedDir , "DerivedDataCacheManifest.txt" ) ;
2015-03-27 08:02:21 -04:00
2015-04-10 13:56:50 -04:00
AddDependency ( GUBP . RootEditorNode . StaticGetFullName ( HostPlatform ) ) ;
2015-03-27 08:02:21 -04:00
}
public static string StaticGetFullName ( UnrealTargetPlatform InHostPlatform )
{
2015-04-10 13:56:50 -04:00
return "BuildDerivedDataCache" + StaticGetHostPlatformSuffix ( InHostPlatform ) ;
2015-03-27 08:02:21 -04:00
}
public override int CISFrequencyQuantumShift ( GUBP bp )
{
return base . CISFrequencyQuantumShift ( bp ) + 2 ;
}
public override string GetFullName ( )
{
return StaticGetFullName ( HostPlatform ) ;
}
public override void DoBuild ( GUBP bp )
{
2015-04-20 11:08:45 -04:00
CommandUtils . CreateDirectory ( SavedDir ) ;
2015-03-27 08:02:21 -04:00
BuildProducts = new List < string > ( ) ;
2015-04-20 11:08:45 -04:00
List < string > ManifestFiles = new List < string > ( ) ;
2015-04-16 11:59:12 -04:00
if ( ! bp . ParseParam ( "NoDDC" ) )
2015-03-27 08:02:21 -04:00
{
2015-04-16 11:54:50 -04:00
string EditorExe = CommandUtils . GetEditorCommandletExe ( CommandUtils . CmdEnv . LocalRoot , HostPlatform ) ;
2015-04-20 11:08:45 -04:00
string RelativePakPath = "Engine/DerivedDataCache/Compressed.ddp" ;
2015-04-16 11:54:50 -04:00
2015-04-10 13:56:50 -04:00
// Delete the output file
2015-04-20 11:08:45 -04:00
string OutputPakFile = CommandUtils . CombinePaths ( CommandUtils . CmdEnv . LocalRoot , RelativePakPath ) ;
2015-04-16 11:54:50 -04:00
string OutputTxtFile = Path . ChangeExtension ( OutputPakFile , ".txt" ) ;
2015-03-27 08:02:21 -04:00
2015-04-10 13:56:50 -04:00
// Generate DDC for all the non-code projects. We don't necessarily have editor DLLs for the code projects, but they should be the same as their blueprint counterparts.
2015-04-16 11:54:50 -04:00
List < string > ProjectPakFiles = new List < string > ( ) ;
2015-04-10 13:56:50 -04:00
foreach ( string ProjectName in ProjectNames )
2015-03-27 08:02:21 -04:00
{
2015-04-10 13:56:50 -04:00
BranchInfo . BranchUProject Project = bp . Branch . FindGameChecked ( ProjectName ) ;
if ( ! Project . Properties . bIsCodeBasedProject )
{
2015-04-16 11:54:50 -04:00
CommandUtils . Log ( "Generating DDC data for {0} on {1}" , Project . GameName , TargetPlatforms ) ;
CommandUtils . DDCCommandlet ( Project . FilePath , EditorExe , null , TargetPlatforms , "-fill -DDC=CreateInstalledEnginePak -ProjectOnly" ) ;
string ProjectPakFile = CommandUtils . CombinePaths ( Path . GetDirectoryName ( OutputPakFile ) , String . Format ( "Compressed-{0}.ddp" , ProjectName ) ) ;
CommandUtils . DeleteFile ( ProjectPakFile ) ;
CommandUtils . RenameFile ( OutputPakFile , ProjectPakFile ) ;
string ProjectTxtFile = Path . ChangeExtension ( ProjectPakFile , ".txt" ) ;
CommandUtils . DeleteFile ( ProjectTxtFile ) ;
CommandUtils . RenameFile ( OutputTxtFile , ProjectTxtFile ) ;
ProjectPakFiles . Add ( Path . GetFileName ( ProjectPakFile ) ) ;
2015-04-10 13:56:50 -04:00
}
2015-03-27 08:02:21 -04:00
}
2015-04-16 11:54:50 -04:00
// Generate DDC for the editor, and merge all the other PAK files in
CommandUtils . Log ( "Generating DDC data for engine content on {0}" , TargetPlatforms ) ;
CommandUtils . DDCCommandlet ( null , EditorExe , null , TargetPlatforms , "-fill -DDC=CreateInstalledEnginePak " + CommandUtils . MakePathSafeToUseWithCommandLine ( "-MergePaks=" + String . Join ( "+" , ProjectPakFiles ) ) ) ;
2015-04-20 11:08:45 -04:00
// Copy the DDP file to the output path
string SavedPakFile = CommandUtils . CombinePaths ( SavedDir , RelativePakPath ) ;
CommandUtils . CopyFile ( OutputPakFile , SavedPakFile ) ;
BuildProducts . Add ( SavedPakFile ) ;
// Add the pak file to the list of files to copy
ManifestFiles . Add ( RelativePakPath ) ;
2015-03-27 08:02:21 -04:00
}
2015-04-20 11:08:45 -04:00
CommandUtils . WriteAllLines ( SavedManifestPath , ManifestFiles . ToArray ( ) ) ;
BuildProducts . Add ( SavedManifestPath ) ;
2015-04-10 13:56:50 -04:00
SaveRecordOfSuccessAndAddToBuildProducts ( ) ;
2015-03-27 08:02:21 -04:00
}
public override float Priority ( )
{
return base . Priority ( ) + 55.0f ;
}
}
}