Commit 498c803c authored by Ian Lance Taylor's avatar Ian Lance Taylor

cmd/go, go/build: add support for gccgo tooldir

The gccgo toolchain does not put tools (cgo, vet, etc.) in
$GOROOT/pkg/tool, but instead in a directory available at
runtime.GCCGOTOOLDIR.

Update the go/build package and the cmd/go tool to use this tool
directory when using gccgo.

Change-Id: Ib827336ff53601208300aceb77f76c2e1b069859
Reviewed-on: https://go-review.googlesource.com/111097
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent b44ca1f3
...@@ -1100,6 +1100,9 @@ ...@@ -1100,6 +1100,9 @@
// //
// Special-purpose environment variables: // Special-purpose environment variables:
// //
// GCCGOTOOLDIR
// If set, where to find gccgo tools, such as cgo.
// The default is based on how gccgo was configured.
// GOROOT_FINAL // GOROOT_FINAL
// The root of the installed Go tree, when it is // The root of the installed Go tree, when it is
// installed in a location other than where it is built. // installed in a location other than where it is built.
......
...@@ -93,11 +93,14 @@ var ( ...@@ -93,11 +93,14 @@ var (
// Update build context to use our computed GOROOT. // Update build context to use our computed GOROOT.
func init() { func init() {
BuildContext.GOROOT = GOROOT BuildContext.GOROOT = GOROOT
if runtime.Compiler != "gccgo" {
// Note that we must use runtime.GOOS and runtime.GOARCH here, // Note that we must use runtime.GOOS and runtime.GOARCH here,
// as the tool directory does not move based on environment variables. // as the tool directory does not move based on environment
// This matches the initialization of ToolDir in go/build, // variables. This matches the initialization of ToolDir in
// except for using GOROOT rather than runtime.GOROOT(). // go/build, except for using GOROOT rather than
// runtime.GOROOT.
build.ToolDir = filepath.Join(GOROOT, "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH) build.ToolDir = filepath.Join(GOROOT, "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH)
}
} }
func findGOROOT() string { func findGOROOT() string {
...@@ -105,6 +108,11 @@ func findGOROOT() string { ...@@ -105,6 +108,11 @@ func findGOROOT() string {
return filepath.Clean(env) return filepath.Clean(env)
} }
def := filepath.Clean(runtime.GOROOT()) def := filepath.Clean(runtime.GOROOT())
if runtime.Compiler == "gccgo" {
// gccgo has no real GOROOT, and it certainly doesn't
// depend on the executable's location.
return def
}
exe, err := os.Executable() exe, err := os.Executable()
if err == nil { if err == nil {
exe, err = filepath.Abs(exe) exe, err = filepath.Abs(exe)
......
...@@ -533,6 +533,9 @@ Architecture-specific environment variables: ...@@ -533,6 +533,9 @@ Architecture-specific environment variables:
Special-purpose environment variables: Special-purpose environment variables:
GCCGOTOOLDIR
If set, where to find gccgo tools, such as cgo.
The default is based on how gccgo was configured.
GOROOT_FINAL GOROOT_FINAL
The root of the installed Go tree, when it is The root of the installed Go tree, when it is
installed in a location other than where it is built. installed in a location other than where it is built.
......
...@@ -975,8 +975,12 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) { ...@@ -975,8 +975,12 @@ func (p *Package) load(stk *ImportStack, bp *build.Package, err error) {
if InstallTargetDir(p) == ToTool { if InstallTargetDir(p) == ToTool {
// This is for 'go tool'. // This is for 'go tool'.
// Override all the usual logic and force it into the tool directory. // Override all the usual logic and force it into the tool directory.
if cfg.BuildToolchainName == "gccgo" {
p.Target = filepath.Join(base.ToolDir, elem)
} else {
p.Target = filepath.Join(cfg.GOROOTpkg, "tool", full) p.Target = filepath.Join(cfg.GOROOTpkg, "tool", full)
} }
}
if p.Target != "" && cfg.BuildContext.GOOS == "windows" { if p.Target != "" && cfg.BuildContext.GOOS == "windows" {
p.Target += ".exe" p.Target += ".exe"
} }
......
...@@ -33,6 +33,17 @@ For more about each tool command, see 'go doc cmd/<command>'. ...@@ -33,6 +33,17 @@ For more about each tool command, see 'go doc cmd/<command>'.
var toolN bool var toolN bool
// Return whether tool can be expected in the gccgo tool directory.
// Other binaries could be in the same directory so don't
// show those with the 'go tool' command.
func isGccgoTool(tool string) bool {
switch tool {
case "cgo", "fix", "cover", "godoc", "vet":
return true
}
return false
}
func init() { func init() {
CmdTool.Flag.BoolVar(&toolN, "n", false, "") CmdTool.Flag.BoolVar(&toolN, "n", false, "")
} }
...@@ -114,6 +125,11 @@ func listTools() { ...@@ -114,6 +125,11 @@ func listTools() {
if base.ToolIsWindows && strings.HasSuffix(name, base.ToolWindowsExtension) { if base.ToolIsWindows && strings.HasSuffix(name, base.ToolWindowsExtension) {
name = name[:len(name)-len(base.ToolWindowsExtension)] name = name[:len(name)-len(base.ToolWindowsExtension)]
} }
// The tool directory used by gccgo will have other binaries
// in addition to go tools. Only display go tools here.
if cfg.BuildToolchainName == "gccgo" && !isGccgoTool(name) {
continue
}
fmt.Println(name) fmt.Println(name)
} }
} }
...@@ -1595,7 +1595,7 @@ func init() { ...@@ -1595,7 +1595,7 @@ func init() {
} }
// ToolDir is the directory containing build tools. // ToolDir is the directory containing build tools.
var ToolDir = filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH) var ToolDir = getToolDir()
// IsLocalImport reports whether the import path is // IsLocalImport reports whether the import path is
// a local import path, like ".", "..", "./foo", or "../foo". // a local import path, like ".", "..", "./foo", or "../foo".
......
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build gc
package build
import (
"path/filepath"
"runtime"
)
// getToolDir returns the default value of ToolDir.
func getToolDir() string {
return filepath.Join(runtime.GOROOT(), "pkg/tool/"+runtime.GOOS+"_"+runtime.GOARCH)
}
// Copyright 2018 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// +build gccgo
package build
import "runtime"
// getToolDir returns the default value of ToolDir.
func getToolDir() string {
return envOr("GCCGOTOOLDIR", runtime.GCCGOTOOLDIR)
}
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