blob: 87910fdab133b45e35d4fbf14918a8494d34f3f8 [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 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)
37 Rule(pctx PackageContext, name string, params RuleParams, argNames ...string) blueprint.Rule
38 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
51 VisitAllModules(visit func(Module))
52 VisitAllModulesIf(pred func(Module) bool, visit func(Module))
53 VisitDepsDepthFirst(module Module, visit func(Module))
54 VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
55 visit func(Module))
56
57 VisitAllModuleVariants(module Module, visit func(Module))
58
59 PrimaryModule(module Module) Module
60 FinalModule(module Module) Module
61
62 AddNinjaFileDeps(deps ...string)
63
64 // GlobWithDeps returns a list of files that match the specified pattern but do not match any
65 // of the patterns in excludes. It also adds efficient dependencies to rerun the primary
66 // builder whenever a file matching the pattern as added or removed, without rerunning if a
67 // file that does not match the pattern is added to a searched directory.
68 GlobWithDeps(pattern string, excludes []string) ([]string, error)
69
70 Fs() pathtools.FileSystem
71}
72
73type singletonAdaptor struct {
74 Singleton
75}
76
77func (s singletonAdaptor) GenerateBuildActions(ctx blueprint.SingletonContext) {
78 s.Singleton.GenerateBuildActions(singletonContextAdaptor{ctx})
79}
80
81type Singleton interface {
82 GenerateBuildActions(SingletonContext)
83}
84
85type singletonContextAdaptor struct {
86 blueprint.SingletonContext
87}
88
Colin Crossaabf6792017-11-29 00:27:14 -080089func (s singletonContextAdaptor) Config() Config {
90 return s.SingletonContext.Config().(Config)
91}
92
Colin Cross0875c522017-11-28 17:34:01 -080093func (s singletonContextAdaptor) Variable(pctx PackageContext, name, value string) {
94 s.SingletonContext.Variable(pctx.PackageContext, name, value)
95}
96
97func (s singletonContextAdaptor) Rule(pctx PackageContext, name string, params RuleParams, argNames ...string) blueprint.Rule {
98 return s.SingletonContext.Rule(pctx.PackageContext, name, params.RuleParams, argNames...)
99}
100
101func (s singletonContextAdaptor) Build(pctx PackageContext, params BuildParams) {
102 bparams := convertBuildParams(params)
103 s.SingletonContext.Build(pctx.PackageContext, bparams)
104
105}
106
107func (s singletonContextAdaptor) SetNinjaBuildDir(pctx PackageContext, value string) {
108 s.SingletonContext.SetNinjaBuildDir(pctx.PackageContext, value)
109}
110
111func (s singletonContextAdaptor) Eval(pctx PackageContext, ninjaStr string) (string, error) {
112 return s.SingletonContext.Eval(pctx.PackageContext, ninjaStr)
113}
114
115// visitAdaptor wraps a visit function that takes an android.Module parameter into
116// a function that takes an blueprint.Module parameter and only calls the visit function if the
117// blueprint.Module is an android.Module.
118func visitAdaptor(visit func(Module)) func(blueprint.Module) {
119 return func(module blueprint.Module) {
120 if aModule, ok := module.(Module); ok {
121 visit(aModule)
122 }
123 }
124}
125
126// predAdaptor wraps a pred function that takes an android.Module parameter
127// into a function that takes an blueprint.Module parameter and only calls the visit function if the
128// blueprint.Module is an android.Module, otherwise returns false.
129func predAdaptor(pred func(Module) bool) func(blueprint.Module) bool {
130 return func(module blueprint.Module) bool {
131 if aModule, ok := module.(Module); ok {
132 return pred(aModule)
133 } else {
134 return false
135 }
136 }
137}
138
139func (s singletonContextAdaptor) VisitAllModules(visit func(Module)) {
140 s.SingletonContext.VisitAllModules(visitAdaptor(visit))
141}
142
143func (s singletonContextAdaptor) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) {
144 s.SingletonContext.VisitAllModulesIf(predAdaptor(pred), visitAdaptor(visit))
145}
146
147func (s singletonContextAdaptor) VisitDepsDepthFirst(module Module, visit func(Module)) {
148 s.SingletonContext.VisitDepsDepthFirst(module, visitAdaptor(visit))
149}
150
151func (s singletonContextAdaptor) VisitDepsDepthFirstIf(module Module, pred func(Module) bool, visit func(Module)) {
152 s.SingletonContext.VisitDepsDepthFirstIf(module, predAdaptor(pred), visitAdaptor(visit))
153}
154
155func (s singletonContextAdaptor) VisitAllModuleVariants(module Module, visit func(Module)) {
156 s.SingletonContext.VisitAllModuleVariants(module, visitAdaptor(visit))
157}
158
159func (s singletonContextAdaptor) PrimaryModule(module Module) Module {
160 return s.SingletonContext.PrimaryModule(module).(Module)
161}
162
163func (s singletonContextAdaptor) FinalModule(module Module) Module {
164 return s.SingletonContext.FinalModule(module).(Module)
165}