diff options
author | Péter Szilágyi <peterke@gmail.com> | 2017-08-07 22:47:58 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-08-07 22:47:58 +0800 |
commit | f5925b045945824c4a128b01551ecece37bc1a95 (patch) | |
tree | bc1e0e590d85b60acfd836775ee12cbccd90727f | |
parent | 67439c1dbaa72f62c86d9a776cb01add2d6f3b9b (diff) | |
parent | f59a49d591e3311b030b57d2be488a6303a3747a (diff) | |
download | dexon-f5925b045945824c4a128b01551ecece37bc1a95.tar dexon-f5925b045945824c4a128b01551ecece37bc1a95.tar.gz dexon-f5925b045945824c4a128b01551ecece37bc1a95.tar.bz2 dexon-f5925b045945824c4a128b01551ecece37bc1a95.tar.lz dexon-f5925b045945824c4a128b01551ecece37bc1a95.tar.xz dexon-f5925b045945824c4a128b01551ecece37bc1a95.tar.zst dexon-f5925b045945824c4a128b01551ecece37bc1a95.zip |
Merge pull request #14928 from fjl/build-goroot-explain
internal/build: add GoTool and document why it uses GOROOT
-rw-r--r-- | build/ci.go | 5 | ||||
-rw-r--r-- | internal/build/util.go | 16 |
2 files changed, 15 insertions, 6 deletions
diff --git a/build/ci.go b/build/ci.go index e631d70ef..6fe03db71 100644 --- a/build/ci.go +++ b/build/ci.go @@ -250,10 +250,7 @@ func goTool(subcmd string, args ...string) *exec.Cmd { } func goToolArch(arch string, subcmd string, args ...string) *exec.Cmd { - gocmd := filepath.Join(runtime.GOROOT(), "bin", "go") - cmd := exec.Command(gocmd, subcmd) - cmd.Args = append(cmd.Args, args...) - + cmd := build.GoTool(subcmd, args...) if subcmd == "build" || subcmd == "install" || subcmd == "test" { // Go CGO has a Windows linker error prior to 1.8 (https://github.com/golang/go/issues/8756). // Work around issue by allowing multiple definitions for <1.8 builds. diff --git a/internal/build/util.go b/internal/build/util.go index 44f6760b9..ade9cbe93 100644 --- a/internal/build/util.go +++ b/internal/build/util.go @@ -138,6 +138,19 @@ func CopyFile(dst, src string, mode os.FileMode) { } } +// GoTool returns the command that runs a go tool. This uses go from GOROOT instead of PATH +// so that go commands executed by build use the same version of Go as the 'host' that runs +// build code. e.g. +// +// /usr/lib/go-1.8/bin/go run build/ci.go ... +// +// runs using go 1.8 and invokes go 1.8 tools from the same GOROOT. This is also important +// because runtime.Version checks on the host should match the tools that are run. +func GoTool(tool string, args ...string) *exec.Cmd { + args = append([]string{tool}, args...) + return exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) +} + // ExpandPackagesNoVendor expands a cmd/go import path pattern, skipping // vendored packages. func ExpandPackagesNoVendor(patterns []string) []string { @@ -148,8 +161,7 @@ func ExpandPackagesNoVendor(patterns []string) []string { } } if expand { - args := append([]string{"list"}, patterns...) - cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), args...) + cmd := GoTool("list", patterns...) out, err := cmd.CombinedOutput() if err != nil { log.Fatalf("package listing failed: %v\n%s", err, string(out)) |