GOMODCACHE = envOr("GOMODCACHE", gopathDir("pkg/mod"))
// Used in envcmd.MkEnv and build ID computations.
- GOARM = envOr("GOARM", fmt.Sprint(objabi.GOARM))
- GO386 = envOr("GO386", objabi.GO386)
- GOMIPS = envOr("GOMIPS", objabi.GOMIPS)
- GOMIPS64 = envOr("GOMIPS64", objabi.GOMIPS64)
- GOPPC64 = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", objabi.GOPPC64))
- GOWASM = envOr("GOWASM", fmt.Sprint(objabi.GOWASM))
- GOEXPERIMENT = envOr("GOEXPERIMENT", objabi.GOEXPERIMENT)
+ GOARM = envOr("GOARM", fmt.Sprint(objabi.GOARM))
+ GO386 = envOr("GO386", objabi.GO386)
+ GOMIPS = envOr("GOMIPS", objabi.GOMIPS)
+ GOMIPS64 = envOr("GOMIPS64", objabi.GOMIPS64)
+ GOPPC64 = envOr("GOPPC64", fmt.Sprintf("%s%d", "power", objabi.GOPPC64))
+ GOWASM = envOr("GOWASM", fmt.Sprint(objabi.GOWASM))
GOPROXY = envOr("GOPROXY", "https://proxy.golang.org,direct")
GOSUMDB = envOr("GOSUMDB", "sum.golang.org")
import (
"bytes"
- "cmd/go/internal/fsys"
"context"
"encoding/json"
"errors"
"cmd/go/internal/base"
"cmd/go/internal/cache"
"cmd/go/internal/cfg"
+ "cmd/go/internal/fsys"
"cmd/go/internal/load"
"cmd/go/internal/modload"
"cmd/go/internal/str"
"cmd/go/internal/trace"
+ "cmd/internal/objabi"
)
// actionList returns the list of actions in the dag rooted at root
key, val := cfg.GetArchEnv()
fmt.Fprintf(h, "%s=%s\n", key, val)
- if exp := cfg.GOEXPERIMENT; exp != "" {
- fmt.Fprintf(h, "GOEXPERIMENT=%q\n", exp)
+ if objabi.GOEXPERIMENT != "" {
+ fmt.Fprintf(h, "GOEXPERIMENT=%q\n", objabi.GOEXPERIMENT)
}
// TODO(rsc): Convince compiler team not to add more magic environment variables,
key, val := cfg.GetArchEnv()
fmt.Fprintf(h, "%s=%s\n", key, val)
- if exp := cfg.GOEXPERIMENT; exp != "" {
- fmt.Fprintf(h, "GOEXPERIMENT=%q\n", exp)
+ if objabi.GOEXPERIMENT != "" {
+ fmt.Fprintf(h, "GOEXPERIMENT=%q\n", objabi.GOEXPERIMENT)
}
// The linker writes source file paths that say GOROOT_FINAL, but
// build tag with the same name but prefixed by "goexperiment." which can be
// used for compiling alternative files for the experiment. This allows
// changes for the experiment, like extra struct fields in the runtime,
- // without affecting the base non-experiment code at all. [2:] strips the
- // leading "X:" from objabi.Expstring().
- exp := objabi.Expstring()[2:]
- if exp != "none" {
- experiments := strings.Split(exp, ",")
- for _, expt := range experiments {
- cfg.BuildContext.BuildTags = append(cfg.BuildContext.BuildTags, "goexperiment."+expt)
- }
+ // without affecting the base non-experiment code at all.
+ for _, expt := range strings.Split(objabi.GOEXPERIMENT, ",") {
+ cfg.BuildContext.BuildTags = append(cfg.BuildContext.BuildTags, "goexperiment."+expt)
}
}
// to distinguish go1.10.2 with an experiment
// from go1.10.2 without an experiment.
p := Expstring()
- if p == DefaultExpstring() {
+ if p == defaultExpstring {
p = ""
}
sep := ""
var (
defaultGOROOT string // set by linker
- GOROOT = envOr("GOROOT", defaultGOROOT)
- GOARCH = envOr("GOARCH", defaultGOARCH)
- GOOS = envOr("GOOS", defaultGOOS)
- GOEXPERIMENT = envOr("GOEXPERIMENT", defaultGOEXPERIMENT)
- GO386 = envOr("GO386", defaultGO386)
- GOARM = goarm()
- GOMIPS = gomips()
- GOMIPS64 = gomips64()
- GOPPC64 = goppc64()
- GOWASM = gowasm()
- GO_LDSO = defaultGO_LDSO
- Version = version
+ GOROOT = envOr("GOROOT", defaultGOROOT)
+ GOARCH = envOr("GOARCH", defaultGOARCH)
+ GOOS = envOr("GOOS", defaultGOOS)
+ GO386 = envOr("GO386", defaultGO386)
+ GOARM = goarm()
+ GOMIPS = gomips()
+ GOMIPS64 = gomips64()
+ GOPPC64 = goppc64()
+ GOWASM = gowasm()
+ GO_LDSO = defaultGO_LDSO
+ Version = version
+
+ // GOEXPERIMENT is a comma-separated list of enabled
+ // experiments. This is derived from the GOEXPERIMENT
+ // environment variable if set, or the value of GOEXPERIMENT
+ // when make.bash was run if not.
+ GOEXPERIMENT string // Set by package init
)
const (
}
func init() {
- for _, f := range strings.Split(GOEXPERIMENT, ",") {
+ // Capture "default" experiments.
+ defaultExpstring = Expstring()
+
+ goexperiment := envOr("GOEXPERIMENT", defaultGOEXPERIMENT)
+
+ for _, f := range strings.Split(goexperiment, ",") {
if f != "" {
addexp(f)
}
if GOARCH != "amd64" {
Regabi_enabled = 0
}
+
+ // Set GOEXPERIMENT to the parsed and canonicalized set of experiments.
+ GOEXPERIMENT = expList()
}
// Note: must agree with runtime.framepointer_enabled.
// Toolchain experiments.
// These are controlled by the GOEXPERIMENT environment
// variable recorded when the toolchain is built.
-// This list is also known to cmd/gc.
var exper = []struct {
name string
val *int
{"regabi", &Regabi_enabled},
}
-var defaultExpstring = Expstring()
-
-func DefaultExpstring() string {
- return defaultExpstring
-}
+var defaultExpstring string
-func Expstring() string {
- buf := "X"
+// expList returns the list of enabled GOEXPERIMENTS as a
+// commas-separated list.
+func expList() string {
+ buf := ""
for i := range exper {
if *exper[i].val != 0 {
buf += "," + exper[i].name
}
}
- if buf == "X" {
- buf += ",none"
+ if len(buf) == 0 {
+ return ""
+ }
+ return buf[1:]
+}
+
+// Expstring returns the GOEXPERIMENT string that should appear in Go
+// version signatures. This always starts with "X:".
+func Expstring() string {
+ list := expList()
+ if list == "" {
+ return "X:none"
}
- return "X:" + buf[2:]
+ return "X:" + list
}