From a13a7b276e2fad0a2e3e6de6c7fe81bdf8399aa3 Mon Sep 17 00:00:00 2001 From: ZGaetano Date: Wed, 6 May 2026 19:17:24 -0400 Subject: [PATCH] scripts: Windows boringtun build script (PowerShell) --- scripts/build-boringtun-win.ps1 | 122 ++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 scripts/build-boringtun-win.ps1 diff --git a/scripts/build-boringtun-win.ps1 b/scripts/build-boringtun-win.ps1 new file mode 100644 index 0000000..775351b --- /dev/null +++ b/scripts/build-boringtun-win.ps1 @@ -0,0 +1,122 @@ +#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