blob: 4e63d1995e58cc20bce8b92e88c0548dc0a62bb0 [file] [log] [blame]
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxf5a3eac2021-08-23 17:05:17 +00001// Copyright 2021 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
Liz Kammer2dd9ca42020-11-25 16:06:39 -080015package bp2build
16
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux0da7ce62021-08-23 17:04:20 +000017/*
18For shareable/common bp2build testing functionality and dumping ground for
19specific-but-shared functionality among tests in package
20*/
21
Liz Kammer2dd9ca42020-11-25 16:06:39 -080022import (
Liz Kammer7a210ac2021-09-22 15:52:58 -040023 "fmt"
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000024 "strings"
Rupert Shuttleworth06559d02021-05-19 09:14:26 -040025 "testing"
26
Spandan Das5af0bd32022-09-28 20:43:08 +000027 "github.com/google/blueprint/proptools"
28
Liz Kammer2dd9ca42020-11-25 16:06:39 -080029 "android/soong/android"
Sam Delmerico24c56032022-03-28 19:53:03 +000030 "android/soong/android/allowlists"
Jingwen Chen73850672020-12-14 08:25:34 -050031 "android/soong/bazel"
Liz Kammer2dd9ca42020-11-25 16:06:39 -080032)
33
Jingwen Chen91220d72021-03-24 02:18:33 -040034var (
Rupert Shuttleworth06559d02021-05-19 09:14:26 -040035 buildDir string
Jingwen Chen91220d72021-03-24 02:18:33 -040036)
37
Jingwen Chen5146ac02021-09-02 11:44:42 +000038func checkError(t *testing.T, errs []error, expectedErr error) bool {
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000039 t.Helper()
Jingwen Chen5146ac02021-09-02 11:44:42 +000040
Jingwen Chen5146ac02021-09-02 11:44:42 +000041 if len(errs) != 1 {
Liz Kammer6eff3232021-08-26 08:37:59 -040042 return false
Jingwen Chen5146ac02021-09-02 11:44:42 +000043 }
Liz Kammer54309532021-12-14 12:21:22 -050044 if strings.Contains(errs[0].Error(), expectedErr.Error()) {
Jingwen Chen5146ac02021-09-02 11:44:42 +000045 return true
46 }
47
48 return false
49}
50
Sam Delmerico3177a6e2022-06-21 19:28:33 +000051func errored(t *testing.T, tc Bp2buildTestCase, errs []error) bool {
Jingwen Chen5146ac02021-09-02 11:44:42 +000052 t.Helper()
Sam Delmerico3177a6e2022-06-21 19:28:33 +000053 if tc.ExpectedErr != nil {
Jingwen Chen5146ac02021-09-02 11:44:42 +000054 // Rely on checkErrors, as this test case is expected to have an error.
55 return false
56 }
57
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000058 if len(errs) > 0 {
59 for _, err := range errs {
Sam Delmerico3177a6e2022-06-21 19:28:33 +000060 t.Errorf("%s: %s", tc.Description, err)
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000061 }
62 return true
63 }
Jingwen Chen5146ac02021-09-02 11:44:42 +000064
65 // All good, continue execution.
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000066 return false
67}
68
Trevor Radcliffe1b4b2d92022-09-01 18:57:01 +000069func RunBp2BuildTestCaseSimple(t *testing.T, tc Bp2buildTestCase) {
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000070 t.Helper()
Sam Delmerico3177a6e2022-06-21 19:28:33 +000071 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {}, tc)
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000072}
73
Sam Delmerico3177a6e2022-06-21 19:28:33 +000074type Bp2buildTestCase struct {
75 Description string
76 ModuleTypeUnderTest string
77 ModuleTypeUnderTestFactory android.ModuleFactory
78 Blueprint string
79 ExpectedBazelTargets []string
80 Filesystem map[string]string
81 Dir string
Trevor Radcliffe58ea4512022-04-07 20:36:39 +000082 // An error with a string contained within the string of the expected error
Sam Delmerico3177a6e2022-06-21 19:28:33 +000083 ExpectedErr error
84 UnconvertedDepsMode unconvertedDepsMode
Jingwen Chen0eeaeb82022-09-21 10:27:42 +000085
86 // For every directory listed here, the BUILD file for that directory will
87 // be merged with the generated BUILD file. This allows custom BUILD targets
88 // to be used in tests, or use BUILD files to draw package boundaries.
89 KeepBuildFileForDirs []string
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000090}
91
Sam Delmerico3177a6e2022-06-21 19:28:33 +000092func RunBp2BuildTestCase(t *testing.T, registerModuleTypes func(ctx android.RegistrationContext), tc Bp2buildTestCase) {
Liz Kammerffc17e42022-11-23 09:42:05 -050093 t.Helper()
Spandan Das5af0bd32022-09-28 20:43:08 +000094 bp2buildSetup := func(ctx *android.TestContext) {
95 registerModuleTypes(ctx)
96 ctx.RegisterForBazelConversion()
97 }
98 runBp2BuildTestCaseWithSetup(t, bp2buildSetup, tc)
99}
100
101func RunApiBp2BuildTestCase(t *testing.T, registerModuleTypes func(ctx android.RegistrationContext), tc Bp2buildTestCase) {
Liz Kammerffc17e42022-11-23 09:42:05 -0500102 t.Helper()
Spandan Das5af0bd32022-09-28 20:43:08 +0000103 apiBp2BuildSetup := func(ctx *android.TestContext) {
104 registerModuleTypes(ctx)
105 ctx.RegisterForApiBazelConversion()
106 }
107 runBp2BuildTestCaseWithSetup(t, apiBp2BuildSetup, tc)
108}
109
110func runBp2BuildTestCaseWithSetup(t *testing.T, setup func(ctx *android.TestContext), tc Bp2buildTestCase) {
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000111 t.Helper()
112 dir := "."
113 filesystem := make(map[string][]byte)
114 toParse := []string{
115 "Android.bp",
116 }
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000117 for f, content := range tc.Filesystem {
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000118 if strings.HasSuffix(f, "Android.bp") {
119 toParse = append(toParse, f)
120 }
121 filesystem[f] = []byte(content)
122 }
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000123 config := android.TestConfig(buildDir, nil, tc.Blueprint, filesystem)
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000124 ctx := android.NewTestContext(config)
125
Spandan Das5af0bd32022-09-28 20:43:08 +0000126 setup(ctx)
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000127 ctx.RegisterModuleType(tc.ModuleTypeUnderTest, tc.ModuleTypeUnderTestFactory)
Jingwen Chen0eeaeb82022-09-21 10:27:42 +0000128
129 // A default configuration for tests to not have to specify bp2build_available on top level targets.
130 bp2buildConfig := android.NewBp2BuildAllowlist().SetDefaultConfig(
131 allowlists.Bp2BuildConfig{
132 android.Bp2BuildTopLevel: allowlists.Bp2BuildDefaultTrueRecursively,
133 },
134 )
135 for _, f := range tc.KeepBuildFileForDirs {
136 bp2buildConfig.SetKeepExistingBuildFile(map[string]bool{
137 f: /*recursive=*/ false,
138 })
139 }
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000140 ctx.RegisterBp2BuildConfig(bp2buildConfig)
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000141
Jingwen Chen5146ac02021-09-02 11:44:42 +0000142 _, parseErrs := ctx.ParseFileList(dir, toParse)
143 if errored(t, tc, parseErrs) {
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000144 return
145 }
Jingwen Chen5146ac02021-09-02 11:44:42 +0000146 _, resolveDepsErrs := ctx.ResolveDependencies(config)
147 if errored(t, tc, resolveDepsErrs) {
148 return
149 }
150
Cole Faustb09da7e2022-05-18 10:57:33 -0700151 parseAndResolveErrs := append(parseErrs, resolveDepsErrs...)
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000152 if tc.ExpectedErr != nil && checkError(t, parseAndResolveErrs, tc.ExpectedErr) {
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000153 return
154 }
155
156 checkDir := dir
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000157 if tc.Dir != "" {
158 checkDir = tc.Dir
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000159 }
Paul Duffinc6390592022-11-04 13:35:21 +0000160 codegenCtx := NewCodegenContext(config, ctx.Context, Bp2Build)
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000161 codegenCtx.unconvertedDepMode = tc.UnconvertedDepsMode
Liz Kammer6eff3232021-08-26 08:37:59 -0400162 bazelTargets, errs := generateBazelTargetsForDir(codegenCtx, checkDir)
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000163 if tc.ExpectedErr != nil {
164 if checkError(t, errs, tc.ExpectedErr) {
Liz Kammer54309532021-12-14 12:21:22 -0500165 return
166 } else {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000167 t.Errorf("Expected error: %q, got: %q and %q", tc.ExpectedErr, errs, parseAndResolveErrs)
Liz Kammer54309532021-12-14 12:21:22 -0500168 }
Liz Kammer6eff3232021-08-26 08:37:59 -0400169 } else {
170 android.FailIfErrored(t, errs)
171 }
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000172 if actualCount, expectedCount := len(bazelTargets), len(tc.ExpectedBazelTargets); actualCount != expectedCount {
Sasha Smundak9d2f1742022-08-04 13:28:38 -0700173 t.Errorf("%s: Expected %d bazel target (%s), got %d (%s)",
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000174 tc.Description, expectedCount, tc.ExpectedBazelTargets, actualCount, bazelTargets)
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000175 } else {
176 for i, target := range bazelTargets {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000177 if w, g := tc.ExpectedBazelTargets[i], target.content; w != g {
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000178 t.Errorf(
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux447f6c92021-08-31 20:30:36 +0000179 "%s: Expected generated Bazel target to be `%s`, got `%s`",
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000180 tc.Description, w, g)
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +0000181 }
182 }
183 }
184}
185
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800186type nestedProps struct {
Liz Kammer46fb7ab2021-12-01 10:09:34 -0500187 Nested_prop *string
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800188}
189
Liz Kammer32a03392021-09-14 11:17:21 -0400190type EmbeddedProps struct {
Liz Kammer46fb7ab2021-12-01 10:09:34 -0500191 Embedded_prop *string
Liz Kammer32a03392021-09-14 11:17:21 -0400192}
193
194type OtherEmbeddedProps struct {
Liz Kammer46fb7ab2021-12-01 10:09:34 -0500195 Other_embedded_prop *string
Liz Kammer32a03392021-09-14 11:17:21 -0400196}
197
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800198type customProps struct {
Liz Kammer32a03392021-09-14 11:17:21 -0400199 EmbeddedProps
200 *OtherEmbeddedProps
201
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800202 Bool_prop bool
203 Bool_ptr_prop *bool
204 // Ensure that properties tagged `blueprint:mutated` are omitted
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000205 Int_prop int `blueprint:"mutated"`
206 Int64_ptr_prop *int64
207 String_prop string
208 String_literal_prop *string `android:"arch_variant"`
209 String_ptr_prop *string
210 String_list_prop []string
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800211
212 Nested_props nestedProps
213 Nested_props_ptr *nestedProps
Liz Kammer4562a3b2021-04-21 18:15:34 -0400214
Liz Kammer32b77cf2021-08-04 15:17:02 -0400215 Arch_paths []string `android:"path,arch_variant"`
216 Arch_paths_exclude []string `android:"path,arch_variant"`
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400217
218 // Prop used to indicate this conversion should be 1 module -> multiple targets
219 One_to_many_prop *bool
Spandan Das5af0bd32022-09-28 20:43:08 +0000220
221 Api *string // File describing the APIs of this module
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800222}
223
224type customModule struct {
225 android.ModuleBase
Liz Kammerea6666f2021-02-17 10:17:28 -0500226 android.BazelModuleBase
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800227
228 props customProps
229}
230
231// OutputFiles is needed because some instances of this module use dist with a
232// tag property which requires the module implements OutputFileProducer.
233func (m *customModule) OutputFiles(tag string) (android.Paths, error) {
234 return android.PathsForTesting("path" + tag), nil
235}
236
237func (m *customModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
238 // nothing for now.
239}
240
241func customModuleFactoryBase() android.Module {
242 module := &customModule{}
243 module.AddProperties(&module.props)
Liz Kammerea6666f2021-02-17 10:17:28 -0500244 android.InitBazelModule(module)
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800245 return module
246}
247
Liz Kammerdfeb1202022-05-13 17:20:20 -0400248func customModuleFactoryHostAndDevice() android.Module {
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800249 m := customModuleFactoryBase()
Liz Kammer4562a3b2021-04-21 18:15:34 -0400250 android.InitAndroidArchModule(m, android.HostAndDeviceSupported, android.MultilibBoth)
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800251 return m
252}
253
Liz Kammerdfeb1202022-05-13 17:20:20 -0400254func customModuleFactoryDeviceSupported() android.Module {
255 m := customModuleFactoryBase()
256 android.InitAndroidArchModule(m, android.DeviceSupported, android.MultilibBoth)
257 return m
258}
259
260func customModuleFactoryHostSupported() android.Module {
261 m := customModuleFactoryBase()
262 android.InitAndroidArchModule(m, android.HostSupported, android.MultilibBoth)
263 return m
264}
265
266func customModuleFactoryHostAndDeviceDefault() android.Module {
267 m := customModuleFactoryBase()
268 android.InitAndroidArchModule(m, android.HostAndDeviceDefault, android.MultilibBoth)
269 return m
270}
271
272func customModuleFactoryNeitherHostNorDeviceSupported() android.Module {
273 m := customModuleFactoryBase()
274 android.InitAndroidArchModule(m, android.NeitherHostNorDeviceSupported, android.MultilibBoth)
275 return m
276}
277
Liz Kammer2dd9ca42020-11-25 16:06:39 -0800278type testProps struct {
279 Test_prop struct {
280 Test_string_prop string
281 }
282}
283
284type customTestModule struct {
285 android.ModuleBase
286
287 props customProps
288 test_props testProps
289}
290
291func (m *customTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
292 // nothing for now.
293}
294
295func customTestModuleFactoryBase() android.Module {
296 m := &customTestModule{}
297 m.AddProperties(&m.props)
298 m.AddProperties(&m.test_props)
299 return m
300}
301
302func customTestModuleFactory() android.Module {
303 m := customTestModuleFactoryBase()
304 android.InitAndroidModule(m)
305 return m
306}
307
308type customDefaultsModule struct {
309 android.ModuleBase
310 android.DefaultsModuleBase
311}
312
313func customDefaultsModuleFactoryBase() android.DefaultsModule {
314 module := &customDefaultsModule{}
315 module.AddProperties(&customProps{})
316 return module
317}
318
319func customDefaultsModuleFactoryBasic() android.Module {
320 return customDefaultsModuleFactoryBase()
321}
322
323func customDefaultsModuleFactory() android.Module {
324 m := customDefaultsModuleFactoryBase()
325 android.InitDefaultsModule(m)
326 return m
327}
Jingwen Chen73850672020-12-14 08:25:34 -0500328
Liz Kammer32a03392021-09-14 11:17:21 -0400329type EmbeddedAttr struct {
Liz Kammer46fb7ab2021-12-01 10:09:34 -0500330 Embedded_attr *string
Liz Kammer32a03392021-09-14 11:17:21 -0400331}
332
333type OtherEmbeddedAttr struct {
Liz Kammer46fb7ab2021-12-01 10:09:34 -0500334 Other_embedded_attr *string
Liz Kammer32a03392021-09-14 11:17:21 -0400335}
336
Jingwen Chen73850672020-12-14 08:25:34 -0500337type customBazelModuleAttributes struct {
Liz Kammer32a03392021-09-14 11:17:21 -0400338 EmbeddedAttr
339 *OtherEmbeddedAttr
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000340 String_literal_prop bazel.StringAttribute
341 String_ptr_prop *string
342 String_list_prop []string
343 Arch_paths bazel.LabelListAttribute
Spandan Das5af0bd32022-09-28 20:43:08 +0000344 Api bazel.LabelAttribute
Jingwen Chen73850672020-12-14 08:25:34 -0500345}
346
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400347func (m *customModule) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400348 if p := m.props.One_to_many_prop; p != nil && *p {
349 customBp2buildOneToMany(ctx, m)
350 return
351 }
Liz Kammer4562a3b2021-04-21 18:15:34 -0400352
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000353 paths := bazel.LabelListAttribute{}
354 strAttr := bazel.StringAttribute{}
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400355 for axis, configToProps := range m.GetArchVariantProperties(ctx, &customProps{}) {
356 for config, props := range configToProps {
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000357 if custProps, ok := props.(*customProps); ok {
358 if custProps.Arch_paths != nil {
359 paths.SetSelectValue(axis, config, android.BazelLabelForModuleSrcExcludes(ctx, custProps.Arch_paths, custProps.Arch_paths_exclude))
360 }
361 if custProps.String_literal_prop != nil {
362 strAttr.SetSelectValue(axis, config, custProps.String_literal_prop)
363 }
Liz Kammer4562a3b2021-04-21 18:15:34 -0400364 }
365 }
Jingwen Chen73850672020-12-14 08:25:34 -0500366 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400367
368 paths.ResolveExcludes()
369
370 attrs := &customBazelModuleAttributes{
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000371 String_literal_prop: strAttr,
372 String_ptr_prop: m.props.String_ptr_prop,
373 String_list_prop: m.props.String_list_prop,
374 Arch_paths: paths,
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400375 }
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux3a019a62022-06-23 16:02:44 +0000376
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400377 attrs.Embedded_attr = m.props.Embedded_prop
378 if m.props.OtherEmbeddedProps != nil {
379 attrs.OtherEmbeddedAttr = &OtherEmbeddedAttr{Other_embedded_attr: m.props.OtherEmbeddedProps.Other_embedded_prop}
380 }
381
382 props := bazel.BazelTargetModuleProperties{
383 Rule_class: "custom",
384 }
385
386 ctx.CreateBazelTargetModule(props, android.CommonAttributes{Name: m.Name()}, attrs)
Jingwen Chen73850672020-12-14 08:25:34 -0500387}
Jingwen Chen40067de2021-01-26 21:58:43 -0500388
Spandan Das5af0bd32022-09-28 20:43:08 +0000389var _ android.ApiProvider = (*customModule)(nil)
390
391func (c *customModule) ConvertWithApiBp2build(ctx android.TopDownMutatorContext) {
392 props := bazel.BazelTargetModuleProperties{
393 Rule_class: "custom_api_contribution",
394 }
395 apiAttribute := bazel.MakeLabelAttribute(
396 android.BazelLabelForModuleSrcSingle(ctx, proptools.String(c.props.Api)).Label,
397 )
398 attrs := &customBazelModuleAttributes{
399 Api: *apiAttribute,
400 }
401 ctx.CreateBazelTargetModule(props,
402 android.CommonAttributes{Name: c.Name()},
403 attrs)
404}
405
Jingwen Chen40067de2021-01-26 21:58:43 -0500406// A bp2build mutator that uses load statements and creates a 1:M mapping from
407// module to target.
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400408func customBp2buildOneToMany(ctx android.TopDownMutatorContext, m *customModule) {
Jingwen Chen77e8b7b2021-02-05 03:03:24 -0500409
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400410 baseName := m.Name()
411 attrs := &customBazelModuleAttributes{}
Jingwen Chen1fd14692021-02-05 03:01:50 -0500412
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400413 myLibraryProps := bazel.BazelTargetModuleProperties{
414 Rule_class: "my_library",
415 Bzl_load_location: "//build/bazel/rules:rules.bzl",
Jingwen Chen40067de2021-01-26 21:58:43 -0500416 }
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400417 ctx.CreateBazelTargetModule(myLibraryProps, android.CommonAttributes{Name: baseName}, attrs)
418
419 protoLibraryProps := bazel.BazelTargetModuleProperties{
420 Rule_class: "proto_library",
421 Bzl_load_location: "//build/bazel/rules:proto.bzl",
422 }
423 ctx.CreateBazelTargetModule(protoLibraryProps, android.CommonAttributes{Name: baseName + "_proto_library_deps"}, attrs)
424
425 myProtoLibraryProps := bazel.BazelTargetModuleProperties{
426 Rule_class: "my_proto_library",
427 Bzl_load_location: "//build/bazel/rules:proto.bzl",
428 }
429 ctx.CreateBazelTargetModule(myProtoLibraryProps, android.CommonAttributes{Name: baseName + "_my_proto_library_deps"}, attrs)
Jingwen Chen40067de2021-01-26 21:58:43 -0500430}
Jingwen Chenba369ad2021-02-22 10:19:34 -0500431
432// Helper method for tests to easily access the targets in a dir.
Liz Kammer6eff3232021-08-26 08:37:59 -0400433func generateBazelTargetsForDir(codegenCtx *CodegenContext, dir string) (BazelTargets, []error) {
Rupert Shuttleworth2a4fc3e2021-04-21 07:10:09 -0400434 // TODO: Set generateFilegroups to true and/or remove the generateFilegroups argument completely
Liz Kammer6eff3232021-08-26 08:37:59 -0400435 res, err := GenerateBazelTargets(codegenCtx, false)
Alix94e26032022-08-16 20:37:33 +0000436 if err != nil {
437 return BazelTargets{}, err
438 }
Liz Kammer6eff3232021-08-26 08:37:59 -0400439 return res.buildFileToTargets[dir], err
Jingwen Chenba369ad2021-02-22 10:19:34 -0500440}
Liz Kammer32b77cf2021-08-04 15:17:02 -0400441
442func registerCustomModuleForBp2buildConversion(ctx *android.TestContext) {
Liz Kammerdfeb1202022-05-13 17:20:20 -0400443 ctx.RegisterModuleType("custom", customModuleFactoryHostAndDevice)
Liz Kammer32b77cf2021-08-04 15:17:02 -0400444 ctx.RegisterForBazelConversion()
445}
Liz Kammer7a210ac2021-09-22 15:52:58 -0400446
447func simpleModuleDoNotConvertBp2build(typ, name string) string {
448 return fmt.Sprintf(`
449%s {
450 name: "%s",
451 bazel_module: { bp2build_available: false },
452}`, typ, name)
453}
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500454
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000455type AttrNameToString map[string]string
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500456
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000457func (a AttrNameToString) clone() AttrNameToString {
458 newAttrs := make(AttrNameToString, len(a))
Liz Kammerdfeb1202022-05-13 17:20:20 -0400459 for k, v := range a {
460 newAttrs[k] = v
461 }
462 return newAttrs
463}
464
465// makeBazelTargetNoRestrictions returns bazel target build file definition that can be host or
466// device specific, or independent of host/device.
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000467func makeBazelTargetHostOrDevice(typ, name string, attrs AttrNameToString, hod android.HostOrDeviceSupported) string {
Liz Kammerdfeb1202022-05-13 17:20:20 -0400468 if _, ok := attrs["target_compatible_with"]; !ok {
469 switch hod {
470 case android.HostSupported:
471 attrs["target_compatible_with"] = `select({
472 "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
473 "//conditions:default": [],
474 })`
475 case android.DeviceSupported:
476 attrs["target_compatible_with"] = `["//build/bazel/platforms/os:android"]`
477 }
478 }
479
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500480 attrStrings := make([]string, 0, len(attrs)+1)
Sasha Smundakfb589492022-08-04 11:13:27 -0700481 if name != "" {
482 attrStrings = append(attrStrings, fmt.Sprintf(` name = "%s",`, name))
483 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500484 for _, k := range android.SortedStringKeys(attrs) {
485 attrStrings = append(attrStrings, fmt.Sprintf(" %s = %s,", k, attrs[k]))
486 }
487 return fmt.Sprintf(`%s(
488%s
489)`, typ, strings.Join(attrStrings, "\n"))
490}
Liz Kammerdfeb1202022-05-13 17:20:20 -0400491
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000492// MakeBazelTargetNoRestrictions returns bazel target build file definition that does not add a
Liz Kammerdfeb1202022-05-13 17:20:20 -0400493// target_compatible_with. This is useful for module types like filegroup and genrule that arch not
494// arch variant
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000495func MakeBazelTargetNoRestrictions(typ, name string, attrs AttrNameToString) string {
Liz Kammerdfeb1202022-05-13 17:20:20 -0400496 return makeBazelTargetHostOrDevice(typ, name, attrs, android.HostAndDeviceDefault)
497}
498
499// makeBazelTargetNoRestrictions returns bazel target build file definition that is device specific
500// as this is the most common default in Soong.
Alixe06d75b2022-08-31 18:28:19 +0000501func MakeBazelTarget(typ, name string, attrs AttrNameToString) string {
Liz Kammerdfeb1202022-05-13 17:20:20 -0400502 return makeBazelTargetHostOrDevice(typ, name, attrs, android.DeviceSupported)
503}
Sasha Smundak9d2f1742022-08-04 13:28:38 -0700504
505type ExpectedRuleTarget struct {
506 Rule string
507 Name string
508 Attrs AttrNameToString
509 Hod android.HostOrDeviceSupported
510}
511
512func (ebr ExpectedRuleTarget) String() string {
513 return makeBazelTargetHostOrDevice(ebr.Rule, ebr.Name, ebr.Attrs, ebr.Hod)
514}
Trevor Radcliffe087af542022-09-16 15:36:10 +0000515
516func makeCcStubSuiteTargets(name string, attrs AttrNameToString) string {
517 if _, hasStubs := attrs["stubs_symbol_file"]; !hasStubs {
518 return ""
519 }
520 STUB_SUITE_ATTRS := map[string]string{
521 "stubs_symbol_file": "symbol_file",
522 "stubs_versions": "versions",
523 "soname": "soname",
524 "source_library": "source_library",
525 }
526
527 stubSuiteAttrs := AttrNameToString{}
528 for key, _ := range attrs {
529 if _, stubSuiteAttr := STUB_SUITE_ATTRS[key]; stubSuiteAttr {
530 stubSuiteAttrs[STUB_SUITE_ATTRS[key]] = attrs[key]
531 }
532 }
533 return MakeBazelTarget("cc_stub_suite", name+"_stub_libs", stubSuiteAttrs)
534}
Alix341484b2022-10-31 19:08:18 +0000535
536func MakeNeverlinkDuplicateTarget(moduleType string, name string) string {
537 return MakeBazelTarget(moduleType, name+"-neverlink", AttrNameToString{
538 "neverlink": `True`,
539 "exports": `[":` + name + `"]`,
540 })
541}