mirror of
https://github.com/Cheviiot/Vintner.git
synced 2026-08-03 15:57:24 +00:00
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:
@@ -48,17 +48,17 @@ jobs:
|
|||||||
tag="${{ inputs.tag || github.ref_name }}"
|
tag="${{ inputs.tag || github.ref_name }}"
|
||||||
version="${tag#v}"
|
version="${tag#v}"
|
||||||
go build -trimpath -ldflags="-s -w -X main.version=${version}" \
|
go build -trimpath -ldflags="-s -w -X main.version=${version}" \
|
||||||
-o "msvc-go-wine-linux-${{ matrix.goarch }}" ./cmd/msvc-go-wine
|
-o "vintner-linux-${{ matrix.goarch }}" ./cmd/vintner
|
||||||
|
|
||||||
- name: Verify it runs
|
- name: Verify it runs
|
||||||
if: matrix.goarch == 'amd64'
|
if: matrix.goarch == 'amd64'
|
||||||
run: ./msvc-go-wine-linux-amd64 version
|
run: ./vintner-linux-amd64 version
|
||||||
|
|
||||||
- name: Upload artifact
|
- name: Upload artifact
|
||||||
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
||||||
with:
|
with:
|
||||||
name: msvc-go-wine-linux-${{ matrix.goarch }}
|
name: vintner-linux-${{ matrix.goarch }}
|
||||||
path: msvc-go-wine-linux-${{ matrix.goarch }}
|
path: vintner-linux-${{ matrix.goarch }}
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
|
|
||||||
@@ -71,11 +71,11 @@ jobs:
|
|||||||
- name: Download all architectures
|
- name: Download all architectures
|
||||||
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
||||||
with:
|
with:
|
||||||
pattern: msvc-go-wine-linux-*
|
pattern: vintner-linux-*
|
||||||
merge-multiple: true
|
merge-multiple: true
|
||||||
|
|
||||||
- name: Checksums
|
- name: Checksums
|
||||||
run: sha256sum msvc-go-wine-linux-* > SHA256SUMS
|
run: sha256sum vintner-linux-* > SHA256SUMS
|
||||||
|
|
||||||
- name: Create or update GitHub Release
|
- name: Create or update GitHub Release
|
||||||
env:
|
env:
|
||||||
@@ -85,10 +85,10 @@ jobs:
|
|||||||
tag="${{ inputs.tag || github.ref_name }}"
|
tag="${{ inputs.tag || github.ref_name }}"
|
||||||
if ! gh release view "$tag" >/dev/null 2>&1; then
|
if ! gh release view "$tag" >/dev/null 2>&1; then
|
||||||
gh release create "$tag" \
|
gh release create "$tag" \
|
||||||
--title "msvc-go-wine $tag" \
|
--title "vintner $tag" \
|
||||||
--notes "Linux amd64/arm64 binaries built by CI from this tag. See README.md for install instructions."
|
--notes "Linux amd64/arm64 binaries built by CI from this tag. See README.md for install instructions."
|
||||||
fi
|
fi
|
||||||
gh release upload "$tag" \
|
gh release upload "$tag" \
|
||||||
msvc-go-wine-linux-* \
|
vintner-linux-* \
|
||||||
SHA256SUMS \
|
SHA256SUMS \
|
||||||
--clobber
|
--clobber
|
||||||
|
|||||||
+1
-1
@@ -1,3 +1,3 @@
|
|||||||
/msvc-go-wine
|
/vintner
|
||||||
*.test
|
*.test
|
||||||
.claude/
|
.claude/
|
||||||
|
|||||||
+2
-2
@@ -20,6 +20,6 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
SOFTWARE.
|
SOFTWARE.
|
||||||
|
|
||||||
This license covers msvc-go-wine's own source code. It does not cover the
|
This license covers vintner's own source code. It does not cover the
|
||||||
Microsoft Visual C++ Build Tools / Windows SDK that `msvc-go-wine download`
|
Microsoft Visual C++ Build Tools / Windows SDK that `vintner download`
|
||||||
fetches and unpacks, which remain governed by Microsoft's own license terms.
|
fetches and unpacks, which remain governed by Microsoft's own license terms.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# msvc-go-wine
|
# vintner
|
||||||
|
|
||||||
Cross compile with MSVC on Linux, using Wine — a single-binary Go tool
|
Cross compile with MSVC on Linux, using Wine — a single-binary Go tool
|
||||||
inspired by [mstorsjo/msvc-wine](https://github.com/mstorsjo/msvc-wine)'s
|
inspired by [mstorsjo/msvc-wine](https://github.com/mstorsjo/msvc-wine)'s
|
||||||
@@ -6,13 +6,14 @@ approach (download the real MSVC/WinSDK, wrap the compiler under Wine),
|
|||||||
implemented independently.
|
implemented independently.
|
||||||
|
|
||||||
Once installed, you invoke the real Microsoft toolchain exactly like on
|
Once installed, you invoke the real Microsoft toolchain exactly like on
|
||||||
Windows: `cl`, `link`, `lib`, `rc`, `midl`, `mt`, `dumpbin`, `msbuild`,
|
Windows: `cl`, `link`, `lib`, `rc`, `midl`, `mc`, `mt`, `dumpbin`, `msbuild`,
|
||||||
`nmake`, `ml`, `ml64`, `armasm`, `armasm64` all just work from your `PATH`.
|
`nmake`, `ml`, `ml64`, `armasm`, `armasm64`, plus trivial `cmd`/`findstr`
|
||||||
|
shims, all just work from your `PATH`.
|
||||||
|
|
||||||
## How it works
|
## How it works
|
||||||
|
|
||||||
`msvc-go-wine` is one Go binary that behaves differently depending on the
|
`vintner` is one Go binary that behaves differently depending on the name
|
||||||
name it's invoked as (a "multi-call binary", like busybox):
|
it's invoked as (a "multi-call binary", like busybox):
|
||||||
|
|
||||||
- Invoked as `cl`, `link`, `lib`, ... → it loads a small per-architecture
|
- Invoked as `cl`, `link`, `lib`, ... → it loads a small per-architecture
|
||||||
`env.json`, builds the `INCLUDE`/`LIB`/`WINEPATH` environment Wine needs,
|
`env.json`, builds the `INCLUDE`/`LIB`/`WINEPATH` environment Wine needs,
|
||||||
@@ -21,22 +22,23 @@ name it's invoked as (a "multi-call binary", like busybox):
|
|||||||
runs the real `.exe` under `wine`/`wine64`, and rewrites the tool's output
|
runs the real `.exe` under `wine`/`wine64`, and rewrites the tool's output
|
||||||
back from `z:\...` paths to plain unix paths so your build system's error
|
back from `z:\...` paths to plain unix paths so your build system's error
|
||||||
parsing keeps working.
|
parsing keeps working.
|
||||||
- Invoked as `msvc-go-wine` → it exposes the `download`, `install`, `env` and
|
- Invoked as `vintner` → it exposes the `download`, `install`, `env` and
|
||||||
`version` management subcommands described below.
|
`version` management subcommands described below (each also has a short
|
||||||
|
alias: `dl`, `i`, `e`, `v`; `help`/`h` prints usage).
|
||||||
|
|
||||||
## Quick start
|
## Quick start
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 1. Download and unpack MSVC + Windows SDK into ~/.msvc-go-wine (requires
|
# 1. Download and unpack MSVC + Windows SDK into ~/.vintner (requires
|
||||||
# accepting Microsoft's Visual Studio Build Tools license, and msitools
|
# accepting Microsoft's Visual Studio Build Tools license, and msitools
|
||||||
# for unpacking .msi payloads). Pass --dest <dir> for a different location.
|
# for unpacking .msi payloads). Pass --dest <dir> for a different location.
|
||||||
msvc-go-wine download --accept-license
|
vintner download --accept-license
|
||||||
|
|
||||||
# 2. Wire up the tool wrappers
|
# 2. Wire up the tool wrappers
|
||||||
msvc-go-wine install
|
vintner install
|
||||||
|
|
||||||
# 3. Add the toolchain to PATH and build
|
# 3. Add the toolchain to PATH and build
|
||||||
export PATH=~/.msvc-go-wine/bin/x64:$PATH
|
export PATH=~/.vintner/bin/x64:$PATH
|
||||||
cl /nologo /EHsc hello.cpp
|
cl /nologo /EHsc hello.cpp
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -56,20 +58,23 @@ pkcon install wine msitools
|
|||||||
## Commands
|
## Commands
|
||||||
|
|
||||||
```
|
```
|
||||||
msvc-go-wine download --accept-license [--dest <dir>] [options] fetch and unpack MSVC/WinSDK
|
vintner download (dl) --accept-license [--dest <dir>] [options] fetch and unpack MSVC/WinSDK/WDK
|
||||||
msvc-go-wine install [dir] wire up wrappers for a downloaded MSVC
|
vintner install (i) [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
|
vintner env (e) --bin <dir>/bin/<arch> print INCLUDE/LIB for native clang-cl/lld-link use
|
||||||
msvc-go-wine version print the version
|
vintner version (v) print the version
|
||||||
|
vintner help (h) print usage
|
||||||
```
|
```
|
||||||
|
|
||||||
`--dest`/`[dir]` both default to `~/.msvc-go-wine` when omitted.
|
`--dest`/`[dir]` both default to `~/.vintner` when omitted.
|
||||||
|
|
||||||
`download` supports `--msvc-version`, `--sdk-version`, `--architecture`,
|
`download`'s main options: `--msvc-version`, `--sdk-version`,
|
||||||
`--host-arch`, `--with-*` component toggles, `--ignore`, `--only-download`,
|
`--architecture`, `--host-arch`, `--only-host`, `--with-wdk` (also fetch the
|
||||||
`--only-unpack`, `--keep-unpack`, `--cache`, `--language`,
|
Windows Driver Kit, for building KMDF/UMDF drivers), `--ignore`,
|
||||||
`--include-optional`, `--skip-recommended`, `--major`, `--preview`,
|
`--only-download`, `--only-unpack`, `--keep-unpack`, `--skip-patch`,
|
||||||
`--manifest`, `--list-workloads`, `--list-components`, `--print-deps-tree`.
|
`--cache`, `--language`, `--include-optional`, `--skip-recommended`,
|
||||||
Run `msvc-go-wine download -h` for the full list.
|
`--major`, `--preview`, `--manifest`, `--list-workloads`,
|
||||||
|
`--list-components`, `--print-deps-tree`. Run `vintner download -h` for the
|
||||||
|
full list with descriptions.
|
||||||
|
|
||||||
`--list-workloads`/`--list-components` print every workload/component id
|
`--list-workloads`/`--list-components` print every workload/component id
|
||||||
(with its human-readable title) available in the fetched manifest and exit
|
(with its human-readable title) available in the fetched manifest and exit
|
||||||
@@ -78,13 +83,31 @@ package id or via `--with-*`. `--print-deps-tree` prints the dependency tree
|
|||||||
of whatever would actually be selected (honoring every other flag), also
|
of whatever would actually be selected (honoring every other flag), also
|
||||||
without downloading.
|
without downloading.
|
||||||
|
|
||||||
|
### Building drivers (WDK)
|
||||||
|
|
||||||
|
`vintner download --with-wdk` additionally fetches the Windows Driver Kit
|
||||||
|
(headers, import libs, and the MSBuild `WindowsKernelModeDriver10.0`/
|
||||||
|
`WindowsUserModeDriver10.0` PlatformToolsets) so `msbuild` can build real
|
||||||
|
KMDF/UMDF drivers - compiling, linking, INF stamping and the `Inf2Cat`
|
||||||
|
signability check (with `SignMode=off`) all work under Wine. Verified
|
||||||
|
end-to-end against a real sample driver from
|
||||||
|
[microsoft/Windows-driver-samples](https://github.com/microsoft/Windows-driver-samples).
|
||||||
|
Only x64 and arm64 targets have a WDK package upstream (no x86/arm).
|
||||||
|
|
||||||
|
### Language
|
||||||
|
|
||||||
|
CLI messages (usage text, progress lines, prompts) are in English by
|
||||||
|
default. Set `VINTNER_LANG=ru` (or have a `ru`-prefixed `LC_ALL`/
|
||||||
|
`LC_MESSAGES`/`LANG`, e.g. `ru_RU.UTF-8`) for Russian. Deeper error text
|
||||||
|
bubbled up from internal packages stays in English.
|
||||||
|
|
||||||
### Using clang-cl/lld-link instead of Wine
|
### Using clang-cl/lld-link instead of Wine
|
||||||
|
|
||||||
You don't need Wine at all if you drive the (nonredistributable) MSVC/WinSDK
|
You don't need Wine at all if you drive the (nonredistributable) MSVC/WinSDK
|
||||||
headers and libraries with Clang/LLD in MSVC-compatible mode:
|
headers and libraries with Clang/LLD in MSVC-compatible mode:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
eval "$(msvc-go-wine env --bin ~/.msvc-go-wine/bin/x64)"
|
eval "$(vintner env --bin ~/.vintner/bin/x64)"
|
||||||
clang-cl -c hello.c
|
clang-cl -c hello.c
|
||||||
lld-link hello.obj -out:hello.exe
|
lld-link hello.obj -out:hello.exe
|
||||||
```
|
```
|
||||||
@@ -92,7 +115,7 @@ lld-link hello.obj -out:hello.exe
|
|||||||
## Building from source
|
## Building from source
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go build -o msvc-go-wine ./cmd/msvc-go-wine
|
go build -o vintner ./cmd/vintner
|
||||||
```
|
```
|
||||||
|
|
||||||
Go 1.23+ is all you need to build it; `wine`/`msitools` are only needed at
|
Go 1.23+ is all you need to build it; `wine`/`msitools` are only needed at
|
||||||
@@ -124,14 +147,14 @@ telemetry, and don't hard-fail devcmd setup when an optional component
|
|||||||
|
|
||||||
## Known gaps
|
## Known gaps
|
||||||
|
|
||||||
- `download` doesn't yet support installing the Windows Driver Kit via
|
None currently tracked. Download/select/unpack/install, general MSBuild
|
||||||
`--with-wdk-installers`; the core selection/download/unpack/install
|
projects, WDK driver builds, dependency-tree printing, and
|
||||||
pipeline, dependency tree printing, and workload/component listing are all
|
workload/component listing are all implemented and verified against real
|
||||||
fully implemented.
|
projects.
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT, see [LICENSE.txt](LICENSE.txt) - covers msvc-go-wine's own source only.
|
MIT, see [LICENSE.txt](LICENSE.txt) - covers vintner's own source only. The
|
||||||
The MSVC Build Tools / Windows SDK that `download` fetches remain governed
|
MSVC Build Tools / Windows SDK / WDK that `download` fetches remain governed
|
||||||
by Microsoft's own license (accepted via `--accept-license`), same as with
|
by Microsoft's own license (accepted via `--accept-license`), same as with
|
||||||
any other way of obtaining them.
|
any other way of obtaining them.
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
msvc-go-wine: skip VsDevCmd's telemetry upload.
|
vintner: skip VsDevCmd's telemetry upload.
|
||||||
|
|
||||||
There's no telemetry endpoint reachable (or wanted) under Wine. Rather than
|
There's no telemetry endpoint reachable (or wanted) under Wine. Rather than
|
||||||
touching the conditional logic below, just set the opt-out switch the
|
touching the conditional logic below, just set the opt-out switch the
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
msvc-go-wine: always record the starting directory.
|
vintner: always record the starting directory.
|
||||||
|
|
||||||
vsdevcmd_start.bat only saved __VSCMD_CURRENT_DIR when the caller passed
|
vsdevcmd_start.bat only saved __VSCMD_CURRENT_DIR when the caller passed
|
||||||
-startdir=none, which doesn't hold up under Wine's cmd.exe (see
|
-startdir=none, which doesn't hold up under Wine's cmd.exe (see
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
msvc-go-wine: find the Windows SDK/UCRT dirs on disk before trying the registry.
|
vintner: find the Windows SDK/UCRT dirs on disk before trying the registry.
|
||||||
|
|
||||||
winsdk.bat locates the Windows 10/11 SDK and Universal CRT SDK by querying
|
winsdk.bat locates the Windows 10/11 SDK and Universal CRT SDK by querying
|
||||||
the Windows Registry, which doesn't have real SDK installation entries
|
the Windows Registry, which doesn't have real SDK installation entries
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
msvc-go-wine: don't hard-fail devcmd setup when ConnectionManagerExe is missing.
|
vintner: don't hard-fail devcmd setup when ConnectionManagerExe is missing.
|
||||||
|
|
||||||
Not every MSVC/WinSDK download selection includes the Linux
|
Not every MSVC/WinSDK download selection includes the Linux
|
||||||
ConnectionManagerExe component; a missing optional component shouldn't
|
ConnectionManagerExe component; a missing optional component shouldn't
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
msvc-go-wine: don't hard-fail devcmd setup when the bundled CMake/Ninja is missing.
|
vintner: don't hard-fail devcmd setup when the bundled CMake/Ninja is missing.
|
||||||
|
|
||||||
Same reasoning as the ConnectionManagerExe fix: a missing optional
|
Same reasoning as the ConnectionManagerExe fix: a missing optional
|
||||||
component shouldn't abort the whole Developer Command Prompt setup.
|
component shouldn't abort the whole Developer Command Prompt setup.
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
msvc-go-wine: make MSBuild resolve the Windows SDK / UCRT / preferred tool
|
vintner: make MSBuild resolve the Windows SDK / UCRT / preferred tool
|
||||||
architecture from the VS install layout directly, since there's no
|
architecture from the VS install layout directly, since there's no
|
||||||
Windows Registry under Wine for the stock .props files to query.
|
Windows Registry under Wine for the stock .props files to query.
|
||||||
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
msvc-go-wine: let MSBuild find the Windows SDK without the registry.
|
vintner: let MSBuild find the Windows SDK without the registry.
|
||||||
|
|
||||||
GetLatestSDKTargetPlatformVersion normally resolves the SDK via the
|
GetLatestSDKTargetPlatformVersion normally resolves the SDK via the
|
||||||
registry, which has nothing to find under Wine. Pass it an extra list of
|
registry, which has nothing to find under Wine. Pass it an extra list of
|
||||||
roots (populated by msvc-go-wine.props, see the ImportBefore directory next
|
roots (populated by vintner.props, see the ImportBefore directory next
|
||||||
to this file) so it can also look directly under the VS install root.
|
to this file) so it can also look directly under the VS install root.
|
||||||
|
|
||||||
diff --git a/MSBuild/Microsoft/VC/v180/Microsoft.Cpp.WindowsSDK.props b/MSBuild/Microsoft/VC/v180/Microsoft.Cpp.WindowsSDK.props
|
diff --git a/MSBuild/Microsoft/VC/v180/Microsoft.Cpp.WindowsSDK.props b/MSBuild/Microsoft/VC/v180/Microsoft.Cpp.WindowsSDK.props
|
||||||
|
|||||||
Vendored
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
// toolrelay.exe - a thin native launcher for a Wine-hosted MSVC tool
|
// toolrelay.exe - a thin native launcher for a Wine-hosted MSVC tool
|
||||||
// invocation, built and used by msvc-go-wine (see internal/install's
|
// invocation, built and used by vintner (see internal/install's
|
||||||
// buildToolRelay and internal/wrapper's runViaToolRelay).
|
// buildToolRelay and internal/wrapper's runViaToolRelay).
|
||||||
//
|
//
|
||||||
// It exists to solve two problems that are only solvable from inside a
|
// It exists to solve two problems that are only solvable from inside a
|
||||||
|
|||||||
@@ -8,13 +8,13 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/download"
|
"github.com/Cheviiot/vintner/internal/download"
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/i18n"
|
"github.com/Cheviiot/vintner/internal/i18n"
|
||||||
)
|
)
|
||||||
|
|
||||||
func runDownload(args []string) int {
|
func runDownload(args []string) int {
|
||||||
fs := flag.NewFlagSet("download", flag.ContinueOnError)
|
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)")
|
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")
|
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")
|
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 == "" {
|
if manifestURL == "" {
|
||||||
url, err := download.FetchChannelManifest(*major, *preview)
|
url, err := download.FetchChannelManifest(*major, *preview)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
|
fmt.Fprintln(os.Stderr, "vintner download:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
manifestURL = url
|
manifestURL = url
|
||||||
@@ -73,7 +73,7 @@ func runDownload(args []string) int {
|
|||||||
|
|
||||||
manifest, err := download.FetchInstallerManifest(manifestURL)
|
manifest, err := download.FetchInstallerManifest(manifestURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
|
fmt.Fprintln(os.Stderr, "vintner download:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,7 +105,7 @@ func runDownload(args []string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := download.ResolveSelection(opts, idx); err != nil {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,7 +116,7 @@ func runDownload(args []string) int {
|
|||||||
|
|
||||||
selected, err := download.ExpandSelection(idx, opts)
|
selected, err := download.ExpandSelection(idx, opts)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
|
fmt.Fprintln(os.Stderr, "vintner download:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
var downloadSize, installSize int64
|
var downloadSize, installSize int64
|
||||||
@@ -130,9 +130,9 @@ func runDownload(args []string) int {
|
|||||||
cache := *cacheDir
|
cache := *cacheDir
|
||||||
removeCache := false
|
removeCache := false
|
||||||
if cache == "" {
|
if cache == "" {
|
||||||
tmp, err := os.MkdirTemp("", "msvc-go-wine-cache-")
|
tmp, err := os.MkdirTemp("", "vintner-cache-")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
|
fmt.Fprintln(os.Stderr, "vintner download:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
cache = tmp
|
cache = tmp
|
||||||
@@ -145,7 +145,7 @@ func runDownload(args []string) int {
|
|||||||
if !*onlyDownload && *dest == "" {
|
if !*onlyDownload && *dest == "" {
|
||||||
def, err := defaultToolchainDir()
|
def, err := defaultToolchainDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
|
fmt.Fprintln(os.Stderr, "vintner download:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
*dest = def
|
*dest = def
|
||||||
@@ -153,7 +153,7 @@ func runDownload(args []string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := download.FetchPayloads(selected, cache, *onlyDownload); err != nil {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
if *onlyDownload {
|
if *onlyDownload {
|
||||||
@@ -162,7 +162,7 @@ func runDownload(args []string) int {
|
|||||||
|
|
||||||
destAbs, err := filepath.Abs(*dest)
|
destAbs, err := filepath.Abs(*dest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine download:", err)
|
fmt.Fprintln(os.Stderr, "vintner download:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -171,7 +171,7 @@ func runDownload(args []string) int {
|
|||||||
unpack = filepath.Join(destAbs, "unpack")
|
unpack = filepath.Join(destAbs, "unpack")
|
||||||
}
|
}
|
||||||
if err := download.UnpackSelectedPackages(selected, cache, unpack); err != nil {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -180,14 +180,14 @@ func runDownload(args []string) int {
|
|||||||
for _, hostArch := range []string{"amd64", "arm64"} {
|
for _, hostArch := range []string{"amd64", "arm64"} {
|
||||||
msbuildExe := filepath.Join(unpack, "MSBuild", "Current", "Bin", hostArch, "MSBuild.exe")
|
msbuildExe := filepath.Join(unpack, "MSBuild", "Current", "Bin", hostArch, "MSBuild.exe")
|
||||||
if err := download.CopyRedirectedAssemblies(msbuildExe); err != nil {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !*onlyUnpack {
|
if !*onlyUnpack {
|
||||||
if err := download.RelocateBuildTools(unpack, destAbs); err != nil {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
if !*keepUnpack {
|
if !*keepUnpack {
|
||||||
@@ -195,7 +195,7 @@ func runDownload(args []string) int {
|
|||||||
}
|
}
|
||||||
if !*skipPatch && *major == 18 {
|
if !*skipPatch && *major == 18 {
|
||||||
if err := download.ApplyCompatibilityFixes(destAbs); err != nil {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -203,7 +203,7 @@ func runDownload(args []string) int {
|
|||||||
|
|
||||||
if opts.WithWDK && !*onlyUnpack {
|
if opts.WithWDK && !*onlyUnpack {
|
||||||
if err := downloadWDK(opts, selected, cache, destAbs, *major); err != nil {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,17 +6,17 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/i18n"
|
"github.com/Cheviiot/vintner/internal/i18n"
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/wineenv"
|
"github.com/Cheviiot/vintner/internal/wineenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// runEnv prints shell `export` statements for INCLUDE/LIB (converted from
|
// runEnv prints shell `export` statements for INCLUDE/LIB (converted from
|
||||||
// wine's "z:\..." notation to plain unix paths) and TARGET_TRIPLE, for
|
// wine's "z:\..." notation to plain unix paths) and TARGET_TRIPLE, for
|
||||||
// driving clang-cl/lld-link directly without Wine.
|
// 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 {
|
func runEnv(args []string) int {
|
||||||
fs := flag.NewFlagSet("env", flag.ContinueOnError)
|
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 {
|
if err := fs.Parse(args); err != nil {
|
||||||
return 2
|
return 2
|
||||||
}
|
}
|
||||||
@@ -27,12 +27,12 @@ func runEnv(args []string) int {
|
|||||||
|
|
||||||
cfg, err := wineenv.Load(*bin)
|
cfg, err := wineenv.Load(*bin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine env:", err)
|
fmt.Fprintln(os.Stderr, "vintner env:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
baseUnix, err := wineenv.FindBaseUnix(*bin)
|
baseUnix, err := wineenv.FindBaseUnix(*bin)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine env:", err)
|
fmt.Fprintln(os.Stderr, "vintner env:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
paths := wineenv.NewPaths(cfg, baseUnix)
|
paths := wineenv.NewPaths(cfg, baseUnix)
|
||||||
@@ -4,8 +4,8 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/i18n"
|
"github.com/Cheviiot/vintner/internal/i18n"
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/install"
|
"github.com/Cheviiot/vintner/internal/install"
|
||||||
)
|
)
|
||||||
|
|
||||||
func runInstall(args []string) int {
|
func runInstall(args []string) int {
|
||||||
@@ -20,7 +20,7 @@ func runInstall(args []string) int {
|
|||||||
} else {
|
} else {
|
||||||
def, err := defaultToolchainDir()
|
def, err := defaultToolchainDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine install:", err)
|
fmt.Fprintln(os.Stderr, "vintner install:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
dest = def
|
dest = def
|
||||||
@@ -29,12 +29,12 @@ func runInstall(args []string) int {
|
|||||||
|
|
||||||
self, err := os.Executable()
|
self, err := os.Executable()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine install:", err)
|
fmt.Fprintln(os.Stderr, "vintner install:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := install.Install(dest, self); err != nil {
|
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
|
return 1
|
||||||
}
|
}
|
||||||
fmt.Println(i18n.T("install.done", dest+"/bin/<arch>"))
|
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`,
|
// 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
|
// `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
|
// otherwise exposes the `download`/`install`/`env`/`version` management
|
||||||
// subcommands.
|
// subcommands.
|
||||||
package main
|
package main
|
||||||
@@ -12,8 +12,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/i18n"
|
"github.com/Cheviiot/vintner/internal/i18n"
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/wrapper"
|
"github.com/Cheviiot/vintner/internal/wrapper"
|
||||||
)
|
)
|
||||||
|
|
||||||
// version is set at build time via -ldflags "-X main.version=X.Y.Z";
|
// 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":
|
case "env", "e":
|
||||||
return runEnv(args[1:])
|
return runEnv(args[1:])
|
||||||
case "version", "v", "--version":
|
case "version", "v", "--version":
|
||||||
fmt.Println("msvc-go-wine " + version)
|
fmt.Println("vintner " + version)
|
||||||
return 0
|
return 0
|
||||||
case "-h", "--help", "help", "h":
|
case "-h", "--help", "help", "h":
|
||||||
printUsage()
|
printUsage()
|
||||||
@@ -6,12 +6,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// defaultToolchainDir is where `download`/`install` operate when the user
|
// 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 ~`.
|
// clutter a plain `ls ~`.
|
||||||
func defaultToolchainDir() (string, error) {
|
func defaultToolchainDir() (string, error) {
|
||||||
home, err := os.UserHomeDir()
|
home, err := os.UserHomeDir()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
return filepath.Join(home, ".msvc-go-wine"), nil
|
return filepath.Join(home, ".vintner"), nil
|
||||||
}
|
}
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
module github.com/Cheviiot/msvc-go-wine
|
module github.com/Cheviiot/vintner
|
||||||
|
|
||||||
go 1.23
|
go 1.23
|
||||||
|
|||||||
@@ -186,7 +186,7 @@ var httpClient = &http.Client{Timeout: 5 * time.Minute}
|
|||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// --manifest points at a local file, fetched through this same client
|
// --manifest points at a local file, fetched through this same client
|
||||||
// via a "file:" URL (see cmd/msvc-go-wine's runDownload) - so it needs a
|
// via a "file:" URL (see cmd/vintner's runDownload) - so it needs a
|
||||||
// registered "file" handler alongside the default http/https transport.
|
// registered "file" handler alongside the default http/https transport.
|
||||||
t := http.DefaultTransport.(*http.Transport).Clone()
|
t := http.DefaultTransport.(*http.Transport).Clone()
|
||||||
t.RegisterProtocol("file", http.NewFileTransport(http.Dir("/")))
|
t.RegisterProtocol("file", http.NewFileTransport(http.Dir("/")))
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Cheviiot/msvc-go-wine/assets"
|
"github.com/Cheviiot/vintner/assets"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ApplyCompatibilityFixes applies the embedded Wine compatibility patches
|
// ApplyCompatibilityFixes applies the embedded Wine compatibility patches
|
||||||
@@ -63,7 +63,7 @@ func applyGitPatch(dest, embeddedPath, target string) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
tmp, err := os.CreateTemp("", "msvc-go-wine-*.patch")
|
tmp, err := os.CreateTemp("", "vintner-*.patch")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ type Options struct {
|
|||||||
// selection - unlike everything else it depends on, it's opt-in via
|
// selection - unlike everything else it depends on, it's opt-in via
|
||||||
// --with-wdk, since the actual driver headers/libs come from a separate
|
// --with-wdk, since the actual driver headers/libs come from a separate
|
||||||
// NuGet package download handled outside ExpandSelection entirely (see
|
// NuGet package download handled outside ExpandSelection entirely (see
|
||||||
// wdk.go and cmd/msvc-go-wine's runDownload).
|
// wdk.go and cmd/vintner's runDownload).
|
||||||
WithWDK bool
|
WithWDK bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+31
-31
@@ -1,4 +1,4 @@
|
|||||||
// Package i18n provides minimal message localization for msvc-go-wine's own
|
// Package i18n provides minimal message localization for vintner's own
|
||||||
// CLI chrome (usage text, progress lines, prompts). It does not localize
|
// CLI chrome (usage text, progress lines, prompts). It does not localize
|
||||||
// error messages bubbled up from deeper packages - those stay in English,
|
// error messages bubbled up from deeper packages - those stay in English,
|
||||||
// matching how most cross-platform dev tools keep diagnostic text technical
|
// matching how most cross-platform dev tools keep diagnostic text technical
|
||||||
@@ -20,13 +20,13 @@ const (
|
|||||||
|
|
||||||
var current = detect()
|
var current = detect()
|
||||||
|
|
||||||
// detect picks the active language from MSVC_GO_WINE_LANG (checked first, so
|
// detect picks the active language from VINTNER_LANG (checked first, so
|
||||||
// it always overrides the locale), falling back to the POSIX locale
|
// it always overrides the locale), falling back to the POSIX locale
|
||||||
// variables in their usual priority order (LC_ALL, LC_MESSAGES, LANG). Any
|
// variables in their usual priority order (LC_ALL, LC_MESSAGES, LANG). Any
|
||||||
// value starting with "ru" (case-insensitive) selects Russian; anything else
|
// value starting with "ru" (case-insensitive) selects Russian; anything else
|
||||||
// falls back to English.
|
// falls back to English.
|
||||||
func detect() Lang {
|
func detect() Lang {
|
||||||
for _, key := range []string{"MSVC_GO_WINE_LANG", "LC_ALL", "LC_MESSAGES", "LANG"} {
|
for _, key := range []string{"VINTNER_LANG", "LC_ALL", "LC_MESSAGES", "LANG"} {
|
||||||
v := os.Getenv(key)
|
v := os.Getenv(key)
|
||||||
if v == "" {
|
if v == "" {
|
||||||
continue
|
continue
|
||||||
@@ -65,55 +65,55 @@ func T(key string, args ...any) string {
|
|||||||
|
|
||||||
var catalog = map[string]map[Lang]string{
|
var catalog = map[string]map[Lang]string{
|
||||||
"main.usage": {
|
"main.usage": {
|
||||||
EN: `msvc-go-wine - cross compile with MSVC on Linux via Wine
|
EN: `vintner - cross compile with MSVC on Linux via Wine
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
msvc-go-wine download (dl) --accept-license [--dest <dir>] [options]
|
vintner download (dl) --accept-license [--dest <dir>] [options]
|
||||||
fetch and unpack MSVC/WinSDK/WDK
|
fetch and unpack MSVC/WinSDK/WDK
|
||||||
msvc-go-wine install (i) [dir] wire up wrappers for a downloaded MSVC
|
vintner install (i) [dir] wire up wrappers for a downloaded MSVC
|
||||||
msvc-go-wine env (e) --bin <dir/bin/arch> print INCLUDE/LIB for native clang-cl/lld-link use
|
vintner env (e) --bin <dir/bin/arch> print INCLUDE/LIB for native clang-cl/lld-link use
|
||||||
msvc-go-wine version (v) print the version
|
vintner version (v) print the version
|
||||||
msvc-go-wine help (h) show this message
|
vintner help (h) show this message
|
||||||
|
|
||||||
Run "msvc-go-wine <command> --help" for that command's own options - download
|
Run "vintner <command> --help" for that command's own options - download
|
||||||
has many, including --with-wdk, --list-workloads, --list-components and
|
has many, including --with-wdk, --list-workloads, --list-components and
|
||||||
--print-deps-tree.
|
--print-deps-tree.
|
||||||
|
|
||||||
--dest/[dir] default to ~/.msvc-go-wine if omitted.
|
--dest/[dir] default to ~/.vintner if omitted.
|
||||||
Language: set MSVC_GO_WINE_LANG=ru (or LANG=ru_RU...) for Russian output.
|
Language: set VINTNER_LANG=ru (or LANG=ru_RU...) for Russian output.
|
||||||
|
|
||||||
Once installed, add <dir>/bin/<arch> to PATH and invoke the tools directly:
|
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
|
cl, link, lib, ml, ml64, mc, midl, mt, rc, dumpbin, msbuild, nmake, armasm, armasm64, cmd, findstr
|
||||||
`,
|
`,
|
||||||
RU: `msvc-go-wine — кросс-компиляция настоящим MSVC на Linux через Wine
|
RU: `vintner — кросс-компиляция настоящим MSVC на Linux через Wine
|
||||||
|
|
||||||
Использование:
|
Использование:
|
||||||
msvc-go-wine download (dl) --accept-license [--dest <каталог>] [опции]
|
vintner download (dl) --accept-license [--dest <каталог>] [опции]
|
||||||
скачать и распаковать MSVC/WinSDK/WDK
|
скачать и распаковать MSVC/WinSDK/WDK
|
||||||
msvc-go-wine install (i) [каталог] настроить обёртки для скачанного MSVC
|
vintner install (i) [каталог] настроить обёртки для скачанного MSVC
|
||||||
msvc-go-wine env (e) --bin <dir/bin/arch> вывести INCLUDE/LIB для clang-cl/lld-link напрямую
|
vintner env (e) --bin <dir/bin/arch> вывести INCLUDE/LIB для clang-cl/lld-link напрямую
|
||||||
msvc-go-wine version (v) показать версию
|
vintner version (v) показать версию
|
||||||
msvc-go-wine help (h) показать эту справку
|
vintner help (h) показать эту справку
|
||||||
|
|
||||||
Запустите «msvc-go-wine <команда> --help» для параметров конкретной команды —
|
Запустите «vintner <команда> --help» для параметров конкретной команды —
|
||||||
у download их много, включая --with-wdk, --list-workloads, --list-components
|
у download их много, включая --with-wdk, --list-workloads, --list-components
|
||||||
и --print-deps-tree.
|
и --print-deps-tree.
|
||||||
|
|
||||||
--dest/[каталог] по умолчанию — ~/.msvc-go-wine.
|
--dest/[каталог] по умолчанию — ~/.vintner.
|
||||||
Язык: установите MSVC_GO_WINE_LANG=en (или LANG=en_US...) для вывода на английском.
|
Язык: установите VINTNER_LANG=en (или LANG=en_US...) для вывода на английском.
|
||||||
|
|
||||||
После установки добавьте <dir>/bin/<arch> в PATH и вызывайте инструменты напрямую:
|
После установки добавьте <dir>/bin/<arch> в PATH и вызывайте инструменты напрямую:
|
||||||
cl, link, lib, ml, ml64, mc, midl, mt, rc, dumpbin, msbuild, nmake, armasm, armasm64, cmd, findstr
|
cl, link, lib, ml, ml64, mc, midl, mt, rc, dumpbin, msbuild, nmake, armasm, armasm64, cmd, findstr
|
||||||
`,
|
`,
|
||||||
},
|
},
|
||||||
"main.unknown_subcommand": {
|
"main.unknown_subcommand": {
|
||||||
EN: "msvc-go-wine: unknown subcommand %q\n\n",
|
EN: "vintner: unknown subcommand %q\n\n",
|
||||||
RU: "msvc-go-wine: неизвестная подкоманда %q\n\n",
|
RU: "vintner: неизвестная подкоманда %q\n\n",
|
||||||
},
|
},
|
||||||
|
|
||||||
"install.usage": {
|
"install.usage": {
|
||||||
EN: "usage: msvc-go-wine install (i) [dest] (default: ~/.msvc-go-wine)",
|
EN: "usage: vintner install (i) [dest] (default: ~/.vintner)",
|
||||||
RU: "использование: msvc-go-wine install (i) [каталог] (по умолчанию: ~/.msvc-go-wine)",
|
RU: "использование: vintner install (i) [каталог] (по умолчанию: ~/.vintner)",
|
||||||
},
|
},
|
||||||
"install.default_dir": {
|
"install.default_dir": {
|
||||||
EN: "No directory given, using default: %s",
|
EN: "No directory given, using default: %s",
|
||||||
@@ -125,12 +125,12 @@ Once installed, add <dir>/bin/<arch> to PATH and invoke the tools directly:
|
|||||||
},
|
},
|
||||||
|
|
||||||
"env.usage": {
|
"env.usage": {
|
||||||
EN: "usage: msvc-go-wine env (e) --bin <dest>/bin/<arch>",
|
EN: "usage: vintner env (e) --bin <dest>/bin/<arch>",
|
||||||
RU: "использование: msvc-go-wine env (e) --bin <dest>/bin/<arch>",
|
RU: "использование: vintner env (e) --bin <dest>/bin/<arch>",
|
||||||
},
|
},
|
||||||
"env.unknown_arch": {
|
"env.unknown_arch": {
|
||||||
EN: "msvc-go-wine env: unknown arch %q\n",
|
EN: "vintner env: unknown arch %q\n",
|
||||||
RU: "msvc-go-wine env: неизвестная архитектура %q\n",
|
RU: "vintner env: неизвестная архитектура %q\n",
|
||||||
},
|
},
|
||||||
|
|
||||||
"download.host_arch": {
|
"download.host_arch": {
|
||||||
@@ -146,8 +146,8 @@ Once installed, add <dir>/bin/<arch> to PATH and invoke the tools directly:
|
|||||||
RU: "--dest не указан, используется значение по умолчанию: %s",
|
RU: "--dest не указан, используется значение по умолчанию: %s",
|
||||||
},
|
},
|
||||||
"download.done": {
|
"download.done": {
|
||||||
EN: "Done. Next: msvc-go-wine install %s",
|
EN: "Done. Next: vintner install %s",
|
||||||
RU: "Готово. Далее: msvc-go-wine install %s",
|
RU: "Готово. Далее: vintner install %s",
|
||||||
},
|
},
|
||||||
"download.wdk_skip": {
|
"download.wdk_skip": {
|
||||||
EN: "--with-wdk: no x64/arm64 target architecture selected, skipping (no WDK package exists for x86/arm)",
|
EN: "--with-wdk: no x64/arm64 target architecture selected, skipping (no WDK package exists for x86/arm)",
|
||||||
|
|||||||
+13
-13
@@ -1,4 +1,4 @@
|
|||||||
// Package install wires up a downloaded MSVC/WinSDK tree so the msvc-go-wine
|
// Package install wires up a downloaded MSVC/WinSDK tree so the vintner
|
||||||
// wrapper commands can find it: locating the installed toolchain/SDK
|
// wrapper commands can find it: locating the installed toolchain/SDK
|
||||||
// versions, fixing up header/library name casing, laying out the
|
// versions, fixing up header/library name casing, laying out the
|
||||||
// per-architecture tool symlinks, and building the toolrelay helper.
|
// per-architecture tool symlinks, and building the toolrelay helper.
|
||||||
@@ -14,16 +14,16 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Cheviiot/msvc-go-wine/assets"
|
"github.com/Cheviiot/vintner/assets"
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/wineenv"
|
"github.com/Cheviiot/vintner/internal/wineenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
var archs = []string{"x86", "x64", "arm", "arm64"}
|
var archs = []string{"x86", "x64", "arm", "arm64"}
|
||||||
|
|
||||||
// Install wires up dest (a directory previously populated by
|
// Install wires up dest (a directory previously populated by
|
||||||
// `msvc-go-wine download --dest dest`) with the tool wrapper symlinks and
|
// `vintner download --dest dest`) with the tool wrapper symlinks and
|
||||||
// env.json config the wrapper runtime expects. selfBinary is the path to
|
// env.json config the wrapper runtime expects. selfBinary is the path to
|
||||||
// the currently running msvc-go-wine executable, copied into dest/bin so
|
// the currently running vintner executable, copied into dest/bin so
|
||||||
// the arch-specific tool symlinks have something to point at.
|
// the arch-specific tool symlinks have something to point at.
|
||||||
func Install(dest, selfBinary string) error {
|
func Install(dest, selfBinary string) error {
|
||||||
dest, err := filepath.Abs(dest)
|
dest, err := filepath.Abs(dest)
|
||||||
@@ -86,7 +86,7 @@ func Install(dest, selfBinary string) error {
|
|||||||
|
|
||||||
kits10 := filepath.Join(dest, "kits", "10")
|
kits10 := filepath.Join(dest, "kits", "10")
|
||||||
if !isDir(kits10) {
|
if !isDir(kits10) {
|
||||||
return fmt.Errorf("%s not found - expected a Windows SDK already unpacked by `msvc-go-wine download`", kits10)
|
return fmt.Errorf("%s not found - expected a Windows SDK already unpacked by `vintner download`", kits10)
|
||||||
}
|
}
|
||||||
if err := lnS("Lib", filepath.Join(kits10, "lib")); err != nil {
|
if err := lnS("Lib", filepath.Join(kits10, "lib")); err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -148,7 +148,7 @@ func Install(dest, selfBinary string) error {
|
|||||||
if err := os.MkdirAll(destBin, 0o755); err != nil {
|
if err := os.MkdirAll(destBin, 0o755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
sharedBinary := filepath.Join(destBin, "msvc-go-wine")
|
sharedBinary := filepath.Join(destBin, "vintner")
|
||||||
if err := copyFile(selfBinary, sharedBinary, 0o755); err != nil {
|
if err := copyFile(selfBinary, sharedBinary, 0o755); err != nil {
|
||||||
return fmt.Errorf("installing shared binary: %w", err)
|
return fmt.Errorf("installing shared binary: %w", err)
|
||||||
}
|
}
|
||||||
@@ -288,7 +288,7 @@ func renameHostDirs(binDir string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// setupWrapperDir creates <destBin>/<arch> with its own local copy of the
|
// setupWrapperDir creates <destBin>/<arch> with its own local copy of the
|
||||||
// msvc-go-wine binary (not a symlink to the shared one in destBin), and
|
// vintner binary (not a symlink to the shared one in destBin), and
|
||||||
// symlinks every tool name to that LOCAL copy.
|
// symlinks every tool name to that LOCAL copy.
|
||||||
//
|
//
|
||||||
// This matters: the wrapper runtime locates its own install root via
|
// This matters: the wrapper runtime locates its own install root via
|
||||||
@@ -297,23 +297,23 @@ func renameHostDirs(binDir string) error {
|
|||||||
// PATH-resolved absolute path as argv[0] (some just pass the bare command
|
// PATH-resolved absolute path as argv[0] (some just pass the bare command
|
||||||
// name, e.g. "cl", which would make a naive argv[0]-based lookup resolve
|
// name, e.g. "cl", which would make a naive argv[0]-based lookup resolve
|
||||||
// against the caller's cwd instead of the install dir). A same-directory
|
// against the caller's cwd instead of the install dir). A same-directory
|
||||||
// symlink (cl -> msvc-go-wine) resolves to a binary that's still in the
|
// symlink (cl -> vintner) resolves to a binary that's still in the
|
||||||
// right arch dir; a symlink to a binary one level up (cl -> ../msvc-go-wine)
|
// right arch dir; a symlink to a binary one level up (cl -> ../vintner)
|
||||||
// would not be.
|
// would not be.
|
||||||
func setupWrapperDir(destBin, selfBinary, arch, host, dotnetHost, msvcVer, sdkVer string) error {
|
func setupWrapperDir(destBin, selfBinary, arch, host, dotnetHost, msvcVer, sdkVer string) error {
|
||||||
archDir := filepath.Join(destBin, arch)
|
archDir := filepath.Join(destBin, arch)
|
||||||
if err := os.MkdirAll(archDir, 0o755); err != nil {
|
if err := os.MkdirAll(archDir, 0o755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
localBinary := filepath.Join(archDir, "msvc-go-wine")
|
localBinary := filepath.Join(archDir, "vintner")
|
||||||
if err := copyFile(selfBinary, localBinary, 0o755); err != nil {
|
if err := copyFile(selfBinary, localBinary, 0o755); err != nil {
|
||||||
return fmt.Errorf("installing per-arch binary: %w", err)
|
return fmt.Errorf("installing per-arch binary: %w", err)
|
||||||
}
|
}
|
||||||
for name := range toolNames {
|
for name := range toolNames {
|
||||||
if err := lnS("msvc-go-wine", filepath.Join(archDir, name)); err != nil {
|
if err := lnS("vintner", filepath.Join(archDir, name)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := lnS("msvc-go-wine", filepath.Join(archDir, name+".exe")); err != nil {
|
if err := lnS("vintner", filepath.Join(archDir, name+".exe")); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// ConfigFileName is the per-architecture config dropped next to the tool
|
// ConfigFileName is the per-architecture config dropped next to the tool
|
||||||
// symlinks by `msvc-go-wine install`.
|
// symlinks by `vintner install`.
|
||||||
const ConfigFileName = "env.json"
|
const ConfigFileName = "env.json"
|
||||||
|
|
||||||
// Config is the per-architecture info generated at install time.
|
// Config is the per-architecture info generated at install time.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/wineenv"
|
"github.com/Cheviiot/vintner/internal/wineenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
var reToolsetDir = regexp.MustCompile(`^v(\d+)$`)
|
var reToolsetDir = regexp.MustCompile(`^v(\d+)$`)
|
||||||
|
|||||||
+21
-21
@@ -12,7 +12,7 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/Cheviiot/msvc-go-wine/internal/wineenv"
|
"github.com/Cheviiot/vintner/internal/wineenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// pipeDrainGrace bounds how long we wait for a tool's stdout/stderr copy
|
// pipeDrainGrace bounds how long we wait for a tool's stdout/stderr copy
|
||||||
@@ -24,7 +24,7 @@ import (
|
|||||||
// `| tail`, CI log capture) long after the actual build finished.
|
// `| tail`, CI log capture) long after the actual build finished.
|
||||||
const pipeDrainGrace = 500 * time.Millisecond
|
const pipeDrainGrace = 500 * time.Millisecond
|
||||||
|
|
||||||
// toolRelayName is where `msvc-go-wine install` places the compiled
|
// toolRelayName is where `vintner install` places the compiled
|
||||||
// toolrelay.exe helper, shared across all arch bin dirs.
|
// toolrelay.exe helper, shared across all arch bin dirs.
|
||||||
const toolRelayName = "toolrelay.exe"
|
const toolRelayName = "toolrelay.exe"
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@ func Run(tool string, args []string) int {
|
|||||||
|
|
||||||
s, ok := Tools[tool]
|
s, ok := Tools[tool]
|
||||||
if !ok {
|
if !ok {
|
||||||
fmt.Fprintf(os.Stderr, "msvc-go-wine: unknown tool %q\n", tool)
|
fmt.Fprintf(os.Stderr, "vintner: unknown tool %q\n", tool)
|
||||||
return 127
|
return 127
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,19 +50,19 @@ func Run(tool string, args []string) int {
|
|||||||
// <dest>/bin/<arch>, not <dest>/bin.
|
// <dest>/bin/<arch>, not <dest>/bin.
|
||||||
exePath, err := os.Executable()
|
exePath, err := os.Executable()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
scriptDir := filepath.Dir(exePath)
|
scriptDir := filepath.Dir(exePath)
|
||||||
|
|
||||||
cfg, err := wineenv.Load(scriptDir)
|
cfg, err := wineenv.Load(scriptDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine: loading install config:", err)
|
fmt.Fprintln(os.Stderr, "vintner: loading install config:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
baseUnix, err := wineenv.FindBaseUnix(scriptDir)
|
baseUnix, err := wineenv.FindBaseUnix(scriptDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine: locating installation root:", err)
|
fmt.Fprintln(os.Stderr, "vintner: locating installation root:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
paths := wineenv.NewPaths(cfg, baseUnix)
|
paths := wineenv.NewPaths(cfg, baseUnix)
|
||||||
@@ -71,7 +71,7 @@ func Run(tool string, args []string) int {
|
|||||||
|
|
||||||
wineBin, err := wineenv.FindWine()
|
wineBin, err := wineenv.FindWine()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,17 +119,17 @@ func Run(tool string, args []string) int {
|
|||||||
// observes the real 32-bit exit code via Win32 before translating and
|
// observes the real 32-bit exit code via Win32 before translating and
|
||||||
// re-exiting with a value that fits in a byte.
|
// re-exiting with a value that fits in a byte.
|
||||||
func runViaToolRelay(wineBin, relayExe, exePath string, args []string, paths *wineenv.Paths, stdoutF, stderrF lineFilter) int {
|
func runViaToolRelay(wineBin, relayExe, exePath string, args []string, paths *wineenv.Paths, stdoutF, stderrF lineFilter) int {
|
||||||
stdoutFifo := filepath.Join(os.TempDir(), fmt.Sprintf("msvc-go-wine.stdout.%d", os.Getpid()))
|
stdoutFifo := filepath.Join(os.TempDir(), fmt.Sprintf("vintner.stdout.%d", os.Getpid()))
|
||||||
stderrFifo := filepath.Join(os.TempDir(), fmt.Sprintf("msvc-go-wine.stderr.%d", os.Getpid()))
|
stderrFifo := filepath.Join(os.TempDir(), fmt.Sprintf("vintner.stderr.%d", os.Getpid()))
|
||||||
os.Remove(stdoutFifo)
|
os.Remove(stdoutFifo)
|
||||||
os.Remove(stderrFifo)
|
os.Remove(stderrFifo)
|
||||||
if err := syscall.Mkfifo(stdoutFifo, 0o600); err != nil {
|
if err := syscall.Mkfifo(stdoutFifo, 0o600); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
defer os.Remove(stdoutFifo)
|
defer os.Remove(stdoutFifo)
|
||||||
if err := syscall.Mkfifo(stderrFifo, 0o600); err != nil {
|
if err := syscall.Mkfifo(stderrFifo, 0o600); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
defer os.Remove(stderrFifo)
|
defer os.Remove(stderrFifo)
|
||||||
@@ -144,7 +144,7 @@ func runViaToolRelay(wineBin, relayExe, exePath string, args []string, paths *wi
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -176,7 +176,7 @@ func runViaToolRelay(wineBin, relayExe, exePath string, args []string, paths *wi
|
|||||||
if exitErr, ok := err.(*exec.ExitError); ok {
|
if exitErr, ok := err.(*exec.ExitError); ok {
|
||||||
return exitErr.ExitCode()
|
return exitErr.ExitCode()
|
||||||
}
|
}
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
@@ -191,17 +191,17 @@ func runViaToolRelay(wineBin, relayExe, exePath string, args []string, paths *wi
|
|||||||
func runRawStdout(cmd *exec.Cmd) int {
|
func runRawStdout(cmd *exec.Cmd) int {
|
||||||
stdout, err := cmd.StdoutPipe()
|
stdout, err := cmd.StdoutPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
stderr, err := cmd.StderrPipe()
|
stderr, err := cmd.StderrPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ func runRawStdout(cmd *exec.Cmd) int {
|
|||||||
if exitErr, ok := err.(*exec.ExitError); ok {
|
if exitErr, ok := err.(*exec.ExitError); ok {
|
||||||
return exitErr.ExitCode()
|
return exitErr.ExitCode()
|
||||||
}
|
}
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
@@ -265,17 +265,17 @@ func buildEnv(p *wineenv.Paths) []string {
|
|||||||
func runFiltered(cmd *exec.Cmd, stdoutF, stderrF lineFilter) int {
|
func runFiltered(cmd *exec.Cmd, stdoutF, stderrF lineFilter) int {
|
||||||
stdout, err := cmd.StdoutPipe()
|
stdout, err := cmd.StdoutPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
stderr, err := cmd.StderrPipe()
|
stderr, err := cmd.StderrPipe()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cmd.Start(); err != nil {
|
if err := cmd.Start(); err != nil {
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -292,7 +292,7 @@ func runFiltered(cmd *exec.Cmd, stdoutF, stderrF lineFilter) int {
|
|||||||
if exitErr, ok := err.(*exec.ExitError); ok {
|
if exitErr, ok := err.(*exec.ExitError); ok {
|
||||||
return exitErr.ExitCode()
|
return exitErr.ExitCode()
|
||||||
}
|
}
|
||||||
fmt.Fprintln(os.Stderr, "msvc-go-wine:", err)
|
fmt.Fprintln(os.Stderr, "vintner:", err)
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
// filtering its output.
|
// filtering its output.
|
||||||
package wrapper
|
package wrapper
|
||||||
|
|
||||||
import "github.com/Cheviiot/msvc-go-wine/internal/wineenv"
|
import "github.com/Cheviiot/vintner/internal/wineenv"
|
||||||
|
|
||||||
// dirKind selects which install directory a tool's real .exe lives in.
|
// dirKind selects which install directory a tool's real .exe lives in.
|
||||||
type dirKind int
|
type dirKind int
|
||||||
|
|||||||
Reference in New Issue
Block a user