github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/src/cmd/go/env.go (about)

     1  // Copyright 2012 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package main
     6  
     7  import (
     8  	"fmt"
     9  	"os"
    10  	"runtime"
    11  	"strings"
    12  )
    13  
    14  var cmdEnv = &Command{
    15  	Run:       runEnv,
    16  	UsageLine: "env [var ...]",
    17  	Short:     "print Go environment information",
    18  	Long: `
    19  Env prints Go environment information.
    20  
    21  By default env prints information as a shell script
    22  (on Windows, a batch file).  If one or more variable
    23  names is given as arguments,  env prints the value of
    24  each named variable on its own line.
    25  	`,
    26  }
    27  
    28  type envVar struct {
    29  	name, value string
    30  }
    31  
    32  func mkEnv() []envVar {
    33  	var b builder
    34  	b.init()
    35  
    36  	env := []envVar{
    37  		{"GOARCH", goarch},
    38  		{"GOBIN", gobin},
    39  		{"GOEXE", exeSuffix},
    40  		{"GOHOSTARCH", runtime.GOARCH},
    41  		{"GOHOSTOS", runtime.GOOS},
    42  		{"GOOS", goos},
    43  		{"GOPATH", os.Getenv("GOPATH")},
    44  		{"GORACE", os.Getenv("GORACE")},
    45  		{"GOROOT", goroot},
    46  		{"GOTOOLDIR", toolDir},
    47  
    48  		// disable escape codes in clang errors
    49  		{"TERM", "dumb"},
    50  	}
    51  
    52  	if gccgoBin != "" {
    53  		env = append(env, envVar{"GCCGO", gccgoBin})
    54  	} else {
    55  		env = append(env, envVar{"GCCGO", gccgoName})
    56  	}
    57  
    58  	switch goarch {
    59  	case "arm":
    60  		env = append(env, envVar{"GOARM", os.Getenv("GOARM")})
    61  	case "386":
    62  		env = append(env, envVar{"GO386", os.Getenv("GO386")})
    63  	}
    64  
    65  	if goos != "plan9" {
    66  		cmd := b.gccCmd(".")
    67  		env = append(env, envVar{"CC", cmd[0]})
    68  		env = append(env, envVar{"GOGCCFLAGS", strings.Join(cmd[3:], " ")})
    69  		cmd = b.gxxCmd(".")
    70  		env = append(env, envVar{"CXX", cmd[0]})
    71  	}
    72  
    73  	if buildContext.CgoEnabled {
    74  		env = append(env, envVar{"CGO_ENABLED", "1"})
    75  	} else {
    76  		env = append(env, envVar{"CGO_ENABLED", "0"})
    77  	}
    78  
    79  	return env
    80  }
    81  
    82  func findEnv(env []envVar, name string) string {
    83  	for _, e := range env {
    84  		if e.name == name {
    85  			return e.value
    86  		}
    87  	}
    88  	return ""
    89  }
    90  
    91  // extraEnvVars returns environment variables that should not leak into child processes.
    92  func extraEnvVars() []envVar {
    93  	var b builder
    94  	b.init()
    95  	cppflags, cflags, cxxflags, fflags, ldflags := b.cflags(&Package{})
    96  	return []envVar{
    97  		{"PKG_CONFIG", b.pkgconfigCmd()},
    98  		{"CGO_CFLAGS", strings.Join(cflags, " ")},
    99  		{"CGO_CPPFLAGS", strings.Join(cppflags, " ")},
   100  		{"CGO_CXXFLAGS", strings.Join(cxxflags, " ")},
   101  		{"CGO_FFLAGS", strings.Join(fflags, " ")},
   102  		{"CGO_LDFLAGS", strings.Join(ldflags, " ")},
   103  	}
   104  }
   105  
   106  func runEnv(cmd *Command, args []string) {
   107  	env := mkEnv()
   108  	env = append(env, extraEnvVars()...)
   109  	if len(args) > 0 {
   110  		for _, name := range args {
   111  			fmt.Printf("%s\n", findEnv(env, name))
   112  		}
   113  		return
   114  	}
   115  
   116  	for _, e := range env {
   117  		if e.name != "TERM" {
   118  			switch runtime.GOOS {
   119  			default:
   120  				fmt.Printf("%s=\"%s\"\n", e.name, e.value)
   121  			case "plan9":
   122  				if strings.IndexByte(e.value, '\x00') < 0 {
   123  					fmt.Printf("%s='%s'\n", e.name, strings.Replace(e.value, "'", "''", -1))
   124  				} else {
   125  					v := strings.Split(e.value, "\x00")
   126  					fmt.Printf("%s=(", e.name)
   127  					for x, s := range v {
   128  						if x > 0 {
   129  							fmt.Printf(" ")
   130  						}
   131  						fmt.Printf("%s", s)
   132  					}
   133  					fmt.Printf(")\n")
   134  				}
   135  			case "windows":
   136  				fmt.Printf("set %s=%s\n", e.name, e.value)
   137  			}
   138  		}
   139  	}
   140  }