1#Requires -Version 5.1
2$ErrorActionPreference = "Stop"
3
4$SCCACHE_VERSION = "v0.10.0"
5$SCCACHE_DIR = "./target/sccache"
6
7function Install-Sccache {
8 New-Item -ItemType Directory -Path $SCCACHE_DIR -Force | Out-Null
9
10 $sccachePath = Join-Path $SCCACHE_DIR "sccache.exe"
11
12 if (Test-Path $sccachePath) {
13 Write-Host "sccache already cached: $(& $sccachePath --version)"
14 }
15 else {
16 Write-Host "Installing sccache ${SCCACHE_VERSION} from GitHub releases..."
17
18 $arch = if ([Environment]::Is64BitOperatingSystem) { "x86_64" } else { "i686" }
19 $archive = "sccache-${SCCACHE_VERSION}-${arch}-pc-windows-msvc.zip"
20 $basename = "sccache-${SCCACHE_VERSION}-${arch}-pc-windows-msvc"
21 $url = "https://github.com/mozilla/sccache/releases/download/${SCCACHE_VERSION}/${archive}"
22
23 $tempDir = Join-Path $env:TEMP "sccache-install"
24 New-Item -ItemType Directory -Path $tempDir -Force | Out-Null
25
26 try {
27 $archivePath = Join-Path $tempDir $archive
28 Invoke-WebRequest -Uri $url -OutFile $archivePath
29 Expand-Archive -Path $archivePath -DestinationPath $tempDir
30
31 $extractedPath = Join-Path $tempDir $basename "sccache.exe"
32 Move-Item -Path $extractedPath -Destination $sccachePath -Force
33
34 Write-Host "Installed sccache: $(& $sccachePath --version)"
35 }
36 finally {
37 Remove-Item -Recurse -Force $tempDir -ErrorAction SilentlyContinue
38 }
39 }
40
41 $absolutePath = (Resolve-Path $SCCACHE_DIR).Path
42 if ($env:GITHUB_PATH) {
43 $absolutePath | Out-File -FilePath $env:GITHUB_PATH -Append -Encoding utf8
44 }
45 $env:PATH = "$absolutePath;$env:PATH"
46}
47
48function Configure-Sccache {
49 if (-not $env:R2_ACCOUNT_ID) {
50 Write-Host "R2_ACCOUNT_ID not set, skipping sccache configuration"
51 return
52 }
53
54 Write-Host "Configuring sccache with Cloudflare R2..."
55
56 $bucket = if ($env:SCCACHE_BUCKET) { $env:SCCACHE_BUCKET } else { "sccache-zed" }
57 $keyPrefix = if ($env:SCCACHE_KEY_PREFIX) { $env:SCCACHE_KEY_PREFIX } else { "sccache/" }
58 $baseDir = if ($env:GITHUB_WORKSPACE) { $env:GITHUB_WORKSPACE } else { (Get-Location).Path }
59
60 # Set in current process
61 $env:SCCACHE_ENDPOINT = "https://$($env:R2_ACCOUNT_ID).r2.cloudflarestorage.com"
62 $env:SCCACHE_BUCKET = $bucket
63 $env:SCCACHE_REGION = "auto"
64 $env:SCCACHE_S3_KEY_PREFIX = $keyPrefix
65 $env:SCCACHE_BASEDIR = $baseDir
66 $env:AWS_ACCESS_KEY_ID = $env:R2_ACCESS_KEY_ID
67 $env:AWS_SECRET_ACCESS_KEY = $env:R2_SECRET_ACCESS_KEY
68 $env:RUSTC_WRAPPER = "sccache"
69
70 # Also write to GITHUB_ENV for subsequent steps
71 if ($env:GITHUB_ENV) {
72 @(
73 "SCCACHE_ENDPOINT=$($env:SCCACHE_ENDPOINT)"
74 "SCCACHE_BUCKET=$($env:SCCACHE_BUCKET)"
75 "SCCACHE_REGION=$($env:SCCACHE_REGION)"
76 "SCCACHE_S3_KEY_PREFIX=$($env:SCCACHE_S3_KEY_PREFIX)"
77 "SCCACHE_BASEDIR=$($env:SCCACHE_BASEDIR)"
78 "AWS_ACCESS_KEY_ID=$($env:AWS_ACCESS_KEY_ID)"
79 "AWS_SECRET_ACCESS_KEY=$($env:AWS_SECRET_ACCESS_KEY)"
80 "RUSTC_WRAPPER=$($env:RUSTC_WRAPPER)"
81 ) | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
82 }
83
84 Write-Host "✓ sccache configured with Cloudflare R2 (bucket: $bucket)"
85}
86
87function Show-Config {
88 Write-Host "=== sccache configuration ==="
89 Write-Host "sccache version: $(sccache --version)"
90 Write-Host "RUSTC_WRAPPER: $($env:RUSTC_WRAPPER ?? '<not set>')"
91 Write-Host "SCCACHE_BUCKET: $($env:SCCACHE_BUCKET ?? '<not set>')"
92 Write-Host "SCCACHE_ENDPOINT: $($env:SCCACHE_ENDPOINT ?? '<not set>')"
93 Write-Host "SCCACHE_REGION: $($env:SCCACHE_REGION ?? '<not set>')"
94 Write-Host "SCCACHE_S3_KEY_PREFIX: $($env:SCCACHE_S3_KEY_PREFIX ?? '<not set>')"
95 Write-Host "SCCACHE_BASEDIR: $($env:SCCACHE_BASEDIR ?? '<not set>')"
96
97 if ($env:AWS_ACCESS_KEY_ID) {
98 Write-Host "AWS_ACCESS_KEY_ID: <set>"
99 }
100 else {
101 Write-Host "AWS_ACCESS_KEY_ID: <not set>"
102 }
103
104 if ($env:AWS_SECRET_ACCESS_KEY) {
105 Write-Host "AWS_SECRET_ACCESS_KEY: <set>"
106 }
107 else {
108 Write-Host "AWS_SECRET_ACCESS_KEY: <not set>"
109 }
110
111 Write-Host "=== sccache stats ==="
112 sccache --show-stats
113}
114
115Install-Sccache
116Configure-Sccache
117Show-Config