mirror of
https://github.com/RPCS3/rpcs3.git
synced 2026-10-11 22:49:55 +00:00
Building on windows made easier (#19507)
This commit is contained in:
+16
@@ -172,6 +172,22 @@ In case you preferred to install and use the standalone **CMake** tool:
|
||||
```
|
||||
3) once the build is completed, the **RPCS3** application will be available under the `<rpcs3_root>\build-msvc\bin` folder
|
||||
|
||||
#### Building with the PowerShell script
|
||||
|
||||
As an alternative to building through Visual Studio, run the PowerShell helper from the repository root:
|
||||
|
||||
```powershell
|
||||
.\scripts\win_build.ps1
|
||||
```
|
||||
|
||||
The script locates a supported Visual Studio installation, finds Qt from `Qt6_ROOT` or a standard `C:\Qt` installation, configures a Release Ninja Multi-Config build, and then builds it. Pass `-Cores <count>` to set the parallel build count; by default it uses all logical processors:
|
||||
|
||||
```powershell
|
||||
.\scripts\win_build.ps1 -Cores 8
|
||||
```
|
||||
|
||||
The resulting application is placed in `<rpcs3_root>\build\bin`.
|
||||
|
||||
### Linux
|
||||
|
||||
While still in the project root:
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
#Requires -Version 5.1
|
||||
param(
|
||||
[int]$Cores = 0
|
||||
)
|
||||
Set-StrictMode -Version Latest
|
||||
$ErrorActionPreference = 'Stop'
|
||||
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
|
||||
Clear-Host
|
||||
|
||||
function Print-Elapsed {
|
||||
param([datetime]$Start)
|
||||
|
||||
$Elapsed = (Get-Date) - $Start
|
||||
|
||||
Write-Host ''
|
||||
Write-Host ('Total build time: {0}h {1}m {2}s' -f
|
||||
[int]$Elapsed.TotalHours,
|
||||
$Elapsed.Minutes,
|
||||
$Elapsed.Seconds)
|
||||
}
|
||||
|
||||
$StartTime = Get-Date
|
||||
|
||||
# ============================================================
|
||||
# Visual Studio Detection
|
||||
# ============================================================
|
||||
$VsVarsPath = $null
|
||||
|
||||
$UninstallKeys = @(
|
||||
'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall',
|
||||
'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall'
|
||||
)
|
||||
|
||||
:vsSearch foreach ($BaseKey in $UninstallKeys) {
|
||||
foreach ($SubKey in (Get-ChildItem $BaseKey -ErrorAction SilentlyContinue)) {
|
||||
$DisplayName = $SubKey.GetValue('DisplayName', '')
|
||||
if ($DisplayName -like '*Visual Studio*') {
|
||||
$InstallLocation = $SubKey.GetValue('InstallLocation', '')
|
||||
if ($InstallLocation) {
|
||||
$Candidate = Join-Path $InstallLocation 'VC\Auxiliary\Build\vcvars64.bat'
|
||||
if (Test-Path $Candidate) {
|
||||
$VsVarsPath = $Candidate
|
||||
break vsSearch
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $VsVarsPath) {
|
||||
Write-Error 'ERROR: Visual Studio not found.'
|
||||
Read-Host 'Press Enter to exit'
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host "Using VS environment: $VsVarsPath"
|
||||
|
||||
# Import VS environment variables by running vcvars64.bat and capturing the env
|
||||
$TempFile = [System.IO.Path]::GetTempFileName() + '.bat'
|
||||
@"
|
||||
@echo off
|
||||
call "$VsVarsPath"
|
||||
set
|
||||
"@ | Set-Content $TempFile -Encoding ASCII
|
||||
|
||||
cmd /c $TempFile | ForEach-Object {
|
||||
if ($_ -match '^([^=]+)=(.*)$') {
|
||||
[System.Environment]::SetEnvironmentVariable($Matches[1], $Matches[2], 'Process')
|
||||
}
|
||||
}
|
||||
Remove-Item $TempFile -Force
|
||||
|
||||
# ============================================================
|
||||
# Qt Detection
|
||||
# ============================================================
|
||||
$QtRoot = $null
|
||||
|
||||
if ($env:Qt6_ROOT -and (Test-Path (Join-Path $env:Qt6_ROOT 'lib\cmake\Qt6\Qt6Config.cmake'))) {
|
||||
$QtRoot = $env:Qt6_ROOT
|
||||
Write-Host "Found Qt6 from environment variable: $env:Qt6_ROOT"
|
||||
}
|
||||
|
||||
if (-not $QtRoot) {
|
||||
foreach ($Drive in 'C','D','E','F','G','H') {
|
||||
$QtBase = "${Drive}:\Qt"
|
||||
if (-not (Test-Path $QtBase)) { continue }
|
||||
foreach ($VersionDir in (Get-ChildItem $QtBase -Directory -Filter '6.*' -ErrorAction SilentlyContinue)) {
|
||||
$Candidate = Join-Path $VersionDir.FullName 'msvc2022_64'
|
||||
if (Test-Path (Join-Path $Candidate 'lib\cmake\Qt6\Qt6Config.cmake')) {
|
||||
$QtRoot = $Candidate
|
||||
Write-Host "Found Qt6 at: $Candidate"
|
||||
break
|
||||
}
|
||||
}
|
||||
if ($QtRoot) { break }
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $QtRoot) {
|
||||
Write-Error @'
|
||||
ERROR: Qt6 not found. Please set the Qt6_ROOT environment variable.
|
||||
Example: [System.Environment]::SetEnvironmentVariable('Qt6_ROOT','C:\Qt\6.8.3\msvc2022_64','User')
|
||||
'@
|
||||
Read-Host 'Press Enter to exit'
|
||||
exit 1
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Build Configuration
|
||||
# ============================================================
|
||||
if ($Cores -le 0) {
|
||||
$Cores = (Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors
|
||||
}
|
||||
|
||||
$SourceDir = Split-Path -Parent $PSScriptRoot
|
||||
$BuildDir = Join-Path $SourceDir 'build'
|
||||
|
||||
# ============================================================
|
||||
# Selective Clean (SDL3 export conflict fix)
|
||||
# Only wipe SDL3 folder to avoid the export() CMake 4.x conflict
|
||||
# while preserving all other compiled objects (LLVM, ffmpeg, etc.)
|
||||
# ============================================================
|
||||
$SdlDir = Join-Path $BuildDir '3rdparty\libsdl-org'
|
||||
if (Test-Path $SdlDir) {
|
||||
Write-Host ''
|
||||
Write-Host 'Cleaning SDL3 build cache to prevent export conflicts...'
|
||||
Remove-Item $SdlDir -Recurse -Force
|
||||
Write-Host 'SDL3 clean done.'
|
||||
}
|
||||
|
||||
if (-not (Test-Path $BuildDir)) {
|
||||
New-Item $BuildDir -ItemType Directory | Out-Null
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# CMake Configure
|
||||
# Skipped if CMakeCache.txt already exists from a previous run.
|
||||
# Delete build\CMakeCache.txt or the entire build folder to force
|
||||
# a full reconfigure (e.g. after changing cmake flags).
|
||||
# ============================================================
|
||||
$CacheFile = Join-Path $BuildDir 'CMakeCache.txt'
|
||||
if (-not (Test-Path $CacheFile)) {
|
||||
Write-Host ''
|
||||
Write-Host "Configuring CMake with $Cores cores..."
|
||||
Write-Host "Qt6 Root: $QtRoot"
|
||||
Write-Host ''
|
||||
|
||||
& cmake $SourceDir -G 'Ninja Multi-Config' `
|
||||
-DBUILD_LLVM=ON `
|
||||
-DUSE_SYSTEM_OPENCV=OFF `
|
||||
-DUSE_SYSTEM_CURL=OFF `
|
||||
-DUSE_SYSTEM_ZLIB=OFF `
|
||||
-DUSE_SYSTEM_LIBPNG=OFF `
|
||||
-DUSE_SYSTEM_SDL=OFF `
|
||||
-DUSE_VULKAN=ON `
|
||||
"-DQt6_ROOT=$QtRoot" `
|
||||
"-DCMAKE_PREFIX_PATH=$QtRoot" `
|
||||
-B $BuildDir
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host ''
|
||||
Write-Error 'ERROR: CMake configuration failed!'
|
||||
Print-Elapsed $StartTime
|
||||
Read-Host 'Press Enter to exit'
|
||||
exit 1
|
||||
}
|
||||
} else {
|
||||
Write-Host ''
|
||||
Write-Host 'Skipping CMake configure (cache exists).'
|
||||
Write-Host "To force a full reconfigure, delete: $CacheFile"
|
||||
}
|
||||
|
||||
# ============================================================
|
||||
# Build
|
||||
# Ninja will only recompile files that have actually changed.
|
||||
# ============================================================
|
||||
Write-Host ''
|
||||
Write-Host "Building with $Cores cores..."
|
||||
|
||||
& cmake --build $BuildDir --config Release --parallel $Cores
|
||||
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-Host ''
|
||||
Write-Error 'ERROR: Build failed!'
|
||||
Print-Elapsed $StartTime
|
||||
Read-Host 'Press Enter to exit'
|
||||
exit 1
|
||||
}
|
||||
|
||||
Write-Host ''
|
||||
Write-Host "Build complete! Output is in `"$BuildDir\bin\`""
|
||||
Print-Elapsed $StartTime
|
||||
Read-Host 'Press Enter to exit'
|
||||
exit 0
|
||||
Reference in New Issue
Block a user