]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: add GOEXPERIMENT to `go env` output
authorMatthew Dempsky <mdempsky@google.com>
Wed, 16 Jun 2021 22:10:57 +0000 (15:10 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Mon, 28 Jun 2021 20:51:30 +0000 (20:51 +0000)
This CL adds GOEXPERIMENT to `go env` output, and also makes it
configurable via `GOENV`. Thanks to Baokun Lee's CL 304350 for the
test and initial work on this.

Fixes #45226.

Change-Id: Ie7f92a8a503b6a2a4df3f6598f0b2bf2915e2e7d
Reviewed-on: https://go-review.googlesource.com/c/go/+/328751
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
Trust: Bryan C. Mills <bcmills@google.com>
Trust: Matthew Dempsky <mdempsky@google.com>

src/cmd/go/alldocs.go
src/cmd/go/internal/envcmd/env.go
src/cmd/go/internal/help/helpdoc.go
src/cmd/go/testdata/script/env_exp.txt [new file with mode: 0644]
src/cmd/go/testdata/script/env_unset.txt
src/cmd/go/testdata/script/env_write.txt

index fd95da23eb073773ea0203d6f6743c931683a2a2..90eb3e2a00b56ddc5e878672f7f18f42b9d2cbf4 100644 (file)
 //     GCCGOTOOLDIR
 //             If set, where to find gccgo tools, such as cgo.
 //             The default is based on how gccgo was configured.
+//     GOEXPERIMENT
+//             Comma-separated list of toolchain experiments to enable or disable.
+//             The list of available experiments may change arbitrarily over time.
+//             See src/internal/goexperiment/flags.go for currently valid values.
+//             Warning: This variable is provided for the development and testing
+//             of the Go toolchain itself. Use beyond that purpose is unsupported.
 //     GOROOT_FINAL
 //             The root of the installed Go tree, when it is
 //             installed in a location other than where it is built.
index d88dcce5c0a374b7c715f870d689bde0a51cae96..1553d263914541f05a639e03b8041969ba244301 100644 (file)
@@ -73,6 +73,7 @@ func MkEnv() []cfg.EnvVar {
                {Name: "GOCACHE", Value: cache.DefaultDir()},
                {Name: "GOENV", Value: envFile},
                {Name: "GOEXE", Value: cfg.ExeSuffix},
+               {Name: "GOEXPERIMENT", Value: buildcfg.GOEXPERIMENT()},
                {Name: "GOFLAGS", Value: cfg.Getenv("GOFLAGS")},
                {Name: "GOHOSTARCH", Value: runtime.GOARCH},
                {Name: "GOHOSTOS", Value: runtime.GOOS},
@@ -364,6 +365,13 @@ func checkBuildConfig(add map[string]string, del map[string]bool) error {
                }
        }
 
+       goexperiment, okGOEXPERIMENT := get("GOEXPERIMENT", buildcfg.GOEXPERIMENT(), "")
+       if okGOEXPERIMENT {
+               if _, _, err := buildcfg.ParseGOEXPERIMENT(goos, goarch, goexperiment); err != nil {
+                       return err
+               }
+       }
+
        return nil
 }
 
index b552777e3e015ae7a2c9e7340605c7b8f515ffd5..490ff1fb7cf05bd5a7e107c1ea40bb44174cc0db 100644 (file)
@@ -610,6 +610,12 @@ Special-purpose environment variables:
        GCCGOTOOLDIR
                If set, where to find gccgo tools, such as cgo.
                The default is based on how gccgo was configured.
+       GOEXPERIMENT
+               Comma-separated list of toolchain experiments to enable or disable.
+               The list of available experiments may change arbitrarily over time.
+               See src/internal/goexperiment/flags.go for currently valid values.
+               Warning: This variable is provided for the development and testing
+               of the Go toolchain itself. Use beyond that purpose is unsupported.
        GOROOT_FINAL
                The root of the installed Go tree, when it is
                installed in a location other than where it is built.
diff --git a/src/cmd/go/testdata/script/env_exp.txt b/src/cmd/go/testdata/script/env_exp.txt
new file mode 100644 (file)
index 0000000..681512d
--- /dev/null
@@ -0,0 +1,17 @@
+# Test GOEXPERIMENT variable
+
+# go env shows default empty GOEXPERIMENT
+go env
+stdout GOEXPERIMENT=
+
+# go env shows valid experiments
+env GOEXPERIMENT=fieldtrack,staticlockranking
+go env GOEXPERIMENT
+stdout '.*fieldtrack.*staticlockranking.*'
+go env
+stdout 'GOEXPERIMENT=.*fieldtrack.*staticlockranking.*'
+
+# go env rejects unknown experiments
+env GOEXPERIMENT=bad
+! go env GOEXPERIMENT
+stderr 'unknown GOEXPERIMENT bad'
index 35fbb0a8a207721d2d73a7876df79ec5268286bc..4e0f249509873ed7355470f5bd0a1326defbb1a0 100644 (file)
@@ -4,6 +4,12 @@
 env GOENV=badenv
 env GOOS=
 env GOARCH=
+env GOEXPERIMENT=
+
+! go env
+stderr '^go(\.exe)?: unknown GOEXPERIMENT badexp$'
+
+go env -u GOEXPERIMENT
 
 ! go env
 stderr '^cmd/go: unsupported GOOS/GOARCH pair bados/badarch$'
@@ -21,3 +27,4 @@ go env
 -- badenv --
 GOOS=bados
 GOARCH=badarch
+GOEXPERIMENT=badexp
index 4fa39df10447156b494b244a2074a6feff8632f1..b5e97391679cc52442322e972c7a82fbed0e30bc 100644 (file)
@@ -179,3 +179,9 @@ stderr 'unsupported GOOS/GOARCH.*windows/mips$'
 stderr 'go env -w: GOMODCACHE entry is relative; must be absolute path: "~/test"'
 ! go env -w GOMODCACHE=./test
 stderr 'go env -w: GOMODCACHE entry is relative; must be absolute path: "./test"'
+
+# go env -w checks validity of GOEXPERIMENT
+env GOEXPERIMENT=
+! go env -w GOEXPERIMENT=badexp
+stderr 'unknown GOEXPERIMENT badexp'
+go env -w GOEXPERIMENT=fieldtrack