cmd/go: diagnose unset GOROOT when built with -trimpath

For #51483

Change-Id: I4546c20cf968b595020a1eba888fe1d9a1c6cfc5
Reviewed-on: https://go-review.googlesource.com/c/go/+/391811
Reviewed-by: Russ Cox <rsc@golang.org>
Trust: Bryan Mills <bcmills@google.com>
This commit is contained in:
Bryan C. Mills 2022-03-10 23:40:10 -05:00 committed by Bryan Mills
parent e1fbf13896
commit cc2e7f36ba
4 changed files with 27 additions and 3 deletions

View File

@ -370,7 +370,10 @@ func findGOROOT() string {
if env := Getenv("GOROOT"); env != "" {
return filepath.Clean(env)
}
def := filepath.Clean(runtime.GOROOT())
def := ""
if r := runtime.GOROOT(); r != "" {
def = filepath.Clean(r)
}
if runtime.Compiler == "gccgo" {
// gccgo has no real GOROOT, and it certainly doesn't
// depend on the executable's location.

View File

@ -142,6 +142,10 @@ func main() {
}
}
if cfg.GOROOT == "" {
fmt.Fprintf(os.Stderr, "go: cannot find GOROOT directory: 'go' binary is trimmed and GOROOT is not set\n")
os.Exit(2)
}
if fi, err := os.Stat(cfg.GOROOT); err != nil || !fi.IsDir() {
fmt.Fprintf(os.Stderr, "go: cannot find GOROOT directory: %v\n", cfg.GOROOT)
os.Exit(2)

View File

@ -22,6 +22,7 @@ import (
"path/filepath"
"regexp"
"runtime"
"runtime/debug"
"strconv"
"strings"
"sync"
@ -373,6 +374,17 @@ Script:
ok = testenv.HasSymlink()
case "case-sensitive":
ok = isCaseSensitive(ts.t)
case "trimpath":
if info, _ := debug.ReadBuildInfo(); info == nil {
ts.fatalf("missing build info")
} else {
for _, s := range info.Settings {
if s.Key == "-trimpath" && s.Value == "true" {
ok = true
break
}
}
}
default:
if strings.HasPrefix(cond.tag, "exec:") {
prog := cond.tag[len("exec:"):]

View File

@ -8,11 +8,16 @@
# TODO(#51483): when runtime.GOROOT() returns the empty string,
# go/build should default to 'go env GOROOT' instead.
[short] skip
env GOROOT=
env GOROOT_FINAL=
[trimpath] ! go env GOROOT
[trimpath] stderr '^go: cannot find GOROOT directory: ''go'' binary is trimmed and GOROOT is not set$'
[trimpath] stop
[short] skip
go run .
stdout '^GOROOT '$TESTGO_GOROOT'$'
stdout '^runtime '$TESTGO_GOROOT${/}src${/}runtime'$'