Skip to content

Commit

Permalink
cmd/go/internal/tool: set Internal.ExeName on tool's package
Browse files Browse the repository at this point in the history
While the cached name of an executable is set based on the base name of
the package path, the executable produced as the output of link doesn't
have ExeName set on it and is just called a.out (with a .exe suffix on
Windows). Set ExeName so that the first time the binary is run, from the
directory link is run in, it has the right name for ps.

For #48429

Change-Id: Ic049304ec6fd5b23c2f5aaaf91aa58d79fe5a7ba
Cq-Include-Trybots: luci.golang.try:gotip-linux-amd64-longtest,gotip-windows-amd64-longtest
Reviewed-on: https://go-review.googlesource.com/c/go/+/630695
Reviewed-by: Conrad Irwin <[email protected]>
Reviewed-by: Hongxiang Jiang <[email protected]>
LUCI-TryBot-Result: Go LUCI <[email protected]>
  • Loading branch information
matloob committed Nov 21, 2024
1 parent a3a31ec commit a86ea80
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
1 change: 1 addition & 0 deletions src/cmd/go/internal/tool/tool.go
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,7 @@ func buildAndRunModtool(ctx context.Context, tool string, args []string) {
pkgOpts := load.PackageOpts{MainOnly: true}
p := load.PackagesAndErrors(ctx, pkgOpts, []string{tool})[0]
p.Internal.OmitDebug = true
p.Internal.ExeName = path.Base(p.ImportPath)

a1 := b.LinkAction(work.ModeBuild, work.ModeBuild, p)
a1.CacheExecutable = true
Expand Down
32 changes: 32 additions & 0 deletions src/cmd/go/testdata/script/tool_exename.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
[short] skip 'runs go build'

# First run: executable for bar is not cached.
# Make sure it's not called a.out
go tool bar
stdout 'my name is: bar'$GOEXE
! stdout 'a.out'

# Second run: executable is cached. Make sure it
# has the right name.
go tool bar
stdout 'my name is: bar'$GOEXE
! stdout 'a.out'

-- go.mod --
module example.com/foo

go 1.24

tool example.com/foo/bar
-- bar/bar.go --
package main

import (
"fmt"
"os"
"path/filepath"
)

func main() {
fmt.Println("my name is:", filepath.Base(os.Args[0]))
}

0 comments on commit a86ea80

Please sign in to comment.