// Copyright 2013 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. //go:build ignore // mksyscall_windows wraps golang.org/x/sys/windows/mkwinsyscall. package main import ( "bytes" "os" "os/exec" "path/filepath" "runtime" ) func main() { goTool := filepath.Join(runtime.GOROOT(), "bin", "go") listCmd := exec.Command(goTool, "list", "-m") listCmd.Env = append(os.Environ(), "GO111MODULE=on") var ( cmdEnv []string modArgs []string ) if out, err := listCmd.Output(); err == nil && string(bytes.TrimSpace(out)) == "std" { // Force module mode to use mkwinsyscall at the same version as the x/sys // module vendored into the standard library. cmdEnv = append(os.Environ(), "GO111MODULE=on") // Force -mod=readonly instead of the default -mod=vendor. // // mkwinsyscall is not itself vendored into the standard library, and it is // not feasible to do so at the moment: std-vendored libraries are included // in the "std" meta-pattern (because in general they *are* linked into // users binaries separately from the original import paths), and we can't // allow a binary in the "std" meta-pattern. modArgs = []string{"-mod=readonly"} } else { // Nobody outside the standard library should be using this wrapper: other // modules can vendor in the mkwinsyscall tool directly (as described in // https://golang.org/issue/25922), so they don't need this wrapper to // set module mode and -mod=readonly explicitly. os.Stderr.WriteString("WARNING: Please switch from using:\n go run $GOROOT/src/syscall/mksyscall_windows.go\nto using:\n go run golang.org/x/sys/windows/mkwinsyscall\n") } args := append([]string{"run"}, modArgs...) args = append(args, "golang.org/x/sys/windows/mkwinsyscall") args = append(args, os.Args[1:]...) cmd := exec.Command(goTool, args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr cmd.Env = cmdEnv err := cmd.Run() if err != nil { os.Exit(1) } }