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.
41 lines
1.3 KiB
Go
41 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/Cheviiot/vintner/internal/wrapper"
|
|
)
|
|
|
|
// runTool dispatches `vintner <tool> [args...]` (cl, link, msbuild, ...)
|
|
// directly, without needing <dest>/bin/<arch> on PATH or a same-directory
|
|
// symlink pointing back at this binary.
|
|
//
|
|
// Resolves which toolchain bin dir to use from VINTNER_BIN if set (same
|
|
// meaning as `env --bin`: point it directly at a <dest>/bin/<arch>
|
|
// directory - useful for a non-default --dest, or to pick a specific
|
|
// architecture when more than one is installed), else defaults to
|
|
// <defaultToolchainDir>/bin/<hostArch>, the layout a plain `vintner
|
|
// download && vintner install` with no --dest override produces.
|
|
func runTool(tool string, args []string) int {
|
|
binDir := os.Getenv("VINTNER_BIN")
|
|
if binDir == "" {
|
|
def, err := defaultToolchainDir()
|
|
if err != nil {
|
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
|
return 1
|
|
}
|
|
binDir = filepath.Join(def, "bin", detectHostArch())
|
|
}
|
|
if fi, err := os.Stat(binDir); err != nil || !fi.IsDir() {
|
|
fmt.Fprintf(os.Stderr,
|
|
"vintner: no installed toolchain found at %s\n"+
|
|
"Run `vintner download --accept-license && vintner install` first, "+
|
|
"or set VINTNER_BIN to an existing <dest>/bin/<arch> directory.\n",
|
|
binDir)
|
|
return 1
|
|
}
|
|
return wrapper.Run(tool, args, binDir)
|
|
}
|