blob: 164b1bc59ee9a4b40ee32c6082fa7183e379edbb [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 {
Martin Stjernholmf4677322020-07-07 02:20:40 +010025 name string
26 replaceBp bool // modules is added to default bp boilerplate if false.
27 modules string
28 prebuilt []OsType
Colin Crossce75d2c2016-10-06 16:12:58 -070029}{
30 {
31 name: "no prebuilt",
32 modules: `
33 source {
34 name: "bar",
35 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000036 prebuilt: nil,
Colin Crossce75d2c2016-10-06 16:12:58 -070037 },
38 {
39 name: "no source prebuilt not preferred",
40 modules: `
41 prebuilt {
42 name: "bar",
43 prefer: false,
Jiyong Parkd4671112019-04-19 17:23:04 +090044 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070045 }`,
Martin Stjernholmf4677322020-07-07 02:20:40 +010046 prebuilt: []OsType{Android, BuildOs},
Colin Crossce75d2c2016-10-06 16:12:58 -070047 },
48 {
49 name: "no source prebuilt preferred",
50 modules: `
51 prebuilt {
52 name: "bar",
53 prefer: true,
Jiyong Parkd4671112019-04-19 17:23:04 +090054 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070055 }`,
Martin Stjernholmf4677322020-07-07 02:20:40 +010056 prebuilt: []OsType{Android, BuildOs},
Colin Crossce75d2c2016-10-06 16:12:58 -070057 },
58 {
59 name: "prebuilt not preferred",
60 modules: `
61 source {
62 name: "bar",
63 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000064
Colin Crossce75d2c2016-10-06 16:12:58 -070065 prebuilt {
66 name: "bar",
67 prefer: false,
Jiyong Parkd4671112019-04-19 17:23:04 +090068 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070069 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000070 prebuilt: nil,
Colin Crossce75d2c2016-10-06 16:12:58 -070071 },
72 {
73 name: "prebuilt preferred",
74 modules: `
75 source {
76 name: "bar",
77 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000078
Colin Crossce75d2c2016-10-06 16:12:58 -070079 prebuilt {
80 name: "bar",
81 prefer: true,
Jiyong Parkd4671112019-04-19 17:23:04 +090082 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070083 }`,
Martin Stjernholmf4677322020-07-07 02:20:40 +010084 prebuilt: []OsType{Android, BuildOs},
Colin Crossce75d2c2016-10-06 16:12:58 -070085 },
Colin Cross0d614dd2016-10-14 15:38:43 -070086 {
87 name: "prebuilt no file not preferred",
88 modules: `
89 source {
90 name: "bar",
91 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000092
Colin Cross0d614dd2016-10-14 15:38:43 -070093 prebuilt {
94 name: "bar",
95 prefer: false,
96 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000097 prebuilt: nil,
Colin Cross0d614dd2016-10-14 15:38:43 -070098 },
99 {
100 name: "prebuilt no file preferred",
101 modules: `
102 source {
103 name: "bar",
104 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000105
Colin Cross0d614dd2016-10-14 15:38:43 -0700106 prebuilt {
107 name: "bar",
108 prefer: true,
109 }`,
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000110 prebuilt: nil,
Colin Cross0d614dd2016-10-14 15:38:43 -0700111 },
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700112 {
113 name: "prebuilt file from filegroup preferred",
114 modules: `
115 filegroup {
116 name: "fg",
Jiyong Parkd4671112019-04-19 17:23:04 +0900117 srcs: ["prebuilt_file"],
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700118 }
119 prebuilt {
120 name: "bar",
121 prefer: true,
122 srcs: [":fg"],
123 }`,
Martin Stjernholmf4677322020-07-07 02:20:40 +0100124 prebuilt: []OsType{Android, BuildOs},
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000125 },
126 {
127 name: "prebuilt module for device only",
128 modules: `
129 source {
130 name: "bar",
131 }
132
133 prebuilt {
134 name: "bar",
135 host_supported: false,
136 prefer: true,
137 srcs: ["prebuilt_file"],
138 }`,
Martin Stjernholmf4677322020-07-07 02:20:40 +0100139 prebuilt: []OsType{Android},
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000140 },
141 {
142 name: "prebuilt file for host only",
143 modules: `
144 source {
145 name: "bar",
146 }
147
148 prebuilt {
149 name: "bar",
150 prefer: true,
151 target: {
Paul Duffin69304cf2020-05-29 08:01:00 +0100152 host: {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000153 srcs: ["prebuilt_file"],
154 },
155 },
156 }`,
Martin Stjernholmf4677322020-07-07 02:20:40 +0100157 prebuilt: []OsType{BuildOs},
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700158 },
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700159 {
160 name: "prebuilt override not preferred",
161 modules: `
162 source {
163 name: "baz",
164 }
165
166 override_source {
167 name: "bar",
168 base: "baz",
169 }
170
171 prebuilt {
172 name: "bar",
173 prefer: false,
174 srcs: ["prebuilt_file"],
175 }`,
176 prebuilt: nil,
177 },
178 {
179 name: "prebuilt override preferred",
180 modules: `
181 source {
182 name: "baz",
183 }
184
185 override_source {
186 name: "bar",
187 base: "baz",
188 }
189
190 prebuilt {
191 name: "bar",
192 prefer: true,
193 srcs: ["prebuilt_file"],
194 }`,
Martin Stjernholmf4677322020-07-07 02:20:40 +0100195 prebuilt: []OsType{Android, BuildOs},
196 },
197 {
198 name: "prebuilt including default-disabled OS",
199 replaceBp: true,
200 modules: `
201 source {
202 name: "foo",
203 deps: [":bar"],
204 target: {
205 windows: {
206 enabled: true,
207 },
208 },
209 }
210
211 source {
212 name: "bar",
213 target: {
214 windows: {
215 enabled: true,
216 },
217 },
218 }
219
220 prebuilt {
221 name: "bar",
222 prefer: true,
223 srcs: ["prebuilt_file"],
224 target: {
225 windows: {
226 enabled: true,
227 },
228 },
229 }`,
230 prebuilt: []OsType{Android, BuildOs, Windows},
231 },
232 {
233 name: "fall back to source for default-disabled OS",
234 replaceBp: true,
235 modules: `
236 source {
237 name: "foo",
238 deps: [":bar"],
239 target: {
240 windows: {
241 enabled: true,
242 },
243 },
244 }
245
246 source {
247 name: "bar",
248 target: {
249 windows: {
250 enabled: true,
251 },
252 },
253 }
254
255 prebuilt {
256 name: "bar",
257 prefer: true,
258 srcs: ["prebuilt_file"],
259 }`,
260 prebuilt: []OsType{Android, BuildOs},
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700261 },
Colin Crossce75d2c2016-10-06 16:12:58 -0700262}
263
264func TestPrebuilts(t *testing.T) {
Paul Duffin35816122021-02-24 01:49:52 +0000265 fs := MockFS{
Colin Cross98be1bb2019-12-13 20:41:13 -0800266 "prebuilt_file": nil,
267 "source_file": nil,
268 }
Colin Cross0d614dd2016-10-14 15:38:43 -0700269
Colin Crossce75d2c2016-10-06 16:12:58 -0700270 for _, test := range prebuiltsTests {
271 t.Run(test.name, func(t *testing.T) {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100272 bp := test.modules
273 if !test.replaceBp {
274 bp = bp + `
275 source {
276 name: "foo",
277 deps: [":bar"],
278 }`
279 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800280
Martin Stjernholmf4677322020-07-07 02:20:40 +0100281 // Add windows to the target list to test the logic when a variant is
282 // disabled by default.
283 if !Windows.DefaultDisabled {
284 t.Errorf("windows is assumed to be disabled by default")
285 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100286
Paul Duffin35816122021-02-24 01:49:52 +0000287 result := emptyTestFixtureFactory.Extend(
288 PrepareForTestWithArchMutator,
289 PrepareForTestWithPrebuilts,
290 PrepareForTestWithOverrides,
291 PrepareForTestWithFilegroup,
292 // Add a Windows target to the configuration.
293 FixtureModifyConfig(func(config Config) {
294 config.Targets[Windows] = []Target{
295 {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
296 }
297 }),
298 fs.AddToFixture(),
299 FixtureRegisterWithContext(registerTestPrebuiltModules),
300 ).RunTestWithBp(t, bp)
Colin Crossce75d2c2016-10-06 16:12:58 -0700301
Paul Duffin35816122021-02-24 01:49:52 +0000302 for _, variant := range result.ModuleVariantsForTests("foo") {
303 foo := result.ModuleForTests("foo", variant)
Martin Stjernholmf4677322020-07-07 02:20:40 +0100304 t.Run(foo.Module().Target().Os.String(), func(t *testing.T) {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000305 var dependsOnSourceModule, dependsOnPrebuiltModule bool
Paul Duffin35816122021-02-24 01:49:52 +0000306 result.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000307 if _, ok := m.(*sourceModule); ok {
308 dependsOnSourceModule = true
309 }
310 if p, ok := m.(*prebuiltModule); ok {
311 dependsOnPrebuiltModule = true
312 if !p.Prebuilt().properties.UsePrebuilt {
313 t.Errorf("dependency on prebuilt module not marked used")
314 }
315 }
316 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700317
Martin Stjernholmf4677322020-07-07 02:20:40 +0100318 moduleIsDisabled := !foo.Module().Enabled()
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000319 deps := foo.Module().(*sourceModule).deps
Martin Stjernholmf4677322020-07-07 02:20:40 +0100320 if moduleIsDisabled {
321 if len(deps) > 0 {
322 t.Errorf("disabled module got deps: %v", deps)
323 }
324 } else {
325 if len(deps) != 1 {
326 t.Errorf("deps does not have single path, but is %v", deps)
327 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700328 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100329
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000330 var usingSourceFile, usingPrebuiltFile bool
Martin Stjernholmf4677322020-07-07 02:20:40 +0100331 if len(deps) > 0 && deps[0].String() == "source_file" {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000332 usingSourceFile = true
333 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100334 if len(deps) > 0 && deps[0].String() == "prebuilt_file" {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000335 usingPrebuiltFile = true
336 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700337
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000338 prebuilt := false
339 for _, os := range test.prebuilt {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100340 if os == foo.Module().Target().Os {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000341 prebuilt = true
342 }
343 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900344
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000345 if prebuilt {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100346 if moduleIsDisabled {
347 t.Errorf("dependent module for prebuilt is disabled")
348 }
349
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000350 if !dependsOnPrebuiltModule {
351 t.Errorf("doesn't depend on prebuilt module")
352 }
353 if !usingPrebuiltFile {
354 t.Errorf("doesn't use prebuilt_file")
355 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700356
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000357 if dependsOnSourceModule {
358 t.Errorf("depends on source module")
359 }
360 if usingSourceFile {
361 t.Errorf("using source_file")
362 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100363 } else if !moduleIsDisabled {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000364 if dependsOnPrebuiltModule {
365 t.Errorf("depends on prebuilt module")
366 }
367 if usingPrebuiltFile {
368 t.Errorf("using prebuilt_file")
369 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700370
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000371 if !dependsOnSourceModule {
372 t.Errorf("doesn't depend on source module")
373 }
374 if !usingSourceFile {
375 t.Errorf("doesn't use source_file")
376 }
377 }
378 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700379 }
380 })
381 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700382}
383
Paul Duffin78ac5b92020-01-14 12:42:08 +0000384func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
Paul Duffin35816122021-02-24 01:49:52 +0000385 registerTestPrebuiltModules(ctx)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000386
387 RegisterPrebuiltMutators(ctx)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700388 ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000389}
390
Paul Duffin35816122021-02-24 01:49:52 +0000391func registerTestPrebuiltModules(ctx RegistrationContext) {
392 ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
393 ctx.RegisterModuleType("source", newSourceModule)
394 ctx.RegisterModuleType("override_source", newOverrideSourceModule)
395}
396
Colin Crossce75d2c2016-10-06 16:12:58 -0700397type prebuiltModule struct {
398 ModuleBase
Colin Cross74d73e22017-08-02 11:05:49 -0700399 prebuilt Prebuilt
400 properties struct {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000401 Srcs []string `android:"path,arch_variant"`
Colin Cross74d73e22017-08-02 11:05:49 -0700402 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900403 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700404}
405
Colin Cross36242852017-06-23 15:06:31 -0700406func newPrebuiltModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700407 m := &prebuiltModule{}
Colin Cross74d73e22017-08-02 11:05:49 -0700408 m.AddProperties(&m.properties)
409 InitPrebuiltModule(m, &m.properties.Srcs)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000410 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Colin Cross36242852017-06-23 15:06:31 -0700411 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700412}
413
414func (p *prebuiltModule) Name() string {
415 return p.prebuilt.Name(p.ModuleBase.Name())
416}
417
Jiyong Parkd4671112019-04-19 17:23:04 +0900418func (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
419 if len(p.properties.Srcs) >= 1 {
420 p.src = p.prebuilt.SingleSourcePath(ctx)
421 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700422}
423
424func (p *prebuiltModule) Prebuilt() *Prebuilt {
425 return &p.prebuilt
426}
427
Colin Cross41955e82019-05-29 14:40:35 -0700428func (p *prebuiltModule) OutputFiles(tag string) (Paths, error) {
429 switch tag {
430 case "":
431 return Paths{p.src}, nil
432 default:
433 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
434 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900435}
436
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700437type sourceModuleProperties struct {
438 Deps []string `android:"path,arch_variant"`
439}
440
Colin Crossce75d2c2016-10-06 16:12:58 -0700441type sourceModule struct {
442 ModuleBase
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700443 OverridableModuleBase
444
445 properties sourceModuleProperties
Colin Crossce75d2c2016-10-06 16:12:58 -0700446 dependsOnSourceModule, dependsOnPrebuiltModule bool
Jiyong Parkd4671112019-04-19 17:23:04 +0900447 deps Paths
448 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700449}
450
Colin Cross36242852017-06-23 15:06:31 -0700451func newSourceModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700452 m := &sourceModule{}
Colin Cross36242852017-06-23 15:06:31 -0700453 m.AddProperties(&m.properties)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000454 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700455 InitOverridableModule(m, nil)
Colin Cross36242852017-06-23 15:06:31 -0700456 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700457}
458
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700459func (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900460 // s.properties.Deps are annotated with android:path, so they are
461 // automatically added to the dependency by pathDeps mutator
Colin Crossce75d2c2016-10-06 16:12:58 -0700462}
463
464func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900465 s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
466 s.src = PathForModuleSrc(ctx, "source_file")
467}
468
469func (s *sourceModule) Srcs() Paths {
470 return Paths{s.src}
Colin Crossce75d2c2016-10-06 16:12:58 -0700471}
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700472
473type overrideSourceModule struct {
474 ModuleBase
475 OverrideModuleBase
476}
477
478func (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
479}
480
481func newOverrideSourceModule() Module {
482 m := &overrideSourceModule{}
483 m.AddProperties(&sourceModuleProperties{})
484
485 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
486 InitOverrideModule(m)
487 return m
488}