mirror of
https://github.com/Cheviiot/Vintner.git
synced 2026-08-03 15:57:24 +00:00
A single-binary Go tool for cross compiling with the real MSVC toolchain on Linux via Wine. Behaves as cl/link/lib/rc/midl/mt/dumpbin/msbuild/ nmake/ml/ml64/armasm/armasm64/cmd/findstr depending on the name it's invoked as, plus download/install/env/version management subcommands. - download: fetches the MSVC/WinSDK installer manifest, resolves package selection and dependencies, downloads and verifies payloads, unpacks VSIX/MSI packages, and applies a handful of compatibility patches so VsDevCmd.bat and MSBuild's SDK detection work without a Windows Registry (which doesn't exist under Wine). - install: locates the installed toolchain/SDK versions, normalizes header/library name casing, lays out per-architecture tool symlinks with an env.json config each, and compiles a small native launcher (toolrelay.exe) that lets mt.exe's CMake-compatibility exit code survive Wine's own exit-code truncation. - The wrapper runtime rewrites absolute unix paths in tool arguments into Wine's z:\... form, runs the real .exe under wine, and rewrites the tool's output back to plain unix paths. Verified end-to-end against a real MSVC/WinSDK download: cl, link, mt and the resulting hello.exe all work under Wine, including through the toolrelay.exe relay path and with paths containing non-ASCII characters. Offline unit tests cover the wrapper's path-rewrite/output-filter logic, install-time header lowercasing, and download package-selection/ dependency-resolution.
71 lines
1.9 KiB
Go
71 lines
1.9 KiB
Go
// Command msvc-go-wine cross compiles with the real MSVC toolchain on Linux
|
|
// via Wine. It's a multi-call binary that behaves as `cl`, `link`, `lib`,
|
|
// `rc`, `midl`, `mt`, `dumpbin`, `msbuild`, etc. when invoked under one of
|
|
// those names (via symlinks set up by `msvc-go-wine install`), and
|
|
// otherwise exposes the `download`/`install`/`env`/`version` management
|
|
// subcommands.
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/Cheviiot/msvc-go-wine/internal/wrapper"
|
|
)
|
|
|
|
func main() {
|
|
base := filepath.Base(os.Args[0])
|
|
name := strings.TrimSuffix(strings.ToLower(base), ".exe")
|
|
|
|
if _, ok := wrapper.Tools[name]; ok {
|
|
os.Exit(wrapper.Run(name, os.Args[1:]))
|
|
}
|
|
if name == "cmd" || name == "findstr" {
|
|
os.Exit(wrapper.Run(name, os.Args[1:]))
|
|
}
|
|
|
|
os.Exit(runCLI(os.Args[1:]))
|
|
}
|
|
|
|
func runCLI(args []string) int {
|
|
if len(args) == 0 {
|
|
printUsage()
|
|
return 1
|
|
}
|
|
|
|
switch args[0] {
|
|
case "download":
|
|
return runDownload(args[1:])
|
|
case "install":
|
|
return runInstall(args[1:])
|
|
case "env":
|
|
return runEnv(args[1:])
|
|
case "version":
|
|
fmt.Println("msvc-go-wine dev")
|
|
return 0
|
|
case "-h", "--help", "help":
|
|
printUsage()
|
|
return 0
|
|
default:
|
|
fmt.Fprintf(os.Stderr, "msvc-go-wine: unknown subcommand %q\n\n", args[0])
|
|
printUsage()
|
|
return 1
|
|
}
|
|
}
|
|
|
|
func printUsage() {
|
|
fmt.Fprint(os.Stderr, `msvc-go-wine - cross compile with MSVC on Linux via Wine
|
|
|
|
Usage:
|
|
msvc-go-wine download --dest <dir> [options] fetch and unpack MSVC/WinSDK
|
|
msvc-go-wine install <dir> wire up wrappers for a downloaded MSVC
|
|
msvc-go-wine env --bin <dir/bin/arch> print INCLUDE/LIB for native clang-cl/lld-link use
|
|
msvc-go-wine version print the version
|
|
|
|
Once installed, add <dir>/bin/<arch> to PATH and invoke the tools directly:
|
|
cl, link, lib, ml, ml64, mc, midl, mt, rc, dumpbin, msbuild, nmake, armasm, armasm64, cmd, findstr
|
|
`)
|
|
}
|