blob: e9820865cbb5d73d21df23cddf5693b7e066f1ad [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
30 BlueprintFile(module Module) string
31
32 ModuleErrorf(module Module, format string, args ...interface{})
33 Errorf(format string, args ...interface{})
34
Jamie Gennis2fb20952014-10-03 02:49:58 -070035 Variable(pctx *PackageContext, name, value string)
36 Rule(pctx *PackageContext, name string, params RuleParams, argNames ...string) Rule
37 Build(pctx *PackageContext, params BuildParams)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070038 RequireNinjaVersion(major, minor, micro int)
39
40 // SetBuildDir sets the value of the top-level "builddir" Ninja variable
41 // that controls where Ninja stores its build log files. This value can be
42 // set at most one time for a single build. Setting it multiple times (even
43 // across different singletons) will result in a panic.
Jamie Gennis2fb20952014-10-03 02:49:58 -070044 SetBuildDir(pctx *PackageContext, value string)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070045
46 VisitAllModules(visit func(Module))
47 VisitAllModulesIf(pred func(Module) bool, visit func(Module))
Jamie Gennise98b8a92014-06-17 10:24:24 -070048 VisitDepsDepthFirst(module Module, visit func(Module))
49 VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
50 visit func(Module))
Mathias Agopian5b8477d2014-06-25 17:21:54 -070051
52 AddNinjaFileDeps(deps ...string)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070053}
54
55var _ SingletonContext = (*singletonContext)(nil)
56
57type singletonContext struct {
58 context *Context
Jamie Gennis6eb4d242014-06-11 18:31:16 -070059 config interface{}
Jamie Gennis1bc967e2014-05-27 16:34:41 -070060 scope *localScope
61
Mathias Agopian5b8477d2014-06-25 17:21:54 -070062 ninjaFileDeps []string
63 errs []error
Jamie Gennis1bc967e2014-05-27 16:34:41 -070064
65 actionDefs localBuildActions
66}
67
Jamie Gennis6eb4d242014-06-11 18:31:16 -070068func (s *singletonContext) Config() interface{} {
Jamie Gennis1bc967e2014-05-27 16:34:41 -070069 return s.config
70}
71
Colin Crossbbfa51a2014-12-17 16:12:41 -080072func (s *singletonContext) ModuleName(logicModule Module) string {
Colin Cross4572edd2015-05-13 14:36:24 -070073 return s.context.ModuleName(logicModule)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070074}
75
Colin Crossbbfa51a2014-12-17 16:12:41 -080076func (s *singletonContext) ModuleDir(logicModule Module) string {
Colin Cross4572edd2015-05-13 14:36:24 -070077 return s.context.ModuleDir(logicModule)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070078}
79
Colin Crossbbfa51a2014-12-17 16:12:41 -080080func (s *singletonContext) BlueprintFile(logicModule Module) string {
Colin Cross4572edd2015-05-13 14:36:24 -070081 return s.context.BlueprintFile(logicModule)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070082}
83
Colin Crossbbfa51a2014-12-17 16:12:41 -080084func (s *singletonContext) ModuleErrorf(logicModule Module, format string,
Jamie Gennis1bc967e2014-05-27 16:34:41 -070085 args ...interface{}) {
86
Colin Cross4572edd2015-05-13 14:36:24 -070087 s.errs = append(s.errs, s.context.ModuleErrorf(logicModule, format, args...))
Jamie Gennis1bc967e2014-05-27 16:34:41 -070088}
89
90func (s *singletonContext) Errorf(format string, args ...interface{}) {
91 // TODO: Make this not result in the error being printed as "internal error"
92 s.errs = append(s.errs, fmt.Errorf(format, args...))
93}
94
Jamie Gennis2fb20952014-10-03 02:49:58 -070095func (s *singletonContext) Variable(pctx *PackageContext, name, value string) {
96 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -070097
Jamie Gennis1bc967e2014-05-27 16:34:41 -070098 v, err := s.scope.AddLocalVariable(name, value)
99 if err != nil {
100 panic(err)
101 }
102
103 s.actionDefs.variables = append(s.actionDefs.variables, v)
104}
105
Jamie Gennis2fb20952014-10-03 02:49:58 -0700106func (s *singletonContext) Rule(pctx *PackageContext, name string,
107 params RuleParams, argNames ...string) Rule {
Jamie Genniscbc6f862014-06-05 20:00:22 -0700108
Jamie Gennis2fb20952014-10-03 02:49:58 -0700109 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -0700110
Jamie Genniscbc6f862014-06-05 20:00:22 -0700111 r, err := s.scope.AddLocalRule(name, &params, argNames...)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700112 if err != nil {
113 panic(err)
114 }
115
116 s.actionDefs.rules = append(s.actionDefs.rules, r)
117
118 return r
119}
120
Jamie Gennis2fb20952014-10-03 02:49:58 -0700121func (s *singletonContext) Build(pctx *PackageContext, params BuildParams) {
122 s.scope.ReparentTo(pctx)
Jamie Gennis0ed63ef2014-06-30 18:07:17 -0700123
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700124 def, err := parseBuildParams(s.scope, &params)
125 if err != nil {
126 panic(err)
127 }
128
129 s.actionDefs.buildDefs = append(s.actionDefs.buildDefs, def)
130}
131
132func (s *singletonContext) RequireNinjaVersion(major, minor, micro int) {
133 s.context.requireNinjaVersion(major, minor, micro)
134}
135
Jamie Gennis2fb20952014-10-03 02:49:58 -0700136func (s *singletonContext) SetBuildDir(pctx *PackageContext, value string) {
137 s.scope.ReparentTo(pctx)
Jamie Gennis7d5b2f82014-09-24 17:51:52 -0700138
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700139 ninjaValue, err := parseNinjaString(s.scope, value)
140 if err != nil {
141 panic(err)
142 }
143
144 s.context.setBuildDir(ninjaValue)
145}
146
147func (s *singletonContext) VisitAllModules(visit func(Module)) {
Colin Cross4572edd2015-05-13 14:36:24 -0700148 s.context.VisitAllModules(visit)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700149}
150
151func (s *singletonContext) VisitAllModulesIf(pred func(Module) bool,
152 visit func(Module)) {
153
Colin Cross4572edd2015-05-13 14:36:24 -0700154 s.context.VisitAllModulesIf(pred, visit)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700155}
Jamie Gennise98b8a92014-06-17 10:24:24 -0700156
157func (s *singletonContext) VisitDepsDepthFirst(module Module,
158 visit func(Module)) {
159
Colin Cross4572edd2015-05-13 14:36:24 -0700160 s.context.VisitDepsDepthFirst(module, visit)
Jamie Gennise98b8a92014-06-17 10:24:24 -0700161}
162
163func (s *singletonContext) VisitDepsDepthFirstIf(module Module,
164 pred func(Module) bool, visit func(Module)) {
165
Colin Cross4572edd2015-05-13 14:36:24 -0700166 s.context.VisitDepsDepthFirstIf(module, pred, visit)
Jamie Gennise98b8a92014-06-17 10:24:24 -0700167}
Mathias Agopian5b8477d2014-06-25 17:21:54 -0700168
169func (s *singletonContext) AddNinjaFileDeps(deps ...string) {
170 s.ninjaFileDeps = append(s.ninjaFileDeps, deps...)
171}