-
Notifications
You must be signed in to change notification settings - Fork 13
/
ue-build.ps1
178 lines (148 loc) · 5.99 KB
/
ue-build.ps1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
[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 Unreal Build Tool"
Write-Output "Usage:"
Write-Output " ue-build.ps1 [[-mode:]<dev|test|prod>] [[-src:]sourcefolder] [Options]"
Write-Output " "
Write-Output " -mode : Build mode"
Write-Output " : dev = build Development Editor, dlls only (default)"
Write-Output " : cleandev = build Development Editor CLEANLY"
Write-Output " : test = build Development and pacakge for test"
Write-Output " : prod = build Shipping and package for production"
Write-Output " -src : Source folder (current folder if omitted)"
Write-Output " : (should be root of project)"
Write-Output " -nocloseeditor : Don't close Unreal 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"
Write-Output " "
Write-Output "Environment Variables:"
Write-Output " UEINSTALL : Use a specific Unreal install."
Write-Output " : Default is to find one based on project version, under UEROOT"
Write-Output " UEROOT : Parent folder of all binary Unreal installs (detects version). "
Write-Output " : Default C:\Program Files\Epic Games"
Write-Output " "
}
$ErrorActionPreference = "Stop"
if ($help) {
Print-Usage
Exit 0
}
if (-not $mode) {
$mode = "dev"
}
if ($src.Length -eq 0) {
$src = "."
Write-Verbose "-src not specified, assuming current directory"
}
if (-not ($mode -in @('dev', 'cleandev', 'test', 'prod'))) {
Print-Usage
Write-Output "ERROR: Invalid mode argument: $mode"
Exit 3
}
. $PSScriptRoot\inc\buildtargets.ps1
$result = 0
try {
if ($src -ne ".") { Push-Location $src }
Write-Output "-- Build process starting --"
# Locate Unreal 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."
}
# In PS 6.0+ we could use Split-Path -LeafBase but let's stick with built-in PS 5.1
$uprojname = [System.IO.Path]::GetFileNameWithoutExtension($uprojfile)
if ($dryrun) {
Write-Output "Would build $uprojname for $mode"
} else {
Write-Output "Building $uprojname for $mode"
}
# Check version number of Unreal 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
Write-Output "Engine version is $uversion"
# UEINSTALL env var should point at the root of the *specific version* of
# Unreal you want to use. This is mainly for use in source builds, default is
# to build it from version number and root of all UE binary installs
$uinstall = $Env:UEINSTALL
# Backwards compat with old env var
if (-not $uinstall) {
$uinstall = $Env:UE4INSTALL
}
if (-not $uinstall) {
# UEROOT should be the parent folder of all UE versions
$uroot = $Env:UEROOT
# Backwards compat with old env var
if (-not $uroot) {
$uroot = $Env:UE4ROOT
}
if (-not $uroot) {
$uroot = "C:\Program Files\Epic Games"
}
$uinstall = Join-Path $uroot "UE_$uversion"
}
# Test we can find Build.bat
$batchfolder = Join-Path "$uinstall" "Engine\Build\BatchFiles"
$buildbat = Join-Path "$batchfolder" "Build.bat"
if (-not (Test-Path $buildbat -PathType Leaf)) {
throw "Build.bat missing at $buildbat : Aborting"
}
$buildargs = ""
switch ($mode) {
'dev' {
# Stolen from the VS project settings because boy is this badly documented
# The -Project seems to be needed, as is the -FromMsBuild
# -Project has to point at the ABSOLUTE PATH of the uproject
$uprojfileabs = Join-Path "$(Get-Location)" $uprojfile
$target = Find-DefaultTarget $src "Editor"
$buildargs = "$target Win64 Development -Project=`"${uprojfileabs}`" -WaitMutex -FromMsBuild"
}
'cleandev' {
$uprojfileabs = Join-Path "$(Get-Location)" $uprojfile
$target = Find-DefaultTarget $src "Editor"
$buildargs = "$target Win64 Development -Project=`"${uprojfileabs}`" -WaitMutex -FromMsBuild -clean"
}
'test' {
$uprojfileabs = Join-Path "$(Get-Location)" $uprojfile
$target = Find-DefaultTarget $src "Game"
$buildargs = "$target Win64 Test -Project=`"${uprojfileabs}`" -WaitMutex -FromMsBuild -clean"
}
'prod' {
$uprojfileabs = Join-Path "$(Get-Location)" $uprojfile
$target = Find-DefaultTarget $src "Game"
$buildargs = "$target Win64 Shipping -Project=`"${uprojfileabs}`" -WaitMutex -FromMsBuild -clean"
}
default {
# TODO
# We probably want to use custom launch profiles for this
Write-Output "Mode '$mode' is not supported yet"
}
}
if ($dryrun) {
Write-Output "Would run: build.bat $buildargs"
} else {
Write-Verbose "Running $buildbat $buildargs"
$proc = Start-Process $buildbat $buildargs -Wait -PassThru -NoNewWindow
if ($proc.ExitCode -ne 0) {
$code = $proc.ExitCode
throw "*** Build exited with code $code, see above"
}
}
Write-Output "-- Build process finished OK --"
} catch {
Write-Output "ERROR: $($_.Exception.Message)"
$result = 9
} finally {
if ($src -ne ".") { Pop-Location }
}
Exit $result