diff --git a/src/cmd/go/go_test.go b/src/cmd/go/go_test.go index 6c87ce83f8c4de6c0dbbe6e92bc05b22546354e4..a264daa710439b0f1d35e671126d25f5c4c9dedc 100644 --- a/src/cmd/go/go_test.go +++ b/src/cmd/go/go_test.go @@ -4728,6 +4728,9 @@ func TestBuildCache(t *testing.T) { tg.run("build", "-x", "complex/w") tg.grepStderrNot(`[\\/]compile|gccgo`, "ran compiler incorrectly") + tg.run("build", "-a", "-x", "complex/w") + tg.grepStderr(`[\\/]compile|gccgo`, "did not run compiler with -a") + // complex is a non-trivial main package. // the link step should not be cached. tg.run("build", "-o", os.DevNull, "-x", "complex") diff --git a/src/cmd/go/internal/work/buildid.go b/src/cmd/go/internal/work/buildid.go index 35ef1df885ae1ec1e683821ef4325cff46cb67aa..b9e1bab0a3e9b7fe27e64f4f5b4a8fc6c5488cea 100644 --- a/src/cmd/go/internal/work/buildid.go +++ b/src/cmd/go/internal/work/buildid.go @@ -355,17 +355,19 @@ func (b *Builder) useCache(a *Action, p *load.Package, actionHash cache.ActionID // We treat hits in this cache as being "stale" for the purposes of go list // (in effect, "stale" means whether p.Target is up-to-date), // but we're still happy to use results from the build artifact cache. - if c := cache.Default(); c != nil { - outputID, size, err := c.Get(actionHash) - if err == nil { - file := c.OutputFile(outputID) - info, err1 := os.Stat(file) - buildID, err2 := buildid.ReadFile(file) - if err1 == nil && err2 == nil && info.Size() == size { - a.built = file - a.Target = "DO NOT USE - using cache" - a.buildID = buildID - return true + if !cfg.BuildA { + if c := cache.Default(); c != nil { + outputID, size, err := c.Get(actionHash) + if err == nil { + file := c.OutputFile(outputID) + info, err1 := os.Stat(file) + buildID, err2 := buildid.ReadFile(file) + if err1 == nil && err2 == nil && info.Size() == size { + a.built = file + a.Target = "DO NOT USE - using cache" + a.buildID = buildID + return true + } } } }