101 lines
3.1 KiB
PowerShell
101 lines
3.1 KiB
PowerShell
$ErrorActionPreference = "Stop"
|
|
|
|
$VENDOR_DIR = Join-Path $PSScriptRoot "..\vendor" | Resolve-Path
|
|
|
|
# ------------------------------------------
|
|
# Platform detection (target dir name, only used for the up-to-date check)
|
|
|
|
# Windows PowerShell 5.1 doesn't define $IsWindows/$IsMacOS/$IsLinux
|
|
if (-not (Test-Path variable:IsWindows)) { $IsWindows = $env:OS -eq "Windows_NT" }
|
|
if (-not (Test-Path variable:IsMacOS)) { $IsMacOS = $false }
|
|
if (-not (Test-Path variable:IsLinux)) { $IsLinux = $false }
|
|
|
|
if ($IsWindows) {
|
|
$os = "windows"
|
|
$extra = "-msvc"
|
|
} elseif ($IsMacOS) {
|
|
$os = "macos"
|
|
$extra = ""
|
|
} elseif ($IsLinux) {
|
|
$os = "linux"
|
|
$extra = ""
|
|
} else {
|
|
Write-Error "wgpu setup: unsupported OS"
|
|
exit 1
|
|
}
|
|
|
|
$procArch = [System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture
|
|
$arch = if ($procArch -eq [System.Runtime.InteropServices.Architecture]::Arm64) { "aarch64" } else { "x86_64" }
|
|
|
|
$odinRoot = (odin root).Trim()
|
|
$name = "wgpu-$os-$arch$extra-release"
|
|
$target = Join-Path $VENDOR_DIR "wgpu\lib\$name"
|
|
|
|
# ------------------------------------------
|
|
# WGPU version detection
|
|
|
|
if ($args.Count -gt 0 -and $args[0]) {
|
|
$WGPU_VERSION = $args[0]
|
|
} else {
|
|
$odinTypes = Join-Path $odinRoot "vendor\wgpu\wgpu_native_types.odin"
|
|
$typesContent = Get-Content $odinTypes -Raw
|
|
if ($typesContent -match 'BINDINGS_VERSION_STRING :: "([^"]*)"') {
|
|
$WGPU_VERSION = "v" + $Matches[1]
|
|
}
|
|
}
|
|
|
|
if (-not $WGPU_VERSION -or $WGPU_VERSION -eq "v") {
|
|
Write-Error "wgpu setup: could not detect the wgpu-native version"
|
|
exit 1
|
|
}
|
|
|
|
# Detect the version of the vendored wgpu bindings
|
|
$currentTypes = Join-Path $VENDOR_DIR "wgpu\wgpu_native_types.odin"
|
|
$current = $null
|
|
if (Test-Path $currentTypes) {
|
|
$cur = Get-Content $currentTypes -Raw
|
|
if ($cur -match 'BINDINGS_VERSION_STRING :: "([^"]*)"') {
|
|
$current = "v" + $Matches[1]
|
|
}
|
|
}
|
|
|
|
# Check if the vendored wgpu is already up to date
|
|
if ($current -eq $WGPU_VERSION -and (Test-Path $target)) {
|
|
exit 0
|
|
}
|
|
|
|
# ------------------------------------------
|
|
# Copy vendor/wgpu
|
|
|
|
# Remove any stale copy
|
|
if (Test-Path (Join-Path $VENDOR_DIR "wgpu")) {
|
|
Remove-Item -Recurse -Force (Join-Path $VENDOR_DIR "wgpu")
|
|
}
|
|
|
|
# Copy wgpu
|
|
$wgpuPath = Join-Path $odinRoot "vendor\wgpu"
|
|
Copy-Item -Recurse $wgpuPath $VENDOR_DIR
|
|
|
|
# Point imports at the copied vendor wgpu package
|
|
Get-ChildItem -Path (Join-Path $VENDOR_DIR "wgpu") -Recurse -Filter *.odin | ForEach-Object {
|
|
(Get-Content $_.FullName -Raw) -replace '"vendor:wgpu"', '"wgpu:wgpu"' | Set-Content $_.FullName -NoNewline
|
|
}
|
|
|
|
# ------------------------------------------
|
|
# Download
|
|
|
|
$assetBase = "https://github.com/gfx-rs/wgpu-native/releases/download/$WGPU_VERSION"
|
|
|
|
if (-not (Test-Path $target)) {
|
|
$url = "$assetBase/$name.zip"
|
|
Write-Output "wgpu setup: downloading $url"
|
|
$tmp = Join-Path ([System.IO.Path]::GetTempPath()) ([System.Guid]::NewGuid().ToString())
|
|
New-Item -ItemType Directory -Path $tmp | Out-Null
|
|
try {
|
|
Invoke-WebRequest -MaximumRedirection 5 -Uri $url -OutFile (Join-Path $tmp "wgpu.zip")
|
|
Expand-Archive -Force -Path (Join-Path $tmp "wgpu.zip") -DestinationPath $target
|
|
} finally {
|
|
Remove-Item -Recurse -Force $tmp
|
|
}
|
|
}
|