blob: faf1a443e69d7521129862b68ec2d2e784e3a86d [file] [log] [blame]
Liz Kammer2dd9ca42020-11-25 16:06:39 -08001package bp2build
2
3import (
Rupert Shuttleworth06559d02021-05-19 09:14:26 -04004 "testing"
5
Liz Kammer2dd9ca42020-11-25 16:06:39 -08006 "android/soong/android"
Jingwen Chen73850672020-12-14 08:25:34 -05007 "android/soong/bazel"
Liz Kammer2dd9ca42020-11-25 16:06:39 -08008)
9
Jingwen Chen91220d72021-03-24 02:18:33 -040010var (
11 // A default configuration for tests to not have to specify bp2build_available on top level targets.
12 bp2buildConfig = android.Bp2BuildConfig{
13 android.BP2BUILD_TOPLEVEL: android.Bp2BuildDefaultTrueRecursively,
14 }
Rupert Shuttleworth06559d02021-05-19 09:14:26 -040015
16 buildDir string
Jingwen Chen91220d72021-03-24 02:18:33 -040017)
18
Liz Kammer2dd9ca42020-11-25 16:06:39 -080019type nestedProps struct {
20 Nested_prop string
21}
22
23type customProps struct {
24 Bool_prop bool
25 Bool_ptr_prop *bool
26 // Ensure that properties tagged `blueprint:mutated` are omitted
27 Int_prop int `blueprint:"mutated"`
28 Int64_ptr_prop *int64
29 String_prop string
30 String_ptr_prop *string
31 String_list_prop []string
32
33 Nested_props nestedProps
34 Nested_props_ptr *nestedProps
Liz Kammer4562a3b2021-04-21 18:15:34 -040035
Liz Kammer32b77cf2021-08-04 15:17:02 -040036 Arch_paths []string `android:"path,arch_variant"`
37 Arch_paths_exclude []string `android:"path,arch_variant"`
Liz Kammer2dd9ca42020-11-25 16:06:39 -080038}
39
40type customModule struct {
41 android.ModuleBase
Liz Kammerea6666f2021-02-17 10:17:28 -050042 android.BazelModuleBase
Liz Kammer2dd9ca42020-11-25 16:06:39 -080043
44 props customProps
45}
46
Rupert Shuttleworth06559d02021-05-19 09:14:26 -040047func errored(t *testing.T, desc string, errs []error) bool {
48 t.Helper()
49 if len(errs) > 0 {
50 for _, err := range errs {
51 t.Errorf("%s: %s", desc, err)
52 }
53 return true
54 }
55 return false
56}
57
Liz Kammer2dd9ca42020-11-25 16:06:39 -080058// OutputFiles is needed because some instances of this module use dist with a
59// tag property which requires the module implements OutputFileProducer.
60func (m *customModule) OutputFiles(tag string) (android.Paths, error) {
61 return android.PathsForTesting("path" + tag), nil
62}
63
64func (m *customModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
65 // nothing for now.
66}
67
68func customModuleFactoryBase() android.Module {
69 module := &customModule{}
70 module.AddProperties(&module.props)
Liz Kammerea6666f2021-02-17 10:17:28 -050071 android.InitBazelModule(module)
Liz Kammer2dd9ca42020-11-25 16:06:39 -080072 return module
73}
74
75func customModuleFactory() android.Module {
76 m := customModuleFactoryBase()
Liz Kammer4562a3b2021-04-21 18:15:34 -040077 android.InitAndroidArchModule(m, android.HostAndDeviceSupported, android.MultilibBoth)
Liz Kammer2dd9ca42020-11-25 16:06:39 -080078 return m
79}
80
81type testProps struct {
82 Test_prop struct {
83 Test_string_prop string
84 }
85}
86
87type customTestModule struct {
88 android.ModuleBase
89
90 props customProps
91 test_props testProps
92}
93
94func (m *customTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
95 // nothing for now.
96}
97
98func customTestModuleFactoryBase() android.Module {
99 m := &customTestModule{}
100 m.AddProperties(&m.props)
101 m.AddProperties(&m.test_props)
102 return m
103}
104
105func customTestModuleFactory() android.Module {
106 m := customTestModuleFactoryBase()
107 android.InitAndroidModule(m)
108 return m
109}
110
111type customDefaultsModule struct {
112 android.ModuleBase
113 android.DefaultsModuleBase
114}
115
116func customDefaultsModuleFactoryBase() android.DefaultsModule {
117 module := &customDefaultsModule{}
118 module.AddProperties(&customProps{})
119 return module
120}
121
122func customDefaultsModuleFactoryBasic() android.Module {
123 return customDefaultsModuleFactoryBase()
124}
125
126func customDefaultsModuleFactory() android.Module {
127 m := customDefaultsModuleFactoryBase()
128 android.InitDefaultsModule(m)
129 return m
130}
Jingwen Chen73850672020-12-14 08:25:34 -0500131
132type customBazelModuleAttributes struct {
Jingwen Chen73850672020-12-14 08:25:34 -0500133 String_prop string
134 String_list_prop []string
Liz Kammer4562a3b2021-04-21 18:15:34 -0400135 Arch_paths bazel.LabelListAttribute
Jingwen Chen73850672020-12-14 08:25:34 -0500136}
137
138type customBazelModule struct {
139 android.BazelTargetModuleBase
140 customBazelModuleAttributes
141}
142
143func customBazelModuleFactory() android.Module {
144 module := &customBazelModule{}
145 module.AddProperties(&module.customBazelModuleAttributes)
146 android.InitBazelTargetModule(module)
147 return module
148}
149
150func (m *customBazelModule) Name() string { return m.BaseModuleName() }
151func (m *customBazelModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {}
152
153func customBp2BuildMutator(ctx android.TopDownMutatorContext) {
154 if m, ok := ctx.Module().(*customModule); ok {
Jingwen Chen12b4c272021-03-10 02:05:59 -0500155 if !m.ConvertWithBp2build(ctx) {
Jingwen Chen77e8b7b2021-02-05 03:03:24 -0500156 return
157 }
158
Liz Kammer32b77cf2021-08-04 15:17:02 -0400159 paths := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, m.props.Arch_paths, m.props.Arch_paths_exclude))
Liz Kammer4562a3b2021-04-21 18:15:34 -0400160
Liz Kammer9abd62d2021-05-21 08:37:59 -0400161 for axis, configToProps := range m.GetArchVariantProperties(ctx, &customProps{}) {
162 for config, props := range configToProps {
163 if archProps, ok := props.(*customProps); ok && archProps.Arch_paths != nil {
Liz Kammer32b77cf2021-08-04 15:17:02 -0400164 paths.SetSelectValue(axis, config, android.BazelLabelForModuleSrcExcludes(ctx, archProps.Arch_paths, archProps.Arch_paths_exclude))
Liz Kammer9abd62d2021-05-21 08:37:59 -0400165 }
Liz Kammer4562a3b2021-04-21 18:15:34 -0400166 }
167 }
168
Liz Kammer32b77cf2021-08-04 15:17:02 -0400169 paths.ResolveExcludes()
170
Jingwen Chen1fd14692021-02-05 03:01:50 -0500171 attrs := &customBazelModuleAttributes{
Jingwen Chen73850672020-12-14 08:25:34 -0500172 String_prop: m.props.String_prop,
173 String_list_prop: m.props.String_list_prop,
Liz Kammer4562a3b2021-04-21 18:15:34 -0400174 Arch_paths: paths,
Jingwen Chen1fd14692021-02-05 03:01:50 -0500175 }
176
Liz Kammerfc46bc12021-02-19 11:06:17 -0500177 props := bazel.BazelTargetModuleProperties{
178 Rule_class: "custom",
179 }
Jingwen Chen1fd14692021-02-05 03:01:50 -0500180
Liz Kammerfc46bc12021-02-19 11:06:17 -0500181 ctx.CreateBazelTargetModule(customBazelModuleFactory, m.Name(), props, attrs)
Jingwen Chen73850672020-12-14 08:25:34 -0500182 }
183}
Jingwen Chen40067de2021-01-26 21:58:43 -0500184
185// A bp2build mutator that uses load statements and creates a 1:M mapping from
186// module to target.
187func customBp2BuildMutatorFromStarlark(ctx android.TopDownMutatorContext) {
188 if m, ok := ctx.Module().(*customModule); ok {
Jingwen Chen12b4c272021-03-10 02:05:59 -0500189 if !m.ConvertWithBp2build(ctx) {
Jingwen Chen77e8b7b2021-02-05 03:03:24 -0500190 return
191 }
192
Jingwen Chen1fd14692021-02-05 03:01:50 -0500193 baseName := m.Name()
194 attrs := &customBazelModuleAttributes{}
195
Liz Kammerfc46bc12021-02-19 11:06:17 -0500196 myLibraryProps := bazel.BazelTargetModuleProperties{
197 Rule_class: "my_library",
198 Bzl_load_location: "//build/bazel/rules:rules.bzl",
199 }
200 ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName, myLibraryProps, attrs)
Jingwen Chen1fd14692021-02-05 03:01:50 -0500201
Liz Kammerfc46bc12021-02-19 11:06:17 -0500202 protoLibraryProps := bazel.BazelTargetModuleProperties{
203 Rule_class: "proto_library",
204 Bzl_load_location: "//build/bazel/rules:proto.bzl",
205 }
206 ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName+"_proto_library_deps", protoLibraryProps, attrs)
Jingwen Chen1fd14692021-02-05 03:01:50 -0500207
Liz Kammerfc46bc12021-02-19 11:06:17 -0500208 myProtoLibraryProps := bazel.BazelTargetModuleProperties{
209 Rule_class: "my_proto_library",
210 Bzl_load_location: "//build/bazel/rules:proto.bzl",
211 }
212 ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName+"_my_proto_library_deps", myProtoLibraryProps, attrs)
Jingwen Chen40067de2021-01-26 21:58:43 -0500213 }
214}
Jingwen Chenba369ad2021-02-22 10:19:34 -0500215
216// Helper method for tests to easily access the targets in a dir.
Liz Kammerba3ea162021-02-17 13:22:03 -0500217func generateBazelTargetsForDir(codegenCtx *CodegenContext, dir string) BazelTargets {
Rupert Shuttleworth2a4fc3e2021-04-21 07:10:09 -0400218 // TODO: Set generateFilegroups to true and/or remove the generateFilegroups argument completely
Jingwen Chenc63677b2021-06-17 05:43:19 +0000219 buildFileToTargets, _, _ := GenerateBazelTargets(codegenCtx, false)
Jingwen Chenba369ad2021-02-22 10:19:34 -0500220 return buildFileToTargets[dir]
221}
Liz Kammer32b77cf2021-08-04 15:17:02 -0400222
223func registerCustomModuleForBp2buildConversion(ctx *android.TestContext) {
224 ctx.RegisterModuleType("custom", customModuleFactory)
225 ctx.RegisterBp2BuildMutator("custom", customBp2BuildMutator)
226 ctx.RegisterForBazelConversion()
227}