From bbec3852f68996b53bfd77a36a64997d817c6aab Mon Sep 17 00:00:00 2001 From: Steve Streeting Date: Mon, 11 May 2020 12:29:07 +0100 Subject: [PATCH] Starting a UE4 build script --- ue4-build.ps1 | 125 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 ue4-build.ps1 diff --git a/ue4-build.ps1 b/ue4-build.ps1 new file mode 100644 index 0000000..9e2beda --- /dev/null +++ b/ue4-build.ps1 @@ -0,0 +1,125 @@ +[CmdletBinding()] # Fail on unknown args +param ( + [string]$mode, + [string]$src, + [switch]$nocloseeditor = $false, + [switch]$dryrun = $false, + [switch]$help = $false +) + +function Print-Usage { + Write-Output "Steve's UE4 Build Tool" + Write-Output " This is a WIP, only builds for dev right now" + Write-Output "Usage:" + Write-Output " ue4-build.ps1 [-mode:] [[-src:]sourcefolder] [Options]" + Write-Output " " + Write-Output " -mode : Build mode (required)" + Write-Output " : dev = build Development Editor, dlls only" + Write-Output " : dev = build Development Editor locally for editor" + Write-Output " : test = build Development and pacakge for test (TODO)" + Write-Output " : prod = build Shipping and package for production (TODO)" + Write-Output " -src : Source folder (current folder if omitted)" + Write-Output " : (should be root of project)" + Write-Output " -nocloseeditor : Don't close UE4 editor (this will prevent DLL cleanup)" + Write-Output " -dryrun : Don't perform any actual actions, just report on what you would do" + Write-Output " -help : Print this help" +} + +$ErrorActionPreference = "Stop" + + +if ($help) { + Print-Usage + Exit 0 +} + +if (-not $mode) { + Print-Usage + Write-Output "ERROR: Required argument: mode" + Exit 3 +} + +if (-not (@('dev', 'test', 'prod') -contains $mode)) { + Print-Usage + Write-Output "ERROR: Invalid mode argument: $mode" + Exit 3 + +} + + +$result = 0 + +try { + if ($src -ne ".") { Push-Location $src } + + # Locate UE4 project file + $uprojfile = Get-ChildItem *.uproject | Select-Object -expand Name + if (-not $uprojfile) { + throw "No Unreal project file found in $(Get-Location)! Aborting." + } + if ($uprojfile -is [array]) { + throw "Multiple Unreal project files found in $(Get-Location)! Aborting." + } + + Write-Output "Building $uprojfile for $mode" + + # Check version number of UE4 project so we know which version to run + # We can read this from .uproject which is JSON + $uproject = Get-Content $uprojfile | ConvertFrom-Json + + $uversion = $uproject.EngineAssociation + + # UE4INSTALL env var should point at the root of the *specific version* of + # UE4 you want to use. This is mainly for use in source builds, default is + # to build it from version number and root of all UE4 binary installs + $uinstall = $Env:UE4INSTALL + + if (-not $uinstall) { + # UE4ROOT should be the parent folder of all UE versions + $uroot = $Env:UE4ROOT + if (-not $uroot) { + $uroot = "C:\Program Files\Epic Games" + } + + $uinstall = Join-Path $uroot "UE_$uversion" + } + + # Test we can find RunUAT.bat + $uat = Join-Path "$uinstall" "Engine\Build\BatchFiles\RunUAT.bat" + if (-not (Test-Path $uat -PathType Leaf)) { + throw "Unreal Automation Tool doesn't exist at $uat : Aborting" + } + + Write-Verbose "Running $uat" + + + # Close UE4 as early as possible + # if (-not $dryrun -and -not $nocloseeditor) { + # # Check if Unity is running, if so try to shut it gracefully + # $ue4proc = Get-Process UE4Editor | Where-Object {$_.MainWindowTitle -like "ue4localise*" } + # if ($ue4proc) { + # Write-Output "UE4 is currently running, trying to gracefully shut window " + # $ue4proc.CloseMainWindow() + # Start-Sleep 5 + # if (!$ue4proc.HasExited) { + # throw "Couldn't close UE4 gracefully, aborting!" + # } + # } + # Remove-Variable ue4proc + # } + + + # Try to locate RunUAT.bat so we don't have to add UE4 version to PATH + # Most likely in + # C:\Program Files\Epic Games\UE_4.24\Engine\Build\BatchFiles + + +} catch { + Write-Output "ERROR: $($_.Exception.Message)" + $result = 9 +} finally { + if ($src -ne ".") { Pop-Location } +} + + +Exit $result