// Copyright 2021 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package buildcfg provides access to the build configuration // described by the current environment. It is for use by build tools // such as cmd/go or cmd/compile and for setting up go/build's Default context. // // Note that it does NOT provide access to the build configuration used to // build the currently-running binary. For that, use runtime.GOOS etc // as well as internal/goexperiment. package buildcfg import ( "fmt" "os" "path/filepath" "strings" ) var ( defaultGOROOT string // set by linker 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 ) // Error is one of the errors found (if any) in the build configuration. var Error error // Check exits the program with a fatal error if Error is non-nil. func Check() { if Error != nil { fmt.Fprintf(os.Stderr, "%s: %v\n", filepath.Base(os.Args[0]), Error) os.Exit(2) } } func envOr(key, value string) string { if x := os.Getenv(key); x != "" { return x } return value } func goarm() int { def := defaultGOARM if GOOS == "android" && GOARCH == "arm" { // Android arm devices always support GOARM=7. def = "7" } switch v := envOr("GOARM", def); v { case "5": return 5 case "6": return 6 case "7": return 7 } Error = fmt.Errorf("invalid GOARM: must be 5, 6, 7") return int(def[0] - '0') } func gomips() string { switch v := envOr("GOMIPS", defaultGOMIPS); v { case "hardfloat", "softfloat": return v } Error = fmt.Errorf("invalid GOMIPS: must be hardfloat, softfloat") return defaultGOMIPS } func gomips64() string { switch v := envOr("GOMIPS64", defaultGOMIPS64); v { case "hardfloat", "softfloat": return v } Error = fmt.Errorf("invalid GOMIPS64: must be hardfloat, softfloat") return defaultGOMIPS64 } func goppc64() int { switch v := envOr("GOPPC64", defaultGOPPC64); v { case "power8": return 8 case "power9": return 9 } Error = fmt.Errorf("invalid GOPPC64: must be power8, power9") return int(defaultGOPPC64[len("power")] - '0') } type gowasmFeatures struct { SignExt bool SatConv bool } func (f gowasmFeatures) String() string { var flags []string if f.SatConv { flags = append(flags, "satconv") } if f.SignExt { flags = append(flags, "signext") } return strings.Join(flags, ",") } func gowasm() (f gowasmFeatures) { for _, opt := range strings.Split(envOr("GOWASM", ""), ",") { switch opt { case "satconv": f.SatConv = true case "signext": f.SignExt = true case "": // ignore default: Error = fmt.Errorf("invalid GOWASM: no such feature %q", opt) } } return } func Getgoextlinkenabled() string { return envOr("GO_EXTLINK_ENABLED", defaultGO_EXTLINK_ENABLED) }