@@ -0,0 +1,68 @@
|
||||
# Packages the component the way foobar2000 expects to install it.
|
||||
#
|
||||
# pwsh -File tools/package.ps1 # both architectures
|
||||
# pwsh -File tools/package.ps1 -Platform x64
|
||||
#
|
||||
# A ".fb2k-component" file is a plain ZIP archive holding the component DLL; the
|
||||
# user drags it onto foobar2000 (or uses Preferences -> Components -> Install) and
|
||||
# the installer unpacks it into a subfolder of the profile's user-components. The
|
||||
# archive must therefore contain the DLL at its root, and the architecture matters:
|
||||
# foobar2000 1.6 is 32-bit, 2.x ships both, and a wrong-architecture DLL is
|
||||
# silently ignored -- so x86 and x64 get separate packages.
|
||||
#
|
||||
# A readme travels inside the archive so the file explains itself once installed.
|
||||
[CmdletBinding()]
|
||||
param(
|
||||
[ValidateSet('Win32', 'x64', 'both')][string]$Platform = 'both',
|
||||
[string]$Configuration = 'Release-Static'
|
||||
)
|
||||
|
||||
$ErrorActionPreference = 'Stop'
|
||||
$projectRoot = Split-Path -Parent $PSScriptRoot
|
||||
$distDir = Join-Path $projectRoot 'dist'
|
||||
|
||||
# The version the component reports comes from main.cpp; read it from the source so
|
||||
# the package name cannot drift from what foobar2000 shows.
|
||||
$version = '0.0.0'
|
||||
$main = Get-Content (Join-Path $projectRoot 'src\main.cpp') -Raw
|
||||
if ($main -match '#define\s+JOC_VERSION\s+"([^"]+)"') {
|
||||
$version = $Matches[1]
|
||||
} elseif ($main -match 'DECLARE_COMPONENT_VERSION\s*\(\s*"[^"]*"\s*,\s*"([^"]+)"') {
|
||||
$version = $Matches[1]
|
||||
}
|
||||
|
||||
$targets = if ($Platform -eq 'both') { @('Win32', 'x64') } else { @($Platform) }
|
||||
New-Item -ItemType Directory -Force -Path $distDir | Out-Null
|
||||
# Packages of earlier versions would otherwise pile up and be uploaded as well.
|
||||
Get-ChildItem $distDir -Filter '*.fb2k-component' -ErrorAction SilentlyContinue |
|
||||
Where-Object { $_.Name -notlike "*$version*" } |
|
||||
Remove-Item -Force
|
||||
|
||||
foreach ($target in $targets) {
|
||||
$architecture = if ($target -eq 'Win32') { 'x86' } else { 'x64' }
|
||||
Write-Host "building $target ($architecture)..." -ForegroundColor Cyan
|
||||
& (Join-Path $PSScriptRoot 'build.ps1') -Platform $target -Configuration $Configuration | Out-Null
|
||||
if ($LASTEXITCODE -ne 0) { throw "build failed for $target" }
|
||||
|
||||
$dll = Join-Path $projectRoot "build\$target\foo_input_joc.dll"
|
||||
if (-not (Test-Path -LiteralPath $dll)) { throw "missing $dll" }
|
||||
|
||||
# Stage exactly what should end up in the user's profile.
|
||||
$stage = Join-Path $distDir "stage-$architecture"
|
||||
if (Test-Path -LiteralPath $stage) { Remove-Item -LiteralPath $stage -Recurse -Force }
|
||||
New-Item -ItemType Directory -Force -Path $stage | Out-Null
|
||||
Copy-Item -LiteralPath $dll -Destination (Join-Path $stage 'foo_input_joc.dll') -Force
|
||||
Copy-Item -LiteralPath (Join-Path $projectRoot 'README.md') -Destination $stage -Force
|
||||
|
||||
$archive = Join-Path $distDir "foo_input_joc-$version-$architecture.fb2k-component"
|
||||
if (Test-Path -LiteralPath $archive) { Remove-Item -LiteralPath $archive -Force }
|
||||
Compress-Archive -Path (Join-Path $stage '*') -DestinationPath $archive -CompressionLevel Optimal
|
||||
|
||||
Remove-Item -LiteralPath $stage -Recurse -Force
|
||||
Write-Host (" {0} ({1:N0} bytes)" -f $archive, (Get-Item -LiteralPath $archive).Length) -ForegroundColor Green
|
||||
}
|
||||
|
||||
Write-Host ''
|
||||
Get-ChildItem $distDir -Filter '*.fb2k-component' | ForEach-Object {
|
||||
Write-Host ("{0} sha256={1}" -f $_.Name, (Get-FileHash $_.FullName -Algorithm SHA256).Hash.ToLower())
|
||||
}
|
||||
Reference in New Issue
Block a user