Rebrand project to vintner

Renamed the GitHub repo, Go module path, binary, and default install
directory from msvc-go-wine to vintner. Updated every user-facing
string (usage text, error prefixes, README, LICENSE, CI/release
workflow) and the embedded compatibility patches' own header text to
match; the VINTNER_LANG env var replaces VSMC_GO_WINE_LANG.

Also fixes a real bug found while re-verifying the rename end-to-end:
Microsoft.Cpp.WindowsSDK.props.patch had LF-only line endings in its
hunk body while the real Microsoft-shipped file it targets is CRLF,
so `git apply` silently failed on every real install and the SDK
detection fix it's meant to provide was never actually taking effect.
Restored matching CRLF endings in the hunk (checked against the other
five patches, which already had this right). Left the patch's
internal MsvcGoWine_ExtraSdkRoots MSBuild property name alone rather
than renaming it too - changing hunk content, even just an identifier,
breaks reverse-apply idempotency for anyone re-running download
against an already-patched tree, which the fix above depends on. Added
a .remove marker so an existing install's old-named props file gets
cleaned up on the next download.

Re-verified end-to-end after the rename: general MSBuild/cl/link
still work, and a real KMDF driver build (compile, link, INF stamping,
Inf2Cat signability check) still succeeds under the renamed binary.

