diff --git a/README.md b/README.md index 09c43f4..fa4aaae 100644 --- a/README.md +++ b/README.md @@ -79,10 +79,11 @@ Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManage ``` The Windows installer will attempt to install Git automatically if it is not already available. It also tries to install Python 3 using `winget`, `choco`, or `scoop` when Python is missing and recognizes the `py` launcher if `python` -isn't on your PATH. If automatic installation fails, you'll be shown a link to download Python directly from -. +isn't on your PATH. If these tools are unavailable you'll see a link to download Python directly from +. When Python 3.13 or newer is detected without the Microsoft C++ build tools, +the installer now attempts to download Python 3.12 automatically so you don't have to compile packages from source. -**Note:** If you are using Python 3.13 or newer, install the [Microsoft Visual C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) and reopen PowerShell before rerunning the installer. +**Note:** If this fallback fails, install Python 3.12 manually or install the [Microsoft Visual C++ Build Tools](https://visualstudio.microsoft.com/visual-cpp-build-tools/) and rerun the installer. *Install the beta branch:* ```powershell Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; $scriptContent = (New-Object System.Net.WebClient).DownloadString('https://raw.githubusercontent.com/PR0M3TH3AN/SeedPass/main/scripts/install.ps1'); & ([scriptblock]::create($scriptContent)) -Branch beta diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 36cc538..229d675 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -100,6 +100,27 @@ function Get-PythonCommand { return $null } +# Try to locate a specific Python version using the `py` launcher or +# versioned executables like `python3.12`. +function Get-PythonCommandByVersion { + param([string]$Version) + $cmd = Get-Command py -ErrorAction SilentlyContinue + if ($cmd) { + $out = & $cmd -$Version --version 2>&1 + if ($LASTEXITCODE -eq 0 -and $out -match '^Python') { + return @('py', "-$Version") + } + } + $cmd = Get-Command "python$Version" -ErrorAction SilentlyContinue + if ($cmd) { + $out = & $cmd --version 2>&1 + if ($LASTEXITCODE -eq 0 -and $out -match '^Python') { + return ,("python$Version") + } + } + return $null +} + $PythonCmd = Get-PythonCommand if (-not $PythonCmd) { Write-Warning "Python 3 is not installed. Attempting to install..." @@ -133,6 +154,34 @@ if ($pyVersion -and $pyVersion.Major -eq 3 -and $pyVersion.Minor -ge 13) { # Ensure C++ build tools are available before installing dependencies Ensure-BuildTools +# If build tools are still missing and Python 3.13+ is in use, try to +# install Python 3.12 automatically since many packages lack wheels for +# newer versions. +$buildOk = Get-Command cl.exe -ErrorAction SilentlyContinue +if (-not $buildOk -and $pyVersion -and $pyVersion.Major -eq 3 -and $pyVersion.Minor -ge 13) { + Write-Warning "No Microsoft C++ Build Tools detected and Python $pyVersionString is in use." + Write-Info "Attempting to install Python 3.12 for compatibility..." + if (Get-Command winget -ErrorAction SilentlyContinue) { + try { winget install --id Python.Python.3.12 -e --source winget -h } catch { Write-Warning "Failed to install Python 3.12 via winget." } + } elseif (Get-Command choco -ErrorAction SilentlyContinue) { + try { choco install python --version=3.12 -y } catch { Write-Warning "Failed to install Python 3.12 via Chocolatey." } + } elseif (Get-Command scoop -ErrorAction SilentlyContinue) { + try { scoop install python@3.12 } catch { Write-Warning "Failed to install Python 3.12 via Scoop." } + } else { + Write-Warning "Please install Python 3.12 manually from https://www.python.org/downloads/windows/" + } + + $env:Path = [System.Environment]::GetEnvironmentVariable('Path','Machine') + ';' + + [System.Environment]::GetEnvironmentVariable('Path','User') + $py12 = Get-PythonCommandByVersion '3.12' + if ($py12) { + Write-Info "Using Python 3.12 for installation." + $PythonCmd = $py12 + } else { + Write-Warning "Python 3.12 not found after installation attempt." + } +} + # 2. Clone or update the repository if (Test-Path (Join-Path $InstallDir ".git")) { Write-Info "SeedPass directory found. Fetching updates and switching to '$Branch' branch..."