Files
spacetris/build-production.ps1

285 lines
8.2 KiB
PowerShell

#!/usr/bin/env pwsh
<#
.SYNOPSIS
Production Build Script for Tetris SDL3 Game
.DESCRIPTION
This script builds the Tetris game for production distribution, including:
- Clean Release build with optimizations
- Dependency collection and packaging
- Asset organization and validation
- Distributable package creation
.PARAMETER Clean
Perform a clean build (removes existing build directories)
.PARAMETER PackageOnly
Skip building and only create the distribution package
.PARAMETER OutputDir
Directory where the final package will be created (default: ./dist)
.EXAMPLE
.\build-production.ps1 -Clean
.\build-production.ps1 -PackageOnly -OutputDir "C:\Releases"
#>
param(
[switch]$Clean,
[switch]$PackageOnly,
[string]$OutputDir = "dist"
)
# Configuration
$ProjectName = "tetris"
$BuildDir = "build-release"
$PackageDir = Join-Path $OutputDir "TetrisGame"
$Version = Get-Date -Format "yyyy.MM.dd"
# Colors for output
function Write-ColorOutput($ForegroundColor) {
$fc = $host.UI.RawUI.ForegroundColor
$host.UI.RawUI.ForegroundColor = $ForegroundColor
if ($args) {
Write-Output $args
}
$host.UI.RawUI.ForegroundColor = $fc
}
function Write-Success { Write-ColorOutput Green $args }
function Write-Info { Write-ColorOutput Cyan $args }
function Write-Warning { Write-ColorOutput Yellow $args }
function Write-Error { Write-ColorOutput Red $args }
Write-Info "======================================"
Write-Info " Tetris SDL3 Production Builder"
Write-Info "======================================"
Write-Info "Version: $Version"
Write-Info "Output: $PackageDir"
Write-Info ""
# Check if we're in the right directory
if (!(Test-Path "CMakeLists.txt")) {
Write-Error "Error: CMakeLists.txt not found. Please run this script from the project root directory."
exit 1
}
# Step 1: Clean if requested
if ($Clean) {
Write-Info "🧹 Cleaning previous builds..."
if (Test-Path $BuildDir) {
Remove-Item $BuildDir -Recurse -Force
Write-Success "Removed $BuildDir"
}
if (Test-Path $OutputDir) {
Remove-Item $OutputDir -Recurse -Force
Write-Success "Removed $OutputDir"
}
}
# Step 2: Build (unless PackageOnly)
if (!$PackageOnly) {
Write-Info "🔨 Building Release version..."
# Create build directory
if (!(Test-Path $BuildDir)) {
New-Item -ItemType Directory -Path $BuildDir | Out-Null
}
# Configure with CMake for Release
Write-Info "Configuring CMake for Release build..."
$configResult = & cmake -S . -B $BuildDir -DCMAKE_BUILD_TYPE=Release 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Error "CMake configuration failed:"
Write-Error $configResult
exit 1
}
Write-Success "CMake configuration completed"
# Build the project
Write-Info "Compiling Release build..."
$buildResult = & cmake --build $BuildDir --config Release 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Error "Build failed:"
Write-Error $buildResult
exit 1
}
Write-Success "Build completed successfully"
}
# Step 3: Verify executable exists
$ExecutablePath = Join-Path $BuildDir "Release\$ProjectName.exe"
if (!(Test-Path $ExecutablePath)) {
# Try alternative path structure
$ExecutablePath = Join-Path $BuildDir "$ProjectName.exe"
if (!(Test-Path $ExecutablePath)) {
Write-Error "Error: Executable not found at expected locations"
Write-Error "Expected: $ExecutablePath"
exit 1
}
}
Write-Success "Found executable: $ExecutablePath"
# Step 4: Create package directory structure
Write-Info "📦 Creating distribution package..."
if (Test-Path $PackageDir) {
Remove-Item $PackageDir -Recurse -Force
}
New-Item -ItemType Directory -Path $PackageDir -Force | Out-Null
# Step 5: Copy executable
Write-Info "Copying executable..."
Copy-Item $ExecutablePath $PackageDir
Write-Success "Copied $ProjectName.exe"
# Step 6: Copy assets
Write-Info "Copying game assets..."
# Copy all required assets
$AssetFolders = @("assets", "fonts")
foreach ($folder in $AssetFolders) {
if (Test-Path $folder) {
$destPath = Join-Path $PackageDir $folder
Copy-Item $folder -Destination $destPath -Recurse -Force
Write-Success "Copied $folder"
}
}
# Copy font files from root (if any)
$FontFiles = @("FreeSans.ttf")
foreach ($font in $FontFiles) {
if (Test-Path $font) {
Copy-Item $font $PackageDir
Write-Success "Copied $font"
}
}
# Step 7: Copy dependencies (DLLs)
Write-Info "Copying runtime dependencies..."
$buildVcpkgBin = Join-Path (Join-Path $BuildDir "vcpkg_installed") "x64-windows/bin"
$repoVcpkgBin = "vcpkg_installed/x64-windows/bin"
$DependencyDirs = @($buildVcpkgBin, $repoVcpkgBin) | Where-Object { $_ } | Select-Object -Unique
$copiedNames = @{}
foreach ($dir in $DependencyDirs) {
if (!(Test-Path $dir)) { continue }
Write-Info "Scanning $dir for DLLs..."
$dlls = Get-ChildItem -Path $dir -Filter "*.dll" -ErrorAction SilentlyContinue
foreach ($dll in $dlls) {
$dest = Join-Path $PackageDir $dll.Name
Copy-Item $dll.FullName $dest -Force
if (-not $copiedNames.ContainsKey($dll.Name)) {
Write-Success "Copied $($dll.Name)"
$copiedNames[$dll.Name] = $true
}
}
}
if ($copiedNames.Count -eq 0) {
Write-Warning "No dependency DLLs were copied. Please ensure vcpkg has been built for Release."
}
# Step 8: Create README and batch file for easy launching
Write-Info "Creating distribution files..."
# Create README
$ReadmeContent = @"
Tetris SDL3 Game - Release $Version
=====================================
## System Requirements
- Windows 10/11 (64-bit)
- DirectX compatible graphics
- Audio device for music and sound effects
## Installation
1. Extract all files to a folder
2. Run tetris.exe
## Controls
- Arrow Keys: Move pieces
- Z/X: Rotate pieces
- C: Hold piece
- Space: Hard drop
- P: Pause
- F11: Toggle fullscreen
- Esc: Return to menu
## Troubleshooting
- If the game doesn't start, ensure all DLL files are in the same folder as tetris.exe
- For audio issues, check that your audio drivers are up to date
- The game requires the assets folder to be in the same directory as the executable
## Files Included
- tetris.exe - Main game executable
- SDL3.dll, SDL3_ttf.dll, SDL3_image.dll - Required libraries
- assets/ - Game assets (images, music, fonts)
- FreeSans.ttf - Main font file
Enjoy playing Tetris!
"@
$ReadmeContent | Out-File -FilePath (Join-Path $PackageDir "README.txt") -Encoding UTF8
Write-Success "Created README.txt"
# Create launch batch file
$BatchContent = @"
@echo off
cd /d "%~dp0"
tetris.exe
pause
"@
$BatchContent | Out-File -FilePath (Join-Path $PackageDir "Launch-Tetris.bat") -Encoding ASCII
Write-Success "Created Launch-Tetris.bat"
# Step 9: Validate package
Write-Info "🔍 Validating package..."
$RequiredFiles = @("$ProjectName.exe", "assets", "FreeSans.ttf")
$MissingFiles = @()
foreach ($file in $RequiredFiles) {
$filePath = Join-Path $PackageDir $file
if (!(Test-Path $filePath)) {
$MissingFiles += $file
}
}
if ($MissingFiles.Count -gt 0) {
Write-Warning "Warning: Missing files detected:"
foreach ($missing in $MissingFiles) {
Write-Warning " - $missing"
}
} else {
Write-Success "All required files present"
}
# Step 10: Calculate package size
$PackageSize = (Get-ChildItem $PackageDir -Recurse | Measure-Object -Property Length -Sum).Sum
$PackageSizeMB = [math]::Round($PackageSize / 1MB, 2)
# Step 11: Create ZIP archive (optional)
$ZipPath = Join-Path $OutputDir "TetrisGame-$Version.zip"
Write-Info "📁 Creating ZIP archive..."
try {
Compress-Archive -Path $PackageDir -DestinationPath $ZipPath -Force
Write-Success "Created ZIP: $ZipPath"
} catch {
Write-Warning "Failed to create ZIP archive: $($_.Exception.Message)"
}
# Final summary
Write-Info ""
Write-Success "======================================"
Write-Success " Build Completed Successfully!"
Write-Success "======================================"
Write-Info "Package location: $PackageDir"
Write-Info "Package size: $PackageSizeMB MB"
if (Test-Path $ZipPath) {
Write-Info "ZIP archive: $ZipPath"
}
Write-Info ""
Write-Info "The game is ready for distribution!"
Write-Info "Users can run tetris.exe or Launch-Tetris.bat"
Write-Info ""