mirror of
https://github.com/Cheviiot/Vintner.git
synced 2026-08-03 15:57:24 +00:00
`vintner cl ...`, `vintner msbuild ...`, etc. now work without adding <dest>/bin/<arch> to PATH or relying on the same-directory symlinks `install` sets up there. wrapper.Run gained an explicit binDir parameter (empty string preserves the existing os.Executable()-based self-location for the ordinary multi-call/symlink case) so cmd/vintner's new runTool can point it at a resolved toolchain directory instead. Resolution order: VINTNER_BIN if set (same meaning as `env --bin` - point it at a <dest>/bin/<arch> directory directly, for a non-default --dest or a specific architecture), else <defaultToolchainDir>/bin/ <hostArch> - the layout a plain `vintner download && vintner install` with no --dest override produces. A missing toolchain gets a clear error pointing at both fixes, rather than bubbling up whatever wineenv.Load's env.json error looks like. Also fixed shell completion falling out of sync with the actual tool list: the bash/zsh scripts previously hand-copied tool/flag names (and had already gone stale once - --with-dxsdk was missing from the download flag completions since it was added). The tool name list is now generated from wrapper.ToolNames() instead of hand-maintained, and both scripts now complete tool names too, so `vintner <TAB>` suggests `cl`, `link`, `msbuild`, etc. alongside the management subcommands. Verified end-to-end with a minimal PATH (/usr/bin:/bin only, no toolchain dir on it at all): `vintner cl /nologo hello.c` compiled successfully, and `vintner msbuild -t:Rebuild ...` rebuilt the same real KMDF driver verified earlier this session - both via the default ~/.vintner/bin/<hostArch> resolution, no VINTNER_BIN override needed.
89 lines
3.0 KiB
Go
89 lines
3.0 KiB
Go
// Package wrapper implements the per-tool command dispatch (cl, link, lib,
|
|
// ml, ml64, mc, midl, mt, rc, dumpbin, msbuild, nmake, armasm, armasm64, cmd,
|
|
// findstr): loading each tool's environment, invoking it under Wine, and
|
|
// filtering its output.
|
|
package wrapper
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/Cheviiot/vintner/internal/wineenv"
|
|
)
|
|
|
|
// dirKind selects which install directory a tool's real .exe lives in.
|
|
type dirKind int
|
|
|
|
const (
|
|
dirBin dirKind = iota // <bindir> - vc/tools/msvc/<ver>/bin/Host<host>/<arch>
|
|
dirSDK // <sdkbindir> - kits/10/bin/<sdkver>/<host>
|
|
dirMSBuild
|
|
)
|
|
|
|
type spec struct {
|
|
exeName string
|
|
dir dirKind
|
|
rawStdout bool // MSBuild: skip line filtering, inherit stdio directly
|
|
stdoutFilter lineFilter
|
|
stderrFilter lineFilter
|
|
postProcess func(origArgs []string) // cl: fix up /P /Fi<file> output
|
|
}
|
|
|
|
// Tools lists every multi-call name this binary answers to, besides its own
|
|
// management-CLI name.
|
|
var Tools = map[string]spec{
|
|
"cl": {exeName: "cl.exe", dir: dirBin, stdoutFilter: clStdoutFilter, stderrFilter: clStderrFilter, postProcess: clPostProcess},
|
|
"link": {exeName: "link.exe", dir: dirBin},
|
|
"lib": {exeName: "lib.exe", dir: dirBin},
|
|
"ml": {exeName: "ml.exe", dir: dirBin},
|
|
"ml64": {exeName: "ml64.exe", dir: dirBin},
|
|
"nmake": {exeName: "nmake.exe", dir: dirBin},
|
|
"armasm": {exeName: "armasm.exe", dir: dirBin},
|
|
"armasm64": {exeName: "armasm64.exe", dir: dirBin},
|
|
"dumpbin": {exeName: "dumpbin.exe", dir: dirBin, stdoutFilter: dumpbinStdoutFilter},
|
|
"mc": {exeName: "mc.exe", dir: dirSDK},
|
|
"midl": {exeName: "midl.exe", dir: dirSDK},
|
|
"mt": {exeName: "mt.exe", dir: dirSDK},
|
|
"rc": {exeName: "rc.exe", dir: dirSDK},
|
|
"msbuild": {exeName: "MSBuild.exe", dir: dirMSBuild, rawStdout: true},
|
|
}
|
|
|
|
// nativeTools are handled entirely without Wine.
|
|
var nativeTools = map[string]bool{"cmd": true, "findstr": true}
|
|
|
|
// IsTool reports whether name is a recognized wrapped tool - either a
|
|
// Wine-hosted one in Tools or a native shim in nativeTools. Shared between
|
|
// the ordinary multi-call dispatch (invoked *as* one of these names via a
|
|
// same-directory symlink) and `vintner <tool> ...` direct dispatch, so both
|
|
// recognize exactly the same set of names.
|
|
func IsTool(name string) bool {
|
|
_, ok := Tools[name]
|
|
return ok || nativeTools[name]
|
|
}
|
|
|
|
// ToolNames returns every recognized tool name, sorted - Tools and
|
|
// nativeTools combined. Used to generate shell completion without a
|
|
// separate hand-maintained list that could drift from the real set (as
|
|
// happened once already with a stale --with-dxsdk completion entry).
|
|
func ToolNames() []string {
|
|
names := make([]string, 0, len(Tools)+len(nativeTools))
|
|
for name := range Tools {
|
|
names = append(names, name)
|
|
}
|
|
for name := range nativeTools {
|
|
names = append(names, name)
|
|
}
|
|
sort.Strings(names)
|
|
return names
|
|
}
|
|
|
|
func (s spec) exeDir(p *wineenv.Paths) string {
|
|
switch s.dir {
|
|
case dirSDK:
|
|
return p.SDKBinDir
|
|
case dirMSBuild:
|
|
return p.MSBuildBinDir
|
|
default:
|
|
return p.BinDir
|
|
}
|
|
}
|