]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: add a 'buildmode' condition for script tests
authorBryan C. Mills <bcmills@google.com>
Fri, 22 Nov 2019 18:26:58 +0000 (13:26 -0500)
committerBryan C. Mills <bcmills@google.com>
Fri, 22 Nov 2019 19:03:26 +0000 (19:03 +0000)
In CL 208233 I am fixing a panic that occurs only with a specific
build mode. I want that test to run on all platforms that support that
build mode, but the logic for determining support is somewhat
involved.

For now, I am duplicating that logic into the cmd/internal/sys
package, which already reports platform support for other build flags.

We can refactor cmd/go/internal/work to use the extracted function in
a followup CL.

Updates #35759

Change-Id: Ibbaedde4d1e8f683c650beedd10849bc27e7a6e7
Reviewed-on: https://go-review.googlesource.com/c/go/+/208457
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
src/cmd/go/script_test.go
src/cmd/go/testdata/script/README
src/cmd/internal/sys/supported.go

index 369264da76da07aee6002f467519a08e8bba17f3..ec498bbcd763ef2d5faa4b7f140679c2549e3d6c 100644 (file)
@@ -30,6 +30,7 @@ import (
        "cmd/go/internal/robustio"
        "cmd/go/internal/txtar"
        "cmd/go/internal/work"
+       "cmd/internal/sys"
 )
 
 // TestScript runs the tests in testdata/script/*.txt.
@@ -303,6 +304,11 @@ Script:
                                        }
                                        break
                                }
+                               if strings.HasPrefix(cond.tag, "buildmode:") {
+                                       value := strings.TrimPrefix(cond.tag, "buildmode:")
+                                       ok = sys.BuildModeSupported(runtime.Compiler, value, runtime.GOOS, runtime.GOARCH)
+                                       break
+                               }
                                if !imports.KnownArch[cond.tag] && !imports.KnownOS[cond.tag] && cond.tag != "gc" && cond.tag != "gccgo" {
                                        ts.fatalf("unknown condition %q", cond.tag)
                                }
index 511d7471292070a9cfbaa73309f3cf69447bd16b..2782a097079877fca8eb0bc1bd14af48b5af5cbd 100644 (file)
@@ -79,6 +79,7 @@ should only run when the condition is satisfied. The available conditions are:
    - [symlink] for testenv.HasSymlink()
    - [exec:prog] for whether prog is available for execution (found by exec.LookPath)
    - [GODEBUG:value] for whether value is one of the comma-separated entries in the GODEBUG variable
+   - [buildmode:value] for whether -buildmode=value is supported
 
 A condition can be negated: [!short] means to run the rest of the line
 when testing.Short() is false. Multiple conditions may be given for a single
index 4162858ac1b8bfe3f38f553307858f74cbfe5c33..78aa825a7861957298a01b9ca57b16695df5d573 100644 (file)
@@ -43,3 +43,76 @@ func MustLinkExternal(goos, goarch string) bool {
        }
        return false
 }
+
+// BuildModeSupported reports whether goos/goarch supports the given build mode
+// using the given compiler.
+func BuildModeSupported(compiler, buildmode, goos, goarch string) bool {
+       // This function mirrors the logic in cmd/go/internal/work.buildModeInit.
+       //
+       // TODO(bcmills): Refactor buildModeInit to use this function so that the two
+       // don't get out of sync.
+
+       if compiler == "gccgo" {
+               return true
+       }
+
+       platform := goos + "/" + goarch
+
+       switch buildmode {
+       case "archive":
+               return true
+
+       case "c-archive":
+               // TODO(bcmills): This seems dubious.
+               // Do we really support c-archive mode on js/wasm‽
+               return platform != "linux/ppc64"
+
+       case "c-shared":
+               switch platform {
+               case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/ppc64le", "linux/s390x",
+                       "android/amd64", "android/arm", "android/arm64", "android/386",
+                       "freebsd/amd64",
+                       "darwin/amd64", "darwin/386",
+                       "windows/amd64", "windows/386":
+                       return true
+               }
+               return false
+
+       case "default":
+               return true
+
+       case "exe":
+               return true
+
+       case "pie":
+               switch platform {
+               case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x",
+                       "android/amd64", "android/arm", "android/arm64", "android/386",
+                       "freebsd/amd64",
+                       "darwin/amd64",
+                       "aix/ppc64":
+                       return true
+               }
+               return false
+
+       case "shared":
+               switch platform {
+               case "linux/386", "linux/amd64", "linux/arm", "linux/arm64", "linux/ppc64le", "linux/s390x":
+                       return true
+               }
+               return false
+
+       case "plugin":
+               switch platform {
+               case "linux/amd64", "linux/arm", "linux/arm64", "linux/386", "linux/s390x", "linux/ppc64le",
+                       "android/amd64", "android/arm", "android/arm64", "android/386",
+                       "darwin/amd64",
+                       "freebsd/amd64":
+                       return true
+               }
+               return false
+
+       default:
+               return false
+       }
+}