blob: 266b8178011eef9fa9798912a462ac3352dff4cc [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
Jingwen Chen73850672020-12-14 08:25:34 -0500143func customBp2BuildMutator(ctx android.TopDownMutatorContext) {
144 if m, ok := ctx.Module().(*customModule); ok {
Jingwen Chen12b4c272021-03-10 02:05:59 -0500145 if !m.ConvertWithBp2build(ctx) {
Jingwen Chen77e8b7b2021-02-05 03:03:24 -0500146 return
147 }
148
Liz Kammer32b77cf2021-08-04 15:17:02 -0400149 paths := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrcExcludes(ctx, m.props.Arch_paths, m.props.Arch_paths_exclude))
Liz Kammer4562a3b2021-04-21 18:15:34 -0400150
Liz Kammer9abd62d2021-05-21 08:37:59 -0400151 for axis, configToProps := range m.GetArchVariantProperties(ctx, &customProps{}) {
152 for config, props := range configToProps {
153 if archProps, ok := props.(*customProps); ok && archProps.Arch_paths != nil {
Liz Kammer32b77cf2021-08-04 15:17:02 -0400154 paths.SetSelectValue(axis, config, android.BazelLabelForModuleSrcExcludes(ctx, archProps.Arch_paths, archProps.Arch_paths_exclude))
Liz Kammer9abd62d2021-05-21 08:37:59 -0400155 }
Liz Kammer4562a3b2021-04-21 18:15:34 -0400156 }
157 }
158
Liz Kammer32b77cf2021-08-04 15:17:02 -0400159 paths.ResolveExcludes()
160
Jingwen Chen1fd14692021-02-05 03:01:50 -0500161 attrs := &customBazelModuleAttributes{
Jingwen Chen73850672020-12-14 08:25:34 -0500162 String_prop: m.props.String_prop,
163 String_list_prop: m.props.String_list_prop,
Liz Kammer4562a3b2021-04-21 18:15:34 -0400164 Arch_paths: paths,
Jingwen Chen1fd14692021-02-05 03:01:50 -0500165 }
166
Liz Kammerfc46bc12021-02-19 11:06:17 -0500167 props := bazel.BazelTargetModuleProperties{
168 Rule_class: "custom",
169 }
Jingwen Chen1fd14692021-02-05 03:01:50 -0500170
Liz Kammer2ada09a2021-08-11 00:17:36 -0400171 ctx.CreateBazelTargetModule(m.Name(), props, attrs)
Jingwen Chen73850672020-12-14 08:25:34 -0500172 }
173}
Jingwen Chen40067de2021-01-26 21:58:43 -0500174
175// A bp2build mutator that uses load statements and creates a 1:M mapping from
176// module to target.
177func customBp2BuildMutatorFromStarlark(ctx android.TopDownMutatorContext) {
178 if m, ok := ctx.Module().(*customModule); ok {
Jingwen Chen12b4c272021-03-10 02:05:59 -0500179 if !m.ConvertWithBp2build(ctx) {
Jingwen Chen77e8b7b2021-02-05 03:03:24 -0500180 return
181 }
182
Jingwen Chen1fd14692021-02-05 03:01:50 -0500183 baseName := m.Name()
184 attrs := &customBazelModuleAttributes{}
185
Liz Kammerfc46bc12021-02-19 11:06:17 -0500186 myLibraryProps := bazel.BazelTargetModuleProperties{
187 Rule_class: "my_library",
188 Bzl_load_location: "//build/bazel/rules:rules.bzl",
189 }
Liz Kammer2ada09a2021-08-11 00:17:36 -0400190 ctx.CreateBazelTargetModule(baseName, myLibraryProps, attrs)
Jingwen Chen1fd14692021-02-05 03:01:50 -0500191
Liz Kammerfc46bc12021-02-19 11:06:17 -0500192 protoLibraryProps := bazel.BazelTargetModuleProperties{
193 Rule_class: "proto_library",
194 Bzl_load_location: "//build/bazel/rules:proto.bzl",
195 }
Liz Kammer2ada09a2021-08-11 00:17:36 -0400196 ctx.CreateBazelTargetModule(baseName+"_proto_library_deps", protoLibraryProps, attrs)
Jingwen Chen1fd14692021-02-05 03:01:50 -0500197
Liz Kammerfc46bc12021-02-19 11:06:17 -0500198 myProtoLibraryProps := bazel.BazelTargetModuleProperties{
199 Rule_class: "my_proto_library",
200 Bzl_load_location: "//build/bazel/rules:proto.bzl",
201 }
Liz Kammer2ada09a2021-08-11 00:17:36 -0400202 ctx.CreateBazelTargetModule(baseName+"_my_proto_library_deps", myProtoLibraryProps, attrs)
Jingwen Chen40067de2021-01-26 21:58:43 -0500203 }
204}
Jingwen Chenba369ad2021-02-22 10:19:34 -0500205
206// Helper method for tests to easily access the targets in a dir.
Liz Kammerba3ea162021-02-17 13:22:03 -0500207func generateBazelTargetsForDir(codegenCtx *CodegenContext, dir string) BazelTargets {
Rupert Shuttleworth2a4fc3e2021-04-21 07:10:09 -0400208 // TODO: Set generateFilegroups to true and/or remove the generateFilegroups argument completely
Jingwen Chenc63677b2021-06-17 05:43:19 +0000209 buildFileToTargets, _, _ := GenerateBazelTargets(codegenCtx, false)
Jingwen Chenba369ad2021-02-22 10:19:34 -0500210 return buildFileToTargets[dir]
211}
Liz Kammer32b77cf2021-08-04 15:17:02 -0400212
213func registerCustomModuleForBp2buildConversion(ctx *android.TestContext) {
214 ctx.RegisterModuleType("custom", customModuleFactory)
215 ctx.RegisterBp2BuildMutator("custom", customBp2BuildMutator)
216 ctx.RegisterForBazelConversion()
217}