blob: fa40d1fb358edc124835fa6e2cece6cb775c18b2 [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
Colin Cross0c66bc62021-07-20 09:47:41 -070024func TestPrebuilts(t *testing.T) {
25 buildOS := TestArchConfig(t.TempDir(), nil, "", nil).BuildOS
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000026
Colin Cross0c66bc62021-07-20 09:47:41 -070027 var prebuiltsTests = []struct {
28 name string
29 replaceBp bool // modules is added to default bp boilerplate if false.
30 modules string
31 prebuilt []OsType
32 preparer FixturePreparer
33 }{
34 {
35 name: "no prebuilt",
36 modules: `
37 source {
38 name: "bar",
39 }`,
40 prebuilt: nil,
41 },
42 {
43 name: "no source prebuilt not preferred",
44 modules: `
45 prebuilt {
46 name: "bar",
47 prefer: false,
48 srcs: ["prebuilt_file"],
49 }`,
50 prebuilt: []OsType{Android, buildOS},
51 },
52 {
53 name: "no source prebuilt preferred",
54 modules: `
55 prebuilt {
56 name: "bar",
57 prefer: true,
58 srcs: ["prebuilt_file"],
59 }`,
60 prebuilt: []OsType{Android, buildOS},
61 },
62 {
63 name: "prebuilt not preferred",
64 modules: `
65 source {
66 name: "bar",
67 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000068
Colin Cross0c66bc62021-07-20 09:47:41 -070069 prebuilt {
70 name: "bar",
71 prefer: false,
72 srcs: ["prebuilt_file"],
73 }`,
74 prebuilt: nil,
75 },
76 {
77 name: "prebuilt preferred",
78 modules: `
79 source {
80 name: "bar",
81 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000082
Colin Cross0c66bc62021-07-20 09:47:41 -070083 prebuilt {
84 name: "bar",
85 prefer: true,
86 srcs: ["prebuilt_file"],
87 }`,
88 prebuilt: []OsType{Android, buildOS},
89 },
90 {
91 name: "prebuilt no file not preferred",
92 modules: `
93 source {
94 name: "bar",
95 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000096
Colin Cross0c66bc62021-07-20 09:47:41 -070097 prebuilt {
98 name: "bar",
99 prefer: false,
100 }`,
101 prebuilt: nil,
102 },
103 {
104 name: "prebuilt no file preferred",
105 modules: `
106 source {
107 name: "bar",
108 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000109
Colin Cross0c66bc62021-07-20 09:47:41 -0700110 prebuilt {
111 name: "bar",
112 prefer: true,
113 }`,
114 prebuilt: nil,
115 },
116 {
117 name: "prebuilt file from filegroup preferred",
118 modules: `
119 filegroup {
120 name: "fg",
121 srcs: ["prebuilt_file"],
122 }
123 prebuilt {
124 name: "bar",
125 prefer: true,
126 srcs: [":fg"],
127 }`,
128 prebuilt: []OsType{Android, buildOS},
129 },
130 {
131 name: "prebuilt module for device only",
132 modules: `
133 source {
134 name: "bar",
135 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000136
Colin Cross0c66bc62021-07-20 09:47:41 -0700137 prebuilt {
138 name: "bar",
139 host_supported: false,
140 prefer: true,
141 srcs: ["prebuilt_file"],
142 }`,
143 prebuilt: []OsType{Android},
144 },
145 {
146 name: "prebuilt file for host only",
147 modules: `
148 source {
149 name: "bar",
150 }
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700151
Colin Cross0c66bc62021-07-20 09:47:41 -0700152 prebuilt {
153 name: "bar",
154 prefer: true,
155 target: {
156 host: {
157 srcs: ["prebuilt_file"],
Liz Kammer69d64132021-06-24 13:03:06 -0400158 },
159 },
Colin Cross0c66bc62021-07-20 09:47:41 -0700160 }`,
161 prebuilt: []OsType{buildOS},
162 },
163 {
164 name: "prebuilt override not preferred",
165 modules: `
166 source {
167 name: "baz",
168 }
Paul Duffin0c52c7b2021-07-06 17:15:25 +0100169
Colin Cross0c66bc62021-07-20 09:47:41 -0700170 override_source {
171 name: "bar",
172 base: "baz",
173 }
Paul Duffin0c52c7b2021-07-06 17:15:25 +0100174
Colin Cross0c66bc62021-07-20 09:47:41 -0700175 prebuilt {
176 name: "bar",
177 prefer: false,
178 srcs: ["prebuilt_file"],
179 }`,
180 prebuilt: nil,
181 },
182 {
183 name: "prebuilt override preferred",
184 modules: `
185 source {
186 name: "baz",
187 }
Paul Duffin0c52c7b2021-07-06 17:15:25 +0100188
Colin Cross0c66bc62021-07-20 09:47:41 -0700189 override_source {
190 name: "bar",
191 base: "baz",
192 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700193
Colin Cross0c66bc62021-07-20 09:47:41 -0700194 prebuilt {
195 name: "bar",
196 prefer: true,
197 srcs: ["prebuilt_file"],
198 }`,
199 prebuilt: []OsType{Android, buildOS},
200 },
201 {
202 name: "prebuilt including default-disabled OS",
203 replaceBp: true,
204 modules: `
205 source {
206 name: "foo",
207 deps: [":bar"],
208 target: {
209 windows: {
210 enabled: true,
211 },
212 },
213 }
214
215 source {
216 name: "bar",
217 target: {
218 windows: {
219 enabled: true,
220 },
221 },
222 }
223
224 prebuilt {
225 name: "bar",
226 prefer: true,
227 srcs: ["prebuilt_file"],
228 target: {
229 windows: {
230 enabled: true,
231 },
232 },
233 }`,
234 prebuilt: []OsType{Android, buildOS, Windows},
235 },
236 {
237 name: "fall back to source for default-disabled OS",
238 replaceBp: true,
239 modules: `
240 source {
241 name: "foo",
242 deps: [":bar"],
243 target: {
244 windows: {
245 enabled: true,
246 },
247 },
248 }
249
250 source {
251 name: "bar",
252 target: {
253 windows: {
254 enabled: true,
255 },
256 },
257 }
258
259 prebuilt {
260 name: "bar",
261 prefer: true,
262 srcs: ["prebuilt_file"],
263 }`,
264 prebuilt: []OsType{Android, buildOS},
265 },
266 {
267 name: "prebuilt properties customizable",
268 replaceBp: true,
269 modules: `
270 source {
271 name: "foo",
272 deps: [":bar"],
273 }
274
275 soong_config_module_type {
276 name: "prebuilt_with_config",
277 module_type: "prebuilt",
278 config_namespace: "any_namespace",
279 bool_variables: ["bool_var"],
280 properties: ["prefer"],
281 }
282
283 prebuilt_with_config {
284 name: "bar",
285 prefer: true,
286 srcs: ["prebuilt_file"],
287 soong_config_variables: {
288 bool_var: {
289 prefer: false,
290 conditions_default: {
291 prefer: true,
292 },
293 },
294 },
295 }`,
296 prebuilt: []OsType{Android, buildOS},
297 },
298 {
299 name: "prebuilt use_source_config_var={acme, use_source} - no var specified",
300 modules: `
301 source {
302 name: "bar",
303 }
304
305 prebuilt {
306 name: "bar",
307 use_source_config_var: {config_namespace: "acme", var_name: "use_source"},
308 srcs: ["prebuilt_file"],
309 }`,
310 // When use_source_env is specified then it will use the prebuilt by default if the environment
311 // variable is not set.
312 prebuilt: []OsType{Android, buildOS},
313 },
314 {
315 name: "prebuilt use_source_config_var={acme, use_source} - acme_use_source=false",
316 modules: `
317 source {
318 name: "bar",
319 }
320
321 prebuilt {
322 name: "bar",
323 use_source_config_var: {config_namespace: "acme", var_name: "use_source"},
324 srcs: ["prebuilt_file"],
325 }`,
326 preparer: FixtureModifyProductVariables(func(variables FixtureProductVariables) {
327 variables.VendorVars = map[string]map[string]string{
328 "acme": {
329 "use_source": "false",
330 },
331 }
332 }),
333 // Setting the environment variable named in use_source_env to false will cause the prebuilt to
334 // be used.
335 prebuilt: []OsType{Android, buildOS},
336 },
337 {
338 name: "prebuilt use_source_config_var={acme, use_source} - acme_use_source=true",
339 modules: `
340 source {
341 name: "bar",
342 }
343
344 prebuilt {
345 name: "bar",
346 use_source_config_var: {config_namespace: "acme", var_name: "use_source"},
347 srcs: ["prebuilt_file"],
348 }`,
349 preparer: FixtureModifyProductVariables(func(variables FixtureProductVariables) {
350 variables.VendorVars = map[string]map[string]string{
351 "acme": {
352 "use_source": "true",
353 },
354 }
355 }),
356 // Setting the environment variable named in use_source_env to true will cause the source to be
357 // used.
358 prebuilt: nil,
359 },
360 {
361 name: "prebuilt use_source_config_var={acme, use_source} - acme_use_source=true, no source",
362 modules: `
363 prebuilt {
364 name: "bar",
365 use_source_config_var: {config_namespace: "acme", var_name: "use_source"},
366 srcs: ["prebuilt_file"],
367 }`,
368 preparer: FixtureModifyProductVariables(func(variables FixtureProductVariables) {
369 variables.VendorVars = map[string]map[string]string{
370 "acme": {
371 "use_source": "true",
372 },
373 }
374 }),
375 // Although the environment variable says to use source there is no source available.
376 prebuilt: []OsType{Android, buildOS},
377 },
378 }
379
Paul Duffin35816122021-02-24 01:49:52 +0000380 fs := MockFS{
Colin Cross98be1bb2019-12-13 20:41:13 -0800381 "prebuilt_file": nil,
382 "source_file": nil,
383 }
Colin Cross0d614dd2016-10-14 15:38:43 -0700384
Colin Crossce75d2c2016-10-06 16:12:58 -0700385 for _, test := range prebuiltsTests {
386 t.Run(test.name, func(t *testing.T) {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100387 bp := test.modules
388 if !test.replaceBp {
389 bp = bp + `
390 source {
391 name: "foo",
392 deps: [":bar"],
393 }`
394 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800395
Martin Stjernholmf4677322020-07-07 02:20:40 +0100396 // Add windows to the target list to test the logic when a variant is
397 // disabled by default.
398 if !Windows.DefaultDisabled {
399 t.Errorf("windows is assumed to be disabled by default")
400 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100401
Paul Duffin30ac3e72021-03-20 00:36:14 +0000402 result := GroupFixturePreparers(
Paul Duffin35816122021-02-24 01:49:52 +0000403 PrepareForTestWithArchMutator,
404 PrepareForTestWithPrebuilts,
405 PrepareForTestWithOverrides,
406 PrepareForTestWithFilegroup,
407 // Add a Windows target to the configuration.
408 FixtureModifyConfig(func(config Config) {
409 config.Targets[Windows] = []Target{
410 {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
411 }
412 }),
413 fs.AddToFixture(),
414 FixtureRegisterWithContext(registerTestPrebuiltModules),
Paul Duffin0c52c7b2021-07-06 17:15:25 +0100415 OptionalFixturePreparer(test.preparer),
Paul Duffin35816122021-02-24 01:49:52 +0000416 ).RunTestWithBp(t, bp)
Colin Crossce75d2c2016-10-06 16:12:58 -0700417
Paul Duffin35816122021-02-24 01:49:52 +0000418 for _, variant := range result.ModuleVariantsForTests("foo") {
419 foo := result.ModuleForTests("foo", variant)
Martin Stjernholmf4677322020-07-07 02:20:40 +0100420 t.Run(foo.Module().Target().Os.String(), func(t *testing.T) {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000421 var dependsOnSourceModule, dependsOnPrebuiltModule bool
Paul Duffin35816122021-02-24 01:49:52 +0000422 result.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000423 if _, ok := m.(*sourceModule); ok {
424 dependsOnSourceModule = true
425 }
426 if p, ok := m.(*prebuiltModule); ok {
427 dependsOnPrebuiltModule = true
428 if !p.Prebuilt().properties.UsePrebuilt {
429 t.Errorf("dependency on prebuilt module not marked used")
430 }
431 }
432 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700433
Martin Stjernholmf4677322020-07-07 02:20:40 +0100434 moduleIsDisabled := !foo.Module().Enabled()
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000435 deps := foo.Module().(*sourceModule).deps
Martin Stjernholmf4677322020-07-07 02:20:40 +0100436 if moduleIsDisabled {
437 if len(deps) > 0 {
438 t.Errorf("disabled module got deps: %v", deps)
439 }
440 } else {
441 if len(deps) != 1 {
442 t.Errorf("deps does not have single path, but is %v", deps)
443 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700444 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100445
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000446 var usingSourceFile, usingPrebuiltFile bool
Martin Stjernholmf4677322020-07-07 02:20:40 +0100447 if len(deps) > 0 && deps[0].String() == "source_file" {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000448 usingSourceFile = true
449 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100450 if len(deps) > 0 && deps[0].String() == "prebuilt_file" {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000451 usingPrebuiltFile = true
452 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700453
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000454 prebuilt := false
455 for _, os := range test.prebuilt {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100456 if os == foo.Module().Target().Os {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000457 prebuilt = true
458 }
459 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900460
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000461 if prebuilt {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100462 if moduleIsDisabled {
463 t.Errorf("dependent module for prebuilt is disabled")
464 }
465
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000466 if !dependsOnPrebuiltModule {
467 t.Errorf("doesn't depend on prebuilt module")
468 }
469 if !usingPrebuiltFile {
470 t.Errorf("doesn't use prebuilt_file")
471 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700472
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000473 if dependsOnSourceModule {
474 t.Errorf("depends on source module")
475 }
476 if usingSourceFile {
477 t.Errorf("using source_file")
478 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100479 } else if !moduleIsDisabled {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000480 if dependsOnPrebuiltModule {
481 t.Errorf("depends on prebuilt module")
482 }
483 if usingPrebuiltFile {
484 t.Errorf("using prebuilt_file")
485 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700486
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000487 if !dependsOnSourceModule {
488 t.Errorf("doesn't depend on source module")
489 }
490 if !usingSourceFile {
491 t.Errorf("doesn't use source_file")
492 }
493 }
494 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700495 }
496 })
497 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700498}
499
Paul Duffin78ac5b92020-01-14 12:42:08 +0000500func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
Paul Duffin35816122021-02-24 01:49:52 +0000501 registerTestPrebuiltModules(ctx)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000502
503 RegisterPrebuiltMutators(ctx)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700504 ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000505}
506
Paul Duffincfd33742021-02-27 11:59:02 +0000507var prepareForTestWithFakePrebuiltModules = FixtureRegisterWithContext(registerTestPrebuiltModules)
508
Paul Duffin35816122021-02-24 01:49:52 +0000509func registerTestPrebuiltModules(ctx RegistrationContext) {
510 ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
511 ctx.RegisterModuleType("source", newSourceModule)
512 ctx.RegisterModuleType("override_source", newOverrideSourceModule)
Jingwen Chena47f28d2021-11-02 16:43:57 +0000513 ctx.RegisterModuleType("soong_config_module_type", SoongConfigModuleTypeFactory)
514 ctx.RegisterModuleType("soong_config_string_variable", SoongConfigStringVariableDummyFactory)
515 ctx.RegisterModuleType("soong_config_bool_variable", SoongConfigBoolVariableDummyFactory)
Paul Duffin35816122021-02-24 01:49:52 +0000516}
517
Colin Crossce75d2c2016-10-06 16:12:58 -0700518type prebuiltModule struct {
519 ModuleBase
Colin Cross74d73e22017-08-02 11:05:49 -0700520 prebuilt Prebuilt
521 properties struct {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000522 Srcs []string `android:"path,arch_variant"`
Colin Cross74d73e22017-08-02 11:05:49 -0700523 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900524 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700525}
526
Colin Cross36242852017-06-23 15:06:31 -0700527func newPrebuiltModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700528 m := &prebuiltModule{}
Colin Cross74d73e22017-08-02 11:05:49 -0700529 m.AddProperties(&m.properties)
530 InitPrebuiltModule(m, &m.properties.Srcs)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000531 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Colin Cross36242852017-06-23 15:06:31 -0700532 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700533}
534
535func (p *prebuiltModule) Name() string {
536 return p.prebuilt.Name(p.ModuleBase.Name())
537}
538
Jiyong Parkd4671112019-04-19 17:23:04 +0900539func (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
540 if len(p.properties.Srcs) >= 1 {
541 p.src = p.prebuilt.SingleSourcePath(ctx)
542 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700543}
544
545func (p *prebuiltModule) Prebuilt() *Prebuilt {
546 return &p.prebuilt
547}
548
Colin Cross41955e82019-05-29 14:40:35 -0700549func (p *prebuiltModule) OutputFiles(tag string) (Paths, error) {
550 switch tag {
551 case "":
552 return Paths{p.src}, nil
553 default:
554 return nil, fmt.Errorf("unsupported module reference tag %q", tag)
555 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900556}
557
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700558type sourceModuleProperties struct {
559 Deps []string `android:"path,arch_variant"`
560}
561
Colin Crossce75d2c2016-10-06 16:12:58 -0700562type sourceModule struct {
563 ModuleBase
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700564 OverridableModuleBase
565
566 properties sourceModuleProperties
Colin Crossce75d2c2016-10-06 16:12:58 -0700567 dependsOnSourceModule, dependsOnPrebuiltModule bool
Jiyong Parkd4671112019-04-19 17:23:04 +0900568 deps Paths
569 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700570}
571
Colin Cross36242852017-06-23 15:06:31 -0700572func newSourceModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700573 m := &sourceModule{}
Colin Cross36242852017-06-23 15:06:31 -0700574 m.AddProperties(&m.properties)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000575 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700576 InitOverridableModule(m, nil)
Colin Cross36242852017-06-23 15:06:31 -0700577 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700578}
579
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700580func (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900581 // s.properties.Deps are annotated with android:path, so they are
582 // automatically added to the dependency by pathDeps mutator
Colin Crossce75d2c2016-10-06 16:12:58 -0700583}
584
585func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900586 s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
587 s.src = PathForModuleSrc(ctx, "source_file")
588}
589
590func (s *sourceModule) Srcs() Paths {
591 return Paths{s.src}
Colin Crossce75d2c2016-10-06 16:12:58 -0700592}
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700593
594type overrideSourceModule struct {
595 ModuleBase
596 OverrideModuleBase
597}
598
599func (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
600}
601
602func newOverrideSourceModule() Module {
603 m := &overrideSourceModule{}
604 m.AddProperties(&sourceModuleProperties{})
605
606 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
607 InitOverrideModule(m)
608 return m
609}