Source file
src/cmd/dist/main.go
1
2
3
4
5 package main
6
7 import (
8 "flag"
9 "fmt"
10 "os"
11 "runtime"
12 "strings"
13 )
14
15 func usage() {
16 xprintf(`usage: go tool dist [command]
17 Commands are:
18
19 banner print installation banner
20 bootstrap rebuild everything
21 clean deletes all built files
22 env [-p] print environment (-p: include $PATH)
23 install [dir] install individual directory
24 list [-json] list all supported platforms
25 test [-h] run Go test(s)
26 version print Go version
27
28 All commands take -v flags to emit extra information.
29 `)
30 xexit(2)
31 }
32
33
34 var commands = map[string]func(){
35 "banner": cmdbanner,
36 "bootstrap": cmdbootstrap,
37 "clean": cmdclean,
38 "env": cmdenv,
39 "install": cmdinstall,
40 "list": cmdlist,
41 "test": cmdtest,
42 "version": cmdversion,
43 }
44
45
46 func main() {
47 os.Setenv("TERM", "dumb")
48
49
50
51 if len(os.Args) > 1 && os.Args[1] == "-check-armv6k" {
52 useARMv6K()
53 println("ARMv6K supported.")
54 os.Exit(0)
55 }
56
57 gohostos = runtime.GOOS
58 switch gohostos {
59 case "aix":
60
61 gohostarch = "ppc64"
62 case "darwin":
63
64 defaultclang = true
65 case "freebsd":
66
67 defaultclang = true
68 case "openbsd":
69
70 defaultclang = true
71 case "plan9":
72 gohostarch = os.Getenv("objtype")
73 if gohostarch == "" {
74 fatalf("$objtype is unset")
75 }
76 case "solaris", "illumos":
77
78
79
80
81 out := run("", CheckExit, "isainfo", "-n")
82 if strings.Contains(out, "amd64") {
83 gohostarch = "amd64"
84 }
85 if strings.Contains(out, "i386") {
86 gohostarch = "386"
87 }
88 case "windows":
89 exe = ".exe"
90 }
91
92 sysinit()
93
94 if gohostarch == "" {
95
96 out := run("", CheckExit, "uname", "-m")
97 switch {
98 case strings.Contains(out, "x86_64"), strings.Contains(out, "amd64"):
99 gohostarch = "amd64"
100 case strings.Contains(out, "86"):
101 gohostarch = "386"
102 if gohostos == "darwin" {
103
104
105 gohostarch = "amd64"
106 }
107 case strings.Contains(out, "aarch64"), strings.Contains(out, "arm64"):
108 gohostarch = "arm64"
109 case strings.Contains(out, "arm"):
110 gohostarch = "arm"
111 if gohostos == "netbsd" && strings.Contains(run("", CheckExit, "uname", "-p"), "aarch64") {
112 gohostarch = "arm64"
113 }
114 case strings.Contains(out, "ppc64le"):
115 gohostarch = "ppc64le"
116 case strings.Contains(out, "ppc64"):
117 gohostarch = "ppc64"
118 case strings.Contains(out, "mips64"):
119 gohostarch = "mips64"
120 if elfIsLittleEndian(os.Args[0]) {
121 gohostarch = "mips64le"
122 }
123 case strings.Contains(out, "mips"):
124 gohostarch = "mips"
125 if elfIsLittleEndian(os.Args[0]) {
126 gohostarch = "mipsle"
127 }
128 case strings.Contains(out, "riscv64"):
129 gohostarch = "riscv64"
130 case strings.Contains(out, "s390x"):
131 gohostarch = "s390x"
132 case gohostos == "darwin", gohostos == "ios":
133 if strings.Contains(run("", CheckExit, "uname", "-v"), "RELEASE_ARM64_") {
134 gohostarch = "arm64"
135 }
136 case gohostos == "openbsd":
137 if strings.Contains(run("", CheckExit, "uname", "-p"), "mips64") {
138 gohostarch = "mips64"
139 }
140 default:
141 fatalf("unknown architecture: %s", out)
142 }
143 }
144
145 if gohostarch == "arm" || gohostarch == "mips64" || gohostarch == "mips64le" {
146 maxbg = min(maxbg, runtime.NumCPU())
147 }
148 bginit()
149
150 if len(os.Args) > 1 && os.Args[1] == "-check-goarm" {
151 useVFPv1()
152 println("VFPv1 OK.")
153 useVFPv3()
154 println("VFPv3 OK.")
155 os.Exit(0)
156 }
157
158 xinit()
159 xmain()
160 xexit(0)
161 }
162
163
164 func xmain() {
165 if len(os.Args) < 2 {
166 usage()
167 }
168 cmd := os.Args[1]
169 os.Args = os.Args[1:]
170 flag.Usage = func() {
171 fmt.Fprintf(os.Stderr, "usage: go tool dist %s [options]\n", cmd)
172 flag.PrintDefaults()
173 os.Exit(2)
174 }
175 if f, ok := commands[cmd]; ok {
176 f()
177 } else {
178 xprintf("unknown command %s\n", cmd)
179 usage()
180 }
181 }
182
View as plain text