...
Source file src/cmd/go/internal/base/goflags.go
1
2
3
4
5 package base
6
7 import (
8 "flag"
9 "fmt"
10 "runtime"
11 "strings"
12
13 "cmd/go/internal/cfg"
14 )
15
16 var (
17 goflags []string
18 knownFlag = make(map[string]bool)
19 )
20
21
22 func AddKnownFlag(name string) {
23 knownFlag[name] = true
24 }
25
26
27
28
29 func GOFLAGS() []string {
30 InitGOFLAGS()
31 return goflags
32 }
33
34
35
36 func InitGOFLAGS() {
37 if goflags != nil {
38 return
39 }
40
41
42
43
44
45
46
47 var walkFlags func(*Command)
48 walkFlags = func(cmd *Command) {
49 for _, sub := range cmd.Commands {
50 walkFlags(sub)
51 }
52 cmd.Flag.VisitAll(func(f *flag.Flag) {
53 knownFlag[f.Name] = true
54 })
55 }
56 walkFlags(Go)
57
58
59
60
61
62 hideErrors := cfg.CmdName == "env" || cfg.CmdName == "bug"
63
64 goflags = strings.Fields(cfg.Getenv("GOFLAGS"))
65 if goflags == nil {
66 goflags = []string{}
67 }
68
69
70
71
72 for _, f := range goflags {
73
74 if !strings.HasPrefix(f, "-") || f == "-" || f == "--" || strings.HasPrefix(f, "---") || strings.HasPrefix(f, "-=") || strings.HasPrefix(f, "--=") {
75 if hideErrors {
76 continue
77 }
78 Fatalf("go: parsing $GOFLAGS: non-flag %q", f)
79 }
80
81 name := f[1:]
82 if name[0] == '-' {
83 name = name[1:]
84 }
85 if i := strings.Index(name, "="); i >= 0 {
86 name = name[:i]
87 }
88 if !knownFlag[name] {
89 if hideErrors {
90 continue
91 }
92 Fatalf("go: parsing $GOFLAGS: unknown flag -%s", name)
93 }
94 }
95 }
96
97
98
99 type boolFlag interface {
100 flag.Value
101 IsBoolFlag() bool
102 }
103
104
105 func SetFromGOFLAGS(flags flag.FlagSet) {
106 InitGOFLAGS()
107
108
109
110
111
112 where := "$GOFLAGS"
113 if runtime.GOOS == "windows" {
114 where = "%GOFLAGS%"
115 }
116 for _, goflag := range goflags {
117 name, value, hasValue := goflag, "", false
118 if i := strings.Index(goflag, "="); i >= 0 {
119 name, value, hasValue = goflag[:i], goflag[i+1:], true
120 }
121 if strings.HasPrefix(name, "--") {
122 name = name[1:]
123 }
124 f := flags.Lookup(name[1:])
125 if f == nil {
126 continue
127 }
128 if fb, ok := f.Value.(boolFlag); ok && fb.IsBoolFlag() {
129 if hasValue {
130 if err := fb.Set(value); err != nil {
131 fmt.Fprintf(flags.Output(), "go: invalid boolean value %q for flag %s (from %s): %v\n", value, name, where, err)
132 flags.Usage()
133 }
134 } else {
135 if err := fb.Set("true"); err != nil {
136 fmt.Fprintf(flags.Output(), "go: invalid boolean flag %s (from %s): %v\n", name, where, err)
137 flags.Usage()
138 }
139 }
140 } else {
141 if !hasValue {
142 fmt.Fprintf(flags.Output(), "go: flag needs an argument: %s (from %s)\n", name, where)
143 flags.Usage()
144 }
145 if err := f.Value.Set(value); err != nil {
146 fmt.Fprintf(flags.Output(), "go: invalid value %q for flag %s (from %s): %v\n", value, name, where, err)
147 flags.Usage()
148 }
149 }
150 }
151 }
152
View as plain text