cmd/go: build: print import errors when invoked on files
This fix makes the goFilesPackage helper function print the errors from
package imports and exit similar to how the packagesForBuild function does.
Without this change, when invoking "go build *.go" with, for example,
an old import path, the following stack trace is generated:
panic: runtime error: invalid memory address or nil pointer dereference
goroutine 1 [running]:
go/build.(*Tree).PkgDir(...)
/opt/go/src/pkg/go/build/path.go:52 +0xfb
main.(*builder).action(...)
/opt/go/src/cmd/go/build.go:327 +0xb8
main.(*builder).action(...)
/opt/go/src/cmd/go/build.go:335 +0x208
main.runBuild(...)
/opt/go/src/cmd/go/build.go:129 +0x386
main.main()
/opt/go/src/cmd/go/main.go:126 +0x2d8
Fixes #2865.
R=rsc, dvyukov, r
CC=golang-dev
https://golang.org/cl/5624052
diff --git a/src/cmd/go/build.go b/src/cmd/go/build.go
index bad37df..f6f8de5 100644
--- a/src/cmd/go/build.go
+++ b/src/cmd/go/build.go
@@ -304,6 +304,17 @@
if pkg.Error != nil {
fatalf("%s", pkg.Error)
}
+ printed := map[error]bool{}
+ for _, err := range pkg.DepsErrors {
+ // Since these are errors in dependencies,
+ // the same error might show up multiple times,
+ // once in each package that depends on it.
+ // Only print each once.
+ if !printed[err] {
+ printed[err] = true
+ errorf("%s", err)
+ }
+ }
if target != "" {
pkg.target = target
} else if pkg.Name == "main" {
@@ -312,6 +323,7 @@
pkg.target = pkg.Name + ".a"
}
pkg.ImportPath = "_/" + pkg.target
+ exitIfErrors()
return pkg
}