blob: 07e510801e95cea7e291ea0c26efea0daebbde36 [file] [log] [blame]
Colin Cross8e0c5112015-01-23 14:15:10 -08001// Copyright 2014 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
Jamie Gennis1bc967e2014-05-27 16:34:41 -070015package blueprint
16
17import (
18 "fmt"
Jamie Gennis1bc967e2014-05-27 16:34:41 -070019)
20
21type Singleton interface {
22 GenerateBuildActions(SingletonContext)
23}
24
25type SingletonContext interface {
Jamie Gennis6eb4d242014-06-11 18:31:16 -070026 Config() interface{}
Jamie Gennis1bc967e2014-05-27 16:34:41 -070027
28 ModuleName(module Module) string
29 ModuleDir(module Module) string
Colin Cross8c602f72015-12-17 18:02:11 -080030 ModuleSubDir(module Module) string
Jamie Gennis1bc967e2014-05-27 16:34:41 -070031 BlueprintFile(module Module) string
32
33 ModuleErrorf(module Module, format string, args ...interface{})
34 Errorf(format string, args ...interface{})
Dan Willemsen265d92c2015-12-09 18:06:23 -080035 Failed() bool
Jamie Gennis1bc967e2014-05-27 16:34:41 -070036
Dan Willemsenaeffbf72015-11-25 15:29:32 -080037 Variable(pctx PackageContext, name, value string)
38 Rule(pctx PackageContext, name string, params RuleParams, argNames ...string) Rule
39 Build(pctx PackageContext, params BuildParams)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070040 RequireNinjaVersion(major, minor, micro int)
41
Colin Crossa2599452015-11-18 16:01:01 -080042 // SetNinjaBuildDir sets the value of the top-level "builddir" Ninja variable
Jamie Gennis1bc967e2014-05-27 16:34:41 -070043 // that controls where Ninja stores its build log files. This value can be
Colin Crossa2599452015-11-18 16:01:01 -080044 // set at most one time for a single build, later calls are ignored.
Dan Willemsenaeffbf72015-11-25 15:29:32 -080045 SetNinjaBuildDir(pctx PackageContext, value string)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070046
47 VisitAllModules(visit func(Module))
48 VisitAllModulesIf(pred func(Module) bool, visit func(Module))
Jamie Gennise98b8a92014-06-17 10:24:24 -070049 VisitDepsDepthFirst(module Module, visit func(Module))
50 VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
51 visit func(Module))
Mathias Agopian5b8477d2014-06-25 17:21:54 -070052
Colin Cross24ad5872015-11-17 16:22:29 -080053 VisitAllModuleVariants(module Module, visit func(Module))
54
55 PrimaryModule(module Module) Module
56 FinalModule(module Module) Module
57
Mathias Agopian5b8477d2014-06-25 17:21:54 -070058 AddNinjaFileDeps(deps ...string)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070059}
60
61var _ SingletonContext = (*singletonContext)(nil)
62
63type singletonContext struct {
64 context *Context
Jamie Gennis6eb4d242014-06-11 18:31:16 -070065 config interface{}
Jamie Gennis1bc967e2014-05-27 16:34:41 -070066 scope *localScope
67
Mathias Agopian5b8477d2014-06-25 17:21:54 -070068 ninjaFileDeps []string
69 errs []error
Jamie Gennis1bc967e2014-05-27 16:34:41 -070070
71 actionDefs localBuildActions
72}
73
Jamie Gennis6eb4d242014-06-11 18:31:16 -070074func (s *singletonContext) Config() interface{} {
Jamie Gennis1bc967e2014-05-27 16:34:41 -070075 return s.config
76}
77
Colin Crossbbfa51a2014-12-17 16:12:41 -080078func (s *singletonContext) ModuleName(logicModule Module) string {
Colin Cross4572edd2015-05-13 14:36:24 -070079 return s.context.ModuleName(logicModule)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070080}
81
Colin Crossbbfa51a2014-12-17 16:12:41 -080082func (s *singletonContext) ModuleDir(logicModule Module) string {
Colin Cross4572edd2015-05-13 14:36:24 -070083 return s.context.ModuleDir(logicModule)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070084}
85
Colin Cross8c602f72015-12-17 18:02:11 -080086func (s *singletonContext) ModuleSubDir(logicModule Module) string {
87 return s.context.ModuleSubDir(logicModule)
88}
89
Colin Crossbbfa51a2014-12-17 16:12:41 -080090func (s *singletonContext) BlueprintFile(logicModule Module) string {
Colin Cross4572edd2015-05-13 14:36:24 -070091 return s.context.BlueprintFile(logicModule)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070092}
93
Colin Crossbbfa51a2014-12-17 16:12:41 -080094func (s *singletonContext) ModuleErrorf(logicModule Module, format string,
Jamie Gennis1bc967e2014-05-27 16:34:41 -070095 args ...interface{}) {
96
Colin Cross4572edd2015-05-13 14:36:24 -070097 s.errs = append(s.errs, s.context.ModuleErrorf(logicModule, format, args...))
Jamie Gennis1bc967e2014-05-27 16:34:41 -070098}
99
100func (s *singletonContext) Errorf(format string, args ...interface{}) {
101 // TODO: Make this not result in the error being printed as "internal error"
102 s.errs = append(s.errs, fmt.Errorf(format, args...))
103}
104
Dan Willemsen265d92c2015-12-09 18:06:23 -0800105func (s *singletonContext) Failed() bool {
106 return len(s.errs) > 0
107}
108
Dan Willemsenaeffbf72015-11-25 15:29:32 -0800109func (s *singletonContext) Variable(pctx PackageContext, name, value string) {
Jamie Gennis2fb20952014-10-03 02:49:58 -0700110 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -0700111
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700112 v, err := s.scope.AddLocalVariable(name, value)
113 if err != nil {
114 panic(err)
115 }
116
117 s.actionDefs.variables = append(s.actionDefs.variables, v)
118}
119
Dan Willemsenaeffbf72015-11-25 15:29:32 -0800120func (s *singletonContext) Rule(pctx PackageContext, name string,
Jamie Gennis2fb20952014-10-03 02:49:58 -0700121 params RuleParams, argNames ...string) Rule {
Jamie Genniscbc6f862014-06-05 20:00:22 -0700122
Jamie Gennis2fb20952014-10-03 02:49:58 -0700123 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -0700124
Jamie Genniscbc6f862014-06-05 20:00:22 -0700125 r, err := s.scope.AddLocalRule(name, &params, argNames...)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700126 if err != nil {
127 panic(err)
128 }
129
130 s.actionDefs.rules = append(s.actionDefs.rules, r)
131
132 return r
133}
134
Dan Willemsenaeffbf72015-11-25 15:29:32 -0800135func (s *singletonContext) Build(pctx PackageContext, params BuildParams) {
Jamie Gennis2fb20952014-10-03 02:49:58 -0700136 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -0700137
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700138 def, err := parseBuildParams(s.scope, &params)
139 if err != nil {
140 panic(err)
141 }
142
143 s.actionDefs.buildDefs = append(s.actionDefs.buildDefs, def)
144}
145
146func (s *singletonContext) RequireNinjaVersion(major, minor, micro int) {
147 s.context.requireNinjaVersion(major, minor, micro)
148}
149
Dan Willemsenaeffbf72015-11-25 15:29:32 -0800150func (s *singletonContext) SetNinjaBuildDir(pctx PackageContext, value string) {
Jamie Gennis2fb20952014-10-03 02:49:58 -0700151 s.scope.ReparentTo(pctx)
Jamie Gennis7d5b2f82014-09-24 17:51:52 -0700152
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700153 ninjaValue, err := parseNinjaString(s.scope, value)
154 if err != nil {
155 panic(err)
156 }
157
Colin Crossa2599452015-11-18 16:01:01 -0800158 s.context.setNinjaBuildDir(ninjaValue)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700159}
160
161func (s *singletonContext) VisitAllModules(visit func(Module)) {
Colin Cross4572edd2015-05-13 14:36:24 -0700162 s.context.VisitAllModules(visit)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700163}
164
165func (s *singletonContext) VisitAllModulesIf(pred func(Module) bool,
166 visit func(Module)) {
167
Colin Cross4572edd2015-05-13 14:36:24 -0700168 s.context.VisitAllModulesIf(pred, visit)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700169}
Jamie Gennise98b8a92014-06-17 10:24:24 -0700170
171func (s *singletonContext) VisitDepsDepthFirst(module Module,
172 visit func(Module)) {
173
Colin Cross4572edd2015-05-13 14:36:24 -0700174 s.context.VisitDepsDepthFirst(module, visit)
Jamie Gennise98b8a92014-06-17 10:24:24 -0700175}
176
177func (s *singletonContext) VisitDepsDepthFirstIf(module Module,
178 pred func(Module) bool, visit func(Module)) {
179
Colin Cross4572edd2015-05-13 14:36:24 -0700180 s.context.VisitDepsDepthFirstIf(module, pred, visit)
Jamie Gennise98b8a92014-06-17 10:24:24 -0700181}
Mathias Agopian5b8477d2014-06-25 17:21:54 -0700182
Colin Cross24ad5872015-11-17 16:22:29 -0800183func (s *singletonContext) PrimaryModule(module Module) Module {
184 return s.context.PrimaryModule(module)
185}
186
187func (s *singletonContext) FinalModule(module Module) Module {
188 return s.context.FinalModule(module)
189}
190
191func (s *singletonContext) VisitAllModuleVariants(module Module, visit func(Module)) {
192 s.context.VisitAllModuleVariants(module, visit)
193}
194
Mathias Agopian5b8477d2014-06-25 17:21:54 -0700195func (s *singletonContext) AddNinjaFileDeps(deps ...string) {
196 s.ninjaFileDeps = append(s.ninjaFileDeps, deps...)
197}