tailscale/tool/go.exe.README.txt
Brad Fitzpatrick 8a9840d6a8 tool: replace go.cmd with a 19KB Rust go.exe wrapper
go.cmd used cmd.exe to invoke PowerShell, which mangled arguments:
cmd.exe treats ^ as an escape character (so -run "^$" became -run "$",
running all tests instead of none) and = signs also caused issues in
the PowerShell→cmd.exe argument passing layer.

Replace it with a tiny no_std Rust binary (19KB, 32-bit x86 for
universal Windows compat: x86/x64/ARM64) that directly invokes the
Tailscale Go toolchain via CreateProcessW. The raw command line from
GetCommandLineW is passed through to CreateProcessW with only argv[0]
replaced, so arguments are never parsed or re-escaped.

The binary also handles first-run toolchain download natively using
curl.exe and tar.exe (both ship with Windows 10+), so PowerShell is
no longer required for normal operation. The PowerShell fallback is
only used for the rare TS_USE_GOCROSS=1 path.

PowerShell prefers go.exe over go.cmd when resolving ./tool/go, so
this is a drop-in replacement.

With go.exe in place, the CI can use the natural -bench=. -benchtime=1x
-run="^$" flags directly.

Also removes tool/go-win.ps1 which is now unused.

Updates #19255

Change-Id: I80da23285b74796e7694b89cff29a9fa0eaa6281
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
2026-04-08 14:08:30 -07:00

21 lines
792 B
Plaintext

What is go.exe, and why's a 32-bit x86 Windows binary checked into the repo?
See https://github.com/tailscale/tailscale/pull/19256
In summary, our previous attempts to provide a version of ./tool/go (a
shell script) on Windows with PowerShell and cmd.exe both were
lacking.
So now we we're regrettably checking in a binary to the tree. Its
source code is in ./tool/goexe. It's written in Rust without std so
it's very small (smaller than plenty of of our source code files!) and
it's 32-bit x86 so it runs on 32-bit x86, 64-bit x86, and arm64 Windows
where it's emulated.
This binary is not required, but it's used by our build system and
people working on Tailscale who are used to being able to run
"./tool/go" and have it do the right hermetic thing, using the correct
Go toolchain.