Add utility to build plugins & change dir names to differentiate

This commit is contained in:
Steve Streeting 2023-06-15 15:04:15 +01:00
parent 3f5aa81858
commit cf7fe1d821
7 changed files with 181 additions and 10 deletions

38
doc/BuildPlugin.md Normal file
View File

@ -0,0 +1,38 @@
# Building Plugins
If you want to build a plugin so that you can test it locally as if it was a
Marketplace plugin (before you [package it](PluginPackage.md)), the
`ue-build-plugin.ps1` script can help make it easier.
The plugin will be built for the current platform only, using the engine version
specified in the .uplugin file.
```
Usage:
ue-build-plugin.ps1 [[-src:]sourcefolder] [Options]
-src : Source folder (current folder if omitted)
: (should be root of project)
-dryrun : Don't perform any actual actions, just report on what you would do
-help : Print this help
Environment Variables:
UEINSTALL : Use a specific Unreal install.
: Default is to find one based on project version, under UEROOT
UEROOT : Parent folder of all binary Unreal installs (detects version).
: Default C:\Program Files\Epic Games
```
This script operates based on a `pluginconfig.json` file which must be present
in the root of your plugin, next to the .uplugin file. The options are:
```json
{
"PackageDir": "C:\\Users\\Steve\\Marketplace",
"BuildDir": "C:\\Users\\Steve\\Builds\\MyPlugin",
"PluginFile": "OptionalPluginFilenameWillDetectInDirOtherwise.uplugin",
}
```
Only `BuildDir` is required.

View File

