github.com/corona10/go@v0.0.0-20180224231303-7a218942be57/src/cmd/dist/main.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 "flag" 9 "fmt" 10 "os" 11 "runtime" 12 "strconv" 13 "strings" 14 ) 15 16 func usage() { 17 xprintf(`usage: go tool dist [command] 18 Commands are: 19 20 banner print installation banner 21 bootstrap rebuild everything 22 clean deletes all built files 23 env [-p] print environment (-p: include $PATH) 24 install [dir] install individual directory 25 list [-json] list all supported platforms 26 test [-h] run Go test(s) 27 version print Go version 28 29 All commands take -v flags to emit extra information. 30 `) 31 xexit(2) 32 } 33 34 // commands records the available commands. 35 var commands = map[string]func(){ 36 "banner": cmdbanner, 37 "bootstrap": cmdbootstrap, 38 "clean": cmdclean, 39 "env": cmdenv, 40 "install": cmdinstall, 41 "list": cmdlist, 42 "test": cmdtest, 43 "version": cmdversion, 44 } 45 46 // main takes care of OS-specific startup and dispatches to xmain. 47 func main() { 48 os.Setenv("TERM", "dumb") // disable escape codes in clang errors 49 50 // provide -check-armv6k first, before checking for $GOROOT so that 51 // it is possible to run this check without having $GOROOT available. 52 if len(os.Args) > 1 && os.Args[1] == "-check-armv6k" { 53 useARMv6K() // might fail with SIGILL 54 println("ARMv6K supported.") 55 os.Exit(0) 56 } 57 58 gohostos = runtime.GOOS 59 switch gohostos { 60 case "darwin": 61 // Even on 64-bit platform, darwin uname -m prints i386. 62 // We don't support any of the OS X versions that run on 32-bit-only hardware anymore. 63 gohostarch = "amd64" 64 case "freebsd": 65 // Since FreeBSD 10 gcc is no longer part of the base system. 66 defaultclang = true 67 case "solaris": 68 // Even on 64-bit platform, solaris uname -m prints i86pc. 69 out := run("", CheckExit, "isainfo", "-n") 70 if strings.Contains(out, "amd64") { 71 gohostarch = "amd64" 72 } 73 if strings.Contains(out, "i386") { 74 gohostarch = "386" 75 } 76 case "plan9": 77 gohostarch = os.Getenv("objtype") 78 if gohostarch == "" { 79 fatalf("$objtype is unset") 80 } 81 case "windows": 82 exe = ".exe" 83 } 84 85 sysinit() 86 87 if gohostarch == "" { 88 // Default Unix system. 89 out := run("", CheckExit, "uname", "-m") 90 switch { 91 case strings.Contains(out, "x86_64"), strings.Contains(out, "amd64"): 92 gohostarch = "amd64" 93 case strings.Contains(out, "86"): 94 gohostarch = "386" 95 case strings.Contains(out, "arm"): 96 gohostarch = "arm" 97 case strings.Contains(out, "aarch64"): 98 gohostarch = "arm64" 99 case strings.Contains(out, "ppc64le"): 100 gohostarch = "ppc64le" 101 case strings.Contains(out, "ppc64"): 102 gohostarch = "ppc64" 103 case strings.Contains(out, "mips64"): 104 gohostarch = "mips64" 105 if elfIsLittleEndian(os.Args[0]) { 106 gohostarch = "mips64le" 107 } 108 case strings.Contains(out, "mips"): 109 gohostarch = "mips" 110 if elfIsLittleEndian(os.Args[0]) { 111 gohostarch = "mipsle" 112 } 113 case strings.Contains(out, "s390x"): 114 gohostarch = "s390x" 115 case gohostos == "darwin": 116 if strings.Contains(run("", CheckExit, "uname", "-v"), "RELEASE_ARM_") { 117 gohostarch = "arm" 118 } 119 default: 120 fatalf("unknown architecture: %s", out) 121 } 122 } 123 124 if gohostarch == "arm" || gohostarch == "mips64" || gohostarch == "mips64le" { 125 maxbg = min(maxbg, runtime.NumCPU()) 126 } 127 bginit() 128 129 // The OS X 10.6 linker does not support external linking mode. 130 // See golang.org/issue/5130. 131 // 132 // OS X 10.6 does not work with clang either, but OS X 10.9 requires it. 133 // It seems to work with OS X 10.8, so we default to clang for 10.8 and later. 134 // See golang.org/issue/5822. 135 // 136 // Roughly, OS X 10.N shows up as uname release (N+4), 137 // so OS X 10.6 is uname version 10 and OS X 10.8 is uname version 12. 138 if gohostos == "darwin" { 139 rel := run("", CheckExit, "uname", "-r") 140 if i := strings.Index(rel, "."); i >= 0 { 141 rel = rel[:i] 142 } 143 osx, _ := strconv.Atoi(rel) 144 if osx <= 6+4 { 145 goextlinkenabled = "0" 146 } 147 if osx >= 8+4 { 148 defaultclang = true 149 } 150 } 151 152 if len(os.Args) > 1 && os.Args[1] == "-check-goarm" { 153 useVFPv1() // might fail with SIGILL 154 println("VFPv1 OK.") 155 useVFPv3() // might fail with SIGILL 156 println("VFPv3 OK.") 157 os.Exit(0) 158 } 159 160 xinit() 161 xmain() 162 xexit(0) 163 } 164 165 // The OS-specific main calls into the portable code here. 166 func xmain() { 167 if len(os.Args) < 2 { 168 usage() 169 } 170 cmd := os.Args[1] 171 os.Args = os.Args[1:] // for flag parsing during cmd 172 flag.Usage = func() { 173 fmt.Fprintf(os.Stderr, "usage: go tool dist %s [options]\n", cmd) 174 flag.PrintDefaults() 175 os.Exit(2) 176 } 177 if f, ok := commands[cmd]; ok { 178 f() 179 } else { 180 xprintf("unknown command %s\n", cmd) 181 usage() 182 } 183 }