|
<?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="$(BuildName)" $(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=""$(NetworkOutputDirectory)\$(CookPlatform)\Packages"" /> |
|
<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="$(BuildName)" $(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=""$(NetworkOutputDirectory)\$(CookPlatform)\Packages"" /> |
|
<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. >"$(RootDir)\Engine\Build\PrecompiledBinaries.txt"" /> |
|
<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 "Generated navigation mesh for $(MapName)"" /> |
|
|
|
<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="UE.EditorAutomation(RunTest=$(TestName))"" /> |
|
<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="UE.EditorBootTest"" /> |
|
<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> |
@Nik153 Interesting, so it's a limiter option on ResavePackages that only resaves if there's a change in the output? It wasn't clear from reading the code what that was specifically useful for. I've been doing a lot of wholesale resaving, that would be useful for making it more targeted. (edit: been playing with it.. it takes an insane amount of time to do this operation!)