Spaces:
Sleeping
Sleeping
| # 参数处理 | |
| param( | |
| [switch]$Static, | |
| [switch]$Help, | |
| [ValidateSet("x86_64", "aarch64", "i686")] | |
| [string]$Architecture | |
| ) | |
| # 设置错误时停止执行 | |
| $ErrorActionPreference = "Stop" | |
| # 颜色输出函数 | |
| function Write-Info { param($Message) Write-Host "[INFO] $Message" -ForegroundColor Blue } | |
| function Write-Warn { param($Message) Write-Host "[WARN] $Message" -ForegroundColor Yellow } | |
| function Write-Error { param($Message) Write-Host "[ERROR] $Message" -ForegroundColor Red; exit 1 } | |
| # 检查必要的工具 | |
| function Check-Requirements { | |
| $tools = @("cargo", "protoc", "npm", "node") | |
| $missing = @() | |
| foreach ($tool in $tools) { | |
| if (-not (Get-Command $tool -ErrorAction SilentlyContinue)) { | |
| $missing += $tool | |
| } | |
| } | |
| if ($missing.Count -gt 0) { | |
| Write-Error "缺少必要工具: $($missing -join ', ')" | |
| } | |
| } | |
| # 帮助信息 | |
| function Show-Help { | |
| Write-Host @" | |
| 用法: $(Split-Path $MyInvocation.ScriptName -Leaf) [选项] | |
| 选项: | |
| -Static 使用静态链接(默认动态链接) | |
| -Help 显示此帮助信息 | |
| 不带参数时使用默认配置构建 | |
| "@ | |
| } | |
| # 构建函数 | |
| function Build-Target { | |
| param ( | |
| [string]$Target, | |
| [string]$RustFlags | |
| ) | |
| Write-Info "正在构建 $Target..." | |
| # 设置环境变量 | |
| $env:RUSTFLAGS = $RustFlags | |
| # 构建 | |
| if ($Target -ne (rustc -Vv | Select-String "host: (.*)" | ForEach-Object { $_.Matches.Groups[1].Value })) { | |
| cargo build --target $Target --release | |
| } else { | |
| cargo build --release | |
| } | |
| # 移动编译产物到 release 目录 | |
| $binaryName = "cursor-api" | |
| if ($Static) { | |
| $binaryName += "-static" | |
| } | |
| $binaryPath = if ($Target -eq (rustc -Vv | Select-String "host: (.*)" | ForEach-Object { $_.Matches.Groups[1].Value })) { | |
| "target/release/cursor-api.exe" | |
| } else { | |
| "target/$Target/release/cursor-api.exe" | |
| } | |
| if (Test-Path $binaryPath) { | |
| Copy-Item $binaryPath "release/$binaryName-$Target.exe" | |
| Write-Info "完成构建 $Target" | |
| } else { | |
| Write-Warn "构建产物未找到: $Target" | |
| Write-Warn "查找路径: $binaryPath" | |
| Write-Warn "当前目录内容:" | |
| Get-ChildItem -Recurse target/ | |
| return $false | |
| } | |
| return $true | |
| } | |
| if ($Help) { | |
| Show-Help | |
| exit 0 | |
| } | |
| # 检查依赖 | |
| Check-Requirements | |
| # 创建 release 目录 | |
| New-Item -ItemType Directory -Force -Path release | Out-Null | |
| # 设置静态链接标志 | |
| $rustFlags = "" | |
| if ($Static) { | |
| $rustFlags = "-C target-feature=+crt-static" | |
| } | |
| # 获取目标架构 | |
| $arch = if ($Architecture) { | |
| $Architecture | |
| } else { | |
| switch ($env:PROCESSOR_ARCHITECTURE) { | |
| "AMD64" { "x86_64" } | |
| "ARM64" { "aarch64" } | |
| "X86" { "i686" } | |
| default { Write-Error "不支持的架构: $env:PROCESSOR_ARCHITECTURE" } | |
| } | |
| } | |
| $target = "$arch-pc-windows-msvc" | |
| Write-Info "开始构建..." | |
| if (-not (Build-Target -Target $target -RustFlags $rustFlags)) { | |
| Write-Error "构建失败" | |
| } | |
| Write-Info "构建完成!" |