Skip to content

Commit

Permalink
cmd/go, cmd/compile: match tool versions
Browse files Browse the repository at this point in the history
This change passes runtime.Version from the go tool to the compiler.
If the versions do not match, the compilation fails.
The result is a go tool from one GOROOT will complain loudly if it
is invoked with a different GOROOT value.

Only release versions are checked, so that when developing Go
you can still use "go install cmd/go" and "go install cmd/compile"
separately.

Fixes #19064

Change-Id: I17e184d07d3c1092b1d9af53ba55ed3ecf67791d
Reviewed-on: https://go-review.googlesource.com/42595
Run-TryBot: David Crawshaw <[email protected]>
TryBot-Result: Gobot Gobot <[email protected]>
Reviewed-by: Ian Lance Taylor <[email protected]>
  • Loading branch information
crawshaw committed May 4, 2017
1 parent 9dd7059 commit 98b3e3a
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/cmd/compile/internal/gc/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,8 @@ func Main(archInit func(*Arch)) {
flag.StringVar(&cpuprofile, "cpuprofile", "", "write cpu profile to `file`")
flag.StringVar(&memprofile, "memprofile", "", "write memory profile to `file`")
flag.Int64Var(&memprofilerate, "memprofilerate", 0, "set runtime.MemProfileRate to `rate`")
var goversion string
flag.StringVar(&goversion, "goversion", "", "required version of the runtime")
flag.StringVar(&traceprofile, "traceprofile", "", "write an execution trace to `file`")
flag.StringVar(&blockprofile, "blockprofile", "", "write block profile to `file`")
flag.StringVar(&mutexprofile, "mutexprofile", "", "write mutex profile to `file`")
Expand All @@ -242,6 +244,11 @@ func Main(archInit func(*Arch)) {
usage()
}

if goversion != "" && goversion != runtime.Version() {
fmt.Printf("compile: version %q does not match go tool version %q\n", runtime.Version(), goversion)
Exit(2)
}

thearch.LinkArch.Init(Ctxt)

if outfile == "" {
Expand Down
11 changes: 11 additions & 0 deletions src/cmd/go/go_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4013,3 +4013,14 @@ func TestExecutableGOROOT(t *testing.T) {
t.Fatalf("%s env GOROOT = %q, want %q", symGoTool, got, want)
}
}

func TestNeedVersion(t *testing.T) {
tg := testgo(t)
defer tg.cleanup()
tg.parallel()
tg.tempFile("goversion.go", `package main; func main() {}`)
path := tg.path("goversion.go")
tg.setenv("TESTGO_VERSION", "go1.testgo")
tg.runFail("run", path)
tg.grepStderr("compile", "does not match go tool version")
}
5 changes: 5 additions & 0 deletions src/cmd/go/internal/work/build.go
Original file line number Diff line number Diff line change
Expand Up @@ -392,8 +392,13 @@ func BuildModeInit() {
cfg.BuildContext.InstallSuffix += codegenArg[1:]
}
}
if strings.HasPrefix(runtimeVersion, "go1") {
buildGcflags = append(buildGcflags, "-goversion", runtimeVersion)
}
}

var runtimeVersion = runtime.Version()

func runBuild(cmd *base.Command, args []string) {
InstrumentInit()
BuildModeInit()
Expand Down
17 changes: 17 additions & 0 deletions src/cmd/go/internal/work/testgo.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2017 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.

// This file contains extra hooks for testing the go command.

// +build testgo

package work

import "os"

func init() {
if v := os.Getenv("TESTGO_VERSION"); v != "" {
runtimeVersion = v
}
}

0 comments on commit 98b3e3a

Please sign in to comment.