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.
14 var cmdEnv
= &Command
{
16 UsageLine
: "env [var ...]",
17 Short
: "print Go environment information",
19 Env prints Go environment information.
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.
32 func mkEnv() []envVar
{
40 {"GOHOSTARCH", runtime
.GOARCH
},
41 {"GOHOSTOS", runtime
.GOOS
},
43 {"GOPATH", buildContext
.GOPATH
},
44 {"GORACE", os
.Getenv("GORACE")},
46 {"GOTOOLDIR", toolDir
},
48 // disable escape codes in clang errors
53 env
= append(env
, envVar
{"GCCGO", gccgoBin
})
55 env
= append(env
, envVar
{"GCCGO", gccgoName
})
60 env
= append(env
, envVar
{"GOARM", os
.Getenv("GOARM")})
62 env
= append(env
, envVar
{"GO386", os
.Getenv("GO386")})
66 env
= append(env
, envVar
{"CC", cmd
[0]})
67 env
= append(env
, envVar
{"GOGCCFLAGS", strings
.Join(cmd
[3:], " ")})
69 env
= append(env
, envVar
{"CXX", cmd
[0]})
71 if buildContext
.CgoEnabled
{
72 env
= append(env
, envVar
{"CGO_ENABLED", "1"})
74 env
= append(env
, envVar
{"CGO_ENABLED", "0"})
80 func findEnv(env
[]envVar
, name
string) string {
81 for _
, e
:= range env
{
89 // extraEnvVars returns environment variables that should not leak into child processes.
90 func extraEnvVars() []envVar
{
93 cppflags
, cflags
, cxxflags
, fflags
, ldflags
:= b
.cflags(&Package
{})
95 {"PKG_CONFIG", b
.pkgconfigCmd()},
96 {"CGO_CFLAGS", strings
.Join(cflags
, " ")},
97 {"CGO_CPPFLAGS", strings
.Join(cppflags
, " ")},
98 {"CGO_CXXFLAGS", strings
.Join(cxxflags
, " ")},
99 {"CGO_FFLAGS", strings
.Join(fflags
, " ")},
100 {"CGO_LDFLAGS", strings
.Join(ldflags
, " ")},
104 func runEnv(cmd
*Command
, args
[]string) {
106 env
= append(env
, extraEnvVars()...)
108 for _
, name
:= range args
{
109 fmt
.Printf("%s\n", findEnv(env
, name
))
114 for _
, e
:= range env
{
115 if e
.name
!= "TERM" {
116 switch runtime
.GOOS
{
118 fmt
.Printf("%s=\"%s\"\n", e
.name
, e
.value
)
120 if strings
.IndexByte(e
.value
, '\x00') < 0 {
121 fmt
.Printf("%s='%s'\n", e
.name
, strings
.Replace(e
.value
, "'", "''", -1))
123 v
:= strings
.Split(e
.value
, "\x00")
124 fmt
.Printf("%s=(", e
.name
)
125 for x
, s
:= range v
{
134 fmt
.Printf("set %s=%s\n", e
.name
, e
.value
)