README also gets an accuracy pass: WDK support and the download/env
CLI flags it lists were out of date (WDK was previously listed under
"Known gaps" despite being implemented and verified), the full tool
list was missing mc/cmd/findstr, and the new command aliases and
VINTNER_LANG option are now documented.
This commit is contained in:
Cheviiot
2026-07-25 03:55:22 +10:00
parent 23ea620ce2
commit a1743e4435
28 changed files with 183 additions and 160 deletions
@@ -8,13 +8,13 @@ import (
"path/filepath"
"runtime"
"github.com/Cheviiot/msvc-go-wine/internal/download"
"github.com/Cheviiot/msvc-go-wine/internal/i18n"
"github.com/Cheviiot/vintner/internal/download"
"github.com/Cheviiot/vintner/internal/i18n"
)
func runDownload(args []string) int {
fs := flag.NewFlagSet("download", flag.ContinueOnError)
dest := fs.String("dest", "", "directory to install into (default: ~/.msvc-go-wine)")
dest := fs.String("dest", "", "directory to install into (default: ~/.vintner)")
cacheDir := fs.String("cache", "", "directory to use as a persistent download cache (default: a temp dir, removed afterwards)")
major := fs.Int("major", 18, "the major VS version to download")
preview := fs.Bool("preview", false, "download the preview/insiders channel instead of release/stable")
@@ -63,7 +63,7 @@ func runDownload(args []string) int {
if manifestURL == "" {
url, err := download.FetchChannelManifest(*major, *preview)
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
manifestURL = url
@@ -73,7 +73,7 @@ func runDownload(args []string) int {
manifest, err := download.FetchInstallerManifest(manifestURL)
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
@@ -105,7 +105,7 @@ func runDownload(args []string) int {
}
if err := download.ResolveSelection(opts, idx); err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
@@ -116,7 +116,7 @@ func runDownload(args []string) int {
selected, err := download.ExpandSelection(idx, opts)
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
var downloadSize, installSize int64
@@ -130,9 +130,9 @@ func runDownload(args []string) int {
cache := *cacheDir
removeCache := false
if cache == "" {
tmp, err := os.MkdirTemp("", "msvc-go-wine-cache-")
tmp, err := os.MkdirTemp("", "vintner-cache-")
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
cache = tmp
@@ -145,7 +145,7 @@ func runDownload(args []string) int {
if !*onlyDownload && *dest == "" {
def, err := defaultToolchainDir()
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
*dest = def
@@ -153,7 +153,7 @@ func runDownload(args []string) int {
}
if err := download.FetchPayloads(selected, cache, *onlyDownload); err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
if *onlyDownload {
@@ -162,7 +162,7 @@ func runDownload(args []string) int {
destAbs, err := filepath.Abs(*dest)
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
@@ -171,7 +171,7 @@ func runDownload(args []string) int {
unpack = filepath.Join(destAbs, "unpack")
}
if err := download.UnpackSelectedPackages(selected, cache, unpack); err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
@@ -180,14 +180,14 @@ func runDownload(args []string) int {
for _, hostArch := range []string{"amd64", "arm64"} {
msbuildExe := filepath.Join(unpack, "MSBuild", "Current", "Bin", hostArch, "MSBuild.exe")
if err := download.CopyRedirectedAssemblies(msbuildExe); err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
}
if !*onlyUnpack {
if err := download.RelocateBuildTools(unpack, destAbs); err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
if !*keepUnpack {
@@ -195,7 +195,7 @@ func runDownload(args []string) int {
}
if !*skipPatch && *major == 18 {
if err := download.ApplyCompatibilityFixes(destAbs); err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
}
@@ -203,7 +203,7 @@ func runDownload(args []string) int {
if opts.WithWDK && !*onlyUnpack {
if err := downloadWDK(opts, selected, cache, destAbs, *major); err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
fmt.Fprintln(os.Stderr, "vintner download:", err)
return 1
}
}
@@ -6,17 +6,17 @@ import (
"os"
"strings"
"github.com/Cheviiot/msvc-go-wine/internal/i18n"
"github.com/Cheviiot/msvc-go-wine/internal/wineenv"
"github.com/Cheviiot/vintner/internal/i18n"
"github.com/Cheviiot/vintner/internal/wineenv"
)
// runEnv prints shell `export` statements for INCLUDE/LIB (converted from
// wine's "z:\..." notation to plain unix paths) and TARGET_TRIPLE, for
// driving clang-cl/lld-link directly without Wine.
// Usage: eval "$(msvc-go-wine env --bin <dest>/bin/<arch>)"
// Usage: eval "$(vintner env --bin <dest>/bin/<arch>)"
func runEnv(args []string) int {
fs := flag.NewFlagSet("env", flag.ContinueOnError)
bin := fs.String("bin", "", "the <dest>/bin/<arch> directory produced by `msvc-go-wine install`")
bin := fs.String("bin", "", "the <dest>/bin/<arch> directory produced by `vintner install`")
if err := fs.Parse(args); err != nil {
return 2
}
@@ -27,12 +27,12 @@ func runEnv(args []string) int {
cfg, err := wineenv.Load(*bin)
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine env:", err)
fmt.Fprintln(os.Stderr, "vintner env:", err)
return 1
}
baseUnix, err := wineenv.FindBaseUnix(*bin)
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine env:", err)
fmt.Fprintln(os.Stderr, "vintner env:", err)
return 1
}
paths := wineenv.NewPaths(cfg, baseUnix)
@@ -4,8 +4,8 @@ import (
"fmt"
"os"
"github.com/Cheviiot/msvc-go-wine/internal/i18n"
"github.com/Cheviiot/msvc-go-wine/internal/install"
"github.com/Cheviiot/vintner/internal/i18n"
"github.com/Cheviiot/vintner/internal/install"
)
func runInstall(args []string) int {
@@ -20,7 +20,7 @@ func runInstall(args []string) int {
} else {
def, err := defaultToolchainDir()
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine install:", err)
fmt.Fprintln(os.Stderr, "vintner install:", err)
return 1
}
dest = def
@@ -29,12 +29,12 @@ func runInstall(args []string) int {
self, err := os.Executable()
if err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine install:", err)
fmt.Fprintln(os.Stderr, "vintner install:", err)
return 1
}
if err := install.Install(dest, self); err != nil {
fmt.Fprintln(os.Stderr, "msvc-go-wine install:", err)
fmt.Fprintln(os.Stderr, "vintner install:", err)
return 1
}
fmt.Println(i18n.T("install.done", dest+"/bin/<arch>"))
@@ -1,7 +1,7 @@
// Command msvc-go-wine cross compiles with the real MSVC toolchain on Linux
// Command vintner 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
// those names (via symlinks set up by `vintner install`), and
// otherwise exposes the `download`/`install`/`env`/`version` management
// subcommands.
package main
@@ -12,8 +12,8 @@ import (
"path/filepath"
"strings"
"github.com/Cheviiot/msvc-go-wine/internal/i18n"
"github.com/Cheviiot/msvc-go-wine/internal/wrapper"
"github.com/Cheviiot/vintner/internal/i18n"
"github.com/Cheviiot/vintner/internal/wrapper"
)
// version is set at build time via -ldflags "-X main.version=X.Y.Z";
@@ -48,7 +48,7 @@ func runCLI(args []string) int {
case "env", "e":
return runEnv(args[1:])
case "version", "v", "--version":
fmt.Println("msvc-go-wine " + version)
fmt.Println("vintner " + version)
return 0
case "-h", "--help", "help", "h":
printUsage()
@@ -6,12 +6,12 @@ import (
)
// defaultToolchainDir is where `download`/`install` operate when the user
// doesn't specify a directory: a hidden ~/.msvc-go-wine, so it doesn't
// doesn't specify a directory: a hidden ~/.vintner, so it doesn't
// clutter a plain `ls ~`.
func defaultToolchainDir() (string, error) {
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, ".msvc-go-wine"), nil
return filepath.Join(home, ".vintner"), nil
}