Skip to content

Commit

Permalink
cmd/go: diagnose unset GOROOT when built with -trimpath
Browse files Browse the repository at this point in the history
For golang#51483

Change-Id: I4546c20cf968b595020a1eba888fe1d9a1c6cfc5
Reviewed-on: https://go-review.googlesource.com/c/go/+/391811
Reviewed-by: Russ Cox <[email protected]>
Trust: Bryan Mills <[email protected]>
  • Loading branch information
Bryan C. Mills committed Mar 18, 2022
1 parent e1fbf13 commit cc2e7f3
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 3 deletions.
5 changes: 4 additions & 1 deletion src/cmd/go/internal/cfg/cfg.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
4 changes: 4 additions & 0 deletions src/cmd/go/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
12 changes: 12 additions & 0 deletions src/cmd/go/script_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"path/filepath"
"regexp"
"runtime"
"runtime/debug"
"strconv"
"strings"
"sync"
Expand Down Expand Up @@ -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:"):]
Expand Down
9 changes: 7 additions & 2 deletions src/cmd/go/testdata/script/build_trimpath_goroot.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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'$'
Expand Down

0 comments on commit cc2e7f3

Please sign in to comment.