From: Russ Cox Date: Thu, 8 Mar 2012 19:28:44 +0000 (-0500) Subject: cmd/go: add env command, use to fix misc/cgo/testso X-Git-Tag: weekly.2012-03-13~76 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=2c46569f57fd575e2acceabdbd40a187e66cd71e;p=gostls13.git cmd/go: add env command, use to fix misc/cgo/testso Fixes 386 build on 64-bit machines. R=golang-dev, bradfitz, minux.ma CC=golang-dev https://golang.org/cl/5785053 --- diff --git a/misc/cgo/testso/test.bash b/misc/cgo/testso/test.bash index 119fd64827..ecef873c8d 100755 --- a/misc/cgo/testso/test.bash +++ b/misc/cgo/testso/test.bash @@ -4,7 +4,7 @@ # license that can be found in the LICENSE file. set -e -gcc -fPIC -g -shared -o libcgosotest.so cgoso_c.c +gcc $(go env GOGCCFLAGS) -shared -o libcgosotest.so cgoso_c.c go build main.go LD_LIBRARY_PATH=. ./main rm -f libcgosotest.so main diff --git a/src/cmd/go/doc.go b/src/cmd/go/doc.go index 8df57ff38e..80938087d0 100644 --- a/src/cmd/go/doc.go +++ b/src/cmd/go/doc.go @@ -14,6 +14,7 @@ The commands are: build compile packages and dependencies clean remove object files doc run godoc on package sources + env print Go environment information fix run go tool fix on packages fmt run gofmt on package sources get download and install packages and dependencies @@ -76,6 +77,8 @@ The build flags are shared by the build, install, run, and test commands: -x print the commands. + -compiler name + name of compiler to use, as in runtime.Compiler (gccgo or gc) -gccgoflags 'arg list' arguments to pass on each gccgo compiler/linker invocation -gcflags 'arg list' @@ -153,6 +156,20 @@ To run godoc with specific options, run godoc itself. See also: go fix, go fmt, go vet. +Print Go environment information + +Usage: + + go env [var ...] + +Env prints Go environment information. + +By default env prints information as a shell script +(on Windows, a batch file). If one or more variable +names is given as arguments, env prints the value of +each named variable on its own line. + + Run go tool fix on packages Usage: @@ -253,21 +270,28 @@ is equivalent to -f '{{.ImportPath}}'. The struct being passed to the template is: type Package struct { + Dir string // directory containing package sources + ImportPath string // import path of package in dir Name string // package name Doc string // package documentation string - ImportPath string // import path of package in dir - Dir string // directory containing package sources - Version string // version of installed package (TODO) + Target string // install path + Goroot bool // is this package in the Go root? + Standard bool // is this package part of the standard Go library? Stale bool // would 'go install' do anything for this package? + Root string // Go root or Go path dir containing this package // Source files - GoFiles []string // .go source files (excluding CgoFiles, TestGoFiles, and XTestGoFiles) - TestGoFiles []string // _test.go source files internal to the package they are testing - XTestGoFiles []string // _test.go source files external to the package they are testing - CFiles []string // .c source files - HFiles []string // .h source files - SFiles []string // .s source files - CgoFiles []string // .go sources files that import "C" + GoFiles []string // .go source files (excluding CgoFiles, TestGoFiles, XTestGoFiles) + CgoFiles []string // .go sources files that import "C" + CFiles []string // .c source files + HFiles []string // .h source files + SFiles []string // .s source files + SysoFiles []string // .syso object files to add to archive + + // Cgo directives + CgoCFLAGS []string // cgo: flags for C compiler + CgoLDFLAGS []string // cgo: flags for linker + CgoPkgConfig []string // cgo: pkg-config names // Dependency information Imports []string // import paths used by this package @@ -275,8 +299,13 @@ being passed to the template is: // Error information Incomplete bool // this package or a dependency has an error - Error *PackageError // error loading package + Error *PackageError // error loading package DepsErrors []*PackageError // errors loading dependencies + + TestGoFiles []string // _test.go files in package + TestImports []string // imports from TestGoFiles + XTestGoFiles []string // _test.go files outside package + XTestImports []string // imports from XTestGoFiles } The -json flag causes the package data to be printed in JSON format diff --git a/src/cmd/go/env.go b/src/cmd/go/env.go new file mode 100644 index 0000000000..804dc8e63f --- /dev/null +++ b/src/cmd/go/env.go @@ -0,0 +1,83 @@ +// Copyright 2012 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 main + +import ( + "fmt" + "runtime" + "strings" +) + +var cmdEnv = &Command{ + Run: runEnv, + UsageLine: "env [var ...]", + Short: "print Go environment information", + Long: ` +Env prints Go environment information. + +By default env prints information as a shell script +(on Windows, a batch file). If one or more variable +names is given as arguments, env prints the value of +each named variable on its own line. + `, +} + +type envVar struct { + name, value string +} + +func mkEnv() []envVar { + var b builder + b.init() + + env := []envVar{ + {"GOROOT", goroot}, + {"GOBIN", gobin}, + {"GOARCH", goarch}, + {"GOCHAR", archChar}, + {"GOOS", goos}, + {"GOEXE", exeSuffix}, + {"GOHOSTARCH", runtime.GOARCH}, + {"GOHOSTOS", runtime.GOOS}, + {"GOTOOLDIR", toolDir}, + {"GOGCCFLAGS", strings.Join(b.gccCmd(".")[3:], " ")}, + } + + return env +} + +func findEnv(env []envVar, name string) string { + for _, e := range env { + if e.name == name { + return e.value + } + } + return "" +} + +func runEnv(cmd *Command, args []string) { + env := mkEnv() + if len(args) > 0 { + for _, name := range args { + fmt.Printf("%s\n", findEnv(env, name)) + } + return + } + + switch runtime.GOOS { + default: + for _, e := range env { + fmt.Printf("%s=\"%s\"\n", e.name, e.value) + } + case "plan9": + for _, e := range env { + fmt.Printf("%s='%s'\n", e.name, strings.Replace(e.value, "'", "''", -1)) + } + case "windows": + for _, e := range env { + fmt.Printf("set %s=%s\n", e.name, e.value) + } + } +} diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go index 3a0f7a089d..2cc23d9bd3 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -76,6 +76,7 @@ var commands = []*Command{ cmdBuild, cmdClean, cmdDoc, + cmdEnv, cmdFix, cmdFmt, cmdGet,