]> Cypherpunks repositories - gostls13.git/commitdiff
go/internal/srcimporter: use the 'go' command from the Importer's GOROOT
authorBryan C. Mills <bcmills@google.com>
Fri, 11 Mar 2022 03:56:00 +0000 (22:56 -0500)
committerBryan Mills <bcmills@google.com>
Wed, 16 Mar 2022 17:41:38 +0000 (17:41 +0000)
We have no guarantee in general that there is any 'go' command in
$PATH at all, let alone the correct one. However, we can expect that
if a 'go' command is not in scope, the Importer should have a correct
GOROOT setting: otherwise, it would not be able to import anything
from 'std' at all.

Given that information, when we run `go tool cgo` we should use
GOROOT/bin/go specifically, not whatever 'go' we find in $PATH.

This fixes a failure in go/types.TestStdlib that manifests as a
timeout in when the 'go' command is not present in $PATH, due to
repeated retries for every package that transitively depends on
runtime/cgo.

For #51461

Change-Id: I30cc4613f6f02a04e83c8d55657ef01888c7770f
Reviewed-on: https://go-review.googlesource.com/c/go/+/391807
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>

src/go/internal/srcimporter/srcimporter.go

index e4225eb4d7861c192dd42da6e1f684fb7d707e34..d7ec6691bc79cb37913a47c097727ff1b1e973ce 100644 (file)
@@ -205,7 +205,11 @@ func (p *Importer) cgo(bp *build.Package) (*ast.File, error) {
        }
        defer os.RemoveAll(tmpdir)
 
-       args := []string{"go", "tool", "cgo", "-objdir", tmpdir}
+       goCmd := "go"
+       if p.ctxt.GOROOT != "" {
+               goCmd = filepath.Join(p.ctxt.GOROOT, "bin", "go")
+       }
+       args := []string{goCmd, "tool", "cgo", "-objdir", tmpdir}
        if bp.Goroot {
                switch bp.ImportPath {
                case "runtime/cgo":