blob: b5f5448bee9bb8e396eacef63afae0a3c429d5c9 [file] [log] [blame]
Liz Kammer2dd9ca42020-11-25 16:06:39 -08001package bp2build
2
3import (
4 "android/soong/android"
Jingwen Chen73850672020-12-14 08:25:34 -05005 "android/soong/bazel"
Liz Kammer2dd9ca42020-11-25 16:06:39 -08006)
7
8type nestedProps struct {
9 Nested_prop string
10}
11
12type customProps struct {
13 Bool_prop bool
14 Bool_ptr_prop *bool
15 // Ensure that properties tagged `blueprint:mutated` are omitted
16 Int_prop int `blueprint:"mutated"`
17 Int64_ptr_prop *int64
18 String_prop string
19 String_ptr_prop *string
20 String_list_prop []string
21
22 Nested_props nestedProps
23 Nested_props_ptr *nestedProps
24}
25
26type customModule struct {
27 android.ModuleBase
28
29 props customProps
30}
31
32// OutputFiles is needed because some instances of this module use dist with a
33// tag property which requires the module implements OutputFileProducer.
34func (m *customModule) OutputFiles(tag string) (android.Paths, error) {
35 return android.PathsForTesting("path" + tag), nil
36}
37
38func (m *customModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
39 // nothing for now.
40}
41
42func customModuleFactoryBase() android.Module {
43 module := &customModule{}
44 module.AddProperties(&module.props)
45 return module
46}
47
48func customModuleFactory() android.Module {
49 m := customModuleFactoryBase()
50 android.InitAndroidModule(m)
51 return m
52}
53
54type testProps struct {
55 Test_prop struct {
56 Test_string_prop string
57 }
58}
59
60type customTestModule struct {
61 android.ModuleBase
62
63 props customProps
64 test_props testProps
65}
66
67func (m *customTestModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
68 // nothing for now.
69}
70
71func customTestModuleFactoryBase() android.Module {
72 m := &customTestModule{}
73 m.AddProperties(&m.props)
74 m.AddProperties(&m.test_props)
75 return m
76}
77
78func customTestModuleFactory() android.Module {
79 m := customTestModuleFactoryBase()
80 android.InitAndroidModule(m)
81 return m
82}
83
84type customDefaultsModule struct {
85 android.ModuleBase
86 android.DefaultsModuleBase
87}
88
89func customDefaultsModuleFactoryBase() android.DefaultsModule {
90 module := &customDefaultsModule{}
91 module.AddProperties(&customProps{})
92 return module
93}
94
95func customDefaultsModuleFactoryBasic() android.Module {
96 return customDefaultsModuleFactoryBase()
97}
98
99func customDefaultsModuleFactory() android.Module {
100 m := customDefaultsModuleFactoryBase()
101 android.InitDefaultsModule(m)
102 return m
103}
Jingwen Chen73850672020-12-14 08:25:34 -0500104
105type customBazelModuleAttributes struct {
Jingwen Chen73850672020-12-14 08:25:34 -0500106 String_prop string
107 String_list_prop []string
108}
109
110type customBazelModule struct {
111 android.BazelTargetModuleBase
112 customBazelModuleAttributes
113}
114
115func customBazelModuleFactory() android.Module {
116 module := &customBazelModule{}
117 module.AddProperties(&module.customBazelModuleAttributes)
118 android.InitBazelTargetModule(module)
119 return module
120}
121
122func (m *customBazelModule) Name() string { return m.BaseModuleName() }
123func (m *customBazelModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {}
124
125func customBp2BuildMutator(ctx android.TopDownMutatorContext) {
126 if m, ok := ctx.Module().(*customModule); ok {
Jingwen Chen1fd14692021-02-05 03:01:50 -0500127 attrs := &customBazelModuleAttributes{
Jingwen Chen73850672020-12-14 08:25:34 -0500128 String_prop: m.props.String_prop,
129 String_list_prop: m.props.String_list_prop,
Jingwen Chen1fd14692021-02-05 03:01:50 -0500130 }
131
132 name := "__bp2build__" + m.Name()
133 props := bazel.BazelTargetModuleProperties{
134 Name: &name,
Jingwen Chen73850672020-12-14 08:25:34 -0500135 Rule_class: "custom",
Jingwen Chen1fd14692021-02-05 03:01:50 -0500136 }
137
138 ctx.CreateBazelTargetModule(customBazelModuleFactory, props, attrs)
Jingwen Chen73850672020-12-14 08:25:34 -0500139 }
140}
Jingwen Chen40067de2021-01-26 21:58:43 -0500141
142// A bp2build mutator that uses load statements and creates a 1:M mapping from
143// module to target.
144func customBp2BuildMutatorFromStarlark(ctx android.TopDownMutatorContext) {
145 if m, ok := ctx.Module().(*customModule); ok {
Jingwen Chen1fd14692021-02-05 03:01:50 -0500146 baseName := m.Name()
147 attrs := &customBazelModuleAttributes{}
148
149 myLibraryName := "__bp2build__" + baseName
150 myLibraryProps := bazel.BazelTargetModuleProperties{
151 Name: &myLibraryName,
Jingwen Chen40067de2021-01-26 21:58:43 -0500152 Rule_class: "my_library",
153 Bzl_load_location: "//build/bazel/rules:rules.bzl",
Jingwen Chen1fd14692021-02-05 03:01:50 -0500154 }
155 ctx.CreateBazelTargetModule(customBazelModuleFactory, myLibraryProps, attrs)
156
157 protoLibraryName := "__bp2build__" + baseName + "_proto_library_deps"
158 protoLibraryProps := bazel.BazelTargetModuleProperties{
159 Name: &protoLibraryName,
Jingwen Chen40067de2021-01-26 21:58:43 -0500160 Rule_class: "proto_library",
161 Bzl_load_location: "//build/bazel/rules:proto.bzl",
Jingwen Chen1fd14692021-02-05 03:01:50 -0500162 }
163 ctx.CreateBazelTargetModule(customBazelModuleFactory, protoLibraryProps, attrs)
164
165 myProtoLibraryName := "__bp2build__" + baseName + "_my_proto_library_deps"
166 myProtoLibraryProps := bazel.BazelTargetModuleProperties{
167 Name: &myProtoLibraryName,
Jingwen Chen40067de2021-01-26 21:58:43 -0500168 Rule_class: "my_proto_library",
169 Bzl_load_location: "//build/bazel/rules:proto.bzl",
Jingwen Chen1fd14692021-02-05 03:01:50 -0500170 }
171 ctx.CreateBazelTargetModule(customBazelModuleFactory, myProtoLibraryProps, attrs)
Jingwen Chen40067de2021-01-26 21:58:43 -0500172 }
173}