blob: e8c5121f07d66d64f39240ddde763249f4d275d5 [file] [log] [blame]
Colin Crossce75d2c2016-10-06 16:12:58 -07001// Copyright 2016 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 (
Colin Cross41955e82019-05-29 14:40:35 -070018 "fmt"
Colin Crossce75d2c2016-10-06 16:12:58 -070019 "testing"
20
21 "github.com/google/blueprint"
22)
23
24var prebuiltsTests = []struct {
25 name string
26 modules string
27 prebuilt bool
28}{
29 {
30 name: "no prebuilt",
31 modules: `
32 source {
33 name: "bar",
34 }`,
35 prebuilt: false,
36 },
37 {
38 name: "no source prebuilt not preferred",
39 modules: `
40 prebuilt {
41 name: "bar",
42 prefer: false,
Jiyong Parkd4671112019-04-19 17:23:04 +090043 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070044 }`,
45 prebuilt: true,
46 },
47 {
48 name: "no source prebuilt preferred",
49 modules: `
50 prebuilt {
51 name: "bar",
52 prefer: true,
Jiyong Parkd4671112019-04-19 17:23:04 +090053 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070054 }`,
55 prebuilt: true,
56 },
57 {
58 name: "prebuilt not preferred",
59 modules: `
60 source {
61 name: "bar",
62 }
Jaewoong Junge50fe612020-06-11 10:37:51 -070063
Colin Crossce75d2c2016-10-06 16:12:58 -070064 prebuilt {
65 name: "bar",
66 prefer: false,
Jiyong Parkd4671112019-04-19 17:23:04 +090067 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070068 }`,
69 prebuilt: false,
70 },
71 {
72 name: "prebuilt preferred",
73 modules: `
74 source {
75 name: "bar",
76 }
Jaewoong Junge50fe612020-06-11 10:37:51 -070077
Colin Crossce75d2c2016-10-06 16:12:58 -070078 prebuilt {
79 name: "bar",
80 prefer: true,
Jiyong Parkd4671112019-04-19 17:23:04 +090081 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070082 }`,
83 prebuilt: true,
84 },
Colin Cross0d614dd2016-10-14 15:38:43 -070085 {
86 name: "prebuilt no file not preferred",
87 modules: `
88 source {
89 name: "bar",
90 }
Jaewoong Junge50fe612020-06-11 10:37:51 -070091
Colin Cross0d614dd2016-10-14 15:38:43 -070092 prebuilt {
93 name: "bar",
94 prefer: false,
95 }`,
96 prebuilt: false,
97 },
98 {
99 name: "prebuilt no file preferred",
100 modules: `
101 source {
102 name: "bar",
103 }
Jaewoong Junge50fe612020-06-11 10:37:51 -0700104
Colin Cross0d614dd2016-10-14 15:38:43 -0700105 prebuilt {
106 name: "bar",
107 prefer: true,
108 }`,
109 prebuilt: false,
110 },
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700111 {
112 name: "prebuilt file from filegroup preferred",
113 modules: `
114 filegroup {
115 name: "fg",
Jiyong Parkd4671112019-04-19 17:23:04 +0900116 srcs: ["prebuilt_file"],
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700117 }
118 prebuilt {
119 name: "bar",
120 prefer: true,
121 srcs: [":fg"],
122 }`,
123 prebuilt: true,
124 },
Jaewoong Junge50fe612020-06-11 10:37:51 -0700125 {
126 name: "prebuilt override not preferred",
127 modules: `
128 source {
129 name: "baz",
130 }
131
132 override_source {
133 name: "bar",
134 base: "baz",
135 }
136
137 prebuilt {
138 name: "bar",
139 prefer: false,
140 srcs: ["prebuilt_file"],
141 }`,
142 prebuilt: false,
143 },
144 {
145 name: "prebuilt override preferred",
146 modules: `
147 source {
148 name: "baz",
149 }
150
151 override_source {
152 name: "bar",
153 base: "baz",
154 }
155
156 prebuilt {
157 name: "bar",
158 prefer: true,
159 srcs: ["prebuilt_file"],
160 }`,
161 prebuilt: true,
162 },
Colin Crossce75d2c2016-10-06 16:12:58 -0700163}
164
165func TestPrebuilts(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800166 fs := map[string][]byte{
167 "prebuilt_file": nil,
168 "source_file": nil,
169 }
Colin Cross0d614dd2016-10-14 15:38:43 -0700170
Colin Crossce75d2c2016-10-06 16:12:58 -0700171 for _, test := range prebuiltsTests {
172 t.Run(test.name, func(t *testing.T) {
Colin Cross98be1bb2019-12-13 20:41:13 -0800173 bp := `
174 source {
175 name: "foo",
176 deps: [":bar"],
177 }
178 ` + test.modules
179 config := TestConfig(buildDir, nil, bp, fs)
180
Colin Crosscec81712017-07-13 14:43:27 -0700181 ctx := NewTestContext()
Paul Duffin78ac5b92020-01-14 12:42:08 +0000182 registerTestPrebuiltBuildComponents(ctx)
Colin Cross4b49b762019-11-22 15:25:03 -0800183 ctx.RegisterModuleType("filegroup", FileGroupFactory)
Colin Cross98be1bb2019-12-13 20:41:13 -0800184 ctx.Register(config)
Colin Crossce75d2c2016-10-06 16:12:58 -0700185
Colin Cross98be1bb2019-12-13 20:41:13 -0800186 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
Logan Chien42039712018-03-12 16:29:17 +0800187 FailIfErrored(t, errs)
Colin Crossce75d2c2016-10-06 16:12:58 -0700188 _, errs = ctx.PrepareBuildActions(config)
Logan Chien42039712018-03-12 16:29:17 +0800189 FailIfErrored(t, errs)
Colin Crossce75d2c2016-10-06 16:12:58 -0700190
Colin Crosscec81712017-07-13 14:43:27 -0700191 foo := ctx.ModuleForTests("foo", "")
Colin Crossce75d2c2016-10-06 16:12:58 -0700192
Colin Crossc3e7fa62017-03-17 13:14:32 -0700193 var dependsOnSourceModule, dependsOnPrebuiltModule bool
Colin Crosscec81712017-07-13 14:43:27 -0700194 ctx.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
Colin Crossc3e7fa62017-03-17 13:14:32 -0700195 if _, ok := m.(*sourceModule); ok {
196 dependsOnSourceModule = true
197 }
198 if p, ok := m.(*prebuiltModule); ok {
199 dependsOnPrebuiltModule = true
Colin Cross74d73e22017-08-02 11:05:49 -0700200 if !p.Prebuilt().properties.UsePrebuilt {
Colin Crossc3e7fa62017-03-17 13:14:32 -0700201 t.Errorf("dependency on prebuilt module not marked used")
202 }
203 }
204 })
205
Jiyong Parkd4671112019-04-19 17:23:04 +0900206 deps := foo.Module().(*sourceModule).deps
207 if deps == nil || len(deps) != 1 {
208 t.Errorf("deps does not have single path, but is %v", deps)
209 }
210 var usingSourceFile, usingPrebuiltFile bool
211 if deps[0].String() == "source_file" {
212 usingSourceFile = true
213 }
214 if deps[0].String() == "prebuilt_file" {
215 usingPrebuiltFile = true
216 }
217
Colin Crossce75d2c2016-10-06 16:12:58 -0700218 if test.prebuilt {
Colin Crossc3e7fa62017-03-17 13:14:32 -0700219 if !dependsOnPrebuiltModule {
Colin Crossce75d2c2016-10-06 16:12:58 -0700220 t.Errorf("doesn't depend on prebuilt module")
221 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900222 if !usingPrebuiltFile {
223 t.Errorf("doesn't use prebuilt_file")
224 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700225
Colin Crossc3e7fa62017-03-17 13:14:32 -0700226 if dependsOnSourceModule {
Colin Crossce75d2c2016-10-06 16:12:58 -0700227 t.Errorf("depends on source module")
228 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900229 if usingSourceFile {
230 t.Errorf("using source_file")
231 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700232 } else {
Colin Crossc3e7fa62017-03-17 13:14:32 -0700233 if dependsOnPrebuiltModule {
Colin Crossce75d2c2016-10-06 16:12:58 -0700234 t.Errorf("depends on prebuilt module")
235 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900236 if usingPrebuiltFile {
237 t.Errorf("using prebuilt_file")
238 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700239
Colin Crossc3e7fa62017-03-17 13:14:32 -0700240 if !dependsOnSourceModule {
Jiyong Parkd4671112019-04-19 17:23:04 +0900241 t.Errorf("doesn't depend on source module")
242 }
243 if !usingSourceFile {
244 t.Errorf("doesn't use source_file")
Colin Crossce75d2c2016-10-06 16:12:58 -0700245 }
246 }
247 })
248 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700249}
250
Paul Duffin78ac5b92020-01-14 12:42:08 +0000251func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
252 ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
253 ctx.RegisterModuleType("source", newSourceModule)
Jaewoong Junge50fe612020-06-11 10:37:51 -0700254 ctx.RegisterModuleType("override_source", newOverrideSourceModule)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000255
256 RegisterPrebuiltMutators(ctx)
Jaewoong Junge50fe612020-06-11 10:37:51 -0700257 ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000258}
259
Colin Crossce75d2c2016-10-06 16:12:58 -0700260type prebuiltModule struct {
261 ModuleBase
Colin Cross74d73e22017-08-02 11:05:49 -0700262 prebuilt Prebuilt
263 properties struct {
Colin Cross27b922f2019-03-04 22:35:41 -0800264 Srcs []string `android:"path"`
Colin Cross74d73e22017-08-02 11:05:49 -0700265 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900266 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700267}
268
Colin Cross36242852017-06-23 15:06:31 -0700269func newPrebuiltModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700270 m := &prebuiltModule{}
Colin Cross74d73e22017-08-02 11:05:49 -0700271 m.AddProperties(&m.properties)
272 InitPrebuiltModule(m, &m.properties.Srcs)
Colin Cross36242852017-06-23 15:06:31 -0700273 InitAndroidModule(m)
274 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700275}
276
277func (p *prebuiltModule) Name() string {
278 return p.prebuilt.Name(p.ModuleBase.Name())
279}
280
Jiyong Parkd4671112019-04-19 17:23:04 +0900281func (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
282 if len(p.properties.Srcs) >= 1 {
283 p.src = p.prebuilt.SingleSourcePath(ctx)
284 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700285}
286
287func (p *prebuiltModule) Prebuilt() *Prebuilt {
288 return &p.prebuilt
289}
290
Colin Cross41955e82019-05-29 14:40:35 -0700291func (p *prebuiltModule) OutputFiles(tag string) (Paths, error) {
292 switch tag {
293 case "":
294 return Paths{p.src}, nil
295 default:
296 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
297 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900298}
299
Jaewoong Junge50fe612020-06-11 10:37:51 -0700300type sourceModuleProperties struct {
301 Deps []string `android:"path"`
302}
303
Colin Crossce75d2c2016-10-06 16:12:58 -0700304type sourceModule struct {
305 ModuleBase
Jaewoong Junge50fe612020-06-11 10:37:51 -0700306 OverridableModuleBase
307
308 properties sourceModuleProperties
Colin Crossce75d2c2016-10-06 16:12:58 -0700309 dependsOnSourceModule, dependsOnPrebuiltModule bool
Jiyong Parkd4671112019-04-19 17:23:04 +0900310 deps Paths
311 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700312}
313
Colin Cross36242852017-06-23 15:06:31 -0700314func newSourceModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700315 m := &sourceModule{}
Colin Cross36242852017-06-23 15:06:31 -0700316 m.AddProperties(&m.properties)
317 InitAndroidModule(m)
Jaewoong Junge50fe612020-06-11 10:37:51 -0700318 InitOverridableModule(m, nil)
Colin Cross36242852017-06-23 15:06:31 -0700319 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700320}
321
Jaewoong Junge50fe612020-06-11 10:37:51 -0700322func (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900323 // s.properties.Deps are annotated with android:path, so they are
324 // automatically added to the dependency by pathDeps mutator
Colin Crossce75d2c2016-10-06 16:12:58 -0700325}
326
327func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900328 s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
329 s.src = PathForModuleSrc(ctx, "source_file")
330}
331
332func (s *sourceModule) Srcs() Paths {
333 return Paths{s.src}
Colin Crossce75d2c2016-10-06 16:12:58 -0700334}
Jaewoong Junge50fe612020-06-11 10:37:51 -0700335
336type overrideSourceModule struct {
337 ModuleBase
338 OverrideModuleBase
339}
340
341func (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
342}
343
344func newOverrideSourceModule() Module {
345 m := &overrideSourceModule{}
346 m.AddProperties(&sourceModuleProperties{})
347
348 InitAndroidModule(m)
349 InitOverrideModule(m)
350 return m
351}