#Requires -Version 5.1 <# .SYNOPSIS Build boringtun (Cloudflare WireGuard FFI library) for Windows. .DESCRIPTION Clones or updates the boringtun repository, builds it with Cargo in release mode, and copies the resulting static library + C header to deps/boringtun/. Output: deps/boringtun/boringtun.lib — static library (MSVC target) deps/boringtun/wireguard_ffi.h — C ABI header deps/boringtun/wireguard.dll — thin DLL shim (optional, not used) .PARAMETER Target Rust target triple. Defaults to x86_64-pc-windows-msvc. Use aarch64-pc-windows-msvc for ARM64. .EXAMPLE pwsh scripts/build-boringtun-win.ps1 pwsh scripts/build-boringtun-win.ps1 -Target aarch64-pc-windows-msvc .NOTES Prerequisites: • Rust toolchain (https://rustup.rs) with the target installed: rustup target add x86_64-pc-windows-msvc • Visual Studio Build Tools 2019+ (for link.exe / lib.exe) • Git (for cloning boringtun) #> param( [string]$Target = "x86_64-pc-windows-msvc" ) Set-StrictMode -Version Latest $ErrorActionPreference = "Stop" $Root = Split-Path -Parent (Split-Path -Parent $PSCommandPath) $DepsDir = Join-Path $Root "deps\boringtun" $CloneDir = Join-Path $Root "build\boringtun-src" $RepoURL = "https://github.com/cloudflare/boringtun.git" $CrateName = "boringtun-cli" # the FFI-enabled crate lives under boringtun-cli function Info($msg) { Write-Host " $msg" -ForegroundColor Cyan } function Ok($msg) { Write-Host " ✓ $msg" -ForegroundColor Green } function Fail($msg) { Write-Host " ✗ $msg" -ForegroundColor Red; exit 1 } # ── Validate prerequisites ──────────────────────────────────────────────────── Info "Checking prerequisites..." if (-not (Get-Command cargo -ErrorAction SilentlyContinue)) { Fail "cargo not found. Install Rust from https://rustup.rs" } if (-not (Get-Command git -ErrorAction SilentlyContinue)) { Fail "git not found. Install Git from https://git-scm.com" } # Ensure target is installed $installed = rustup target list --installed 2>&1 if ($installed -notmatch [regex]::Escape($Target)) { Info "Installing Rust target $Target..." rustup target add $Target } Ok "Prerequisites satisfied" # ── Clone / update boringtun ────────────────────────────────────────────────── if (-not (Test-Path $CloneDir)) { Info "Cloning boringtun..." git clone --depth 1 $RepoURL $CloneDir } else { Info "Updating boringtun..." Push-Location $CloneDir git pull --ff-only Pop-Location } Ok "Source ready at $CloneDir" # ── Build ───────────────────────────────────────────────────────────────────── Info "Building boringtun (--release, target=$Target)..." Push-Location $CloneDir cargo build --release --target $Target --features ffi-bindings 2>&1 | Write-Host if ($LASTEXITCODE -ne 0) { Fail "cargo build failed" } Pop-Location Ok "Build complete" # ── Copy artifacts ──────────────────────────────────────────────────────────── New-Item -ItemType Directory -Force -Path $DepsDir | Out-Null # The static library produced by Cargo for MSVC targets is named *.lib $LibSrc = Join-Path $CloneDir "target\$Target\release\boringtun.lib" if (-not (Test-Path $LibSrc)) { # Cargo sometimes names the lib after the crate package $LibSrc = Join-Path $CloneDir "target\$Target\release\boringtun_cli.lib" } if (-not (Test-Path $LibSrc)) { Fail "Could not find boringtun.lib in $CloneDir\target\$Target\release\" } Copy-Item $LibSrc (Join-Path $DepsDir "boringtun.lib") -Force Ok "Copied boringtun.lib" # Copy the FFI header (already lives in app/vpn/boringtun_ffi.h in our repo, # but also copy the upstream version for reference) $HdrSrc = Join-Path $CloneDir "boringtun\src\ffi\wireguard_ffi.h" if (Test-Path $HdrSrc) { Copy-Item $HdrSrc (Join-Path $DepsDir "wireguard_ffi.h") -Force Ok "Copied wireguard_ffi.h" } Write-Host "" Write-Host " Build successful. Output in:" -ForegroundColor Green Write-Host " $DepsDir" -ForegroundColor White Write-Host "" Write-Host " Next steps:" -ForegroundColor Yellow Write-Host " 1. Place wintun.dll (x64) next to DragonMoonlight.exe" -ForegroundColor White Write-Host " Download from https://www.wintun.net" -ForegroundColor White Write-Host " 2. cmake -B build -DCMAKE_BUILD_TYPE=Release" -ForegroundColor White Write-Host " 3. cmake --build build --config Release" -ForegroundColor White