This belongs to a series of clean-up changes (see below) for cmd/dist.
This is change (6).
These changes include:
(1) apply minor fixes
(2) restore behavior of branchtag
(3) unleash bootstrap optimization for windows
(4) use standard generated code header
(5) remove trivial variables + functions
(6) move functions for the better
(7) simplify code segments
(8) use bytes.Buffer for code generation
(9) rename variables + functions
(10) remove doc.go
Change-Id: I1c49e3427079194210a6416057100a7e94a37619
Reviewed-on: https://go-review.googlesource.com/61012
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
* command implementations
*/
-func usage() {
- xprintf("usage: go tool dist [command]\n" +
- "Commands are:\n" +
- "\n" +
- "banner print installation banner\n" +
- "bootstrap rebuild everything\n" +
- "clean deletes all built files\n" +
- "env [-p] print environment (-p: include $PATH)\n" +
- "install [dir] install individual directory\n" +
- "list [-json] list all supported platforms\n" +
- "test [-h] run Go test(s)\n" +
- "version print Go version\n" +
- "\n" +
- "All commands take -v flags to emit extra information.\n",
- )
- xexit(2)
-}
-
// The env command prints the default environment.
func cmdenv() {
path := flag.Bool("p", false, "emit updated PATH")
"flag"
"fmt"
"os"
+ "runtime"
"strconv"
+ "strings"
)
+func usage() {
+ xprintf("usage: go tool dist [command]\n" +
+ "Commands are:\n" +
+ "\n" +
+ "banner print installation banner\n" +
+ "bootstrap rebuild everything\n" +
+ "clean deletes all built files\n" +
+ "env [-p] print environment (-p: include $PATH)\n" +
+ "install [dir] install individual directory\n" +
+ "list [-json] list all supported platforms\n" +
+ "test [-h] run Go test(s)\n" +
+ "version print Go version\n" +
+ "\n" +
+ "All commands take -v flags to emit extra information.\n",
+ )
+ xexit(2)
+}
+
// cmdtab records the available commands.
var cmdtab = []struct {
name string
{"version", cmdversion},
}
+// main takes care of OS-specific startup and dispatches to xmain.
+func main() {
+ os.Setenv("TERM", "dumb") // disable escape codes in clang errors
+
+ // provide -check-armv6k first, before checking for $GOROOT so that
+ // it is possible to run this check without having $GOROOT available.
+ if len(os.Args) > 1 && os.Args[1] == "-check-armv6k" {
+ useARMv6K() // might fail with SIGILL
+ println("ARMv6K supported.")
+ os.Exit(0)
+ }
+
+ gohostos = runtime.GOOS
+ switch gohostos {
+ case "darwin":
+ // Even on 64-bit platform, darwin uname -m prints i386.
+ // We don't support any of the OS X versions that run on 32-bit-only hardware anymore.
+ gohostarch = "amd64"
+ case "freebsd":
+ // Since FreeBSD 10 gcc is no longer part of the base system.
+ defaultclang = true
+ case "solaris":
+ // Even on 64-bit platform, solaris uname -m prints i86pc.
+ out := run("", CheckExit, "isainfo", "-n")
+ if strings.Contains(out, "amd64") {
+ gohostarch = "amd64"
+ }
+ if strings.Contains(out, "i386") {
+ gohostarch = "386"
+ }
+ case "plan9":
+ gohostarch = os.Getenv("objtype")
+ if gohostarch == "" {
+ fatal("$objtype is unset")
+ }
+ case "windows":
+ exe = ".exe"
+ }
+
+ sysinit()
+
+ if gohostarch == "" {
+ // Default Unix system.
+ out := run("", CheckExit, "uname", "-m")
+ switch {
+ case strings.Contains(out, "x86_64"), strings.Contains(out, "amd64"):
+ gohostarch = "amd64"
+ case strings.Contains(out, "86"):
+ gohostarch = "386"
+ case strings.Contains(out, "arm"):
+ gohostarch = "arm"
+ case strings.Contains(out, "aarch64"):
+ gohostarch = "arm64"
+ case strings.Contains(out, "ppc64le"):
+ gohostarch = "ppc64le"
+ case strings.Contains(out, "ppc64"):
+ gohostarch = "ppc64"
+ case strings.Contains(out, "mips64"):
+ gohostarch = "mips64"
+ if elfIsLittleEndian(os.Args[0]) {
+ gohostarch = "mips64le"
+ }
+ case strings.Contains(out, "mips"):
+ gohostarch = "mips"
+ if elfIsLittleEndian(os.Args[0]) {
+ gohostarch = "mipsle"
+ }
+ case strings.Contains(out, "s390x"):
+ gohostarch = "s390x"
+ case gohostos == "darwin":
+ if strings.Contains(run("", CheckExit, "uname", "-v"), "RELEASE_ARM_") {
+ gohostarch = "arm"
+ }
+ default:
+ fatal("unknown architecture: %s", out)
+ }
+ }
+
+ if gohostarch == "arm" || gohostarch == "mips64" || gohostarch == "mips64le" {
+ maxbg = min(maxbg, runtime.NumCPU())
+ }
+ bginit()
+
+ // The OS X 10.6 linker does not support external linking mode.
+ // See golang.org/issue/5130.
+ //
+ // OS X 10.6 does not work with clang either, but OS X 10.9 requires it.
+ // It seems to work with OS X 10.8, so we default to clang for 10.8 and later.
+ // See golang.org/issue/5822.
+ //
+ // Roughly, OS X 10.N shows up as uname release (N+4),
+ // so OS X 10.6 is uname version 10 and OS X 10.8 is uname version 12.
+ if gohostos == "darwin" {
+ rel := run("", CheckExit, "uname", "-r")
+ if i := strings.Index(rel, "."); i >= 0 {
+ rel = rel[:i]
+ }
+ osx, _ := strconv.Atoi(rel)
+ if osx <= 6+4 {
+ goextlinkenabled = "0"
+ }
+ if osx >= 8+4 {
+ defaultclang = true
+ }
+ }
+
+ if len(os.Args) > 1 && os.Args[1] == "-check-goarm" {
+ useVFPv1() // might fail with SIGILL
+ println("VFPv1 OK.")
+ useVFPv3() // might fail with SIGILL
+ println("VFPv3 OK.")
+ os.Exit(0)
+ }
+
+ xinit()
+ xmain()
+ xexit(0)
+}
+
// The OS-specific main calls into the portable code here.
func xmain() {
if len(os.Args) < 2 {
return
}
}
-
xprintf("unknown command %s\n", cmd)
usage()
}
-
-func xflagparse(maxargs int) {
- flag.Var((*count)(&vflag), "v", "verbosity")
- flag.Parse()
- if maxargs >= 0 && flag.NArg() > maxargs {
- flag.Usage()
- }
-}
-
-// count is a flag.Value that is like a flag.Bool and a flag.Int.
-// If used as -name, it increments the count, but -name=x sets the count.
-// Used for verbose flag -v.
-type count int
-
-func (c *count) String() string {
- return fmt.Sprint(int(*c))
-}
-
-func (c *count) Set(s string) error {
- switch s {
- case "true":
- *c++
- case "false":
- *c = 0
- default:
- n, err := strconv.Atoi(s)
- if err != nil {
- return fmt.Errorf("invalid count %q", s)
- }
- *c = count(n)
- }
- return nil
-}
-
-func (c *count) IsBoolFlag() bool {
- return true
-}
import (
"bytes"
+ "flag"
"fmt"
"io"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
- "runtime"
"sort"
"strconv"
"strings"
fmt.Fprintf(os.Stderr, format, args...)
}
-// main takes care of OS-specific startup and dispatches to xmain.
-func main() {
- os.Setenv("TERM", "dumb") // disable escape codes in clang errors
-
- // provide -check-armv6k first, before checking for $GOROOT so that
- // it is possible to run this check without having $GOROOT available.
- if len(os.Args) > 1 && os.Args[1] == "-check-armv6k" {
- useARMv6K() // might fail with SIGILL
- println("ARMv6K supported.")
- os.Exit(0)
- }
-
- gohostos = runtime.GOOS
- switch gohostos {
- case "darwin":
- // Even on 64-bit platform, darwin uname -m prints i386.
- // We don't support any of the OS X versions that run on 32-bit-only hardware anymore.
- gohostarch = "amd64"
- case "freebsd":
- // Since FreeBSD 10 gcc is no longer part of the base system.
- defaultclang = true
- case "solaris":
- // Even on 64-bit platform, solaris uname -m prints i86pc.
- out := run("", CheckExit, "isainfo", "-n")
- if strings.Contains(out, "amd64") {
- gohostarch = "amd64"
- }
- if strings.Contains(out, "i386") {
- gohostarch = "386"
- }
- case "plan9":
- gohostarch = os.Getenv("objtype")
- if gohostarch == "" {
- fatal("$objtype is unset")
- }
- case "windows":
- exe = ".exe"
- }
-
- sysinit()
-
- if gohostarch == "" {
- // Default Unix system.
- out := run("", CheckExit, "uname", "-m")
- switch {
- case strings.Contains(out, "x86_64"), strings.Contains(out, "amd64"):
- gohostarch = "amd64"
- case strings.Contains(out, "86"):
- gohostarch = "386"
- case strings.Contains(out, "arm"):
- gohostarch = "arm"
- case strings.Contains(out, "aarch64"):
- gohostarch = "arm64"
- case strings.Contains(out, "ppc64le"):
- gohostarch = "ppc64le"
- case strings.Contains(out, "ppc64"):
- gohostarch = "ppc64"
- case strings.Contains(out, "mips64"):
- gohostarch = "mips64"
- if elfIsLittleEndian(os.Args[0]) {
- gohostarch = "mips64le"
- }
- case strings.Contains(out, "mips"):
- gohostarch = "mips"
- if elfIsLittleEndian(os.Args[0]) {
- gohostarch = "mipsle"
- }
- case strings.Contains(out, "s390x"):
- gohostarch = "s390x"
- case gohostos == "darwin":
- if strings.Contains(run("", CheckExit, "uname", "-v"), "RELEASE_ARM_") {
- gohostarch = "arm"
- }
- default:
- fatal("unknown architecture: %s", out)
- }
- }
-
- if gohostarch == "arm" || gohostarch == "mips64" || gohostarch == "mips64le" {
- maxbg = min(maxbg, runtime.NumCPU())
- }
- bginit()
-
- // The OS X 10.6 linker does not support external linking mode.
- // See golang.org/issue/5130.
- //
- // OS X 10.6 does not work with clang either, but OS X 10.9 requires it.
- // It seems to work with OS X 10.8, so we default to clang for 10.8 and later.
- // See golang.org/issue/5822.
- //
- // Roughly, OS X 10.N shows up as uname release (N+4),
- // so OS X 10.6 is uname version 10 and OS X 10.8 is uname version 12.
- if gohostos == "darwin" {
- rel := run("", CheckExit, "uname", "-r")
- if i := strings.Index(rel, "."); i >= 0 {
- rel = rel[:i]
- }
- osx, _ := strconv.Atoi(rel)
- if osx <= 6+4 {
- goextlinkenabled = "0"
- }
- if osx >= 8+4 {
- defaultclang = true
- }
- }
-
- if len(os.Args) > 1 && os.Args[1] == "-check-goarm" {
- useVFPv1() // might fail with SIGILL
- println("VFPv1 OK.")
- useVFPv3() // might fail with SIGILL
- println("VFPv3 OK.")
- os.Exit(0)
- }
-
- xinit()
- xmain()
- xexit(0)
-}
-
// xsamefile reports whether f1 and f2 are the same file (or dir)
func xsamefile(f1, f2 string) bool {
fi1, err1 := os.Stat(f1)
}
panic("unreachable")
}
+
+// count is a flag.Value that is like a flag.Bool and a flag.Int.
+// If used as -name, it increments the count, but -name=x sets the count.
+// Used for verbose flag -v.
+type count int
+
+func (c *count) String() string {
+ return fmt.Sprint(int(*c))
+}
+
+func (c *count) Set(s string) error {
+ switch s {
+ case "true":
+ *c++
+ case "false":
+ *c = 0
+ default:
+ n, err := strconv.Atoi(s)
+ if err != nil {
+ return fmt.Errorf("invalid count %q", s)
+ }
+ *c = count(n)
+ }
+ return nil
+}
+
+func (c *count) IsBoolFlag() bool {
+ return true
+}
+
+func xflagparse(maxargs int) {
+ flag.Var((*count)(&vflag), "v", "verbosity")
+ flag.Parse()
+ if maxargs >= 0 && flag.NArg() > maxargs {
+ flag.Usage()
+ }
+}