aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2017-08-07 21:50:31 +0800
committerFelix Lange <fjl@twurst.com>2017-08-07 22:08:50 +0800
commitf59a49d591e3311b030b57d2be488a6303a3747a (patch)
treebf98aa63d62d02226bb0f4a186127b4741a177ca
parent46cf0a616b597dfb8b1feff80ad58b6eb81e57d5 (diff)
downloaddexon-f59a49d591e3311b030b57d2be488a6303a3747a.tar
dexon-f59a49d591e3311b030b57d2be488a6303a3747a.tar.gz
dexon-f59a49d591e3311b030b57d2be488a6303a3747a.tar.bz2
dexon-f59a49d591e3311b030b57d2be488a6303a3747a.tar.lz
dexon-f59a49d591e3311b030b57d2be488a6303a3747a.tar.xz
dexon-f59a49d591e3311b030b57d2be488a6303a3747a.tar.zst
dexon-f59a49d591e3311b030b57d2be488a6303a3747a.zip
internal/build: add GoTool and document why it uses GOROOT
-rw-r--r--build/ci.go5
-rw-r--r--internal/build/util.go16
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))