blob: 83139fdebc42defd2716909eaf3a0e273d5a8e12 [file] [log] [blame]
Jamie Gennis1bc967e2014-05-27 16:34:41 -07001package blueprint
2
3import (
4 "fmt"
5 "path/filepath"
6)
7
8type Singleton interface {
9 GenerateBuildActions(SingletonContext)
10}
11
12type SingletonContext interface {
Jamie Gennis6eb4d242014-06-11 18:31:16 -070013 Config() interface{}
Jamie Gennis1bc967e2014-05-27 16:34:41 -070014
15 ModuleName(module Module) string
16 ModuleDir(module Module) string
17 BlueprintFile(module Module) string
18
19 ModuleErrorf(module Module, format string, args ...interface{})
20 Errorf(format string, args ...interface{})
21
Jamie Gennis2fb20952014-10-03 02:49:58 -070022 Variable(pctx *PackageContext, name, value string)
23 Rule(pctx *PackageContext, name string, params RuleParams, argNames ...string) Rule
24 Build(pctx *PackageContext, params BuildParams)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070025 RequireNinjaVersion(major, minor, micro int)
26
27 // SetBuildDir sets the value of the top-level "builddir" Ninja variable
28 // that controls where Ninja stores its build log files. This value can be
29 // set at most one time for a single build. Setting it multiple times (even
30 // across different singletons) will result in a panic.
Jamie Gennis2fb20952014-10-03 02:49:58 -070031 SetBuildDir(pctx *PackageContext, value string)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070032
33 VisitAllModules(visit func(Module))
34 VisitAllModulesIf(pred func(Module) bool, visit func(Module))
Jamie Gennise98b8a92014-06-17 10:24:24 -070035 VisitDepsDepthFirst(module Module, visit func(Module))
36 VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
37 visit func(Module))
Mathias Agopian5b8477d2014-06-25 17:21:54 -070038
39 AddNinjaFileDeps(deps ...string)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070040}
41
42var _ SingletonContext = (*singletonContext)(nil)
43
44type singletonContext struct {
45 context *Context
Jamie Gennis6eb4d242014-06-11 18:31:16 -070046 config interface{}
Jamie Gennis1bc967e2014-05-27 16:34:41 -070047 scope *localScope
48
Mathias Agopian5b8477d2014-06-25 17:21:54 -070049 ninjaFileDeps []string
50 errs []error
Jamie Gennis1bc967e2014-05-27 16:34:41 -070051
52 actionDefs localBuildActions
53}
54
Jamie Gennis6eb4d242014-06-11 18:31:16 -070055func (s *singletonContext) Config() interface{} {
Jamie Gennis1bc967e2014-05-27 16:34:41 -070056 return s.config
57}
58
59func (s *singletonContext) ModuleName(module Module) string {
60 info := s.context.moduleInfo[module]
61 return info.properties.Name
62}
63
64func (s *singletonContext) ModuleDir(module Module) string {
65 info := s.context.moduleInfo[module]
Jamie Gennisec701282014-06-12 20:06:31 -070066 return filepath.Dir(info.relBlueprintsFile)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070067}
68
69func (s *singletonContext) BlueprintFile(module Module) string {
70 info := s.context.moduleInfo[module]
Jamie Gennisec701282014-06-12 20:06:31 -070071 return info.relBlueprintsFile
Jamie Gennis1bc967e2014-05-27 16:34:41 -070072}
73
74func (s *singletonContext) ModuleErrorf(module Module, format string,
75 args ...interface{}) {
76
77 info := s.context.moduleInfo[module]
78 s.errs = append(s.errs, &Error{
79 Err: fmt.Errorf(format, args...),
80 Pos: info.pos,
81 })
82}
83
84func (s *singletonContext) Errorf(format string, args ...interface{}) {
85 // TODO: Make this not result in the error being printed as "internal error"
86 s.errs = append(s.errs, fmt.Errorf(format, args...))
87}
88
Jamie Gennis2fb20952014-10-03 02:49:58 -070089func (s *singletonContext) Variable(pctx *PackageContext, name, value string) {
90 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -070091
Jamie Gennis1bc967e2014-05-27 16:34:41 -070092 v, err := s.scope.AddLocalVariable(name, value)
93 if err != nil {
94 panic(err)
95 }
96
97 s.actionDefs.variables = append(s.actionDefs.variables, v)
98}
99
Jamie Gennis2fb20952014-10-03 02:49:58 -0700100func (s *singletonContext) Rule(pctx *PackageContext, name string,
101 params RuleParams, argNames ...string) Rule {
Jamie Genniscbc6f862014-06-05 20:00:22 -0700102
Jamie Gennis2fb20952014-10-03 02:49:58 -0700103 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -0700104
Jamie Genniscbc6f862014-06-05 20:00:22 -0700105 r, err := s.scope.AddLocalRule(name, &params, argNames...)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700106 if err != nil {
107 panic(err)
108 }
109
110 s.actionDefs.rules = append(s.actionDefs.rules, r)
111
112 return r
113}
114
Jamie Gennis2fb20952014-10-03 02:49:58 -0700115func (s *singletonContext) Build(pctx *PackageContext, params BuildParams) {
116 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -0700117
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700118 def, err := parseBuildParams(s.scope, &params)
119 if err != nil {
120 panic(err)
121 }
122
123 s.actionDefs.buildDefs = append(s.actionDefs.buildDefs, def)
124}
125
126func (s *singletonContext) RequireNinjaVersion(major, minor, micro int) {
127 s.context.requireNinjaVersion(major, minor, micro)
128}
129
Jamie Gennis2fb20952014-10-03 02:49:58 -0700130func (s *singletonContext) SetBuildDir(pctx *PackageContext, value string) {
131 s.scope.ReparentTo(pctx)
Jamie Gennis7d5b2f82014-09-24 17:51:52 -0700132
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700133 ninjaValue, err := parseNinjaString(s.scope, value)
134 if err != nil {
135 panic(err)
136 }
137
138 s.context.setBuildDir(ninjaValue)
139}
140
141func (s *singletonContext) VisitAllModules(visit func(Module)) {
142 s.context.visitAllModules(visit)
143}
144
145func (s *singletonContext) VisitAllModulesIf(pred func(Module) bool,
146 visit func(Module)) {
147
148 s.context.visitAllModulesIf(pred, visit)
149}
Jamie Gennise98b8a92014-06-17 10:24:24 -0700150
151func (s *singletonContext) VisitDepsDepthFirst(module Module,
152 visit func(Module)) {
153
154 s.context.visitDepsDepthFirst(module, visit)
155}
156
157func (s *singletonContext) VisitDepsDepthFirstIf(module Module,
158 pred func(Module) bool, visit func(Module)) {
159
160 s.context.visitDepsDepthFirstIf(module, pred, visit)
161}
Mathias Agopian5b8477d2014-06-25 17:21:54 -0700162
163func (s *singletonContext) AddNinjaFileDeps(deps ...string) {
164 s.ninjaFileDeps = append(s.ninjaFileDeps, deps...)
165}