blob: 5e4af0ba56c2cf41f28d9b62e1cb587e55740529 [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 (
18 "testing"
19
20 "github.com/google/blueprint"
21)
22
Colin Cross0c66bc62021-07-20 09:47:41 -070023func TestPrebuilts(t *testing.T) {
24 buildOS := TestArchConfig(t.TempDir(), nil, "", nil).BuildOS
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000025
Colin Cross0c66bc62021-07-20 09:47:41 -070026 var prebuiltsTests = []struct {
27 name string
28 replaceBp bool // modules is added to default bp boilerplate if false.
29 modules string
30 prebuilt []OsType
31 preparer FixturePreparer
32 }{
33 {
34 name: "no prebuilt",
35 modules: `
36 source {
37 name: "bar",
38 }`,
39 prebuilt: nil,
40 },
41 {
42 name: "no source prebuilt not preferred",
43 modules: `
44 prebuilt {
45 name: "bar",
46 prefer: false,
47 srcs: ["prebuilt_file"],
48 }`,
49 prebuilt: []OsType{Android, buildOS},
50 },
51 {
52 name: "no source prebuilt preferred",
53 modules: `
54 prebuilt {
55 name: "bar",
56 prefer: true,
57 srcs: ["prebuilt_file"],
58 }`,
59 prebuilt: []OsType{Android, buildOS},
60 },
61 {
62 name: "prebuilt not preferred",
63 modules: `
64 source {
65 name: "bar",
66 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000067
Colin Cross0c66bc62021-07-20 09:47:41 -070068 prebuilt {
69 name: "bar",
70 prefer: false,
71 srcs: ["prebuilt_file"],
72 }`,
73 prebuilt: nil,
74 },
75 {
76 name: "prebuilt preferred",
77 modules: `
78 source {
79 name: "bar",
80 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000081
Colin Cross0c66bc62021-07-20 09:47:41 -070082 prebuilt {
83 name: "bar",
84 prefer: true,
85 srcs: ["prebuilt_file"],
86 }`,
87 prebuilt: []OsType{Android, buildOS},
88 },
89 {
90 name: "prebuilt no file not preferred",
91 modules: `
92 source {
93 name: "bar",
94 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +000095
Colin Cross0c66bc62021-07-20 09:47:41 -070096 prebuilt {
97 name: "bar",
98 prefer: false,
99 }`,
100 prebuilt: nil,
101 },
102 {
103 name: "prebuilt no file preferred",
104 modules: `
105 source {
106 name: "bar",
107 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000108
Colin Cross0c66bc62021-07-20 09:47:41 -0700109 prebuilt {
110 name: "bar",
111 prefer: true,
112 }`,
113 prebuilt: nil,
114 },
115 {
116 name: "prebuilt file from filegroup preferred",
117 modules: `
118 filegroup {
119 name: "fg",
120 srcs: ["prebuilt_file"],
121 }
122 prebuilt {
123 name: "bar",
124 prefer: true,
125 srcs: [":fg"],
126 }`,
127 prebuilt: []OsType{Android, buildOS},
128 },
129 {
130 name: "prebuilt module for device only",
131 modules: `
132 source {
133 name: "bar",
134 }
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000135
Colin Cross0c66bc62021-07-20 09:47:41 -0700136 prebuilt {
137 name: "bar",
138 host_supported: false,
139 prefer: true,
140 srcs: ["prebuilt_file"],
141 }`,
142 prebuilt: []OsType{Android},
143 },
144 {
145 name: "prebuilt file for host only",
146 modules: `
147 source {
148 name: "bar",
149 }
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700150
Colin Cross0c66bc62021-07-20 09:47:41 -0700151 prebuilt {
152 name: "bar",
153 prefer: true,
154 target: {
155 host: {
156 srcs: ["prebuilt_file"],
Liz Kammer69d64132021-06-24 13:03:06 -0400157 },
158 },
Colin Cross0c66bc62021-07-20 09:47:41 -0700159 }`,
160 prebuilt: []OsType{buildOS},
161 },
162 {
163 name: "prebuilt override not preferred",
164 modules: `
165 source {
166 name: "baz",
167 }
Paul Duffin0c52c7b2021-07-06 17:15:25 +0100168
Colin Cross0c66bc62021-07-20 09:47:41 -0700169 override_source {
170 name: "bar",
171 base: "baz",
172 }
Paul Duffin0c52c7b2021-07-06 17:15:25 +0100173
Colin Cross0c66bc62021-07-20 09:47:41 -0700174 prebuilt {
175 name: "bar",
176 prefer: false,
177 srcs: ["prebuilt_file"],
178 }`,
179 prebuilt: nil,
180 },
181 {
182 name: "prebuilt override preferred",
183 modules: `
184 source {
185 name: "baz",
186 }
Paul Duffin0c52c7b2021-07-06 17:15:25 +0100187
Colin Cross0c66bc62021-07-20 09:47:41 -0700188 override_source {
189 name: "bar",
190 base: "baz",
191 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700192
Colin Cross0c66bc62021-07-20 09:47:41 -0700193 prebuilt {
194 name: "bar",
195 prefer: true,
196 srcs: ["prebuilt_file"],
197 }`,
198 prebuilt: []OsType{Android, buildOS},
199 },
200 {
201 name: "prebuilt including default-disabled OS",
202 replaceBp: true,
203 modules: `
204 source {
205 name: "foo",
206 deps: [":bar"],
207 target: {
208 windows: {
209 enabled: true,
210 },
211 },
212 }
213
214 source {
215 name: "bar",
216 target: {
217 windows: {
218 enabled: true,
219 },
220 },
221 }
222
223 prebuilt {
224 name: "bar",
225 prefer: true,
226 srcs: ["prebuilt_file"],
227 target: {
228 windows: {
229 enabled: true,
230 },
231 },
232 }`,
233 prebuilt: []OsType{Android, buildOS, Windows},
234 },
235 {
236 name: "fall back to source for default-disabled OS",
237 replaceBp: true,
238 modules: `
239 source {
240 name: "foo",
241 deps: [":bar"],
242 target: {
243 windows: {
244 enabled: true,
245 },
246 },
247 }
248
249 source {
250 name: "bar",
251 target: {
252 windows: {
253 enabled: true,
254 },
255 },
256 }
257
258 prebuilt {
259 name: "bar",
260 prefer: true,
261 srcs: ["prebuilt_file"],
262 }`,
263 prebuilt: []OsType{Android, buildOS},
264 },
265 {
266 name: "prebuilt properties customizable",
267 replaceBp: true,
268 modules: `
269 source {
270 name: "foo",
271 deps: [":bar"],
272 }
273
274 soong_config_module_type {
275 name: "prebuilt_with_config",
276 module_type: "prebuilt",
277 config_namespace: "any_namespace",
278 bool_variables: ["bool_var"],
279 properties: ["prefer"],
280 }
281
282 prebuilt_with_config {
283 name: "bar",
284 prefer: true,
285 srcs: ["prebuilt_file"],
286 soong_config_variables: {
287 bool_var: {
288 prefer: false,
289 conditions_default: {
290 prefer: true,
291 },
292 },
293 },
294 }`,
295 prebuilt: []OsType{Android, buildOS},
296 },
Colin Cross0c66bc62021-07-20 09:47:41 -0700297 }
298
Paul Duffin35816122021-02-24 01:49:52 +0000299 fs := MockFS{
Colin Cross98be1bb2019-12-13 20:41:13 -0800300 "prebuilt_file": nil,
301 "source_file": nil,
302 }
Colin Cross0d614dd2016-10-14 15:38:43 -0700303
Colin Crossce75d2c2016-10-06 16:12:58 -0700304 for _, test := range prebuiltsTests {
305 t.Run(test.name, func(t *testing.T) {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100306 bp := test.modules
307 if !test.replaceBp {
308 bp = bp + `
309 source {
310 name: "foo",
311 deps: [":bar"],
312 }`
313 }
Colin Cross98be1bb2019-12-13 20:41:13 -0800314
Martin Stjernholmf4677322020-07-07 02:20:40 +0100315 // Add windows to the target list to test the logic when a variant is
316 // disabled by default.
317 if !Windows.DefaultDisabled {
318 t.Errorf("windows is assumed to be disabled by default")
319 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100320
Paul Duffin30ac3e72021-03-20 00:36:14 +0000321 result := GroupFixturePreparers(
Paul Duffin35816122021-02-24 01:49:52 +0000322 PrepareForTestWithArchMutator,
323 PrepareForTestWithPrebuilts,
324 PrepareForTestWithOverrides,
325 PrepareForTestWithFilegroup,
326 // Add a Windows target to the configuration.
327 FixtureModifyConfig(func(config Config) {
328 config.Targets[Windows] = []Target{
329 {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
330 }
331 }),
332 fs.AddToFixture(),
333 FixtureRegisterWithContext(registerTestPrebuiltModules),
Paul Duffin0c52c7b2021-07-06 17:15:25 +0100334 OptionalFixturePreparer(test.preparer),
Paul Duffin35816122021-02-24 01:49:52 +0000335 ).RunTestWithBp(t, bp)
Colin Crossce75d2c2016-10-06 16:12:58 -0700336
Paul Duffin35816122021-02-24 01:49:52 +0000337 for _, variant := range result.ModuleVariantsForTests("foo") {
338 foo := result.ModuleForTests("foo", variant)
Martin Stjernholmf4677322020-07-07 02:20:40 +0100339 t.Run(foo.Module().Target().Os.String(), func(t *testing.T) {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000340 var dependsOnSourceModule, dependsOnPrebuiltModule bool
Paul Duffin35816122021-02-24 01:49:52 +0000341 result.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000342 if _, ok := m.(*sourceModule); ok {
343 dependsOnSourceModule = true
344 }
345 if p, ok := m.(*prebuiltModule); ok {
346 dependsOnPrebuiltModule = true
347 if !p.Prebuilt().properties.UsePrebuilt {
348 t.Errorf("dependency on prebuilt module not marked used")
349 }
350 }
351 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700352
Cole Fausta963b942024-04-11 17:43:00 -0700353 moduleIsDisabled := !foo.Module().Enabled(PanickingConfigAndErrorContext(result.TestContext))
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000354 deps := foo.Module().(*sourceModule).deps
Martin Stjernholmf4677322020-07-07 02:20:40 +0100355 if moduleIsDisabled {
356 if len(deps) > 0 {
357 t.Errorf("disabled module got deps: %v", deps)
358 }
359 } else {
360 if len(deps) != 1 {
361 t.Errorf("deps does not have single path, but is %v", deps)
362 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700363 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100364
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000365 var usingSourceFile, usingPrebuiltFile bool
Martin Stjernholmf4677322020-07-07 02:20:40 +0100366 if len(deps) > 0 && deps[0].String() == "source_file" {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000367 usingSourceFile = true
368 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100369 if len(deps) > 0 && deps[0].String() == "prebuilt_file" {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000370 usingPrebuiltFile = true
371 }
Colin Crossc3e7fa62017-03-17 13:14:32 -0700372
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000373 prebuilt := false
374 for _, os := range test.prebuilt {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100375 if os == foo.Module().Target().Os {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000376 prebuilt = true
377 }
378 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900379
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000380 if prebuilt {
Martin Stjernholmf4677322020-07-07 02:20:40 +0100381 if moduleIsDisabled {
382 t.Errorf("dependent module for prebuilt is disabled")
383 }
384
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000385 if !dependsOnPrebuiltModule {
386 t.Errorf("doesn't depend on prebuilt module")
387 }
388 if !usingPrebuiltFile {
389 t.Errorf("doesn't use prebuilt_file")
390 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700391
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000392 if dependsOnSourceModule {
393 t.Errorf("depends on source module")
394 }
395 if usingSourceFile {
396 t.Errorf("using source_file")
397 }
Martin Stjernholmf4677322020-07-07 02:20:40 +0100398 } else if !moduleIsDisabled {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000399 if dependsOnPrebuiltModule {
400 t.Errorf("depends on prebuilt module")
401 }
402 if usingPrebuiltFile {
403 t.Errorf("using prebuilt_file")
404 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700405
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000406 if !dependsOnSourceModule {
407 t.Errorf("doesn't depend on source module")
408 }
409 if !usingSourceFile {
410 t.Errorf("doesn't use source_file")
411 }
412 }
413 })
Colin Crossce75d2c2016-10-06 16:12:58 -0700414 }
415 })
416 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700417}
418
Spandan Dase3fcb412023-10-26 20:48:02 +0000419func testPrebuiltErrorWithFixture(t *testing.T, expectedError, bp string, fixture FixturePreparer) {
Jooyung Hanebaa5732023-05-02 11:43:14 +0900420 t.Helper()
421 fs := MockFS{
422 "prebuilt_file": nil,
423 }
424 GroupFixturePreparers(
425 PrepareForTestWithArchMutator,
426 PrepareForTestWithPrebuilts,
427 PrepareForTestWithOverrides,
428 fs.AddToFixture(),
429 FixtureRegisterWithContext(registerTestPrebuiltModules),
Spandan Dase3fcb412023-10-26 20:48:02 +0000430 OptionalFixturePreparer(fixture),
Jooyung Hanebaa5732023-05-02 11:43:14 +0900431 ).
432 ExtendWithErrorHandler(FixtureExpectsAtLeastOneErrorMatchingPattern(expectedError)).
433 RunTestWithBp(t, bp)
Spandan Dase3fcb412023-10-26 20:48:02 +0000434
435}
436
437func testPrebuiltError(t *testing.T, expectedError, bp string) {
438 testPrebuiltErrorWithFixture(t, expectedError, bp, nil)
Jooyung Hanebaa5732023-05-02 11:43:14 +0900439}
440
441func TestPrebuiltShouldNotChangePartition(t *testing.T) {
442 testPrebuiltError(t, `partition is different`, `
443 source {
444 name: "foo",
445 vendor: true,
446 }
447 prebuilt {
448 name: "foo",
449 prefer: true,
450 srcs: ["prebuilt_file"],
451 }`)
452}
453
454func TestPrebuiltShouldNotChangePartition_WithOverride(t *testing.T) {
455 testPrebuiltError(t, `partition is different`, `
456 source {
457 name: "foo",
458 vendor: true,
459 }
460 override_source {
461 name: "bar",
462 base: "foo",
463 }
464 prebuilt {
465 name: "bar",
466 prefer: true,
467 srcs: ["prebuilt_file"],
468 }`)
469}
470
Paul Duffin78ac5b92020-01-14 12:42:08 +0000471func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
Paul Duffin35816122021-02-24 01:49:52 +0000472 registerTestPrebuiltModules(ctx)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000473
474 RegisterPrebuiltMutators(ctx)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700475 ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
Paul Duffin78ac5b92020-01-14 12:42:08 +0000476}
477
Paul Duffincfd33742021-02-27 11:59:02 +0000478var prepareForTestWithFakePrebuiltModules = FixtureRegisterWithContext(registerTestPrebuiltModules)
479
Paul Duffin35816122021-02-24 01:49:52 +0000480func registerTestPrebuiltModules(ctx RegistrationContext) {
481 ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
482 ctx.RegisterModuleType("source", newSourceModule)
483 ctx.RegisterModuleType("override_source", newOverrideSourceModule)
Jingwen Chena47f28d2021-11-02 16:43:57 +0000484 ctx.RegisterModuleType("soong_config_module_type", SoongConfigModuleTypeFactory)
485 ctx.RegisterModuleType("soong_config_string_variable", SoongConfigStringVariableDummyFactory)
486 ctx.RegisterModuleType("soong_config_bool_variable", SoongConfigBoolVariableDummyFactory)
Spandan Dase3fcb412023-10-26 20:48:02 +0000487 RegisterApexContributionsBuildComponents(ctx)
Paul Duffin35816122021-02-24 01:49:52 +0000488}
489
Colin Crossce75d2c2016-10-06 16:12:58 -0700490type prebuiltModule struct {
491 ModuleBase
Colin Cross74d73e22017-08-02 11:05:49 -0700492 prebuilt Prebuilt
493 properties struct {
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000494 Srcs []string `android:"path,arch_variant"`
Colin Cross74d73e22017-08-02 11:05:49 -0700495 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700496}
497
Colin Cross36242852017-06-23 15:06:31 -0700498func newPrebuiltModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700499 m := &prebuiltModule{}
Colin Cross74d73e22017-08-02 11:05:49 -0700500 m.AddProperties(&m.properties)
501 InitPrebuiltModule(m, &m.properties.Srcs)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000502 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Colin Cross36242852017-06-23 15:06:31 -0700503 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700504}
505
506func (p *prebuiltModule) Name() string {
507 return p.prebuilt.Name(p.ModuleBase.Name())
508}
509
Jiyong Parkd4671112019-04-19 17:23:04 +0900510func (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
mrziwang01715ca2024-07-01 11:50:18 -0700511 var src Path
Jiyong Parkd4671112019-04-19 17:23:04 +0900512 if len(p.properties.Srcs) >= 1 {
mrziwang01715ca2024-07-01 11:50:18 -0700513 src = p.prebuilt.SingleSourcePath(ctx)
Jiyong Parkd4671112019-04-19 17:23:04 +0900514 }
mrziwang01715ca2024-07-01 11:50:18 -0700515 ctx.SetOutputFiles(Paths{src}, "")
Colin Crossce75d2c2016-10-06 16:12:58 -0700516}
517
518func (p *prebuiltModule) Prebuilt() *Prebuilt {
519 return &p.prebuilt
520}
521
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700522type sourceModuleProperties struct {
523 Deps []string `android:"path,arch_variant"`
524}
525
Colin Crossce75d2c2016-10-06 16:12:58 -0700526type sourceModule struct {
527 ModuleBase
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700528 OverridableModuleBase
529
530 properties sourceModuleProperties
Colin Crossce75d2c2016-10-06 16:12:58 -0700531 dependsOnSourceModule, dependsOnPrebuiltModule bool
Jiyong Parkd4671112019-04-19 17:23:04 +0900532 deps Paths
533 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700534}
535
Colin Cross36242852017-06-23 15:06:31 -0700536func newSourceModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700537 m := &sourceModule{}
Colin Cross36242852017-06-23 15:06:31 -0700538 m.AddProperties(&m.properties)
Martin Stjernholm009a9dc2020-03-05 17:34:13 +0000539 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700540 InitOverridableModule(m, nil)
Colin Cross36242852017-06-23 15:06:31 -0700541 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700542}
543
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700544func (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900545 // s.properties.Deps are annotated with android:path, so they are
546 // automatically added to the dependency by pathDeps mutator
Colin Crossce75d2c2016-10-06 16:12:58 -0700547}
548
549func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900550 s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
551 s.src = PathForModuleSrc(ctx, "source_file")
552}
553
554func (s *sourceModule) Srcs() Paths {
555 return Paths{s.src}
Colin Crossce75d2c2016-10-06 16:12:58 -0700556}
Jaewoong Jungfb25a642020-06-11 10:37:51 -0700557
558type overrideSourceModule struct {
559 ModuleBase
560 OverrideModuleBase
561}
562
563func (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
564}
565
566func newOverrideSourceModule() Module {
567 m := &overrideSourceModule{}
568 m.AddProperties(&sourceModuleProperties{})
569
570 InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
571 InitOverrideModule(m)
572 return m
573}
Spandan Dase3fcb412023-10-26 20:48:02 +0000574
575func TestPrebuiltErrorCannotListBothSourceAndPrebuiltInContributions(t *testing.T) {
576 selectMainlineModuleContritbutions := GroupFixturePreparers(
Colin Crossa66b4632024-08-08 15:50:47 -0700577 PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "my_apex_contributions"),
Spandan Dase3fcb412023-10-26 20:48:02 +0000578 )
Spandan Das3576e762024-01-03 18:57:03 +0000579 testPrebuiltErrorWithFixture(t, `Found duplicate variations of the same module in apex_contributions: foo and prebuilt_foo. Please remove one of these`, `
Spandan Dase3fcb412023-10-26 20:48:02 +0000580 source {
581 name: "foo",
582 }
583 prebuilt {
584 name: "foo",
585 srcs: ["prebuilt_file"],
586 }
587 apex_contributions {
588 name: "my_apex_contributions",
589 api_domain: "my_mainline_module",
590 contents: [
591 "foo",
592 "prebuilt_foo",
593 ],
594 }
595 all_apex_contributions {
596 name: "all_apex_contributions",
597 }
598 `, selectMainlineModuleContritbutions)
599}