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