Commit 4de3c7d3 authored by Jay Conrod's avatar Jay Conrod

cmd/go: include module path and version in cache key with -trimpath

When -trimpath is used, packages built from the module cache still
have debug into that contains the module path and version. Only the
module cache directory is stripped.

With this CL, we now include the module path and version in the cache
key for build actions.

Fixes #35412

Change-Id: I1956592d0d86fcea2cca7c5fc8957e83543d6aa2
Reviewed-on: https://go-review.googlesource.com/c/go/+/207317
Run-TryBot: Jay Conrod <jayconrod@google.com>
Reviewed-by: default avatarBryan C. Mills <bcmills@google.com>
parent fc3eae52
......@@ -206,8 +206,12 @@ func (b *Builder) buildActionID(a *Action) cache.ActionID {
// The compiler hides the exact value of $GOROOT
// when building things in GOROOT.
// Assume b.WorkDir is being trimmed properly.
// When -trimpath is used with a package built from the module cache,
// use the module path and version instead of the directory.
if !p.Goroot && !cfg.BuildTrimpath && !strings.HasPrefix(p.Dir, b.WorkDir) {
fmt.Fprintf(h, "dir %s\n", p.Dir)
} else if cfg.BuildTrimpath && p.Module != nil {
fmt.Fprintf(h, "module %s@%s\n", p.Module.Path, p.Module.Version)
}
fmt.Fprintf(h, "goos %s goarch %s\n", cfg.Goos, cfg.Goarch)
fmt.Fprintf(h, "import %q\n", p.ImportPath)
......
Module with a function that prints file name for the top stack frame.
Different versions of this module are identical, but they should return
different file names with -trimpath.
-- .mod --
module example.com/stack
go 1.14
-- .info --
{"Version":"v1.0.0"}
-- stack.go --
package stack
import "runtime"
func TopFile() string {
_, file, _, _ := runtime.Caller(0)
return file
}
Module with a function that prints file name for the top stack frame.
Different versions of this module are identical, but they should return
different file names with -trimpath.
-- .mod --
module example.com/stack
go 1.14
-- .info --
{"Version":"v1.0.1"}
-- stack.go --
package stack
import "runtime"
func TopFile() string {
_, file, _, _ := runtime.Caller(0)
return file
}
[short] skip
env GO111MODULE=on
# Set up fresh GOCACHE.
......@@ -12,9 +13,35 @@ go build -x -o a.out -trimpath
stderr '(compile|gccgo)( |\.exe)'
stderr 'link( |\.exe)'
# Two distinct versions of the same module with identical content should
# still be cached separately.
# Verifies golang.org/issue/35412.
go get -d example.com/stack@v1.0.0
go run -trimpath printstack.go
stdout '^example.com/stack@v1.0.0/stack.go$'
go get -d example.com/stack@v1.0.1
go run -trimpath printstack.go
stdout '^example.com/stack@v1.0.1/stack.go$'
-- $WORK/hello.go --
package main
func main() { println("hello") }
-- $WORK/printstack.go --
// +build ignore
package main
import (
"fmt"
"example.com/stack"
)
func main() {
fmt.Println(stack.TopFile())
}
-- $WORK/go.mod --
module m
go 1.14
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment