Skip to content

Instantly share code, notes, and snippets.

@regner
Last active April 16, 2024 19:01
Show Gist options
  • Star 24 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save regner/448551d141a8457561e4a197692cdc56 to your computer and use it in GitHub Desktop.
Save regner/448551d141a8457561e4a197692cdc56 to your computer and use it in GitHub Desktop.
A sample BuildGraph script for building, cooking, and packaging an Unreal project.
{
"Horde": {
"AuthMethod": "OpenIdConnect",
"OidcAuthority": "",
"OidcClientId": "",
"OidcClientSecret": "",
"OidcSigninRedirect": "",
"AdminClaimType": "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",
"AdminClaimValue": "",
"OidcRequestedScopes": [
"profile",
"email",
"openid"
],
"OidcClaimNameMapping": [
"preferred_username",
"email",
"name"
],
"OidcClaimEmailMapping": [
"email",
"upn"
],
"OidcClaimHordeUserMapping": [
"preferred_username",
"email",
"upn"
],
"OidcClaimHordePerforceUserMapping": [],
"CorsEnabled": true,
"CorsOrigin": "",
"DashboardUrl": "",
"P4SwarmUrl": "",
"ConfigPath": "globals.json",
"DatabaseConnectionString": "",
"DatabaseName": "",
"HelpEmailAddress": "",
"HelpSlackChannel": "",
"HttpPort": 8080,
"Http2Port": 8081,
"JwtIssuer": "",
"JwtSecret": "",
"ArtifactStorage": {
"Type": "FileSystem",
"BaseDir": "artifacts"
},
"LogStorage": {
"Type": "FileSystem",
"BaseDir": "logs"
},
"CommitStorage": {
"Type": "FileSystem",
"BaseDir": "commits"
},
"LogJsonToStdOut": true,
"RedisConnectionConfig": "",
"UpdateStreamsNotificationChannel": "",
"SlackToken": "",
"SlackSocketToken": "",
"SingleInstance": false,
"RunModes": [
"Server",
"Worker"
]
},
"Serilog": {
"MinimumLevel": {
"Default": "Information"
}
}
}
<?xml version='1.0' ?>
<!--
Why is this one giant script instead of a bunch of smaller scripts?
Mostly this comes down to BuildGraph and personal preference. As the language BuildGraph isn't
really much of a programming language there is no easy way to use an IDE and jump between
includes, find usages of variables, and just generally quickly search things. It was found to
be easier to have a single large file that a developer can quickly jump up and down in when
trying to understand what the BuildGraph script is doing.
Some standard practices within this BuildGraph script:
# Formatting
* Use editorconfig, there is an editor config file next to these scripts
* Indentation: 4 spaces, no tabs
* Void elements must always have trailing slash
* Good: <thing value="true" />
* Bad: <thing value="true">
* Attributes must use double quotes
* Good: <thing value="true" />
* Bad: <thing value='true' />
* No space before closing bracket
* Good: <thing value="true" />
* Bad: <thing value='true' / >
* Good: <thing value="true">
* Bad: <thing value="true" >
* No space around = when specifying element arguments
* Good: <thing value="true" />
* Bad: <thing value = "true"/>
* There must be a space before the trailing slash of a void element
* Good: <thing value="true" />
* Bad: <thing value="true"/>
* No trailing spaces at the end of a line
* Single line comments should have space before and after comment
* Note: Have used * instead of - in the example otherwise the whole document gets commented
* Good: <!** Comment **>
* Bad: <!**Comment**>
* Multiline comments should have the start and end on their own lines and the comments themselves should be indented from the opening/closing tags
* Note: Have used * instead of - in the example otherwise the whole document gets commented
* Good:
<!**
Line one
Line two and a bit or something
**>
* Bad:
<!** Line one
Line two and a bit or something **>
# General script structure
* Options/base configuration at the top
* One section per major "thing"
* Editor
* Compile / cook / package the game and server
* HLODs
* Package resaving
* Tests
* etc.
* Sections should start with a section header (see examples below)
* General section comments can go in the same comment as the section header (see editor and tools section)
* Sections should end with adding that sections nodes to the BuildProjectNodes variable and setting labels, in that order
* For a node to be executed, it must be added to the BuildProjectNodes property, which BuildProject requires
# Environment variables
* Declaring of environment variables to be used within the script will happen only at the very top of the file
# Options
* All user configurable options will be placed towards the top of the file
* By default the script should do nothing, the caller of the script will enable the things they want
* Options that need other options set should have their checks at the top near where the options are first declared
* Default value should come before restrict value when declaring an option
* The enabling of steps should be done in one of two ways:
* An excplicit enable option such as EnableCooking, EnablePackaging, EnableSomeTest
* Populating a list used by a ForEach such as EditorAutomationTests
* In these cases steps should not have an excplicit enable option, as the list should default to empty
* This also means the adding of nodes to the BuildProjectNodes property should happen in the ForEach loop
# Targeting
* All calls to this script will target BuildProject
* As noted in Options above, by default nothing should happen when simply calling the BuildProject
# Node naming
* Node names tend to be reused a number of times by being referenced in the node, reiquirements, labels, and more
* Node names should always be declared as properties
* They should always be declared at the start of the section they are first used in
# Agent naming
* If an agent only has one node, the agent name should be the node name variable
* If it has multiple nodes, make it something that makes sense
# Labels and UGS badges
* We have two concepts for UGS badges:
* Per-step badges
* Overall status badges
* Per-step badges are put on all labels that we want to show up in UGS in the CIS column
* Any time we have a label that has UGS badges, we must duplicate it and also have the same label without badges
* Overall status badges are used to show overall job status as service badges in UGS
* There is only one overall job status badge, which is built at the very end of the script
* As a general rule of thumb labels and badges should follow the format of "process platform game/server"
* In the case of labels the process becomes the category for non-other things
* Examples:
* Category: Cook
* Name: Win64 Game
* UGS badge: Cook Win64 Game
# Note on node names with content paths
Nodes cannot contain slashes. Node names also must be unique. As an example, if you're attempting to generate a list
of nodes with one node per-map, you wont be able to use the map map (/Game/Maps/MapName) as part of the node name.
You could potentially split on the / and use just the last element. However there is nothing preventing users from
having multiple maps with the same name, just a different path. So we actually need the full path name.
In this case the solution we have come up with is to replace / with -. We originally wanted ~, but Horde just renders
those as - anyways.
-->
<BuildGraph xmlns="http://www.epicgames.com/BuildGraph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epicgames.com/BuildGraph ../Schema.xsd">
<EnvVar Name="UE_HORDE_JOBID" />
<EnvVar Name="COMPUTERNAME" />
<EnvVar Name="uebp_PORT" />
<EnvVar Name="uebp_USER" />
<EnvVar Name="uebp_CLIENT" />
<Property Name="HordeURL" Value="https://horde.example.net" />
<!-- Project Options -->
<Option Name="ProjectName" DefaultValue="None" Restrict=".+" Description="Name of Project" />
<Option Name="ProjectPath" DefaultValue="$(ProjectName)" Restrict=".+" Description="Path to the folder that contains your project" />
<Option Name="UGSProject" DefaultValue="$(ProjectName)" Description="Path to the project folder in UGS" />
<!-- Validate that the project exists -->
<Error Message="ProjectName must be specified" If="'$(ProjectName)' == 'None' or '$(ProjectPath)' == 'None'" />
<Property Name="UProject" Value="$(ProjectPath)\$(ProjectName).uproject" />
<Error Message="Project file $(UProject) does not exist" If="!Exists('$(UProject)')" />
<!-- Game platforms to build and cook -->
<Option Name="BuildPS5Client" DefaultValue="false" Description="Build PS5 client" />
<Option Name="BuildWin64Client" DefaultValue="false" Description="Build Win64 client" />
<Option Name="BuildXSXClient" DefaultValue="false" Description="Build XSX client" />
<Property Name="GamePlatforms" Value="" />
<Property Name="GamePlatforms" Value="$(GamePlatforms)PS5+" If="$(BuildPS5Client)" />
<Property Name="GamePlatforms" Value="$(GamePlatforms)Win64+" If="$(BuildWin64Client)" />
<Property Name="GamePlatforms" Value="$(GamePlatforms)XSX+" If="$(BuildXSXClient)" />
<!-- Server platforms to build and cook -->
<Option Name="BuildWin64Server" DefaultValue="false" Description="Build Win64 dedicated server" />
<Option Name="BuildLinuxServer" DefaultValue="false" Description="Build Linux dedicated server" />
<Property Name="ServerPlatforms" Value="" />
<Property Name="ServerPlatforms" Value="$(ServerPlatforms)Win64+" If="$(BuildWin64Server)" />
<Property Name="ServerPlatforms" Value="$(ServerPlatforms)Linux+" If="$(BuildLinuxServer)" />
<!-- Combined platforms, users of this property must understand the addition of Server -->
<Property Name="CombinedPlatforms" Value="" />
<Property Name="CombinedPlatforms" Value="$(GamePlatforms)" If="'$(GamePlatforms)' != ''" />
<ForEach Name="Platform" Values="$(ServerPlatforms)" Separator="+">
<Property Name="CombinedPlatforms" Value="$(CombinedPlatforms)$(Platform)Server+" />
</ForEach>
<!-- Build configuration options -->
<Option Name="BuildDebugConfiguration" DefaultValue="false" Description="Build Debug configurations" />
<Option Name="BuildDevelopmentConfiguration" DefaultValue="false" Description="Build Development configurations" />
<Option Name="BuildShippingConfiguration" DefaultValue="false" Description="Build Shipping configurations" />
<Option Name="BuildTestConfiguration" DefaultValue="false" Description="Build Test configurations" />
<Property Name="BuildConfigurations" Value="" />
<Property Name="BuildConfigurations" Value="$(BuildConfigurations)Debug+" If="$(BuildDebugConfiguration)" />
<Property Name="BuildConfigurations" Value="$(BuildConfigurations)Development+" If="$(BuildDevelopmentConfiguration)" />
<Property Name="BuildConfigurations" Value="$(BuildConfigurations)Shipping+" If="$(BuildShippingConfiguration)" />
<Property Name="BuildConfigurations" Value="$(BuildConfigurations)Test+" If="$(BuildTestConfiguration)" />
<!-- Extra arguments -->
<Property Name="CommonCompileArguments" Value="" />
<Option Name="ExtraToolCompileArguments" DefaultValue="" Restrict="" Description="Extra arguments to use when building the tools" />
<Option Name="ExtraEditorCompileArguments" DefaultValue="" Restrict="" Description="Extra arguments to use when building the editor" />
<Option Name="ExtraProjectCompileArguments" DefaultValue="" Restrict="" Description="Extra arguments to use when building client and server" />
<Option Name="WindowsCompilerVersion" DefaultValue="2019" Description="Version of the compiler toolchain to use on Windows platform" />
<Property Name="CommonCompileArguments" Value="$(CommonCompileArguments) -$(WindowsCompilerVersion)" />
<Option Name="EnableWarningsAsErrorsCompile" DefaultValue="false" Restrict="true|false" Description="Enable escalating warnings to errors when compiling" />
<Property Name="CommonCompileArguments" Value="$(CommonCompileArguments) -WarningsAsErrors" If="$(EnableWarningsAsErrorsCompile)" />
<Option Name="EnableStrictCompile" DefaultValue="false" Restrict="true|false" Description="Enable strict standard conformance mode when compiling" />
<Property Name="CommonCompileArguments" Value="$(CommonCompileArguments) -Strict" If="$(EnableStrictCompile)" />
<Option Name="EnableNonUnityCompile" DefaultValue="false" Restrict="true|false" Description="Disable unity for compiles, forces build to run in full workspace" />
<Property Name="ExtraToolCompileArguments" Value="$(ExtraToolCompileArguments) -DisableUnity" If="$(EnableNonUnityCompile)" />
<Property Name="ExtraEditorCompileArguments" Value="$(ExtraEditorCompileArguments) -NoPCH -NoSharedPCH -DisableUnity -NoLink" If="$(EnableNonUnityCompile)" />
<Property Name="ExtraProjectCompileArguments" Value="$(ExtraProjectCompileArguments) -NoPCH -NoSharedPCH -DisableUnity -NoLink" If="$(EnableNonUnityCompile)" />
<Option Name ="EnableStaticAnalyzer" DefaultValue ="false" Restrict="true|false" Description="Enable static code analysis, be advised this disables linking so will not produce binaries" />
<Property Name="ExtraEditorCompileArguments" Value="$(ExtraEditorCompileArguments) -StaticAnalyzer=Default" If="$(EnableStaticAnalyzer)" />
<Property Name="ExtraProjectCompileArguments" Value="$(ExtraProjectCompileArguments) -StaticAnalyzer=Default" If="$(EnableStaticAnalyzer)" />
<Property Name="ExtraToolCompileArguments" Value="$(ExtraToolCompileArguments) $(CommonCompileArguments)" />
<Property Name="ExtraEditorCompileArguments" Value="$(ExtraEditorCompileArguments) $(CommonCompileArguments)" />
<Property Name="ExtraProjectCompileArguments" Value="$(ExtraProjectCompileArguments) $(CommonCompileArguments)" />
<!-- Cooking and packaging enable/disable options -->
<Option Name="BuildEditor" DefaultValue="false" Restrict="true|false" Description="Should we build the editor" />
<Option Name="EnableCooking" DefaultValue="false" Restrict="true|false" Description="Should we enable cooking steps" />
<Option Name="EnablePackaging" DefaultValue="false" Restrict="true|false" Description="Should we enable packaging steps" />
<!-- For now all hosts are Win64, in the future we may need to add support for Mac if building iOS -->
<Property Name="HostAgentType" Value="Win64" />
<!-- Agent options -->
<Option Name="UseIncrementalAgents" DefaultValue="false" Restrict="true|false" Description="Use incremental agents for building" />
<Option Name="AgentPrefixCompile" DefaultValue="Compile" Description="The prefix to use when definning agents that use compile type nodes." />
<Option Name="AgentPrefixCook" DefaultValue="Cook" Description="The prefix to use when definning agents that use cook type nodes." />
<Option Name="AgentPrefixTest" DefaultValue="Test" Description="The prefix to use when definning agents that run tests." />
<Option Name="AgentOverride" DefaultValue="" Description="If set, other logic is ignored and this agent type is used for all non-test work." />
<!-- Set properties for a common set of agent types known to exist in Horde. All jobs will use one of these agent types -->
<Property Name="CompileAgentType" Value="$(AgentPrefixCompile)$(HostAgentType)" />
<Property Name="CompileAgentType" Value="Incremental$(CompileAgentType)" If="$(UseIncrementalAgents) and !$(EnableNonUnityCompile)" />
<Property Name="CompileAgentType" Value="$(AgentOverride)" If="'$(AgentOverride)' != ''" />
<Property Name="CookAgentType" Value="$(AgentPrefixCook)$(HostAgentType)" />
<Property Name="CookAgentType" Value="Incremental$(CookAgentType)" If="$(UseIncrementalAgents)" />
<Property Name="CookAgentType" Value="$(AgentOverride)" If="'$(AgentOverride)' != ''" />
<!-- Test agents don't have an incremental version, they are expected to pull builds, not create them -->
<Property Name="TestAgentType" Value="$(AgentPrefixTest)$(HostAgentType)" />
<Property Name="TestAgentType" Value="$(AgentOverride)" If="'$(AgentOverride)' != ''" />
<!-- Build name options -->
<Option Name="PreflightChange" DefaultValue="" Description="Preflight CL number if preflight, empty otherwise" />
<Option Name="SetPreflightFlag" DefaultValue="true" Description="Whether to set the IsPreflight flag to true for preflights. Use with caution: this will cause things like build versions to be set to their non-preflight form." />
<Property Name="IsPreflight" Value="false" />
<Property Name="IsPreflight" Value="true" If="'$(PreflightChange)' != '' And $(SetPreflightFlag)" />
<Property Name="PreflightSuffix" Value="" />
<Property Name="PreflightSuffix" Value="-PF-$(PreflightChange)" If="$(IsPreflight)" />
<Property Name="CL-String" Value="CL-$(Change)-$(UE_HORDE_JOBID)" />
<Property Name="BuildName" Value="$(ProjectName)-$(CL-String)$(PreflightSuffix)" />
<!-- UGS options -->
<Option Name="SubmitUGSBinaries" DefaultValue="false" Restrict="true|false" Description="Should we create and submit a UGS binaries archive" />
<Option Name="UGSBinariesStream" DefaultValue="None" Description="The stream in which to put the UGS binaries archive" />
<Option Name="UGSBadgesPerStep" DefaultValue="false" Restrict="true|false" Description="Whether to use specific badges per compile/cook step" />
<Option Name="UGSBadgesOverall" DefaultValue="false" Restrict="true|false" Description="Whether to use a single UGS badge to represent the whole job" />
<Option Name="UGSBadgesOverallName" DefaultValue="None" Description="Name of the UGS badge to use for overall status" />
<Error Message="SubmitUGSBinaries is enabled but UGSBinariesStream is not set" If="$(SubmitUGSBinaries) and '$(UGSBinariesStream)' == 'None'" />
<Error Message="UGSBadgesOverall is enabled but UGSBadgesOverallName is not set" If="$(UGSBadgesOverall) and '$(UGSBadgesOverallName)' == 'None'" />
<!-- DDC Fill options -->
<Option Name="FillDDC" DefaultValue="false" Restrict="true|false" Description="Fill the projects DDC" />
<!-- Common SCC options -->
<Property Name="SCC_None" Value="-SCCProvider=None" />
<!--
We only ever currently apply this property to builds run under a build machine, if that changes then
this will need to be split into multiple parts, and only add the uebp stuff if build machine.
-->
<Property Name="SCC_P4" Value="-SCCProvider=Perforce -P4Port=$(uebp_PORT) -P4User=$(uebp_USER) -P4Client=$(uebp_CLIENT)" />
<!-- World Partition Map Names -->
<Option Name="HLODMapNames" DefaultValue="" Description="List of maps to build HLODs for, + deliminated" />
<Option Name="NavMeshMapNames" DefaultValue="" Description="The map(s) for which NavMesh will be generated, + deliminated" />
<!-- Resave packages options -->
<Option Name="ResaveDirtyPackages" DefaultValue="false" Restrict="true|false" Description="Run ResavePackages for dirty packages only" />
<Option Name="ResaveRedirectors" DefaultValue="false" Restrict="true|false" Description="Run ResavePackages for fixing redirectors" />
<Option Name="MaxPackagesToResave" DefaultValue="500" Description="Maximum number of packages to save in a single run" />
<!-- Automation Test options -->
<Option Name="EnableEditorBootTest" DefaultValue="false" Restrict="true|false" Description="Enable the editor boot test" />
<!--
These options are for controlling which automation tests get run in the editor. The goal here is to
allow as much flexability and control as possible for developers, whilest not making things overly complicated.
The idea is that projects can set EditorAutomationTestsPreflight, EditorAutomationTestsCI, and
EditorAutomationTestsNightly in their project configuration XML file. That gives projects direct control
over what tests get run in different builds without having to request the build team manage it.
It also alows developers to specify the exact tests they want to run by setting EditorAutomationTests directly
when running BuildGraph.
For most users this will be managed via Horde, where build templates will set enable a specific set of tests.
So the flow looks something like this:
* Development teams request automated tests be enabled on their project
* Build team updates Horde configurations to enable automation tests
* For Pre-flight builds, Horde will enable the EditorAutomationTestsPreflight set of tests
* For CI builds, Horde will enable the EditorAutomationTestsCI set of tests
* For Nightly builds, Horde will enable the EditorAutomationTestsNightly set of tests
* Development teams can then, at any time, manage what tests are getting run for each of those jobs
* They can manage groups in Project/Config/DefaultEngine.ini
* They can manage disabled tests in Project/Config/DefaultEngine.ini
* They can manage EditorAutomationTests* in Project/Build/Graph/Project-Config.xml
Of note:
* Tests seperated with + will run in sequence on the same agent
* Tests seperated with ; will run in parallel on multiple agents
* The two methods can be combined
* This would be valid: Group:QuickTestsOne+Group:QuickTestsTwo;Group:LongTests
-->
<Option Name="EditorAutomationTests" DefaultValue="" Description="List of editor automation tests to be run" />
<Option Name="EditorAutomationTestsPreflight" DefaultValue="" Description="List of editor tests to run when editor Preflight tests enabled" />
<Option Name="EditorAutomationTestsCI" DefaultValue="" Description="List of editor tests to run when editor CI tests enabled" />
<Option Name="EditorAutomationTestsNightly" DefaultValue="" Description="List of editor tests to run when editor Nightly tests enabled" />
<Option Name="EditorAutomationTestsPreflightEnable" DefaultValue="false" Restrict="true|false" Description="Should the editor Preflight tests be run" />
<Option Name="EditorAutomationTestsCIEnable" DefaultValue="false" Restrict="true|false" Description="Should the editor CI tests be run" />
<Option Name="EditorAutomationTestsNightlyEnable" DefaultValue="false" Restrict="true|false" Description="Should the editor Nightly tests be run" />
<Property Name="EditorAutomationTests" Value="$(EditorAutomationTests);$(EditorAutomationTestsPreflight)" If="$(EditorAutomationTestsPreflightEnable)" />
<Property Name="EditorAutomationTests" Value="$(EditorAutomationTests);$(EditorAutomationTestsCI)" If="$(EditorAutomationTestsCIEnable)" />
<Property Name="EditorAutomationTests" Value="$(EditorAutomationTests);$(EditorAutomationTestsNightly)" If="$(EditorAutomationTestsNightlyEnable)" />
<!-- Other tests -->
<Option Name="TestCompileAllBlueprints" DefaultValue="false" Restrict="true|false" Description="Test compiling all blueprints with the editor" />
<!-- Path related options -->
<Property Name="ProjectOutputDirectory" Value="$(ProjectName)\Saved\StagedBuilds" />
<Property Name="UGSArchiveDirectory" Value="$(ProjectName)\Saved\ArchiveForUGS" />
<Property Name="UGSArchiveStagingDirectory" Value="$(UGSArchiveDirectory)\Staging" />
<Property Name="UGSArchivePerforceDirectory" Value="$(UGSArchiveDirectory)\Perforce" />
<Property Name="UGSArchiveFile" Value="$(UGSArchivePerforceDirectory)\$(EscapedBranch)-editor.zip" />
<Option Name="NetworkRootDirectory" DefaultValue="" Description="The base folder in which builds will be stored on the network" />
<Option Name="SaveNetworkBuild" DefaultValue="false" Restrict="true|false" Description="Should the build results be stored in the Saved folder and retained rather than the Scratch folder" />
<Error Message="NetworkRootDirectory must be specified" If="'$(NetworkRootDirectory)' == ''" />
<Error Message="$(NetworkRootDirectory) does not exist" If="!Exists('$(NetworkRootDirectory)')" />
<Property Name="NetworkOutputDirectory" Value="" />
<Property Name="NetworkOutputDirectory" Value="$(NetworkRootDirectory)\Builds\Scratch" If="!$(SaveNetworkBuild)" />
<Property Name="NetworkOutputDirectory" Value="$(NetworkRootDirectory)\Builds\Saved" If="$(SaveNetworkBuild)" />
<Property Name="NetworkOutputDirectory" Value="$(NetworkOutputDirectory)\$(EscapedBranch)\$(BuildName)" If="'$(NetworkOutputDirectory)' != ''" />
<Property Name="ScratchBuildsPath" Value="$(NetworkRootDirectory)\Builds\Scratch" />
<Property Name="SavedBuildsPath" Value="$(NetworkRootDirectory)\Builds\Saved" />
<Property Name="HordeIntermediatePath" Value="$(NetworkRootDirectory)\Intermediate" />
<Property Name="AutomationReportOutputDirectory" Value="" />
<Property Name="AutomationReportOutputDirectory" Value="$(NetworkRootDirectory)\AutomationReports" If="$(IsBuildMachine)" />
<Property Name="AutomationReportOutputDirectory" Value="$(AutomationReportOutputDirectory)\$(EscapedBranch)\$(CL-String)" If="'$(AutomationReportOutputDirectory)' != ''" />
<Property Name="UploadSymbols" Value="false" />
<Property Name="UploadSymbols" Value="true" If="$(SubmitUGSBinaries)" />
<Option Name="ProjectSymbolServerPath" DefaultValue="" Description="Path to the symbol server storage" />
<Error Message="ProjectSymbolServerPath must be specified to upload symbols" If="$(UploadSymbols) and '$(ProjectSymbolServerPath)' == ''" />
<Property Name="ProjectSymbolServerPath" Value="$(ProjectSymbolServerPath)\$(EscapedBranch)" />
<!-- Cleanup options -->
<Option Name="ScratchBuildsPurge" DefaultValue="false" Description="Should the NetworkRootDirectory\Builds\Scratch folder be purged of old content" />
<Option Name="ScratchBuildsMaxAge" DefaultValue="1" Description="Maximum age of files, in days, to keep of temp builds when purging is enabled" />
<Option Name="SavedBuildsPurge" DefaultValue="false" Description="Should the NetworkRootDirectory\Builds\Saved folder be purged of old content" />
<Option Name="SavedBuildsMaxAge" DefaultValue="7" Description="Maximum age of files, in days, to keep of temp builds when purging is enabled" />
<Option Name="IntermediateBuildsPurge" DefaultValue="false" Description="Should the NetworkRootDirectory\Intermediate folder be purged of old content" />
<Option Name="IntermediateBuildsMaxAge" DefaultValue="1" Description="Maximum age of files, in days, to keep of intermediate builds when purging is enabled" />
<Option Name="SymbolDaysKeep" DefaultValue="30" Description="Number of days worth of symbols to keep" />
<!-- This is the main property to add nodes to for the final aggregate -->
<Property Name="BuildProjectNodes" Value="" />
<!--
##########################################################
# Editor and tools
##########################################################
We only ever build the Editor for Win64, not going to complicate this by adding support for other
platforms. If we ever get to the point we want to for some reason, we can add it then.
-->
<Property Name="VersionNodeName" Value="Set binary version" />
<Property Name="ToolsNodeName" Value="Compile Tools" />
<Property Name="EditorNodeName" Value="Compile Editor" />
<Agent Name="Build Editor and tools" Type="$(CompileAgentType)">
<Node Name="$(VersionNodeName)">
<SetVersion Change="$(Change)" CompatibleChange="$(CodeChange)" Branch="$(EscapedBranch)" Licensee="true" If="$(IsBuildMachine)" />
</Node>
<Node Name="$(ToolsNodeName)" Requires="$(VersionNodeName)" Produces="#ToolBinaries">
<Compile Target="BootstrapPackagedGame" Platform="Win64" Configuration="Shipping" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" />
<Compile Target="CrashReportClient" Platform="Win64" Configuration="Shipping" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" />
<Compile Target="CrashReportClientEditor" Platform="Win64" Configuration="Shipping" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" />
<Compile Target="ShaderCompileWorker" Platform="Win64" Configuration="Development" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" />
<Compile Target="UnrealHeaderTool" Platform="Win64" Configuration="Development" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" />
<Compile Target="UnrealPak" Platform="Win64" Configuration="Development" Arguments="$(ExtraToolCompileArguments)" Tag="#ToolBinaries" />
</Node>
<Node Name="$(EditorNodeName)" Requires="$(ToolsNodeName)" Produces="#EditorBinaries">
<Compile Target="$(ProjectName)Editor" Platform="Win64" Configuration="Development" Arguments="$(ExtraEditorCompileArguments)" Tag="#EditorBinaries" />
</Node>
</Agent>
<!--Add these nodes to our dependency list -->
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(EditorNodeName);" If="$(BuildEditor)" />
<!-- Create Labels -->
<Label Category="Compile" Name="Editor" Requires="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" />
<Label Category="Compile" Name="Editor" Requires="$(EditorNodeName)" UgsBadge="Compile Editor" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" />
<!--
##########################################################
# Compile / cook / package the game
##########################################################
Tried really hard to get the game and server sections to be the same
section, but was unsucessful. There are just to many differences, however
small they are, for it to make sense.
The main differences that caused problems (if someone is able to fix it):
* Target changing between Project and ProjectServer
* Wanting to package client and server separetly
* Because we are doing them separetly, the BCRArgs need to vary
Any changes done to this section should be duplicated in the server section
below.
-->
<ForEach Name="Platform" Values="$(GamePlatforms)" Separator="+">
<!--
##########################################################
# Compile game
##########################################################
Testing showed that there was no advantage to splitting the compiling of different
configurations between different machines. It might make a difference to non-unity
and full compiles, but the added time of copying files around for each agent
outweight the time it actually took to compile the different configurations.
-->
<Property Name="CompileNodeName" Value="Compile $(Platform) Game" />
<Property Name="UploadSymbolsNodeName" Value="Upload Symbols $(Platform) Game" />
<Agent Name="$(CompileNodeName)" Type="$(CompileAgentType)">
<Node Name="$(CompileNodeName)" Requires="$(ToolsNodeName)" Produces="#$(CompileNodeName) Binaries" RunEarly="true">
<ForEach Name="Configuration" Values="$(BuildConfigurations)" Separator="+">
<Compile Target="$(ProjectName)" Platform="$(Platform)" Configuration="$(Configuration)" Arguments="-BuildVersion=&quot;$(BuildName)&quot; $(ExtraProjectCompileArguments)" />
</ForEach>
</Node>
<Node Name="$(UploadSymbolsNodeName)" Requires="$(CompileNodeName)">
<SymStore Platform="$(Platform)" Files="#$(CompileNodeName)" StoreDir="$(ProjectSymbolServerPath)\$(Platform)" Product="$(ProjectName)" BuildVersion="$(BuildName)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CompileNodeName)" />
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(UploadSymbolsNodeName)" If="$(UploadSymbols) and '$(Platform)' != 'Linux'" />
<Label Category="Compile" Name="$(Platform) Game" Requires="$(CompileNodeName)" Exclude="$(ToolsNodeName)" If="!$(UGSBadgesPerStep)" />
<Label Category="Compile" Name="$(Platform) Game" Requires="$(CompileNodeName)" Exclude="$(ToolsNodeName)" UgsBadge="Compile $(Platform) Game" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" />
<!--
##########################################################
# Cook, stage, and package the client
##########################################################
This is all done on a single node to reduce the amount of stuff copied around
the network. The packaging also tends to work well on the type of agent used
for cooking.
Cook being separate also means it can start once the editor is done, but before
the game is done being compiled.
The staging happens within the same node, but doesn't have RunEarly, so has to wait
for compile and cook.
-->
<Property Name="CookNodeName" Value="Cook $(Platform) game" />
<Property Name="StageNodeName" Value="Stage $(Platform) game" />
<Property Name="CopyStagedNodeName" Value="Copy Staged $(Platform) game" />
<Property Name="PackageNodeName" Value="Package $(Platform) game" />
<Property Name="CopyPackagedNodeName" Value="Copy Packaged $(Platform) game" />
<Property Name="CookPlatform" Value="$(Platform)" />
<Property Name="CookPlatform" Value="Windows" If="'$(Platform)' == 'Win64'" />
<Property Name="BCRArgs" Value="-Project=$(UProject) -Platform=$(Platform) -Configuration=$(BuildConfigurations) -NoCodeSign" />
<Agent Name="Cook, package, and stage $(Platform) game" Type="$(CookAgentType)">
<Node Name="$(CookNodeName)" Requires="$(EditorNodeName)" Produces="#$(CookNodeName) Complete" RunEarly="true">
<Cook Project="$(UProject)" Platform="$(CookPlatform)" />
</Node>
<!-- Stage -->
<Node Name="$(StageNodeName)" Requires="$(CompileNodeName);#$(CompileNodeName) Binaries;#$(CookNodeName) Complete">
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -Stage -Pak" />
<!-- By request of QA, they would like a file at the root with the relevant CL in it -->
<WriteTextFile
File="$(ProjectOutputDirectory)/$(CookPlatform)/cl.txt"
Text="$(Change)"
/>
</Node>
<!-- Publish (Staged) -->
<Node Name="$(CopyStagedNodeName)" Requires="$(StageNodeName)">
<Copy Files="..." From="$(ProjectOutputDirectory)/$(CookPlatform)" To="$(NetworkOutputDirectory)\$(CookPlatform)\Staged" />
</Node>
<!-- Package -->
<Node Name="$(PackageNodeName)" Requires="$(CopyStagedNodeName)">
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -SkipStage -SkipPak -Package" />
</Node>
<!-- Publish (Packages) -->
<Node Name="$(CopyPackagedNodeName)" Requires="$(PackageNodeName)">
<Property Name="ArchiveDirectory" Value="&quot;$(NetworkOutputDirectory)\$(CookPlatform)\Packages&quot;" />
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -SkipStage -SkipPak -SkipPackage -Archive -ArchiveDirectory=$(ArchiveDirectory)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CookNodeName)" If="$(EnableCooking)" />
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CopyPackagedNodeName)" If="$(EnablePackaging)" />
<Label Category="Cook" Name="$(Platform) Game" Requires="$(CookNodename)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" />
<Label Category="Cook" Name="$(Platform) Game" Requires="$(CookNodename)" Exclude="$(EditorNodeName)" UgsBadge="Cook $(Platform) Game" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" />
<Label Category="Package" Name="$(Platform) Game" Requires="$(CopyPackagedNodeName)" Exclude="$(EditorNodeName);$(CookNodename);$(CompileNodeName)" />
</ForEach>
<!--
##########################################################
# Compile / cook / package the server
##########################################################
-->
<ForEach Name="Platform" Values="$(ServerPlatforms)" Separator="+">
<!--
##########################################################
# Compile server
##########################################################
-->
<Property Name="CompileNodeName" Value="Compile $(Platform) Server" />
<Property Name="UploadSymbolsNodeName" Value="Upload Symbols $(Platform) Server" />
<Agent Name="$(CompileNodeName)" Type="$(CompileAgentType)">
<Node Name="$(CompileNodeName)" Requires="$(ToolsNodeName)" Produces="#$(CompileNodeName) Binaries" RunEarly="true">
<ForEach Name="Configuration" Values="$(BuildConfigurations)" Separator="+">
<Compile Target="$(ProjectName)Server" Platform="$(Platform)" Configuration="$(Configuration)" Arguments="-BuildVersion=&quot;$(BuildName)&quot; $(ExtraProjectCompileArguments)" />
</ForEach>
</Node>
<Node Name="$(UploadSymbolsNodeName)" Requires="$(CompileNodeName)">
<SymStore Platform="$(Platform)" Files="#$(CompileNodeName)" StoreDir="$(ProjectSymbolServerPath)\$(Platform)" Product="$(ProjectName)" BuildVersion="$(BuildName)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CompileNodeName)" />
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(UploadSymbolsNodeName)" If="$(UploadSymbols) and '$(Platform)' != 'Linux'" />
<Label Category="Compile" Name="$(Platform) Server" Requires="$(CompileNodeName)" Exclude="$(ToolsNodeName)" If="!$(UGSBadgesPerStep)" />
<Label Category="Compile" Name="$(Platform) Server" Requires="$(CompileNodeName)" Exclude="$(ToolsNodeName)" UgsBadge="Compile $(Platform) Server" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" />
<!--
##########################################################
# Cook, stage, and package the server
##########################################################
-->
<Property Name="CookNodeName" Value="Cook $(Platform) server" />
<Property Name="StageNodeName" Value="Stage $(Platform) server" />
<Property Name="CopyStagedNodeName" Value="Copy Staged $(Platform) server" />
<Property Name="PackageNodeName" Value="Package $(Platform) server" />
<Property Name="CopyPackagedNodeName" Value="Copy Packaged $(Platform) server" />
<Property Name="CookPlatform" Value="$(Platform)Server" />
<Property Name="CookPlatform" Value="WindowsServer" If="'$(Platform)' == 'Win64'" />
<Property Name="BCRArgs" Value="-Project=$(UProject) -Platform=$(Platform) -Configuration=$(BuildConfigurations) -NoCodeSign -Server -NoClient" />
<Agent Name="Cook, package, and stage $(Platform) server" Type="$(CookAgentType)">
<Node Name="$(CookNodeName)" Requires="$(EditorNodeName)" Produces="#$(CookNodeName) Complete" RunEarly="true">
<Cook Project="$(UProject)" Platform="$(CookPlatform)" />
</Node>
<!-- Stage -->
<Node Name="$(StageNodeName)" Requires="$(CompileNodeName);#$(CompileNodeName) Binaries;#$(CookNodeName) Complete">
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -Stage -Pak" />
<!-- By request of QA, they would like a file at the root with the relevant CL in it -->
<WriteTextFile
File="$(ProjectOutputDirectory)/$(CookPlatform)/cl.txt"
Text="$(Change)"
/>
</Node>
<!-- Publish (Staged) -->
<Node Name="$(CopyStagedNodeName)" Requires="$(StageNodeName)">
<Copy Files="..." From="$(ProjectOutputDirectory)/$(CookPlatform)" To="$(NetworkOutputDirectory)\$(CookPlatform)\Staged" />
</Node>
<!-- Package -->
<Node Name="$(PackageNodeName)" Requires="$(CopyStagedNodeName)">
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -SkipStage -SkipPak -Package" />
</Node>
<!-- Publish (Packages) -->
<Node Name="$(CopyPackagedNodeName)" Requires="$(PackageNodeName)">
<Property Name="ArchiveDirectory" Value="&quot;$(NetworkOutputDirectory)\$(CookPlatform)\Packages&quot;" />
<Command Name="BuildCookRun" Arguments="$(BCRArgs) -SkipBuild -SkipCook -SkipStage -SkipPak -SkipPackage -Archive -ArchiveDirectory=$(ArchiveDirectory)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CookNodeName)" If="$(EnableCooking)" />
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(CopyPackagedNodeName)" If="$(EnablePackaging)" />
<Label Category="Cook" Name="$(Platform) Server" Requires="$(CookNodename)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" />
<Label Category="Cook" Name="$(Platform) Server" Requires="$(CookNodename)" Exclude="$(EditorNodeName)" UgsBadge="Cook $(Platform) Server" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" />
<Label Category="Package" Name="$(Platform) Server" Requires="$(CopyPackagedNodeName)" Exclude="$(EditorNodeName);$(CookNodename);$(CompileNodeName)" />
</ForEach>
<!--
##########################################################
# Package UGS pre-compiled binaries
##########################################################
-->
<Property Name="UGSBinariesStageNodeName" Value="Stage files for UGS Archive" />
<Property Name="UGSBinariesSubmitNodeName" Value="Submit UGS Archive" />
<Property Name="UGSBinariesSymbolsNodeName" Value="Upload Editor symbols" />
<Agent Name="Package UGS binaries" Type="$(CompileAgentType)">
<Node Name="$(UGSBinariesStageNodeName)" Requires="$(EditorNodeName)" Produces="#ArchiveFiles">
<!-- Clear out the archive directory so we ensure clean archives -->
<Delete Files="$(UGSArchiveDirectory)\..." />
<!--
Since the AutomationTool is built automatically, it actually isn't in our
required files list, so lets tag it specifically.
Of note, we tag it with ArchiveBinaries directly. If we tag it with ArchiveFiles
we get an error when stripping the AutomationTool symbols.
-->
<Tag Files="Engine\Binaries\DotNET\AutomationTool\..." With="#ArchiveBinaries" />
<!--
Write a text file marker indicating that we're using precompiled binaries, I
have no idea why Epic does this...
-->
<Spawn Exe="cmd.exe" Arguments="/C echo. &gt;&quot;$(RootDir)\Engine\Build\PrecompiledBinaries.txt&quot;" />
<Tag Files="$(RootDir)\Engine\Build\PrecompiledBinaries.txt" With="#ArchiveFiles" />
<!-- Partition all the binaries and symbols -->
<Tag Files="#ToolBinaries;#EditorBinaries" Except=".../Intermediate/..." With="#ArchiveFiles" />
<Tag Files="#ArchiveFiles" Except="*.pdb" With="#ArchiveBinaries" />
<Tag Files="#ArchiveFiles" Filter="*.pdb" With="#ArchiveSymbols" />
<!-- List all the files being archived -->
<Log Message="Archive binaries:" Files="#ArchiveBinaries" />
<Log Message="Archive symbols:" Files="#ArchiveSymbols" />
<!-- Stage all the files to be archived -->
<Copy Files="#ArchiveBinaries" From="$(RootDir)" To="$(UGSArchiveStagingDirectory)" />
<Strip Files="#ArchiveSymbols" BaseDir="$(RootDir)" OutputDir="$(UGSArchiveStagingDirectory)" Platform="Win64" />
<!-- Create the zip file and submit it to Perforce -->
<Zip FromDir="$(UGSArchiveStagingDirectory)" ZipFile="$(UGSArchiveFile)" />
<!-- Tag the editor symbols with source information -->
<!-- <Tag Files="..." Filter="*.c;*.h;*.cpp;*.hpp;*.inl" Except="Engine/Source/ThirdParty/..." With="#SourceFiles" />
<SrcSrv BinaryFiles="#ArchiveFiles" SourceFiles="#SourceFiles" Branch="$(Branch)" Change="$(CodeChange)" /> -->
</Node>
<Node Name="$(UGSBinariesSubmitNodeName)" Requires="$(UGSBinariesStageNodeName)">
<Submit
Description="[CL $(CodeChange)] $(ProjectName) - Precompiled editor binaries"
Files="$(UGSArchiveFile)"
FileType="binary+FS64"
Workspace="$(COMPUTERNAME)_ArchiveForUGS"
Stream="$(UGSBinariesStream)"
RootDir="$(UGSArchivePerforceDirectory)"
/>
</Node>
<Node Name="$(UGSBinariesSymbolsNodeName)" Requires="#ArchiveFiles">
<SymStore Platform="Win64" Files="#ArchiveFiles" StoreDir="$(ProjectSymbolServerPath)\Win64" Product="UGSEditor" BuildVersion="$(BuildName)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(UGSBinariesSubmitNodeName);$(UGSBinariesSymbolsNodeName);" If="$(SubmitUGSBinaries)" />
<Label Category="Other" Name="UGS Binaries" Requires="$(UGSBinariesSubmitNodeName);$(UGSBinariesSymbolsNodeName)" Exclude="$(EditorNodeName)" UgsBadge="UGS Binaries" UgsProject="$(UGSProject)" If="$(SubmitUGSBinaries)" />
<!--
##########################################################
# HLOD generation
##########################################################
To avoid cluttering the Horde UI with lots of labels for each map, we bundle all the nodes into
GeneratedHLODNodes, and then append that to BuildProjectNodes as well as use that for the
labels.
-->
<Property Name="GeneratedHLODNodes" Value="" />
<ForEach Name="MapName" Values="$(HLODMapNames)" Separator="+">
<Property Name="CleanMapName" Value="" />
<ForEach Name="Part" Values="$(MapName)" Separator="/">
<Property Name="CleanMapName" Value="$(CleanMapName)-$(Part)" />
</ForEach>
<Property Name="HLODNodeName" Value="Generate HLODs $(CleanMapName)" />
<Property Name="HLODCommonCommandletArgs" Value="$(MapName) -Builder=WorldPartitionHLODsBuilder -AllowCommandletRendering" />
<Agent Name="$(HLODNodeName)" Type="$(TestAgentType)">
<Node Name="$(HLODNodeName)" Requires="$(EditorNodeName)">
<Commandlet Name="WorldPartitionBuilder" Project="$(UProject)" Arguments="$(HLODCommonCommandletArgs) $(SCC_None) -SetupHLOD" />
<Commandlet Name="WorldPartitionBuilder" Project="$(UProject)" Arguments="$(HLODCommonCommandletArgs) $(SCC_None) -BuildHLODs" />
<Property Name="HLODFinalizeArgs" Value="$(HLODCommonCommandletArgs) -FinalizeHLODs" />
<Property Name="HLODFinalizeArgs" Value="$(HLODFinalizeArgs) $(SCC_P4) -Submit" If="$(IsBuildMachine)" />
<Commandlet Name="WorldPartitionBuilder" Project="$(UProject)" Arguments="$(HLODFinalizeArgs)" />
</Node>
</Agent>
<Property Name="GeneratedHLODNodes" Value="$(GeneratedHLODNodes);$(HLODNodeName);" />
</ForEach>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(GeneratedHLODNodes)" />
<Label Category="Other" Name="Generate HLODs" Requires="$(GeneratedHLODNodes)" Exclude="$(EditorNodeName)" />
<!--
##########################################################
# Resave dirty packages
##########################################################
-->
<Property Name="ResaveDirtyPackagesNodeName" Value="Resave dirty packages" />
<Property Name="ResavePackagesArgs" Value="" />
<Property Name="ResavePackagesArgs" Value="$(ResavePackagesArgs) -ProjectOnly -MaxPackagesToResave=$(MaxPackagesToResave) -GCFreq=10000 -SkipFails" />
<Property Name="ResavePackagesArgs" Value="$(ResavePackagesArgs) -OnlySaveDirtyPackages -SkipCheckedOutPackages -AutoCheckOut" />
<Property Name="ResavePackagesArgs" Value="$(ResavePackagesArgs) $(SCC_P4) -AutoCheckIn" If="$(IsBuildMachine)" />
<Agent Name="$(ResaveDirtyPackagesNodeName)" Type="$(CompileAgentType)">
<Node Name="$(ResaveDirtyPackagesNodeName)" Requires="$(EditorNodeName)">
<Commandlet Name="ResavePackages" Project="$(UProject)" Arguments="$(ResavePackagesArgs)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(ResaveDirtyPackagesNodeName);" If="$(ResaveDirtyPackages)" />
<Label Category="Other" Name="Resave Packages" Requires="$(ResaveDirtyPackagesNodeName)" Exclude="$(EditorNodeName)" />
<!--
##########################################################
# Resave redirectors
##########################################################
Compared to the resave dirty packages:
* We remove the MaxPackagesToResave and add SearchAllAssets
* This is to ensure we are not leaving partial redirectors around
From Epic comment in ContentCommandlets.cpp regarding SearchAllAssets:
> This option allows the dependency graph and soft object path redirect map to be
populated. This is useful if you want soft object references to redirectors to
be followed to the destination asset at save time.
-->
<Property Name="ResaveRedirectorsNodeName" Value="Fixup redirectors" />
<Property Name="ResaveRedirectorsArgs" Value="-ProjectOnly -FixupRedirectors -SearchAllAssets -SkipCheckedOutPackages -AutoCheckOut" />
<Property Name="ResaveRedirectorsArgs" Value="$(ResaveRedirectorsArgs) $(SCC_P4) -AutoCheckIn" If="$(IsBuildMachine)" />
<Agent Name="$(ResaveRedirectorsNodeName)" Type="$(CompileAgentType)">
<Node Name="$(ResaveRedirectorsNodeName)" Requires="$(EditorNodeName)">
<Commandlet Name="ResavePackages" Project="$(UProject)" Arguments="$(ResaveRedirectorsArgs)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(ResaveRedirectorsNodeName);" If="$(ResaveRedirectors)" />
<Label Category="Other" Name="Resave Redirectors" Requires="$(ResaveRedirectorsNodeName)" Exclude="$(EditorNodeName)" />
<!--
##########################################################
# Fill the DDC
##########################################################
-->
<Property Name="FillDDCNodeName" Value="Fill DDC" />
<Agent Name="$(FillDDCNodeName)" Type="$(CompileAgentType)">
<Node Name="$(FillDDCNodeName)" Requires="$(EditorNodeName)">
<Commandlet Name="DerivedDataCache" Project="$(UProject)" Arguments="-Fill -TargetPlatform=WindowsEditor" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(FillDDCNodeName);" If="$(FillDDC)" />
<Label Category="Other" Name="Fill DDC" Requires="$(FillDDCNodeName)" Exclude="$(EditorNodeName)" />
<!--
##########################################################
# Generate NavMesh
##########################################################
To avoid cluttering the Horde UI with lots of individual maps, we bundle all the nodes into
GeneratedNavMeshNodes, and then append that to BuildProjectNodes as well as use that for the
labels.
As of 2022-11-14 and UE 5.0.3, the WorldPartitionBuilder commandlet doesn't support -Submit on the
WorldPartitionNavigationDataBuilder builder. The only builder that supports -Submit is
WorldPartitionHLODsBuilder. Our choice was to either edit the WorldPartitionBuilder automation
command C# code, or the WorldPartitionBuilder commandlet c++ code. Neither of which were super
enticing because they are engine code. To get around it we are simply calling the p4.exe. Hopefully
Epic adds support for the -Submit argument on the commandlet for all builders and this can be removed.
-->
<Property Name="GeneratedNavMeshNodes" Value="" />
<ForEach Name="MapName" Values="$(NavMeshMapNames)" Separator="+">
<Property Name="CleanMapName" Value="" />
<ForEach Name="Part" Values="$(MapName)" Separator="/">
<Property Name="CleanMapName" Value="$(CleanMapName)-$(Part)" />
</ForEach>
<Property Name="NavMeshGenerationNodeName" Value="Generate Nav Mesh $(CleanMapName)" />
<Property Name="NavMeshSubmitNodeName" Value="Submit Nav Mesh $(CleanMapName)" />
<Agent Name="$(NavMeshGenerationNodeName)" Type="$(TestAgentType)">
<Node Name="$(NavMeshGenerationNodeName)" Requires="$(EditorNodeName)">
<Property Name="NavMeshCommonBuilderArgs" Value="-Builder=WorldPartitionNavigationDataBuilder $(MapName) -AllowCommandletRendering $(SCC_P4)" />
<Commandlet Name="WorldPartitionBuilder" Project="$(UProject)" Arguments="$(NavMeshCommonBuilderArgs)" />
</Node>
<Node Name="$(NavMeshSubmitNodeName)" Requires="$(NavMeshGenerationNodeName)">
<Property Name="NavMeshP4Args" Value="-c $(uebp_CLIENT)" />
<Property Name="NavMeshP4Args" Value="$(NavMeshP4Args) submit" />
<Property Name="NavMeshP4Args" Value="$(NavMeshP4Args) -d &quot;Generated navigation mesh for $(MapName)&quot;" />
<Spawn Exe="p4.exe" Arguments="$(NavMeshP4Args)" />
</Node>
</Agent>
<Property Name="GeneratedNavMeshNodes" Value="$(GeneratedNavMeshNodes);$(NavMeshGenerationNodeName)" />
<Property Name="GeneratedNavMeshNodes" Value="$(GeneratedNavMeshNodes);$(NavMeshSubmitNodeName)" If="$(IsBuildMachine)" />
</ForEach>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(GeneratedNavMeshNodes)" />
<Label Category="Other" Name="Generate NavMesh" Requires="$(GeneratedNavMeshNodes)" Exclude="$(EditorNodeName)" />
<!--
##########################################################
# Test CompileAllBlueprints
##########################################################
-->
<Property Name="TestCompileAllBlueprintsNodeName" Value="Test Compile All Blueprints" />
<Agent Name="$(TestCompileAllBlueprintsNodeName)" Type="$(CompileAgentType)">
<Node Name="$(TestCompileAllBlueprintsNodeName)" Requires="$(EditorNodeName)">
<Commandlet Name="CompileAllBlueprints" Project="$(UProject)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(TestCompileAllBlueprintsNodeName);" If="$(TestCompileAllBlueprints)" />
<Label Category="Test" Name="Compile All Blueprints" Requires="$(TestCompileAllBlueprintsNodeName)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" />
<Label Category="Test" Name="Compile All Blueprints" Requires="$(TestCompileAllBlueprintsNodeName)" Exclude="$(EditorNodeName)" UgsBadge="Test Compile All Blueprints" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" />
<!--
##########################################################
# Editor Automation Testing
##########################################################
Valid test names can contain both colon (:) and slashes (/). Those characters are however
not allowed to be in BuildGraph node names. So we need to strip them out.
That is why we have several ForEach loops that might appear useless at first. They are meant
to replace colons with underscores, and slashes with dashes.
Since node names are presented to users, it's not just important they are valid but also
that they are clean. That is why we have the two properties with if statements. Without it
we would end up with the node names being _-TestName, which just isn't very clean.
Note: BuildGraph doesn't seem to have a ElseIf element, so we must do the negative check
first.
-->
<Property Name="EditorAutomationGeneratedNodes" Value="" />
<ForEach Name="TestName" Values="$(EditorAutomationTests)">
<Property Name="TestNameNoSlashes" Value="" />
<ForEach Name="Part" Values="$(TestName)" Separator="/">
<Property Name="TestNameNoSlashes" Value="$(TestNameNoSlashes)-$(Part)" If="'$(TestNameNoSlashes)' != ''" />
<Property Name="TestNameNoSlashes" Value="$(Part)" If="'$(TestNameNoSlashes)' == ''" />
</ForEach>
<Property Name="TestNameNoColon" Value="" />
<ForEach Name="Part" Values="$(TestNameNoSlashes)" Separator=":">
<Property Name="TestNameNoColon" Value="$(TestNameNoColon)_$(Part)" If="'$(TestNameNoColon)' != ''" />
<Property Name="TestNameNoColon" Value="$(Part)" If="'$(TestNameNoColon)' == ''" />
</ForEach>
<Property Name="EditorAutomationTestNodeName" Value="Test $(TestNameNoColon)" />
<Agent Name="$(EditorAutomationTestNodeName)" Type="$(TestAgentType)">
<Node Name="$(EditorAutomationTestNodeName)" Requires="$(EditorNodeName)">
<Property Name="TestArgs" Value="-Project=$(UProject) -NullRHI -NoVSync -FPS=60 -Deterministic" />
<Property Name="TestArgs" Value="$(TestArgs) -WriteTestResultsForHorde" If="'$(UE_HORDE_JOBID)' != ''" />
<Property Name="TestArgs" Value="$(TestArgs) -Test=&quot;UE.EditorAutomation(RunTest=$(TestName))&quot;" />
<Property Name="TestArgs" Value="$(TestArgs) -Build=Editor -UseEditor" />
<Command Name="RunUnreal" Arguments="$(TestArgs)" />
</Node>
</Agent>
<Property Name="EditorAutomationGeneratedNodes" Value="$(EditorAutomationGeneratedNodes);$(EditorAutomationTestNodeName)" />
</ForEach>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(EditorAutomationGeneratedNodes)" />
<Label Category="Test" Name="Editor Automation" Requires="$(EditorAutomationGeneratedNodes)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" />
<Label Category="Test" Name="Editor Automation" Requires="$(EditorAutomationGeneratedNodes)" Exclude="$(EditorNodeName)" UgsBadge="Test Editor Automation" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" />
<!--
##########################################################
# Editor Boot Test
##########################################################
-->
<Property Name="EditorBootTestNodeName" Value="Test Editor Boot" />
<Agent Name="$(EditorBootTestNodeName)" Type="$(TestAgentType)">
<Node Name="$(EditorBootTestNodeName)" Requires="$(EditorNodeName)">
<Property Name="TestArgs" Value="-Project=$(UProject)" />
<Property Name="TestArgs" Value="$(TestArgs) -Test=&quot;UE.EditorBootTest&quot;" />
<Property Name="TestArgs" Value="$(TestArgs) -Build=Editor -UseEditor" />
<Command Name="RunUnreal" Arguments="$(TestArgs)" />
</Node>
</Agent>
<Property Name="BuildProjectNodes" Value="$(BuildProjectNodes);$(EditorBootTestNodeName);" If="$(EnableEditorBootTest)" />
<Label Category="Test" Name="Editor Boot" Requires="$(EditorBootTestNodeName)" Exclude="$(EditorNodeName)" If="!$(UGSBadgesPerStep)" />
<Label Category="Test" Name="Editor Boot" Requires="$(EditorBootTestNodeName)" Exclude="$(EditorNodeName)" UgsBadge="Test Editor Boot" UgsProject="$(UGSProject)" If="$(UGSBadgesPerStep)" />
<!--
##########################################################
# Build aggregate for targeting
##########################################################
-->
<Aggregate Name="BuildProject" Requires="$(BuildProjectNodes)" />
<Label Category="Other" Name="$(UGSBadgesOverallName)" Requires="$(BuildProjectNodes)" UgsBadge="$(UGSBadgesOverallName)" UgsProject="$(UGSProject)" If="$(UGSBadgesOverall)" />
<!--
##########################################################
# Miscellaneous build targets
##########################################################
The following build targets have their own sections and are after
the main BuildProject aggregate because they don't require or need
anything from the rest of the script. They are self contained other
than utalizing the same set of options and properties from the top.
-->
<!--
##########################################################
# Age symstore
##########################################################
Server binaries symbols are stored in the same place as client binaries. Need to
handle the situation where we build Windows server, but not Windows client.
Linux symbols are not even supported, so only worried about Win64.
To do that we build a new list of platforms, and add Win64 if not already there.
-->
<Property Name="AgeSymStoreNodes" Value="" />
<Property Name="AgeSymStorePlatforms" Value="$(GamePlatforms)" />
<Property Name="AgeSymStorePlatforms" Value="$(GamePlatforms)+Win64" If="!ContainsItem('$(GamePlatforms)', 'Win64', '+') and $(BuildWin64Server)"/>
<Agent Name="Age Symstore" Type="Utility">
<ForEach Name="Platform" Values="$(AgeSymStorePlatforms)" Separator="+">
<Property Name="NodeName" Value="Age $(Platform) Symstore" />
<Node Name="$(NodeName)">
<Log Message="Aging Symstore at $(ProjectSymbolServerPath)\$(Platform)" />
<AgeStore Platform="$(Platform)" Days="$(SymbolDaysKeep)" StoreDir="$(ProjectSymbolServerPath)\$(Platform)" />
</Node>
<Property Name="AgeSymStoreNodes" Value="$(AgeSymStoreNodes);$(NodeName)" />
</ForEach>
</Agent>
<!-- Create an aggregate with all the generated nodes -->
<Aggregate Name="AgeSymstore" Requires="$(AgeSymStoreNodes)" />
<!--
##########################################################
# Cleanup network directories
##########################################################
-->
<Property Name="CleanupNodes" Value="" />
<Agent Name="Purge Builds" Type="Utility">
<Node Name="Purge Scratch Builds">
<Log Message="Purging all files older than $(ScratchBuildsMaxAge) in $(ScratchBuildsPath)" />
<PurgeOldFiles Days="$(ScratchBuildsMaxAge)" RootDirectory="$(ScratchBuildsPath)" Files="*/..." />
</Node>
<Property Name="CleanupNodes" Value="$(CleanupNodes);Purge Scratch Builds" If="$(ScratchBuildsPurge)" />
<Node Name="Purge Saved Builds">
<Log Message="Purging all files older than $(SavedBuildsMaxAge) in $(SavedBuildsPath)" />
<PurgeOldFiles Days="$(SavedBuildsMaxAge)" RootDirectory="$(SavedBuildsPath)" Files="*/..." />
</Node>
<Property Name="CleanupNodes" Value="$(CleanupNodes);Purge Saved Builds" If="$(SavedBuildsPurge)" />
<Node Name="Purge Intermediate Builds">
<Log Message="Purging all files older than $(IntermediateBuildsMaxAge) in $(HordeIntermediatePath)" />
<PurgeOldFiles Days="$(IntermediateBuildsMaxAge)" RootDirectory="$(HordeIntermediatePath)" Files="*/..." />
</Node>
<Property Name="CleanupNodes" Value="$(CleanupNodes);Purge Intermediate Builds" If="$(IntermediateBuildsPurge)" />
</Agent>
<!-- Create an aggregate with all the generated nodes -->
<Aggregate Name="UtilityCleanup" Requires="$(CleanupNodes)" />
</BuildGraph>
<?xml version='1.0' ?>
<BuildGraph xmlns="http://www.epicgames.com/BuildGraph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epicgames.com/BuildGraph ../Schema.xsd">
<Property Name="ProjectName" Value="Project" />
<Property Name="NetworkRootDirectory" Value="\\some\network\path\Horde" />
<Property Name="ProjectSymbolServerPath" Value="\\some\network\path\Symstore" />
<Property Name="SymbolDaysKeep" Value="14" />
<Property Name="EnableWarningsAsErrorsCompile" Value="false" />
<Property Name="EnableStrictCompile" Value="false" />
<Property Name="UGSBinariesStream" Value="//project/binaries" />
<!--
Editor automation test configuration
We currently run the same tests for all cases, so just define it once.
-->
<Property Name="EditorAutomationTestsCommon" Value="Group:AI_Navigation;Group:AI_MassAI;Group:AI_SmartObjects;Group:AI_Behaviors;Group:AI_UnitTests" />
<Property Name="EditorAutomationTestsPreflight" Value="$(EditorAutomationTestsCommon)" />
<Property Name="EditorAutomationTestsCI" Value="$(EditorAutomationTestsCommon)" />
<Property Name="EditorAutomationTestsNightly" Value="$(EditorAutomationTestsCommon)" />
</BuildGraph>
{
"Name": "//ue5/main",
"ClusterName": "Default",
"NotificationChannel": "#......",
"NotificationChannelFilter": "Failure",
"TriageChannel": "#.......",
"DefaultPreflight": {
"TemplateID": "pre-flight"
},
"Tabs": [
{
"Title": "Continuous Integration",
"Type": "Jobs",
"ShowNames": true,
"Templates": [
"continuous-integration"
],
"Columns": [
{
"Heading": "Compile",
"Category": "Compile",
"RelativeWidth": 1
},
{
"Heading": "Cook",
"Category": "Cook",
"RelativeWidth": 1
},
{
"Heading": "Other",
"Category": "Other",
"RelativeWidth": 1
}
]
},
{
"Title": "Pre-Flights",
"Type": "Jobs",
"ShowNames": true,
"Templates": [
"pre-flight"
],
"Columns": [
{
"Heading": "Compile",
"Category": "Compile",
"RelativeWidth": 1
},
{
"Heading": "Cook",
"Category": "Cook",
"RelativeWidth": 1
},
{
"Heading": "Package",
"Category": "Package",
"RelativeWidth": 1
},
{
"Heading": "Other",
"Category": "Other",
"RelativeWidth": 1
}
]
},
{
"Title": "Full Builds",
"Type": "Jobs",
"ShowNames": true,
"Templates": [
"on-demand-full-build",
"non-unity-compile",
"nightly-full-build",
"static-analysis"
],
"Columns": [
{
"Heading": "Compile",
"Category": "Compile",
"RelativeWidth": 1
},
{
"Heading": "Cook",
"Category": "Cook",
"RelativeWidth": 1
},
{
"Heading": "Package",
"Category": "Package",
"RelativeWidth": 1
},
{
"Heading": "Other",
"Category": "Other",
"RelativeWidth": 1
}
]
},
{
"Title": "Utilities",
"Type": "Jobs",
"ShowNames": true,
"Templates": [
"utility-age-symstore",
"utility-cleanup",
"utility-ddc-fill",
"utility-hlod-generation",
"utility-navmesh-generation",
"utility-resave-dirty-packages",
"utility-resave-redirectors",
"utility-ugs-binaries"
],
"Columns": [
{
"Heading": "Other",
"Category": "Other",
"RelativeWidth": 1
}
]
}
],
"AgentTypes": {
"IncrementalCompileWin64": {
"Pool": "ue5-compile",
"Workspace": "Incremental",
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate",
"Environment": {
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC"
}
},
"CompileWin64": {
"Pool": "ue5-compile",
"Workspace": "Full",
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate",
"Environment": {
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC"
}
},
"IncrementalCookWin64": {
"Pool": "ue5-cook",
"Workspace": "Incremental",
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate",
"Environment": {
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC"
}
},
"CookWin64": {
"Pool": "ue5-cook",
"Workspace": "Full",
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate",
"Environment": {
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC"
}
},
"TestWin64": {
"Pool": "ue5-test",
"Workspace": "Incremental",
"TempStorageDir": "\\\\network\\share\\project\\Horde\\Intermediate",
"Environment": {
"UE-SharedDataCachePath": "\\\\network\\share\\project_DDC"
}
},
"Utility": {
"Pool": "utility",
"Workspace": "Utility"
}
},
"WorkspaceTypes": {
"Incremental": {
"Stream": "//ue5/main-horde",
"Identifier": "UE5MainInc",
"Incremental": true,
"UseAutoSdk": true
},
"Full": {
"Stream": "//ue5/main-horde",
"Identifier": "UE5MainFull",
"Incremental": false,
"UseAutoSdk": true
},
"Utility": {
"Stream": "//ue5/main-horde-utility",
"Identifier": "UE5MainUtil",
"Incremental": false,
"UseAutoSdk": true
}
},
"Templates": [
{
"ID": "continuous-integration",
"Name": "Continuous Integration",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"ShowUgsBadges": true,
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:UseIncrementalAgents=true",
"-set:UGSBadgesPerStep=true",
"-set:BuildWin64Client=true",
"-set:BuildPS5Client=true",
"-set:BuildXSXClient=true",
"-set:BuildWin64Server=true",
"-set:BuildLinuxServer=true",
"-set:BuildDevelopmentConfiguration=true",
"-set:BuildShippingConfiguration=true",
"-set:BuildTestConfiguration=true",
"-set:EnableCooking=true",
"-set:EditorAutomationTestsCIEnable=true",
"-set:TestCompileAllBlueprints=false"
],
"Schedule": {
"Enabled": true,
"Patterns": [
{
"Interval": 1
}
]
},
"Parameters": []
},
{
"ID": "pre-flight",
"Name": "Pre-flight Build",
"AllowPreflights": true,
"Priority": "High",
"InitialAgentType": "Utility",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:UseIncrementalAgents=true"
],
"Parameters": [
{
"Type": "List",
"Label": "Clients",
"Style": "MultiList",
"Items": [
{
"Text": "Windows",
"ArgumentIfEnabled": "-set:BuildWin64Client=true",
"ArgumentIfDisabled": "-set:BuildWin64Client=false",
"Default": true
},
{
"Text": "Playstation 5",
"ArgumentIfEnabled": "-set:BuildPS5Client=true",
"ArgumentIfDisabled": "-set:BuildPS5Client=false",
"Default": false
},
{
"Text": "Xbox Series X",
"ArgumentIfEnabled": "-set:BuildXSXClient=true",
"ArgumentIfDisabled": "-set:BuildXSXClient=false",
"Default": false
}
]
},
{
"Type": "List",
"Label": "Servers",
"Style": "MultiList",
"Items": [
{
"Text": "Windows",
"ArgumentIfEnabled": "-set:BuildWin64Server=true",
"ArgumentIfDisabled": "-set:BuildWin64Server=false",
"Default": true
},
{
"Text": "Linux",
"ArgumentIfEnabled": "-set:BuildLinuxServer=true",
"ArgumentIfDisabled": "-set:BuildLinuxServer=false",
"Default": true
}
]
},
{
"Type": "List",
"Label": "Configurations",
"Style": "MultiList",
"Items": [
{
"Text": "Debug",
"ArgumentIfEnabled": "-set:BuildDebugConfiguration=true",
"ArgumentIfDisabled": "-set:BuildDebugConfiguration=false",
"Default": false
},
{
"Text": "Development",
"ArgumentIfEnabled": "-set:BuildDevelopmentConfiguration=true",
"ArgumentIfDisabled": "-set:BuildDevelopmentConfiguration=false",
"Default": true
},
{
"Text": "Testing",
"ArgumentIfEnabled": "-set:BuildTestConfiguration=true",
"ArgumentIfDisabled": "-set:BuildTestConfiguration=false",
"Default": false
},
{
"Text": "Shipping",
"ArgumentIfEnabled": "-set:BuildShippingConfiguration=true",
"ArgumentIfDisabled": "-set:BuildShippingConfiguration=false",
"Default": false
}
]
},
{
"Type": "List",
"Label": "Tests",
"Style": "MultiList",
"Items": [
{
"Text": "Compile All Blueprints",
"ArgumentIfEnabled": "-set:TestCompileAllBlueprints=true",
"ArgumentIfDisabled": "-set:TestCompileAllBlueprints=false",
"Default": false
}
]
},
{
"Type": "List",
"Label": "Editor Automation Tests",
"Style": "MultiList",
"Items": [
{
"Text": "Preflight Test Group",
"ArgumentIfEnabled": "-set:EditorAutomationTestsPreflightEnable=true",
"Default": true
},
{
"Text": "CI Test Group",
"ArgumentIfEnabled": "-set:EditorAutomationTestsCIEnable=true",
"Default": false
},
{
"Text": "Nightly Test Group",
"ArgumentIfEnabled": "-set:EditorAutomationTestsNightlyEnable=true",
"Default": false
}
]
},
{
"Type": "Bool",
"Label": "Cook content",
"ArgumentIfEnabled": "-set:EnableCooking=true",
"ArgumentIfDisabled": "-set:EnableCooking=false",
"Default": true
},
{
"Type": "Bool",
"Label": "Package build",
"ArgumentIfEnabled": "-set:EnablePackaging=true",
"ArgumentIfDisabled": "-set:EnablePackaging=false",
"Default": false
},
{
"Type": "Bool",
"Label": "Non-unity Compile",
"ArgumentIfEnabled": "-set:EnableNonUnityCompile=true",
"ArgumentIfDisabled": "-set:EnableNonUnityCompile=false",
"Default": false
}
]
},
{
"ID": "nightly-full-build",
"Name": "Nightly Full Build",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"ShowUgsBadges": true,
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:SaveNetworkBuild=true",
"-set:UGSBadgesOverall=true",
"-set:UGSBadgesOverallName=Nightly Build",
"-set:BuildWin64Client=true",
"-set:BuildPS5Client=true",
"-set:BuildXSXClient=true",
"-set:BuildWin64Server=true",
"-set:BuildLinuxServer=true",
"-set:BuildDevelopmentConfiguration=true",
"-set:BuildShippingConfiguration=true",
"-set:BuildTestConfiguration=true",
"-set:EnablePackaging=true",
"-set:EditorAutomationTestsNightlyEnable=true",
"-set:TestCompileAllBlueprints=false"
],
"Schedule": {
"Enabled": true,
"MaxActive": 1,
"Patterns": [
{
"minTime": 1200
}
]
},
"Parameters": []
},
{
"ID": "non-unity-compile",
"Name": "Non-Unity Compile",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"ShowUgsBadges": true,
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:UGSBadgesOverall=true",
"-set:UGSBadgesOverallName=Non-Unity Build",
"-set:EnableNonUnityCompile=true"
],
"Schedule": {
"Enabled": true,
"MaxActive": 1,
"Patterns": [
{
"MinTime": 1380
}
]
},
"Parameters": [
{
"Type": "Bool",
"Label": "Editor",
"ArgumentIfEnabled": "-set:BuildEditor=true",
"ArgumentIfDisabled": "-set:BuildEditor=false",
"Default": true
},
{
"Type": "List",
"Label": "Clients",
"Style": "MultiList",
"Items": [
{
"Text": "Windows",
"ArgumentIfEnabled": "-set:BuildWin64Client=true",
"ArgumentIfDisabled": "-set:BuildWin64Client=false",
"Default": true
},
{
"Text": "Playstation 5",
"ArgumentIfEnabled": "-set:BuildPS5Client=true",
"ArgumentIfDisabled": "-set:BuildPS5Client=false",
"Default": true
},
{
"Text": "Xbox Series X",
"ArgumentIfEnabled": "-set:BuildXSXClient=true",
"ArgumentIfDisabled": "-set:BuildXSXClient=false",
"Default": true
}
]
},
{
"Type": "List",
"Label": "Servers",
"Style": "MultiList",
"Items": [
{
"Text": "Windows",
"ArgumentIfEnabled": "-set:BuildWin64Server=true",
"ArgumentIfDisabled": "-set:BuildWin64Server=false",
"Default": true
},
{
"Text": "Linux",
"ArgumentIfEnabled": "-set:BuildLinuxServer=true",
"ArgumentIfDisabled": "-set:BuildLinuxServer=false",
"Default": true
}
]
},
{
"Type": "List",
"Label": "Configurations",
"Style": "MultiList",
"Items": [
{
"Text": "Debug",
"ArgumentIfEnabled": "-set:BuildDebugConfiguration=true",
"ArgumentIfDisabled": "-set:BuildDebugConfiguration=false",
"Default": false
},
{
"Text": "Development",
"ArgumentIfEnabled": "-set:BuildDevelopmentConfiguration=true",
"ArgumentIfDisabled": "-set:BuildDevelopmentConfiguration=false",
"Default": true
},
{
"Text": "Testing",
"ArgumentIfEnabled": "-set:BuildTestConfiguration=true",
"ArgumentIfDisabled": "-set:BuildTestConfiguration=false",
"Default": false
},
{
"Text": "Shipping",
"ArgumentIfEnabled": "-set:BuildShippingConfiguration=true",
"ArgumentIfDisabled": "-set:BuildShippingConfiguration=false",
"Default": false
}
]
}
]
},
{
"ID": "static-analysis",
"Name": "Static Analysis",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"ShowUgsBadges": false,
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:EnableStaticAnalyzer=true",
"-set:BuildDevelopmentConfiguration=true"
],
"Schedule": {
"Enabled": false,
"MaxActive": 1,
"Patterns": [
{
"MinTime": 1200
}
]
},
"Parameters": [
{
"Type": "Bool",
"Label": "Editor",
"ArgumentIfEnabled": "-set:BuildEditor=true",
"ArgumentIfDisabled": "-set:BuildEditor=false",
"Default": true
},
{
"Type": "Bool",
"Label": "Windows Client",
"ArgumentIfEnabled": "-set:BuildWin64Client=true",
"ArgumentIfDisabled": "-set:BuildWin64Client=false",
"Default": true
},
{
"Type": "Bool",
"Label": "Windows Server",
"ArgumentIfEnabled": "-set:BuildWin64Server=true",
"ArgumentIfDisabled": "-set:BuildWin64Server=false",
"Default": true
}
]
},
{
"ID": "on-demand-full-build",
"Name": "On-Demand Full Build",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"Priority": "high",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:SaveNetworkBuild=true"
],
"Parameters": [
{
"Type": "List",
"Label": "Clients",
"Style": "MultiList",
"Items": [
{
"Text": "Windows",
"ArgumentIfEnabled": "-set:BuildWin64Client=true",
"ArgumentIfDisabled": "-set:BuildWin64Client=false",
"Default": true
},
{
"Text": "Playstation 5",
"ArgumentIfEnabled": "-set:BuildPS5Client=true",
"ArgumentIfDisabled": "-set:BuildPS5Client=false",
"Default": false
},
{
"Text": "Xbox Series X",
"ArgumentIfEnabled": "-set:BuildXSXClient=true",
"ArgumentIfDisabled": "-set:BuildXSXClient=false",
"Default": false
}
]
},
{
"Type": "List",
"Label": "Servers",
"Style": "MultiList",
"Items": [
{
"Text": "Windows",
"ArgumentIfEnabled": "-set:BuildWin64Server=true",
"ArgumentIfDisabled": "-set:BuildWin64Server=false",
"Default": true
},
{
"Text": "Linux",
"ArgumentIfEnabled": "-set:BuildLinuxServer=true",
"ArgumentIfDisabled": "-set:BuildLinuxServer=false",
"Default": true
}
]
},
{
"Type": "List",
"Label": "Configurations",
"Style": "MultiList",
"Items": [
{
"Text": "Debug",
"ArgumentIfEnabled": "-set:BuildDebugConfiguration=true",
"ArgumentIfDisabled": "-set:BuildDebugConfiguration=false",
"Default": false
},
{
"Text": "Development",
"ArgumentIfEnabled": "-set:BuildDevelopmentConfiguration=true",
"ArgumentIfDisabled": "-set:BuildDevelopmentConfiguration=false",
"Default": true
},
{
"Text": "Testing",
"ArgumentIfEnabled": "-set:BuildTestConfiguration=true",
"ArgumentIfDisabled": "-set:BuildTestConfiguration=false",
"Default": true
},
{
"Text": "Shipping",
"ArgumentIfEnabled": "-set:BuildShippingConfiguration=true",
"ArgumentIfDisabled": "-set:BuildShippingConfiguration=false",
"Default": true
}
]
},
{
"Type": "Bool",
"Label": "Cook",
"ArgumentIfEnabled": "-set:EnableCooking=true",
"ArgumentIfDisabled": "-set:EnableCooking=false",
"Default": true
},
{
"Type": "Bool",
"Label": "Package",
"ArgumentIfEnabled": "-set:EnablePackaging=true",
"ArgumentIfDisabled": "-set:EnablePackaging=false",
"Default": true
}
]
},
{
"ID": "utility-cleanup",
"Name": "Cleanup",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=UtilityCleanup"
],
"Schedule": {
"Enabled": true,
"MaxActive": 1,
"Patterns": [
{
"MinTime": 1320
}
]
},
"Parameters": [
{
"Type": "Bool",
"Label": "Purge scratch build files",
"ArgumentIfEnabled": "-set:ScratchBuildsPurge=true",
"ArgumentIfDisabled": "-set:ScratchBuildsPurge=false",
"Default": true
},
{
"Type": "Bool",
"Label": "Purge saved build files",
"ArgumentIfEnabled": "-set:SavedBuildsPurge=true",
"ArgumentIfDisabled": "-set:SavedBuildsPurge=false",
"Default": true
},
{
"Type": "Bool",
"Label": "Purge intermediate build files",
"ArgumentIfEnabled": "-set:IntermediateBuildsPurge=true",
"ArgumentIfDisabled": "-set:IntermediateBuildsPurge=false",
"Default": true
}
]
},
{
"ID": "utility-ddc-fill",
"Name": "DDC Fill",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:FillDDC=true"
],
"Schedule": {
"Enabled": true,
"MaxActive": 1,
"Patterns": [
{
"MinTime": 1320
}
]
},
"Parameters": []
},
{
"ID": "utility-hlod-generation",
"Name": "HLOD Generation",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:UseIncrementalAgents=true",
"-set:GenerateHLODs=true",
"-set:NavMeshMapNames=",
"-set:BuilderCount="
],
"Schedule": {
"Enabled": false,
"Patterns": [
{
"MinTime": 1320
}
]
},
"Parameters": [ ]
},
{
"ID": "utility-navmesh-generation",
"Name": "NavMesh Generation",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:UseIncrementalAgents=true",
"-set:NavMeshMapNames="
],
"Schedule": {
"Enabled": false,
"MaxActive": 1,
"Patterns": [
{
"MinTime": 1320
}
]
},
"Parameters": [ ]
},
{
"ID": "utility-ugs-binaries",
"Name": "UGS Binaries",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"ShowUgsBadges": true,
"Priority": "High",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:UseIncrementalAgents=true",
"-set:SubmitUGSBinaries=true"
],
"Schedule": {
"Enabled": false,
"MaxActive": 1,
"Filter": [
"ContainsCode"
],
"Patterns": [
{
"Interval": 1
}
]
},
"Parameters": [ ]
},
{
"ID": "utility-age-symstore",
"Name": "Age Symstore",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"ShowUgsBadges": false,
"Priority": "Normal",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=AgeSymstore",
"-set:UseIncrementalAgents=true",
"-set:BuildWin64Client=true",
"-set:BuildPS5Client=true",
"-set:BuildXSXClient=true",
"-set:BuildWin64Server=true",
"-set:BuildLinuxServer=true"
],
"Schedule": {
"Enabled": true,
"MaxActive": 1,
"Patterns": [
{
"MinTime": 1200
}
]
},
"Parameters": [ ]
},
{
"ID": "utility-resave-dirty-packages",
"Name": "Resave Dirty Packages",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"ShowUgsBadges": false,
"Priority": "Normal",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:ResaveDirtyPackages=true"
],
"Schedule": {
"Enabled": false,
"MaxActive": 1,
"Patterns": [
{
"MinTime": 120
}
]
},
"Parameters": [ ]
},
{
"ID": "utility-resave-redirectors",
"Name": "Resave Redirectors",
"AllowPreflights": false,
"InitialAgentType": "Utility",
"ShowUgsBadges": false,
"Priority": "Normal",
"Arguments": [
"-Script=QAGame/Build/Graph/QAGame-BuildProject.xml",
"-Target=BuildProject",
"-set:UseIncrementalAgents=true",
"-set:ResaveRedirectors=true"
],
"Schedule": {
"Enabled": false,
"MaxActive": 1,
"Patterns": [
{
"MinTime": 180
}
]
},
"Parameters": [ ]
}
]
}
<?xml version='1.0' ?>
<BuildGraph xmlns="http://www.epicgames.com/BuildGraph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epicgames.com/BuildGraph ../Schema.xsd">
<Include Script="Project-Config.xml" />
<!-- This will declare an aggregate called BuildAndPackage -->
<Include Script="..\..\..\Engine\Build\Graph\BuildProject.xml" />
</BuildGraph>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment