blob: 23524a533bafe40c47861016fa0ad774889007e8 [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 },
Liz Kammer69d64132021-06-24 13:03:06 -0400262 {
263 name: "prebuilt properties customizable",
264 replaceBp: true,
265 modules: `
266 source {
267 name: "foo",
268 deps: [":bar"],
269 }
270
271 soong_config_module_type {
272 name: "prebuilt_with_config",
273 module_type: "prebuilt",
274 config_namespace: "any_namespace",
275 bool_variables: ["bool_var"],
276 properties: ["prefer"],
277 }
278
279 prebuilt_with_config {
280 name: "bar",
281 prefer: true,
282 srcs: ["prebuilt_file"],
283 soong_config_variables: {
284 bool_var: {
285 prefer: false,
286 conditions_default: {
287 prefer: true,
288 },
289 },
290 },
291 }`,
292 prebuilt: []OsType{Android, BuildOs},
293 },
Colin Crossce75d2c2016-10-06 16:12:58 -0700294}
295
296func TestPrebuilts(t *testing.T) {
Paul Duffin35816122021-02-24 01:49:52 +0000297 fs := MockFS{
Colin Cross98be1bb2019-12-13 20:41:13 -0800298 "prebuilt_file": nil,
299 "source_file": nil,
300 }
Colin Cross0d614dd2016-10-14 15:38:43 -0700301
Colin Crossce75d2c2016-10-06 16:12:58 -0700302 for _, test := range prebuiltsTests {
303 t.Run(test.name, func(t *testing.T) {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100304 bp := test.modules
305 if !test.replaceBp {
306 bp = bp + `
307 source {
308 name: "foo",
309 deps: [":bar"],
310 }`
311 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800312
Martin Stjernholmf4677322020-07-07 02:20:40 +0100313 // Add windows to the target list to test the logic when a variant is
314 // disabled by default.
315 if !Windows.DefaultDisabled {
316 t.Errorf("windows is assumed to be disabled by default")
317 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100318
Paul Duffin30ac3e72021-03-20 00:36:14 +0000319 result := GroupFixturePreparers(
Paul Duffin35816122021-02-24 01:49:52 +0000320 PrepareForTestWithArchMutator,
321 PrepareForTestWithPrebuilts,
322 PrepareForTestWithOverrides,
323 PrepareForTestWithFilegroup,
324 // Add a Windows target to the configuration.
325 FixtureModifyConfig(func(config Config) {
326 config.Targets[Windows] = []Target{
327 {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
328 }
329 }),
330 fs.AddToFixture(),
331 FixtureRegisterWithContext(registerTestPrebuiltModules),
332 ).RunTestWithBp(t, bp)
Colin Crossce75d2c2016-10-06 16:12:58 -0700333
Paul Duffin35816122021-02-24 01:49:52 +0000334 for _, variant := range result.ModuleVariantsForTests("foo") {
335 foo := result.ModuleForTests("foo", variant)
Martin Stjernholmf4677322020-07-07 02:20:40 +0100336 t.Run(foo.Module().Target().Os.String(), func(t *testing.T) {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000337 var dependsOnSourceModule, dependsOnPrebuiltModule bool
Paul Duffin35816122021-02-24 01:49:52 +0000338 result.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000339 if _, ok := m.(*sourceModule); ok {
340 dependsOnSourceModule = true
341 }
342 if p, ok := m.(*prebuiltModule); ok {
343 dependsOnPrebuiltModule = true
344 if !p.Prebuilt().properties.UsePrebuilt {
345 t.Errorf("dependency on prebuilt module not marked used")
346 }
347 }
348 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700349
Martin Stjernholmf4677322020-07-07 02:20:40 +0100350 moduleIsDisabled := !foo.Module().Enabled()
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000351 deps := foo.Module().(*sourceModule).deps
Martin Stjernholmf4677322020-07-07 02:20:40 +0100352 if moduleIsDisabled {
353 if len(deps) > 0 {
354 t.Errorf("disabled module got deps: %v", deps)
355 }
356 } else {
357 if len(deps) != 1 {
358 t.Errorf("deps does not have single path, but is %v", deps)
359 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700360 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100361
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000362 var usingSourceFile, usingPrebuiltFile bool
Martin Stjernholmf4677322020-07-07 02:20:40 +0100363 if len(deps) > 0 && deps[0].String() == "source_file" {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000364 usingSourceFile = true
365 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100366 if len(deps) > 0 && deps[0].String() == "prebuilt_file" {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000367 usingPrebuiltFile = true
368 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700369
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000370 prebuilt := false
371 for _, os := range test.prebuilt {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100372 if os == foo.Module().Target().Os {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000373 prebuilt = true
374 }
375 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900376
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000377 if prebuilt {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100378 if moduleIsDisabled {
379 t.Errorf("dependent module for prebuilt is disabled")
380 }
381
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000382 if !dependsOnPrebuiltModule {
383 t.Errorf("doesn't depend on prebuilt module")
384 }
385 if !usingPrebuiltFile {
386 t.Errorf("doesn't use prebuilt_file")
387 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700388
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000389 if dependsOnSourceModule {
390 t.Errorf("depends on source module")
391 }
392 if usingSourceFile {
393 t.Errorf("using source_file")
394 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100395 } else if !moduleIsDisabled {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000396 if dependsOnPrebuiltModule {
397 t.Errorf("depends on prebuilt module")
398 }
399 if usingPrebuiltFile {
400 t.Errorf("using prebuilt_file")
401 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700402
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000403 if !dependsOnSourceModule {
404 t.Errorf("doesn't depend on source module")
405 }
406 if !usingSourceFile {
407 t.Errorf("doesn't use source_file")
408 }
409 }
410 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700411 }
412 })
413 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700414}
415
Paul Duffin78ac5b92020-01-14 12:42:08 +0000416func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
Paul Duffin35816122021-02-24 01:49:52 +0000417 registerTestPrebuiltModules(ctx)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000418
419 RegisterPrebuiltMutators(ctx)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700420 ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000421}
422
Paul Duffincfd33742021-02-27 11:59:02 +0000423var prepareForTestWithFakePrebuiltModules = FixtureRegisterWithContext(registerTestPrebuiltModules)
424
Paul Duffin35816122021-02-24 01:49:52 +0000425func registerTestPrebuiltModules(ctx RegistrationContext) {
426 ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
427 ctx.RegisterModuleType("source", newSourceModule)
428 ctx.RegisterModuleType("override_source", newOverrideSourceModule)
Liz Kammer69d64132021-06-24 13:03:06 -0400429 ctx.RegisterModuleType("soong_config_module_type", soongConfigModuleTypeFactory)
430 ctx.RegisterModuleType("soong_config_string_variable", soongConfigStringVariableDummyFactory)
431 ctx.RegisterModuleType("soong_config_bool_variable", soongConfigBoolVariableDummyFactory)
Paul Duffin35816122021-02-24 01:49:52 +0000432}
433
Colin Crossce75d2c2016-10-06 16:12:58 -0700434type prebuiltModule struct {
435 ModuleBase
Colin Cross74d73e22017-08-02 11:05:49 -0700436 prebuilt Prebuilt
437 properties struct {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000438 Srcs []string `android:"path,arch_variant"`
Colin Cross74d73e22017-08-02 11:05:49 -0700439 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900440 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700441}
442
Colin Cross36242852017-06-23 15:06:31 -0700443func newPrebuiltModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700444 m := &prebuiltModule{}
Colin Cross74d73e22017-08-02 11:05:49 -0700445 m.AddProperties(&m.properties)
446 InitPrebuiltModule(m, &m.properties.Srcs)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000447 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Colin Cross36242852017-06-23 15:06:31 -0700448 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700449}
450
451func (p *prebuiltModule) Name() string {
452 return p.prebuilt.Name(p.ModuleBase.Name())
453}
454
Jiyong Parkd4671112019-04-19 17:23:04 +0900455func (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
456 if len(p.properties.Srcs) >= 1 {
457 p.src = p.prebuilt.SingleSourcePath(ctx)
458 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700459}
460
461func (p *prebuiltModule) Prebuilt() *Prebuilt {
462 return &p.prebuilt
463}
464
Colin Cross41955e82019-05-29 14:40:35 -0700465func (p *prebuiltModule) OutputFiles(tag string) (Paths, error) {
466 switch tag {
467 case "":
468 return Paths{p.src}, nil
469 default:
470 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
471 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900472}
473
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700474type sourceModuleProperties struct {
475 Deps []string `android:"path,arch_variant"`
476}
477
Colin Crossce75d2c2016-10-06 16:12:58 -0700478type sourceModule struct {
479 ModuleBase
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700480 OverridableModuleBase
481
482 properties sourceModuleProperties
Colin Crossce75d2c2016-10-06 16:12:58 -0700483 dependsOnSourceModule, dependsOnPrebuiltModule bool
Jiyong Parkd4671112019-04-19 17:23:04 +0900484 deps Paths
485 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700486}
487
Colin Cross36242852017-06-23 15:06:31 -0700488func newSourceModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700489 m := &sourceModule{}
Colin Cross36242852017-06-23 15:06:31 -0700490 m.AddProperties(&m.properties)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000491 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700492 InitOverridableModule(m, nil)
Colin Cross36242852017-06-23 15:06:31 -0700493 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700494}
495
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700496func (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900497 // s.properties.Deps are annotated with android:path, so they are
498 // automatically added to the dependency by pathDeps mutator
Colin Crossce75d2c2016-10-06 16:12:58 -0700499}
500
501func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900502 s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
503 s.src = PathForModuleSrc(ctx, "source_file")
504}
505
506func (s *sourceModule) Srcs() Paths {
507 return Paths{s.src}
Colin Crossce75d2c2016-10-06 16:12:58 -0700508}
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700509
510type overrideSourceModule struct {
511 ModuleBase
512 OverrideModuleBase
513}
514
515func (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
516}
517
518func newOverrideSourceModule() Module {
519 m := &overrideSourceModule{}
520 m.AddProperties(&sourceModuleProperties{})
521
522 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
523 InitOverrideModule(m)
524 return m
525}