]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: correct buildmode test (from "c-header" to "c-shared")
authorIan Lance Taylor <iant@golang.org>
Thu, 11 Jan 2018 01:48:37 +0000 (17:48 -0800)
committerIan Lance Taylor <iant@golang.org>
Thu, 11 Jan 2018 19:24:35 +0000 (19:24 +0000)
Change-Id: I8688a47ae83f6719f6134c64fb3d3f2aa275c641
Reviewed-on: https://go-review.googlesource.com/87158
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
misc/cgo/testcarchive/carchive_test.go
misc/cgo/testcshared/cshared_test.go
src/cmd/go/internal/work/exec.go

index 7ba5faabeb3a271a476c68e53705a9d6aa8c298d..79633659da6c01c94927d29bfc626c60e70e9ebd 100644 (file)
@@ -642,3 +642,50 @@ func TestCompileWithoutShared(t *testing.T) {
        t.Logf("%s", out)
        expectSignal(t, err, syscall.SIGPIPE)
 }
+
+// Test that installing a second time recreates the header files.
+func TestCachedInstall(t *testing.T) {
+       defer os.RemoveAll("pkg")
+
+       h1 := filepath.Join("pkg", libgodir, "libgo.h")
+       h2 := filepath.Join("pkg", libgodir, "p.h")
+
+       buildcmd := []string{"go", "install", "-i", "-buildmode=c-archive", "libgo"}
+
+       cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+       cmd.Env = gopathEnv
+       t.Log(buildcmd)
+       if out, err := cmd.CombinedOutput(); err != nil {
+               t.Logf("%s", out)
+               t.Fatal(err)
+       }
+
+       if _, err := os.Stat(h1); err != nil {
+               t.Errorf("libgo.h not installed: %v", err)
+       }
+       if _, err := os.Stat(h2); err != nil {
+               t.Errorf("p.h not installed: %v", err)
+       }
+
+       if err := os.Remove(h1); err != nil {
+               t.Fatal(err)
+       }
+       if err := os.Remove(h2); err != nil {
+               t.Fatal(err)
+       }
+
+       cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
+       cmd.Env = gopathEnv
+       t.Log(buildcmd)
+       if out, err := cmd.CombinedOutput(); err != nil {
+               t.Logf("%s", out)
+               t.Fatal(err)
+       }
+
+       if _, err := os.Stat(h1); err != nil {
+               t.Errorf("libgo.h not installed in second run: %v", err)
+       }
+       if _, err := os.Stat(h2); err != nil {
+               t.Errorf("p.h not installed in second run: %v", err)
+       }
+}
index 49be092396660a297ec4c2013220a247a122e3e3..b9499fcf376c216536756175f6cbba21fee823b4 100644 (file)
@@ -7,6 +7,7 @@ package cshared_test
 import (
        "debug/elf"
        "fmt"
+       "io/ioutil"
        "log"
        "os"
        "os/exec"
@@ -477,3 +478,99 @@ func TestPIE(t *testing.T) {
                }
        }
 }
+
+// Test that installing a second time recreates the header files.
+func TestCachedInstall(t *testing.T) {
+       tmpdir, err := ioutil.TempDir("", "cshared")
+       if err != nil {
+               t.Fatal(err)
+       }
+       // defer os.RemoveAll(tmpdir)
+
+       copyFile(t, filepath.Join(tmpdir, "src", "libgo", "libgo.go"), filepath.Join("src", "libgo", "libgo.go"))
+       copyFile(t, filepath.Join(tmpdir, "src", "p", "p.go"), filepath.Join("src", "p", "p.go"))
+
+       env := append(os.Environ(), "GOPATH="+tmpdir)
+
+       buildcmd := []string{"go", "install", "-x", "-i", "-buildmode=c-shared", "-installsuffix", "testcshared", "libgo"}
+
+       cmd := exec.Command(buildcmd[0], buildcmd[1:]...)
+       cmd.Env = env
+       t.Log(buildcmd)
+       out, err := cmd.CombinedOutput()
+       t.Logf("%s", out)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       var libgoh, ph string
+
+       walker := func(path string, info os.FileInfo, err error) error {
+               if err != nil {
+                       t.Fatal(err)
+               }
+               var ps *string
+               switch filepath.Base(path) {
+               case "libgo.h":
+                       ps = &libgoh
+               case "p.h":
+                       ps = &ph
+               }
+               if ps != nil {
+                       if *ps != "" {
+                               t.Fatalf("%s found again", *ps)
+                       }
+                       *ps = path
+               }
+               return nil
+       }
+
+       if err := filepath.Walk(tmpdir, walker); err != nil {
+               t.Fatal(err)
+       }
+
+       if libgoh == "" {
+               t.Fatal("libgo.h not installed")
+       }
+       if ph == "" {
+               t.Fatal("p.h not installed")
+       }
+
+       if err := os.Remove(libgoh); err != nil {
+               t.Fatal(err)
+       }
+       if err := os.Remove(ph); err != nil {
+               t.Fatal(err)
+       }
+
+       cmd = exec.Command(buildcmd[0], buildcmd[1:]...)
+       cmd.Env = env
+       t.Log(buildcmd)
+       out, err = cmd.CombinedOutput()
+       t.Logf("%s", out)
+       if err != nil {
+               t.Fatal(err)
+       }
+
+       if _, err := os.Stat(libgoh); err != nil {
+               t.Errorf("libgo.h not installed in second run: %v", err)
+       }
+       if _, err := os.Stat(ph); err != nil {
+               t.Errorf("p.h not installed in second run: %v", err)
+       }
+}
+
+// copyFile copies src to dst.
+func copyFile(t *testing.T, dst, src string) {
+       t.Helper()
+       data, err := ioutil.ReadFile(src)
+       if err != nil {
+               t.Fatal(err)
+       }
+       if err := os.MkdirAll(filepath.Dir(dst), 0777); err != nil {
+               t.Fatal(err)
+       }
+       if err := ioutil.WriteFile(dst, data, 0666); err != nil {
+               t.Fatal(err)
+       }
+}
index a91ee7702c5c982dafc810e8d13044f72cc8915e..58bab5cb2f8273ca345cd5c57c7e192b1be38a35 100644 (file)
@@ -308,7 +308,7 @@ func (b *Builder) build(a *Action) (err error) {
                        // Need to look for install header actions depending on this action,
                        // or depending on a link that depends on this action.
                        needHeader := false
-                       if (a.Package.UsesCgo() || a.Package.UsesSwig()) && (cfg.BuildBuildmode == "c-archive" || cfg.BuildBuildmode == "c-header") {
+                       if (a.Package.UsesCgo() || a.Package.UsesSwig()) && (cfg.BuildBuildmode == "c-archive" || cfg.BuildBuildmode == "c-shared") {
                                for _, t1 := range a.triggers {
                                        if t1.Mode == "install header" {
                                                needHeader = true