@ -11,7 +11,7 @@ to make that job easier.
> Unfortunately the first time, this will probably mess with indenting because > Unfortunately the first time, this will probably mess with indenting because
> of a difference of opinion between JSON libraries. But it's harmless. > of a difference of opinion between JSON libraries. But it's harmless.
```sh ```
Usage: Usage:
ue-plugin-package.ps1 [-src:sourcefolder] [-major|-minor|-patch|-hotfix] [options...] ue-plugin-package.ps1 [-src:sourcefolder] [-major|-minor|-patch|-hotfix] [options...]
@ -34,7 +34,7 @@ in the root of your plugin, next to the .uplugin file. The options are:
```json ```json
{ {
"OutputDir": "C:\\Users\\Steve\\MarketplaceBuilds", "PackageDir": "C:\\Users\\Steve\\MarketplaceBuilds",
"PluginFile": "OptionalPluginFilenameWillDetectInDirOtherwise.uplugin", "PluginFile": "OptionalPluginFilenameWillDetectInDirOtherwise.uplugin",
"EngineVersions": "EngineVersions":
[ [
@ -45,7 +45,7 @@ in the root of your plugin, next to the .uplugin file. The options are:
} }
``` ```
`OutputDir` and `EngineVersions` are required. `PackageDir` and `EngineVersions` are required.
## Engine Versions ## Engine Versions

View File

@ -15,3 +15,14 @@ if ($IsWindows) {
if ($IsWindows) { if ($IsWindows) {
$batchSuffix = ".bat" $batchSuffix = ".bat"
} }
function Get-Platform {
if ($IsWindows) {
return "Win64"
} elseif ($IsLinux) {
return "Linux"
} else {
return "Mac"
}
}

View File

@ -1,7 +1,8 @@
class PluginConfig { class PluginConfig {
[string]$OutputDir [string]$PackageDir
[string]$BuildDir
[string]$PluginFile [string]$PluginFile
[array]$EngineVersions [array]$EngineVersions

View File

@ -51,7 +51,12 @@ function Get-UE-Version {
[psobject]$uproject [psobject]$uproject
) )
return $uproject.EngineAssociation if ($uproject.EngineAssociation) {
return $uproject.EngineAssociation
} else {
# Plugin
return $uproject.EngineVersion
}
} }
function Get-Is-UE5 { function Get-Is-UE5 {
@ -88,7 +93,13 @@ function Get-UE-Install {
$uroot = "C:\Program Files\Epic Games" $uroot = "C:\Program Files\Epic Games"
} }
$uinstall = Join-Path $uroot "UE_$ueVersion" # When using $ueVersion, strip off 3rd digit if any
$regex = "(\d+\.\d+)(\.\d+)?"
$match = $ueVersion | Select-String -Pattern $regex
$ueVersionTrimmed = $match.Matches[0].Groups[1].Value
$uinstall = Join-Path $uroot "UE_$ueVersionTrimmed"
} }
# Test we can find RunUAT.bat # Test we can find RunUAT.bat

110
ue-build-plugin.ps1 Normal file
View File

@ -0,0 +1,110 @@
[CmdletBinding()] # Fail on unknown args
param (
[string]$mode,
[string]$src,
[switch]$nocloseeditor = $false,
[switch]$dryrun = $false,
[switch]$help = $false
)
. $PSScriptRoot\inc\platform.ps1
. $PSScriptRoot\inc\pluginconfig.ps1
. $PSScriptRoot\inc\pluginversion.ps1
. $PSScriptRoot\inc\uproject.ps1
. $PSScriptRoot\inc\uplugin.ps1
. $PSScriptRoot\inc\filetools.ps1
function Print-Usage {
Write-Output "Steve's Unreal Plugin Build Tool"
Write-Output "Usage:"
Write-Output " ue-build-plugin.ps1 [[-src:]sourcefolder] [Options]"
Write-Output " "
Write-Output " -src : Source folder (current folder if omitted)"
Write-Output " : (should be root of project)"
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 ($src.Length -eq 0) {
$src = "."
Write-Verbose "-src not specified, assuming current directory"
}
if ($help) {
Print-Usage
Exit 0
}
$result = 0
try {
if ($src -ne ".") { Push-Location $src }
Write-Output "-- Build plugin process starting --"
$config = Read-Plugin-Config -srcfolder:$src
# Locate Unreal project file
$pluginfile = Get-Uplugin-Filename -srcfolder:$src -config:$config
if (-not $pluginfile) {
throw "Not in a uplugin dir!"
}
$proj = Read-Uproject $pluginfile
$ueVersion = Get-UE-Version $proj
$ueinstall = Get-UE-Install $ueVersion
Write-Output ""
Write-Output "Project File : $projfile"
Write-Output "UE Version : $ueVersion"
Write-Output "UE Install : $ueinstall"
Write-Output "Output Folder : $($config.BuildDir)"
Write-Output ""
$runUAT = Join-Path $ueinstall "Engine/Build/BatchFiles/RunUAT$batchSuffix"
$targetPlatform = Get-Platform
$argList = [System.Collections.ArrayList]@()
$argList.Add("BuildPlugin") > $null
$argList.Add("-Plugin=`"$pluginfile`"") > $null
$argList.Add("-Package=`"$($config.BuildDir)`"") > $null
$argList.Add("-Rocket") > $null
$argList.Add("-TargetPlatforms=$targetPlatform") > $null
if ($dryrun) {
Write-Output ""
Write-Output "Would have run:"
Write-Output "> $runUAT $($argList -join " ")"
Write-Output ""
} else {
$proc = Start-Process $runUAT $argList -Wait -PassThru -NoNewWindow
if ($proc.ExitCode -ne 0) {
throw "RunUAT failed!"
}
}
Write-Output "-- Build plugin process finished OK --"
} catch {
Write-Output "ERROR: $($_.Exception.Message)"
$result = 9
} finally {
if ($src -ne ".") { Pop-Location }
}
Exit $result

View File

@ -134,7 +134,7 @@ try {
Write-Output "" Write-Output ""
Write-Output "Plugin File : $pluginfile" Write-Output "Plugin File : $pluginfile"
Write-Output "Output Folder : $($config.OutputDir)" Write-Output "Output Folder : $($config.PackageDir)"
Write-Output "Engine Versions : $($config.EngineVersions -join ", ")" Write-Output "Engine Versions : $($config.EngineVersions -join ", ")"
Write-Output "" Write-Output ""
@ -193,11 +193,11 @@ try {
# Zip parent of the uplugin folder # Zip parent of the uplugin folder
$zipsrc = (Get-Item $pluginfile).Directory.FullName $zipsrc = (Get-Item $pluginfile).Directory.FullName
$zipdst = Join-Path $config.OutputDir "$($pluginName)_v$($versionNumber)_UE$($EngineVer).zip" $zipdst = Join-Path $config.PackageDir "$($pluginName)_v$($versionNumber)_UE$($EngineVer).zip"
$excludefilename = "packageexclusions.txt" $excludefilename = "packageexclusions.txt"
$excludefile = Join-Path $zipsrc $excludefilename $excludefile = Join-Path $zipsrc $excludefilename
New-Item -ItemType Directory -Path $config.OutputDir -Force > $null New-Item -ItemType Directory -Path $config.PackageDir -Force > $null
Write-Output "Compressing to $zipdst" Write-Output "Compressing to $zipdst"
$argList = [System.Collections.ArrayList]@() $argList = [System.Collections.ArrayList]@()
@ -250,7 +250,7 @@ try {
if ($browse -and -not $dryrun) { if ($browse -and -not $dryrun) {
Invoke-Item $config.OutputDir Invoke-Item $config.PackageDir
} }
} }