blob: e575bc6ffb2b68a92732903e4400b1e4ade7df1d [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
36 Arch_paths []string `android:"path,arch_variant"`
Liz Kammer2dd9ca42020-11-25 16:06:39 -080037}
38
39type customModule struct {
40 android.ModuleBase
Liz Kammerea6666f2021-02-17 10:17:28 -050041 android.BazelModuleBase
Liz Kammer2dd9ca42020-11-25 16:06:39 -080042
43 props customProps
44}
45
Rupert Shuttleworth06559d02021-05-19 09:14:26 -040046func errored(t *testing.T, desc string, errs []error) bool {
47 t.Helper()
48 if len(errs) > 0 {
49 for _, err := range errs {
50 t.Errorf("%s: %s", desc, err)
51 }
52 return true
53 }
54 return false
55}
56
Liz Kammer2dd9ca42020-11-25 16:06:39 -080057// OutputFiles is needed because some instances of this module use dist with a
58// tag property which requires the module implements OutputFileProducer.
59func (m *customModule) OutputFiles(tag string) (android.Paths, error) {
60 return android.PathsForTesting("path" + tag), nil
61}
62
63func (m *customModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
64 // nothing for now.
65}
66
67func customModuleFactoryBase() android.Module {
68 module := &customModule{}
69 module.AddProperties(&module.props)
Liz Kammerea6666f2021-02-17 10:17:28 -050070 android.InitBazelModule(module)
Liz Kammer2dd9ca42020-11-25 16:06:39 -080071 return module
72}
73
74func customModuleFactory() android.Module {
75 m := customModuleFactoryBase()
Liz Kammer4562a3b2021-04-21 18:15:34 -040076 android.InitAndroidArchModule(m, android.HostAndDeviceSupported, android.MultilibBoth)
Liz Kammer2dd9ca42020-11-25 16:06:39 -080077 return m
78}
79
80type testProps struct {
81 Test_prop struct {
82 Test_string_prop string
83 }
84}
85
86type customTestModule struct {
87 android.ModuleBase
88
89 props customProps
90 test_props testProps
91}
92
93func (m *customTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
94 // nothing for now.
95}
96
97func customTestModuleFactoryBase() android.Module {
98 m := &customTestModule{}
99 m.AddProperties(&m.props)
100 m.AddProperties(&m.test_props)
101 return m
102}
103
104func customTestModuleFactory() android.Module {
105 m := customTestModuleFactoryBase()
106 android.InitAndroidModule(m)
107 return m
108}
109
110type customDefaultsModule struct {
111 android.ModuleBase
112 android.DefaultsModuleBase
113}
114
115func customDefaultsModuleFactoryBase() android.DefaultsModule {
116 module := &customDefaultsModule{}
117 module.AddProperties(&customProps{})
118 return module
119}
120
121func customDefaultsModuleFactoryBasic() android.Module {
122 return customDefaultsModuleFactoryBase()
123}
124
125func customDefaultsModuleFactory() android.Module {
126 m := customDefaultsModuleFactoryBase()
127 android.InitDefaultsModule(m)
128 return m
129}
Jingwen Chen73850672020-12-14 08:25:34 -0500130
131type customBazelModuleAttributes struct {
Jingwen Chen73850672020-12-14 08:25:34 -0500132 String_prop string
133 String_list_prop []string
Liz Kammer4562a3b2021-04-21 18:15:34 -0400134 Arch_paths bazel.LabelListAttribute
Jingwen Chen73850672020-12-14 08:25:34 -0500135}
136
137type customBazelModule struct {
138 android.BazelTargetModuleBase
139 customBazelModuleAttributes
140}
141
142func customBazelModuleFactory() android.Module {
143 module := &customBazelModule{}
144 module.AddProperties(&module.customBazelModuleAttributes)
145 android.InitBazelTargetModule(module)
146 return module
147}
148
149func (m *customBazelModule) Name() string { return m.BaseModuleName() }
150func (m *customBazelModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {}
151
152func customBp2BuildMutator(ctx android.TopDownMutatorContext) {
153 if m, ok := ctx.Module().(*customModule); ok {
Jingwen Chen12b4c272021-03-10 02:05:59 -0500154 if !m.ConvertWithBp2build(ctx) {
Jingwen Chen77e8b7b2021-02-05 03:03:24 -0500155 return
156 }
157
Liz Kammer4562a3b2021-04-21 18:15:34 -0400158 paths := bazel.MakeLabelListAttribute(android.BazelLabelForModuleSrc(ctx, m.props.Arch_paths))
159
Lukacs T. Berki598dd002021-05-05 09:00:01 +0200160 for arch, props := range m.GetArchProperties(ctx, &customProps{}) {
Liz Kammer4562a3b2021-04-21 18:15:34 -0400161 if archProps, ok := props.(*customProps); ok && archProps.Arch_paths != nil {
162 paths.SetValueForArch(arch.Name, android.BazelLabelForModuleSrc(ctx, archProps.Arch_paths))
163 }
164 }
165
Jingwen Chen1fd14692021-02-05 03:01:50 -0500166 attrs := &customBazelModuleAttributes{
Jingwen Chen73850672020-12-14 08:25:34 -0500167 String_prop: m.props.String_prop,
168 String_list_prop: m.props.String_list_prop,
Liz Kammer4562a3b2021-04-21 18:15:34 -0400169 Arch_paths: paths,
Jingwen Chen1fd14692021-02-05 03:01:50 -0500170 }
171
Liz Kammerfc46bc12021-02-19 11:06:17 -0500172 props := bazel.BazelTargetModuleProperties{
173 Rule_class: "custom",
174 }
Jingwen Chen1fd14692021-02-05 03:01:50 -0500175
Liz Kammerfc46bc12021-02-19 11:06:17 -0500176 ctx.CreateBazelTargetModule(customBazelModuleFactory, m.Name(), props, attrs)
Jingwen Chen73850672020-12-14 08:25:34 -0500177 }
178}
Jingwen Chen40067de2021-01-26 21:58:43 -0500179
180// A bp2build mutator that uses load statements and creates a 1:M mapping from
181// module to target.
182func customBp2BuildMutatorFromStarlark(ctx android.TopDownMutatorContext) {
183 if m, ok := ctx.Module().(*customModule); ok {
Jingwen Chen12b4c272021-03-10 02:05:59 -0500184 if !m.ConvertWithBp2build(ctx) {
Jingwen Chen77e8b7b2021-02-05 03:03:24 -0500185 return
186 }
187
Jingwen Chen1fd14692021-02-05 03:01:50 -0500188 baseName := m.Name()
189 attrs := &customBazelModuleAttributes{}
190
Liz Kammerfc46bc12021-02-19 11:06:17 -0500191 myLibraryProps := bazel.BazelTargetModuleProperties{
192 Rule_class: "my_library",
193 Bzl_load_location: "//build/bazel/rules:rules.bzl",
194 }
195 ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName, myLibraryProps, attrs)
Jingwen Chen1fd14692021-02-05 03:01:50 -0500196
Liz Kammerfc46bc12021-02-19 11:06:17 -0500197 protoLibraryProps := bazel.BazelTargetModuleProperties{
198 Rule_class: "proto_library",
199 Bzl_load_location: "//build/bazel/rules:proto.bzl",
200 }
201 ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName+"_proto_library_deps", protoLibraryProps, attrs)
Jingwen Chen1fd14692021-02-05 03:01:50 -0500202
Liz Kammerfc46bc12021-02-19 11:06:17 -0500203 myProtoLibraryProps := bazel.BazelTargetModuleProperties{
204 Rule_class: "my_proto_library",
205 Bzl_load_location: "//build/bazel/rules:proto.bzl",
206 }
207 ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName+"_my_proto_library_deps", myProtoLibraryProps, attrs)
Jingwen Chen40067de2021-01-26 21:58:43 -0500208 }
209}
Jingwen Chenba369ad2021-02-22 10:19:34 -0500210
211// Helper method for tests to easily access the targets in a dir.
Liz Kammerba3ea162021-02-17 13:22:03 -0500212func generateBazelTargetsForDir(codegenCtx *CodegenContext, dir string) BazelTargets {
Rupert Shuttleworth2a4fc3e2021-04-21 07:10:09 -0400213 // TODO: Set generateFilegroups to true and/or remove the generateFilegroups argument completely
214 buildFileToTargets, _ := GenerateBazelTargets(codegenCtx, false)
Jingwen Chenba369ad2021-02-22 10:19:34 -0500215 return buildFileToTargets[dir]
216}