]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: include Go toolchain information in build ID
authorRuss Cox <rsc@golang.org>
Thu, 4 Jun 2015 19:35:58 +0000 (15:35 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 15 Jun 2015 18:57:35 +0000 (18:57 +0000)
This causes packages and binaries built by Go 1.5 to look
out of date to Go 1.6 and vice versa, so that when you flip
between different Go versions but keep the same GOPATH,
the right rebuilding happens at each flip.

Go 1.4 binaries will also look out of date to Go 1.5,
but Go 1.5 binaries will not look out of date to Go 1.4
(since Go 1.4 doesn't have anything like this).
People flipping between Go 1.4 and Go 1.5 will still
need to use go install -a every time to flip to Go 1.4,
but not when they flip back to Go 1.5.

Fixes #6534.
Fixes #10702.

Change-Id: I0ae7f268f822d483059a938a4f22846ff9275b4c
Reviewed-on: https://go-review.googlesource.com/10760
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Andrew Gerrand <adg@golang.org>
src/cmd/go/pkg.go

index 73527a3aba333ceaa77554235a430444936c902f..7b21fd44144e9b1c2056f1adfb79f0ea8e56195b 100644 (file)
@@ -724,6 +724,27 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package
        for _, file := range inputFiles {
                fmt.Fprintf(h, "%s\n", file)
        }
+
+       // Include the content of runtime/zversion.go in the hash
+       // for package runtime. This will give package runtime a
+       // different build ID in each Go release.
+       if p.Standard && p.ImportPath == "runtime" {
+               data, _ := ioutil.ReadFile(filepath.Join(p.Dir, "zversion.go"))
+               fmt.Fprintf(h, "zversion %q\n", string(data))
+       }
+
+       // Include the build IDs of any dependencies in the hash.
+       // This, combined with the runtime/zversion content,
+       // will cause packages to have different build IDs when
+       // compiled with different Go releases.
+       // This helps the go command know to recompile when
+       // people use the same GOPATH but switch between
+       // different Go releases. See golang.org/issue/10702.
+       for _, dep := range p.Deps {
+               p1 := deps[dep]
+               fmt.Fprintf(h, "dep %s %s\n", p1.ImportPath, p1.buildID)
+       }
+
        p.buildID = fmt.Sprintf("%x", h.Sum(nil))
 
        return p