...
Source file src/pkg/cmd/go/internal/load/flag.go
1
2
3
4
5 package load
6
7 import (
8 "cmd/go/internal/base"
9 "cmd/go/internal/str"
10 "fmt"
11 "strings"
12 )
13
14 var (
15 BuildAsmflags PerPackageFlag
16 BuildGcflags PerPackageFlag
17 BuildLdflags PerPackageFlag
18 BuildGccgoflags PerPackageFlag
19 )
20
21
22
23
24 type PerPackageFlag struct {
25 present bool
26 values []ppfValue
27 }
28
29
30 type ppfValue struct {
31 match func(*Package) bool
32 flags []string
33 }
34
35
36 func (f *PerPackageFlag) Set(v string) error {
37 return f.set(v, base.Cwd)
38 }
39
40
41 func (f *PerPackageFlag) set(v, cwd string) error {
42 f.present = true
43 match := func(p *Package) bool { return p.Internal.CmdlinePkg || p.Internal.CmdlineFiles }
44
45 v = strings.TrimSpace(v)
46 if v == "" {
47
48
49 f.values = append(f.values, ppfValue{match, []string{}})
50 return nil
51 }
52 if !strings.HasPrefix(v, "-") {
53 i := strings.Index(v, "=")
54 if i < 0 {
55 return fmt.Errorf("missing =<value> in <pattern>=<value>")
56 }
57 if i == 0 {
58 return fmt.Errorf("missing <pattern> in <pattern>=<value>")
59 }
60 pattern := strings.TrimSpace(v[:i])
61 match = MatchPackage(pattern, cwd)
62 v = v[i+1:]
63 }
64 flags, err := str.SplitQuotedFields(v)
65 if err != nil {
66 return err
67 }
68 if flags == nil {
69 flags = []string{}
70 }
71 f.values = append(f.values, ppfValue{match, flags})
72 return nil
73 }
74
75
76
77 func (f *PerPackageFlag) String() string { return "<PerPackageFlag>" }
78
79
80 func (f *PerPackageFlag) Present() bool {
81 return f.present
82 }
83
84
85 func (f *PerPackageFlag) For(p *Package) []string {
86 flags := []string{}
87 for _, v := range f.values {
88 if v.match(p) {
89 flags = v.flags
90 }
91 }
92 return flags
93 }
94
View as plain text