blob: 45a9b8243f7076e991f0a0c237b7b2fdc44dbac4 [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)
39 RequireNinjaVersion(major, minor, micro int)
40
41 // SetNinjaBuildDir sets the value of the top-level "builddir" Ninja variable
42 // that controls where Ninja stores its build log files. This value can be
43 // set at most one time for a single build, later calls are ignored.
44 SetNinjaBuildDir(pctx PackageContext, value string)
45
46 // Eval takes a string with embedded ninja variables, and returns a string
47 // with all of the variables recursively expanded. Any variables references
48 // are expanded in the scope of the PackageContext.
49 Eval(pctx PackageContext, ninjaStr string) (string, error)
50
Colin Cross2465c3d2018-09-28 10:19:18 -070051 VisitAllModulesBlueprint(visit func(blueprint.Module))
Colin Cross0875c522017-11-28 17:34:01 -080052 VisitAllModules(visit func(Module))
53 VisitAllModulesIf(pred func(Module) bool, visit func(Module))
Mitch Phillips3a7a31b2019-10-16 15:00:12 -070054
55 VisitDirectDeps(module Module, visit func(Module))
56 VisitDirectDepsIf(module Module, pred func(Module) bool, visit func(Module))
57
Colin Cross6b753602018-06-21 13:03:07 -070058 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Cross0875c522017-11-28 17:34:01 -080059 VisitDepsDepthFirst(module Module, visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -070060 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Cross0875c522017-11-28 17:34:01 -080061 VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
62 visit func(Module))
63
64 VisitAllModuleVariants(module Module, visit func(Module))
65
66 PrimaryModule(module Module) Module
67 FinalModule(module Module) Module
68
69 AddNinjaFileDeps(deps ...string)
70
71 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
72 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
73 // builder whenever a file matching the pattern as added or removed, without rerunning if a
74 // file that does not match the pattern is added to a searched directory.
75 GlobWithDeps(pattern string, excludes []string) ([]string, error)
Colin Cross0875c522017-11-28 17:34:01 -080076}
77
78type singletonAdaptor struct {
79 Singleton
Colin Cross4c83e5c2019-02-25 14:54:28 -080080
81 buildParams []BuildParams
82 ruleParams map[blueprint.Rule]blueprint.RuleParams
Colin Cross0875c522017-11-28 17:34:01 -080083}
84
Colin Cross4c83e5c2019-02-25 14:54:28 -080085var _ testBuildProvider = (*singletonAdaptor)(nil)
86
87func (s *singletonAdaptor) GenerateBuildActions(ctx blueprint.SingletonContext) {
88 sctx := &singletonContextAdaptor{SingletonContext: ctx}
89 if sctx.Config().captureBuild {
90 sctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
91 }
92
93 s.Singleton.GenerateBuildActions(sctx)
94
95 s.buildParams = sctx.buildParams
96 s.ruleParams = sctx.ruleParams
97}
98
99func (s *singletonAdaptor) BuildParamsForTests() []BuildParams {
100 return s.buildParams
101}
102
103func (s *singletonAdaptor) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
104 return s.ruleParams
Colin Cross0875c522017-11-28 17:34:01 -0800105}
106
107type Singleton interface {
108 GenerateBuildActions(SingletonContext)
109}
110
111type singletonContextAdaptor struct {
112 blueprint.SingletonContext
Colin Cross4c83e5c2019-02-25 14:54:28 -0800113
114 buildParams []BuildParams
115 ruleParams map[blueprint.Rule]blueprint.RuleParams
Colin Cross0875c522017-11-28 17:34:01 -0800116}
117
Colin Cross4c83e5c2019-02-25 14:54:28 -0800118func (s *singletonContextAdaptor) Config() Config {
Colin Crossaabf6792017-11-29 00:27:14 -0800119 return s.SingletonContext.Config().(Config)
120}
121
Colin Cross4c83e5c2019-02-25 14:54:28 -0800122func (s *singletonContextAdaptor) DeviceConfig() DeviceConfig {
Colin Cross65494b92019-02-07 14:25:51 -0800123 return DeviceConfig{s.Config().deviceConfig}
124}
125
Colin Cross4c83e5c2019-02-25 14:54:28 -0800126func (s *singletonContextAdaptor) Variable(pctx PackageContext, name, value string) {
Colin Cross0875c522017-11-28 17:34:01 -0800127 s.SingletonContext.Variable(pctx.PackageContext, name, value)
128}
129
Colin Cross4c83e5c2019-02-25 14:54:28 -0800130func (s *singletonContextAdaptor) Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule {
Colin Cross8b8bec32019-11-15 13:18:43 -0800131 if s.Config().UseRemoteBuild() && params.Pool == nil {
Ramy Medhatdd0418a2019-11-04 18:16:11 -0500132 // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
133 // jobs to the local parallelism value
Colin Cross2e2dbc22019-09-25 13:31:46 -0700134 params.Pool = localPool
135 }
Colin Cross4c83e5c2019-02-25 14:54:28 -0800136 rule := s.SingletonContext.Rule(pctx.PackageContext, name, params, argNames...)
137 if s.Config().captureBuild {
138 s.ruleParams[rule] = params
139 }
140 return rule
Colin Cross0875c522017-11-28 17:34:01 -0800141}
142
Colin Cross4c83e5c2019-02-25 14:54:28 -0800143func (s *singletonContextAdaptor) Build(pctx PackageContext, params BuildParams) {
144 if s.Config().captureBuild {
145 s.buildParams = append(s.buildParams, params)
146 }
Colin Cross0875c522017-11-28 17:34:01 -0800147 bparams := convertBuildParams(params)
148 s.SingletonContext.Build(pctx.PackageContext, bparams)
149
150}
151
Colin Cross4c83e5c2019-02-25 14:54:28 -0800152func (s *singletonContextAdaptor) SetNinjaBuildDir(pctx PackageContext, value string) {
Colin Cross0875c522017-11-28 17:34:01 -0800153 s.SingletonContext.SetNinjaBuildDir(pctx.PackageContext, value)
154}
155
Colin Cross4c83e5c2019-02-25 14:54:28 -0800156func (s *singletonContextAdaptor) Eval(pctx PackageContext, ninjaStr string) (string, error) {
Colin Cross0875c522017-11-28 17:34:01 -0800157 return s.SingletonContext.Eval(pctx.PackageContext, ninjaStr)
158}
159
160// visitAdaptor wraps a visit function that takes an android.Module parameter into
161// a function that takes an blueprint.Module parameter and only calls the visit function if the
162// blueprint.Module is an android.Module.
163func visitAdaptor(visit func(Module)) func(blueprint.Module) {
164 return func(module blueprint.Module) {
165 if aModule, ok := module.(Module); ok {
166 visit(aModule)
167 }
168 }
169}
170
171// predAdaptor wraps a pred function that takes an android.Module parameter
172// into a function that takes an blueprint.Module parameter and only calls the visit function if the
173// blueprint.Module is an android.Module, otherwise returns false.
174func predAdaptor(pred func(Module) bool) func(blueprint.Module) bool {
175 return func(module blueprint.Module) bool {
176 if aModule, ok := module.(Module); ok {
177 return pred(aModule)
178 } else {
179 return false
180 }
181 }
182}
183
Colin Cross4c83e5c2019-02-25 14:54:28 -0800184func (s *singletonContextAdaptor) VisitAllModulesBlueprint(visit func(blueprint.Module)) {
Colin Cross2465c3d2018-09-28 10:19:18 -0700185 s.SingletonContext.VisitAllModules(visit)
186}
187
Colin Cross4c83e5c2019-02-25 14:54:28 -0800188func (s *singletonContextAdaptor) VisitAllModules(visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800189 s.SingletonContext.VisitAllModules(visitAdaptor(visit))
190}
191
Colin Cross4c83e5c2019-02-25 14:54:28 -0800192func (s *singletonContextAdaptor) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800193 s.SingletonContext.VisitAllModulesIf(predAdaptor(pred), visitAdaptor(visit))
194}
195
Mitch Phillips3a7a31b2019-10-16 15:00:12 -0700196func (s *singletonContextAdaptor) VisitDirectDeps(module Module, visit func(Module)) {
197 s.SingletonContext.VisitDirectDeps(module, visitAdaptor(visit))
198}
199
200func (s *singletonContextAdaptor) VisitDirectDepsIf(module Module, pred func(Module) bool, visit func(Module)) {
201 s.SingletonContext.VisitDirectDepsIf(module, predAdaptor(pred), visitAdaptor(visit))
202}
203
Colin Cross4c83e5c2019-02-25 14:54:28 -0800204func (s *singletonContextAdaptor) VisitDepsDepthFirst(module Module, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800205 s.SingletonContext.VisitDepsDepthFirst(module, visitAdaptor(visit))
206}
207
Colin Cross4c83e5c2019-02-25 14:54:28 -0800208func (s *singletonContextAdaptor) VisitDepsDepthFirstIf(module Module, pred func(Module) bool, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800209 s.SingletonContext.VisitDepsDepthFirstIf(module, predAdaptor(pred), visitAdaptor(visit))
210}
211
Colin Cross4c83e5c2019-02-25 14:54:28 -0800212func (s *singletonContextAdaptor) VisitAllModuleVariants(module Module, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800213 s.SingletonContext.VisitAllModuleVariants(module, visitAdaptor(visit))
214}
215
Colin Cross4c83e5c2019-02-25 14:54:28 -0800216func (s *singletonContextAdaptor) PrimaryModule(module Module) Module {
Colin Cross0875c522017-11-28 17:34:01 -0800217 return s.SingletonContext.PrimaryModule(module).(Module)
218}
219
Colin Cross4c83e5c2019-02-25 14:54:28 -0800220func (s *singletonContextAdaptor) FinalModule(module Module) Module {
Colin Cross0875c522017-11-28 17:34:01 -0800221 return s.SingletonContext.FinalModule(module).(Module)
222}