blob: 33bc6d1473534882e1b673fcb4d4478ff89001bb [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"
19 "github.com/google/blueprint/pathtools"
20)
21
22// SingletonContext
23type SingletonContext interface {
Colin Crossaabf6792017-11-29 00:27:14 -080024 Config() Config
Colin Cross65494b92019-02-07 14:25:51 -080025 DeviceConfig() DeviceConfig
Colin Cross0875c522017-11-28 17:34:01 -080026
27 ModuleName(module blueprint.Module) string
28 ModuleDir(module blueprint.Module) string
29 ModuleSubDir(module blueprint.Module) string
30 ModuleType(module blueprint.Module) string
31 BlueprintFile(module blueprint.Module) string
32
33 ModuleErrorf(module blueprint.Module, format string, args ...interface{})
34 Errorf(format string, args ...interface{})
35 Failed() bool
36
37 Variable(pctx PackageContext, name, value string)
Colin Cross59014392017-12-12 11:05:06 -080038 Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule
Colin Cross0875c522017-11-28 17:34:01 -080039 Build(pctx PackageContext, params BuildParams)
40 RequireNinjaVersion(major, minor, micro int)
41
42 // SetNinjaBuildDir sets the value of the top-level "builddir" Ninja variable
43 // that controls where Ninja stores its build log files. This value can be
44 // set at most one time for a single build, later calls are ignored.
45 SetNinjaBuildDir(pctx PackageContext, value string)
46
47 // Eval takes a string with embedded ninja variables, and returns a string
48 // with all of the variables recursively expanded. Any variables references
49 // are expanded in the scope of the PackageContext.
50 Eval(pctx PackageContext, ninjaStr string) (string, error)
51
Colin Cross2465c3d2018-09-28 10:19:18 -070052 VisitAllModulesBlueprint(visit func(blueprint.Module))
Colin Cross0875c522017-11-28 17:34:01 -080053 VisitAllModules(visit func(Module))
54 VisitAllModulesIf(pred func(Module) bool, visit func(Module))
Mitch Phillips3a7a31b2019-10-16 15:00:12 -070055
56 VisitDirectDeps(module Module, visit func(Module))
57 VisitDirectDepsIf(module Module, pred func(Module) bool, visit func(Module))
58
Colin Cross6b753602018-06-21 13:03:07 -070059 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Cross0875c522017-11-28 17:34:01 -080060 VisitDepsDepthFirst(module Module, visit func(Module))
Colin Cross6b753602018-06-21 13:03:07 -070061 // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
Colin Cross0875c522017-11-28 17:34:01 -080062 VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
63 visit func(Module))
64
65 VisitAllModuleVariants(module Module, visit func(Module))
66
67 PrimaryModule(module Module) Module
68 FinalModule(module Module) Module
69
70 AddNinjaFileDeps(deps ...string)
71
72 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
73 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
74 // builder whenever a file matching the pattern as added or removed, without rerunning if a
75 // file that does not match the pattern is added to a searched directory.
76 GlobWithDeps(pattern string, excludes []string) ([]string, error)
77
78 Fs() pathtools.FileSystem
79}
80
81type singletonAdaptor struct {
82 Singleton
Colin Cross4c83e5c2019-02-25 14:54:28 -080083
84 buildParams []BuildParams
85 ruleParams map[blueprint.Rule]blueprint.RuleParams
Colin Cross0875c522017-11-28 17:34:01 -080086}
87
Colin Cross4c83e5c2019-02-25 14:54:28 -080088var _ testBuildProvider = (*singletonAdaptor)(nil)
89
90func (s *singletonAdaptor) GenerateBuildActions(ctx blueprint.SingletonContext) {
91 sctx := &singletonContextAdaptor{SingletonContext: ctx}
92 if sctx.Config().captureBuild {
93 sctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
94 }
95
96 s.Singleton.GenerateBuildActions(sctx)
97
98 s.buildParams = sctx.buildParams
99 s.ruleParams = sctx.ruleParams
100}
101
102func (s *singletonAdaptor) BuildParamsForTests() []BuildParams {
103 return s.buildParams
104}
105
106func (s *singletonAdaptor) RuleParamsForTests() map[blueprint.Rule]blueprint.RuleParams {
107 return s.ruleParams
Colin Cross0875c522017-11-28 17:34:01 -0800108}
109
110type Singleton interface {
111 GenerateBuildActions(SingletonContext)
112}
113
114type singletonContextAdaptor struct {
115 blueprint.SingletonContext
Colin Cross4c83e5c2019-02-25 14:54:28 -0800116
117 buildParams []BuildParams
118 ruleParams map[blueprint.Rule]blueprint.RuleParams
Colin Cross0875c522017-11-28 17:34:01 -0800119}
120
Colin Cross4c83e5c2019-02-25 14:54:28 -0800121func (s *singletonContextAdaptor) Config() Config {
Colin Crossaabf6792017-11-29 00:27:14 -0800122 return s.SingletonContext.Config().(Config)
123}
124
Colin Cross4c83e5c2019-02-25 14:54:28 -0800125func (s *singletonContextAdaptor) DeviceConfig() DeviceConfig {
Colin Cross65494b92019-02-07 14:25:51 -0800126 return DeviceConfig{s.Config().deviceConfig}
127}
128
Colin Cross4c83e5c2019-02-25 14:54:28 -0800129func (s *singletonContextAdaptor) Variable(pctx PackageContext, name, value string) {
Colin Cross0875c522017-11-28 17:34:01 -0800130 s.SingletonContext.Variable(pctx.PackageContext, name, value)
131}
132
Colin Cross4c83e5c2019-02-25 14:54:28 -0800133func (s *singletonContextAdaptor) Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule {
Colin Cross2e2dbc22019-09-25 13:31:46 -0700134 if s.Config().UseGoma() && params.Pool == nil {
135 // When USE_GOMA=true is set and the rule is not supported by goma, restrict jobs to the
136 // local parallelism value
137 params.Pool = localPool
138 }
Colin Cross4c83e5c2019-02-25 14:54:28 -0800139 rule := s.SingletonContext.Rule(pctx.PackageContext, name, params, argNames...)
140 if s.Config().captureBuild {
141 s.ruleParams[rule] = params
142 }
143 return rule
Colin Cross0875c522017-11-28 17:34:01 -0800144}
145
Colin Cross4c83e5c2019-02-25 14:54:28 -0800146func (s *singletonContextAdaptor) Build(pctx PackageContext, params BuildParams) {
147 if s.Config().captureBuild {
148 s.buildParams = append(s.buildParams, params)
149 }
Colin Cross0875c522017-11-28 17:34:01 -0800150 bparams := convertBuildParams(params)
151 s.SingletonContext.Build(pctx.PackageContext, bparams)
152
153}
154
Colin Cross4c83e5c2019-02-25 14:54:28 -0800155func (s *singletonContextAdaptor) SetNinjaBuildDir(pctx PackageContext, value string) {
Colin Cross0875c522017-11-28 17:34:01 -0800156 s.SingletonContext.SetNinjaBuildDir(pctx.PackageContext, value)
157}
158
Colin Cross4c83e5c2019-02-25 14:54:28 -0800159func (s *singletonContextAdaptor) Eval(pctx PackageContext, ninjaStr string) (string, error) {
Colin Cross0875c522017-11-28 17:34:01 -0800160 return s.SingletonContext.Eval(pctx.PackageContext, ninjaStr)
161}
162
163// visitAdaptor wraps a visit function that takes an android.Module parameter into
164// a function that takes an blueprint.Module parameter and only calls the visit function if the
165// blueprint.Module is an android.Module.
166func visitAdaptor(visit func(Module)) func(blueprint.Module) {
167 return func(module blueprint.Module) {
168 if aModule, ok := module.(Module); ok {
169 visit(aModule)
170 }
171 }
172}
173
174// predAdaptor wraps a pred function that takes an android.Module parameter
175// into a function that takes an blueprint.Module parameter and only calls the visit function if the
176// blueprint.Module is an android.Module, otherwise returns false.
177func predAdaptor(pred func(Module) bool) func(blueprint.Module) bool {
178 return func(module blueprint.Module) bool {
179 if aModule, ok := module.(Module); ok {
180 return pred(aModule)
181 } else {
182 return false
183 }
184 }
185}
186
Colin Cross4c83e5c2019-02-25 14:54:28 -0800187func (s *singletonContextAdaptor) VisitAllModulesBlueprint(visit func(blueprint.Module)) {
Colin Cross2465c3d2018-09-28 10:19:18 -0700188 s.SingletonContext.VisitAllModules(visit)
189}
190
Colin Cross4c83e5c2019-02-25 14:54:28 -0800191func (s *singletonContextAdaptor) VisitAllModules(visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800192 s.SingletonContext.VisitAllModules(visitAdaptor(visit))
193}
194
Colin Cross4c83e5c2019-02-25 14:54:28 -0800195func (s *singletonContextAdaptor) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800196 s.SingletonContext.VisitAllModulesIf(predAdaptor(pred), visitAdaptor(visit))
197}
198
Mitch Phillips3a7a31b2019-10-16 15:00:12 -0700199func (s *singletonContextAdaptor) VisitDirectDeps(module Module, visit func(Module)) {
200 s.SingletonContext.VisitDirectDeps(module, visitAdaptor(visit))
201}
202
203func (s *singletonContextAdaptor) VisitDirectDepsIf(module Module, pred func(Module) bool, visit func(Module)) {
204 s.SingletonContext.VisitDirectDepsIf(module, predAdaptor(pred), visitAdaptor(visit))
205}
206
Colin Cross4c83e5c2019-02-25 14:54:28 -0800207func (s *singletonContextAdaptor) VisitDepsDepthFirst(module Module, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800208 s.SingletonContext.VisitDepsDepthFirst(module, visitAdaptor(visit))
209}
210
Colin Cross4c83e5c2019-02-25 14:54:28 -0800211func (s *singletonContextAdaptor) VisitDepsDepthFirstIf(module Module, pred func(Module) bool, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800212 s.SingletonContext.VisitDepsDepthFirstIf(module, predAdaptor(pred), visitAdaptor(visit))
213}
214
Colin Cross4c83e5c2019-02-25 14:54:28 -0800215func (s *singletonContextAdaptor) VisitAllModuleVariants(module Module, visit func(Module)) {
Colin Cross0875c522017-11-28 17:34:01 -0800216 s.SingletonContext.VisitAllModuleVariants(module, visitAdaptor(visit))
217}
218
Colin Cross4c83e5c2019-02-25 14:54:28 -0800219func (s *singletonContextAdaptor) PrimaryModule(module Module) Module {
Colin Cross0875c522017-11-28 17:34:01 -0800220 return s.SingletonContext.PrimaryModule(module).(Module)
221}
222
Colin Cross4c83e5c2019-02-25 14:54:28 -0800223func (s *singletonContextAdaptor) FinalModule(module Module) Module {
Colin Cross0875c522017-11-28 17:34:01 -0800224 return s.SingletonContext.FinalModule(module).(Module)
225}