blob: 2c51c6c48452da30ca89ba77f74e12c0ec35e69e [file] [log] [blame]
Colin Cross0875c522017-11-28 17:34:01 -08001// Copyright 2017 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
15package android
16
17import (
18 "github.com/google/blueprint"
Colin Cross0875c522017-11-28 17:34:01 -080019)
20
21// SingletonContext
22type SingletonContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -080023 Config() Config
Colin Cross65494b92019-02-07 14:25:51 -080024 DeviceConfig() DeviceConfig
Colin Cross0875c522017-11-28 17:34:01 -080025
26 ModuleName(module blueprint.Module) string
27 ModuleDir(module blueprint.Module) string
28 ModuleSubDir(module blueprint.Module) string
29 ModuleType(module blueprint.Module) string
30 BlueprintFile(module blueprint.Module) string
31
32 ModuleErrorf(module blueprint.Module, format string, args ...interface{})
33 Errorf(format string, args ...interface{})
34 Failed() bool
35
36 Variable(pctx PackageContext, name, value string)
Colin Cross59014392017-12-12 11:05:06 -080037 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Cross0875c522017-11-28 17:34:01 -080038 Build(pctx PackageContext, params BuildParams)
Colin Crossc3d87d32020-06-04 13:25:17 -070039
40 // Phony creates a Make-style phony rule, a rule with no commands that can depend on other
41 // phony rules or real files. Phony can be called on the same name multiple times to add
42 // additional dependencies.
43 Phony(name string, deps ...Path)
44
Colin Cross0875c522017-11-28 17:34:01 -080045 RequireNinjaVersion(major, minor, micro int)
46
47 // SetNinjaBuildDir sets the value of the top-level "builddir" Ninja variable
48 // that controls where Ninja stores its build log files. This value can be
49 // set at most one time for a single build, later calls are ignored.
50 SetNinjaBuildDir(pctx PackageContext, value string)
51
52 // Eval takes a string with embedded ninja variables, and returns a string
53 // with all of the variables recursively expanded. Any variables references
54 // are expanded in the scope of the PackageContext.
55 Eval(pctx PackageContext, ninjaStr string) (string, error)
56
Colin Cross2465c3d2018-09-28 10:19:18 -070057 VisitAllModulesBlueprint(visit func(blueprint.Module))
Colin Cross0875c522017-11-28 17:34:01 -080058 VisitAllModules(visit func(Module))
59 VisitAllModulesIf(pred func(Module) bool, visit func(Module))
Mitch Phillips3a7a31b2019-10-16 15:00:12 -070060
61 VisitDirectDeps(module Module, visit func(Module))
62 VisitDirectDepsIf(module Module, pred func(Module) bool, visit func(Module))
63
Colin Cross6b753602018-06-21 13:03:07 -070064 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Cross0875c522017-11-28 17:34:01 -080065 VisitDepsDepthFirst(module Module, visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -070066 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Cross0875c522017-11-28 17:34:01 -080067 VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
68 visit func(Module))
69
70 VisitAllModuleVariants(module Module, visit func(Module))
71
72 PrimaryModule(module Module) Module
73 FinalModule(module Module) Module
74
75 AddNinjaFileDeps(deps ...string)
76
77 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
78 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
79 // builder whenever a file matching the pattern as added or removed, without rerunning if a
80 // file that does not match the pattern is added to a searched directory.
81 GlobWithDeps(pattern string, excludes []string) ([]string, error)
Colin Cross0875c522017-11-28 17:34:01 -080082}
83
84type singletonAdaptor struct {
85 Singleton
Colin Cross4c83e5c2019-02-25 14:54:28 -080086
87 buildParams []BuildParams
88 ruleParams map[blueprint.Rule]blueprint.RuleParams
Colin Cross0875c522017-11-28 17:34:01 -080089}
90
Colin Cross4c83e5c2019-02-25 14:54:28 -080091var _ testBuildProvider = (*singletonAdaptor)(nil)
92
93func (s *singletonAdaptor) GenerateBuildActions(ctx blueprint.SingletonContext) {
94 sctx := &singletonContextAdaptor{SingletonContext: ctx}
95 if sctx.Config().captureBuild {
96 sctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
97 }
98
99 s.Singleton.GenerateBuildActions(sctx)
100
101 s.buildParams = sctx.buildParams
102 s.ruleParams = sctx.ruleParams
103}
104
105func (s *singletonAdaptor) BuildParamsForTests() []BuildParams {
106 return s.buildParams
107}
108
109func (s *singletonAdaptor) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
110 return s.ruleParams
Colin Cross0875c522017-11-28 17:34:01 -0800111}
112
113type Singleton interface {
114 GenerateBuildActions(SingletonContext)
115}
116
117type singletonContextAdaptor struct {
118 blueprint.SingletonContext
Colin Cross4c83e5c2019-02-25 14:54:28 -0800119
120 buildParams []BuildParams
121 ruleParams map[blueprint.Rule]blueprint.RuleParams
Colin Cross0875c522017-11-28 17:34:01 -0800122}
123
Colin Cross4c83e5c2019-02-25 14:54:28 -0800124func (s *singletonContextAdaptor) Config() Config {
Colin Crossaabf6792017-11-29 00:27:14 -0800125 return s.SingletonContext.Config().(Config)
126}
127
Colin Cross4c83e5c2019-02-25 14:54:28 -0800128func (s *singletonContextAdaptor) DeviceConfig() DeviceConfig {
Colin Cross65494b92019-02-07 14:25:51 -0800129 return DeviceConfig{s.Config().deviceConfig}
130}
131
Colin Cross4c83e5c2019-02-25 14:54:28 -0800132func (s *singletonContextAdaptor) Variable(pctx PackageContext, name, value string) {
Colin Cross0875c522017-11-28 17:34:01 -0800133 s.SingletonContext.Variable(pctx.PackageContext, name, value)
134}
135
Colin Cross4c83e5c2019-02-25 14:54:28 -0800136func (s *singletonContextAdaptor) Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule {
Ramy Medhat944839a2020-03-31 22:14:52 -0400137 if s.Config().UseRemoteBuild() {
138 if params.Pool == nil {
139 // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
140 // jobs to the local parallelism value
141 params.Pool = localPool
142 } else if params.Pool == remotePool {
143 // remotePool is a fake pool used to identify rule that are supported for remoting. If the rule's
144 // pool is the remotePool, replace with nil so that ninja runs it at NINJA_REMOTE_NUM_JOBS
145 // parallelism.
146 params.Pool = nil
147 }
Colin Cross2e2dbc22019-09-25 13:31:46 -0700148 }
Colin Cross4c83e5c2019-02-25 14:54:28 -0800149 rule := s.SingletonContext.Rule(pctx.PackageContext, name, params, argNames...)
150 if s.Config().captureBuild {
151 s.ruleParams[rule] = params
152 }
153 return rule
Colin Cross0875c522017-11-28 17:34:01 -0800154}
155
Colin Cross4c83e5c2019-02-25 14:54:28 -0800156func (s *singletonContextAdaptor) Build(pctx PackageContext, params BuildParams) {
157 if s.Config().captureBuild {
158 s.buildParams = append(s.buildParams, params)
159 }
Colin Cross0875c522017-11-28 17:34:01 -0800160 bparams := convertBuildParams(params)
161 s.SingletonContext.Build(pctx.PackageContext, bparams)
162
163}
164
Colin Crossc3d87d32020-06-04 13:25:17 -0700165func (s *singletonContextAdaptor) Phony(name string, deps ...Path) {
166 addPhony(s.Config(), name, deps...)
167}
168
Colin Cross4c83e5c2019-02-25 14:54:28 -0800169func (s *singletonContextAdaptor) SetNinjaBuildDir(pctx PackageContext, value string) {
Colin Cross0875c522017-11-28 17:34:01 -0800170 s.SingletonContext.SetNinjaBuildDir(pctx.PackageContext, value)
171}
172
Colin Cross4c83e5c2019-02-25 14:54:28 -0800173func (s *singletonContextAdaptor) Eval(pctx PackageContext, ninjaStr string) (string, error) {
Colin Cross0875c522017-11-28 17:34:01 -0800174 return s.SingletonContext.Eval(pctx.PackageContext, ninjaStr)
175}
176
177// visitAdaptor wraps a visit function that takes an android.Module parameter into
178// a function that takes an blueprint.Module parameter and only calls the visit function if the
179// blueprint.Module is an android.Module.
180func visitAdaptor(visit func(Module)) func(blueprint.Module) {
181 return func(module blueprint.Module) {
182 if aModule, ok := module.(Module); ok {
183 visit(aModule)
184 }
185 }
186}
187
188// predAdaptor wraps a pred function that takes an android.Module parameter
189// into a function that takes an blueprint.Module parameter and only calls the visit function if the
190// blueprint.Module is an android.Module, otherwise returns false.
191func predAdaptor(pred func(Module) bool) func(blueprint.Module) bool {
192 return func(module blueprint.Module) bool {
193 if aModule, ok := module.(Module); ok {
194 return pred(aModule)
195 } else {
196 return false
197 }
198 }
199}
200
Colin Cross4c83e5c2019-02-25 14:54:28 -0800201func (s *singletonContextAdaptor) VisitAllModulesBlueprint(visit func(blueprint.Module)) {
Colin Cross2465c3d2018-09-28 10:19:18 -0700202 s.SingletonContext.VisitAllModules(visit)
203}
204
Colin Cross4c83e5c2019-02-25 14:54:28 -0800205func (s *singletonContextAdaptor) VisitAllModules(visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800206 s.SingletonContext.VisitAllModules(visitAdaptor(visit))
207}
208
Colin Cross4c83e5c2019-02-25 14:54:28 -0800209func (s *singletonContextAdaptor) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800210 s.SingletonContext.VisitAllModulesIf(predAdaptor(pred), visitAdaptor(visit))
211}
212
Mitch Phillips3a7a31b2019-10-16 15:00:12 -0700213func (s *singletonContextAdaptor) VisitDirectDeps(module Module, visit func(Module)) {
214 s.SingletonContext.VisitDirectDeps(module, visitAdaptor(visit))
215}
216
217func (s *singletonContextAdaptor) VisitDirectDepsIf(module Module, pred func(Module) bool, visit func(Module)) {
218 s.SingletonContext.VisitDirectDepsIf(module, predAdaptor(pred), visitAdaptor(visit))
219}
220
Colin Cross4c83e5c2019-02-25 14:54:28 -0800221func (s *singletonContextAdaptor) VisitDepsDepthFirst(module Module, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800222 s.SingletonContext.VisitDepsDepthFirst(module, visitAdaptor(visit))
223}
224
Colin Cross4c83e5c2019-02-25 14:54:28 -0800225func (s *singletonContextAdaptor) VisitDepsDepthFirstIf(module Module, pred func(Module) bool, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800226 s.SingletonContext.VisitDepsDepthFirstIf(module, predAdaptor(pred), visitAdaptor(visit))
227}
228
Colin Cross4c83e5c2019-02-25 14:54:28 -0800229func (s *singletonContextAdaptor) VisitAllModuleVariants(module Module, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800230 s.SingletonContext.VisitAllModuleVariants(module, visitAdaptor(visit))
231}
232
Colin Cross4c83e5c2019-02-25 14:54:28 -0800233func (s *singletonContextAdaptor) PrimaryModule(module Module) Module {
Colin Cross0875c522017-11-28 17:34:01 -0800234 return s.SingletonContext.PrimaryModule(module).(Module)
235}
236
Colin Cross4c83e5c2019-02-25 14:54:28 -0800237func (s *singletonContextAdaptor) FinalModule(module Module) Module {
Colin Cross0875c522017-11-28 17:34:01 -0800238 return s.SingletonContext.FinalModule(module).(Module)
239}