]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: do not create subdirs of $GOBIN
authorDavid Crawshaw <crawshaw@golang.org>
Sat, 11 Jul 2015 15:28:16 +0000 (11:28 -0400)
committerDavid Crawshaw <crawshaw@golang.org>
Tue, 14 Jul 2015 19:25:40 +0000 (19:25 +0000)
Fixes #9769.

Change-Id: I2959906c71d0ce62cdb750dab78eab631a26f229
Reviewed-on: https://go-review.googlesource.com/12080
Reviewed-by: Rob Pike <r@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/cmd/go/build.go
src/cmd/go/go_test.go
src/cmd/go/pkg.go

index 0e78328829f28342151934d3f81f140d4b57cafb..c3afa5af9ccbeabc3870cab298f6cceb23d6248a 100644 (file)
@@ -501,11 +501,14 @@ func runInstall(cmd *Command, args []string) {
 
        for _, p := range pkgs {
                if p.Target == "" && (!p.Standard || p.ImportPath != "unsafe") {
-                       if p.cmdline {
+                       switch {
+                       case p.gobinSubdir:
+                               errorf("go install: cannot install cross-compiled binaries when GOBIN is set")
+                       case p.cmdline:
                                errorf("go install: no install location for .go files listed on command line (GOBIN not set)")
-                       } else if p.ConflictDir != "" {
+                       case p.ConflictDir != "":
                                errorf("go install: no install location for %s: hidden by %s", p.Dir, p.ConflictDir)
-                       } else {
+                       default:
                                errorf("go install: no install location for directory %s outside GOPATH\n"+
                                        "\tFor more details see: go help gopath", p.Dir)
                        }
index 008d40f7e11f1bcc7bb42b246cda05c46e602afb..59c2cffa9ff76cbb03360ac55c1addc99f37c761 100644 (file)
@@ -740,6 +740,27 @@ func TestGoInstallDetectsRemovedFiles(t *testing.T) {
        tg.wantStale("mypkg", "./testgo list mypkg claims mypkg is NOT stale after removing y.go; should be stale")
 }
 
+func TestGoInstallErrorOnCrossCompileToBin(t *testing.T) {
+       tg := testgo(t)
+       defer tg.cleanup()
+       tg.tempFile("src/mycmd/x.go", `package main
+               func main() {}`)
+       tg.setenv("GOPATH", tg.path("."))
+
+       tg.run("build", "mycmd")
+
+       goarch := "386"
+       if runtime.GOARCH == "386" {
+               goarch = "amd64"
+       }
+       tg.setenv("GOOS", "linux")
+       tg.setenv("GOARCH", goarch)
+       tg.runFail("install", "mycmd")
+       tg.setenv("GOBIN", tg.path("."))
+       tg.runFail("install", "mycmd")
+       tg.run("install", "cmd/pack")
+}
+
 func TestGoInstsallDetectsRemovedFilesInPackageMain(t *testing.T) {
        tg := testgo(t)
        defer tg.cleanup()
index f949d4e9f22e743aed49ac3bc44714f6324381e4..432a98ba994549bb52f4787604652dd9b5e1da04 100644 (file)
@@ -98,6 +98,7 @@ type Package struct {
        coverVars    map[string]*CoverVar // variables created by coverage analysis
        omitDWARF    bool                 // tell linker not to write DWARF information
        buildID      string               // expected build ID for generated package
+       gobinSubdir  bool                 // install target would be subdir of GOBIN
 }
 
 // CoverVar holds the name of the generated coverage variables targeting the named file.
@@ -718,6 +719,11 @@ func (p *Package) load(stk *importStack, bp *build.Package, err error) *Package
                } else if p.build.BinDir != "" {
                        // Install to GOBIN or bin of GOPATH entry.
                        p.target = filepath.Join(p.build.BinDir, elem)
+                       if !p.Goroot && strings.Contains(elem, "/") {
+                               // Do not create bin/goos_goarch/elem.
+                               p.target = ""
+                               p.gobinSubdir = true
+                       }
                }
                if goTools[p.ImportPath] == toTool {
                        // This is for 'go tool'.