blob: 2a10a14d41fa5664c8c888c5390c7085fda1d864 [file] [log] [blame]
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -04001// 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
15package bp2build
16
17import (
Yu Liud6201012022-10-17 12:29:15 -070018 "fmt"
Liz Kammer0db0e342023-07-18 11:39:30 -040019 "path/filepath"
Yu Liud6201012022-10-17 12:29:15 -070020 "testing"
21
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040022 "android/soong/android"
Sam Delmericocd1b80f2022-01-11 21:55:46 +000023 "android/soong/cc"
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040024 "android/soong/genrule"
Sam Delmericocd1b80f2022-01-11 21:55:46 +000025 "android/soong/java"
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040026)
27
Liz Kammer78cfdaa2021-11-08 12:56:31 -050028func registerGenruleModuleTypes(ctx android.RegistrationContext) {
29 ctx.RegisterModuleType("genrule_defaults", func() android.Module { return genrule.DefaultsFactory() })
Spandan Dasf62e80a2023-08-17 22:35:04 +000030 ctx.RegisterModuleType("cc_binary", func() android.Module { return cc.BinaryFactory() })
31 ctx.RegisterModuleType("soong_namespace", func() android.Module { return android.NamespaceFactory() })
Liz Kammer78cfdaa2021-11-08 12:56:31 -050032}
33
Sam Delmerico3177a6e2022-06-21 19:28:33 +000034func runGenruleTestCase(t *testing.T, tc Bp2buildTestCase) {
Liz Kammer78cfdaa2021-11-08 12:56:31 -050035 t.Helper()
Sam Delmerico3177a6e2022-06-21 19:28:33 +000036 (&tc).ModuleTypeUnderTest = "genrule"
37 (&tc).ModuleTypeUnderTestFactory = genrule.GenRuleFactory
38 RunBp2BuildTestCase(t, registerGenruleModuleTypes, tc)
Liz Kammer78cfdaa2021-11-08 12:56:31 -050039}
40
Sam Delmericocd1b80f2022-01-11 21:55:46 +000041func otherGenruleBp(genruleTarget string) map[string]string {
42 return map[string]string{
43 "other/Android.bp": fmt.Sprintf(`%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040044 name: "foo.tool",
45 out: ["foo_tool.out"],
46 srcs: ["foo_tool.in"],
47 cmd: "cp $(in) $(out)",
48}
Sam Delmericocd1b80f2022-01-11 21:55:46 +000049%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040050 name: "other.tool",
51 out: ["other_tool.out"],
52 srcs: ["other_tool.in"],
53 cmd: "cp $(in) $(out)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000054}`, genruleTarget, genruleTarget),
Liz Kammer1e753242023-06-02 19:03:06 -040055 "other/file.txt": "",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000056 }
57}
58
59func TestGenruleCliVariableReplacement(t *testing.T) {
60 testCases := []struct {
61 moduleType string
62 factory android.ModuleFactory
63 genDir string
Liz Kammerdfeb1202022-05-13 17:20:20 -040064 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +000065 }{
66 {
67 moduleType: "genrule",
68 factory: genrule.GenRuleFactory,
Vinh Tranf19b6582022-09-21 17:01:49 -040069 genDir: "$(RULEDIR)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000070 },
71 {
72 moduleType: "cc_genrule",
73 factory: cc.GenRuleFactory,
74 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040075 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000076 },
77 {
78 moduleType: "java_genrule",
79 factory: java.GenRuleFactory,
80 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040081 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000082 },
83 {
84 moduleType: "java_genrule_host",
85 factory: java.GenRuleFactoryHost,
86 genDir: "$(RULEDIR)",
Liz Kammerdfeb1202022-05-13 17:20:20 -040087 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +000088 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040089 }
90
Sam Delmericocd1b80f2022-01-11 21:55:46 +000091 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040092 name: "foo.tool",
93 out: ["foo_tool.out"],
94 srcs: ["foo_tool.in"],
95 cmd: "cp $(in) $(out)",
Sam Delmericocd1b80f2022-01-11 21:55:46 +000096 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -040097}
98
Sam Delmericocd1b80f2022-01-11 21:55:46 +000099%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400100 name: "foo",
101 out: ["foo.out"],
102 srcs: ["foo.in"],
103 tools: [":foo.tool"],
104 cmd: "$(location :foo.tool) --genDir=$(genDir) arg $(in) $(out)",
105 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000106}`
107
108 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000109 moduleAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000110 "cmd": fmt.Sprintf(`"$(location :foo.tool) --genDir=%s arg $(SRCS) $(OUTS)"`, tc.genDir),
111 "outs": `["foo.out"]`,
112 "srcs": `["foo.in"]`,
113 "tools": `[":foo.tool"]`,
114 }
115
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000116 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400117 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000118 }
119
120 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000121 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
122 Bp2buildTestCase{
123 ModuleTypeUnderTest: tc.moduleType,
124 ModuleTypeUnderTestFactory: tc.factory,
125 Blueprint: fmt.Sprintf(bp, tc.moduleType, tc.moduleType),
126 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000127 })
128 })
129 }
130}
131
132func TestGenruleLocationsLabel(t *testing.T) {
133 testCases := []struct {
134 moduleType string
135 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400136 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000137 }{
138 {
139 moduleType: "genrule",
140 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400141 },
142 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000143 moduleType: "cc_genrule",
144 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400145 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000146 },
147 {
148 moduleType: "java_genrule",
149 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400150 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000151 },
152 {
153 moduleType: "java_genrule_host",
154 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400155 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000156 },
157 }
158
159 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400160 name: "foo.tools",
161 out: ["foo_tool.out", "foo_tool2.out"],
162 srcs: ["foo_tool.in"],
163 cmd: "cp $(in) $(out)",
164 bazel_module: { bp2build_available: true },
165}
166
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000167%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400168 name: "foo",
169 out: ["foo.out"],
170 srcs: ["foo.in"],
171 tools: [":foo.tools"],
172 cmd: "$(locations :foo.tools) -s $(out) $(in)",
173 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000174}`
175
Sam Delmerico75539d62022-01-31 14:37:29 +0000176 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000177 fooAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000178 "cmd": `"$(locations :foo.tools) -s $(OUTS) $(SRCS)"`,
179 "outs": `["foo.out"]`,
180 "srcs": `["foo.in"]`,
181 "tools": `[":foo.tools"]`,
182 }
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000183 fooToolsAttrs := AttrNameToString{
Sam Delmerico75539d62022-01-31 14:37:29 +0000184 "cmd": `"cp $(SRCS) $(OUTS)"`,
185 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400186 "foo_tool.out",
187 "foo_tool2.out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500188 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000189 "srcs": `["foo_tool.in"]`,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000190 }
191
Sam Delmerico75539d62022-01-31 14:37:29 +0000192 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400193 makeBazelTargetHostOrDevice("genrule", "foo", fooAttrs, tc.hod),
194 makeBazelTargetHostOrDevice("genrule", "foo.tools", fooToolsAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000195 }
196
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000197 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000198 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
199 Bp2buildTestCase{
200 ModuleTypeUnderTest: tc.moduleType,
201 ModuleTypeUnderTestFactory: tc.factory,
202 Blueprint: fmt.Sprintf(bp, tc.moduleType, tc.moduleType),
203 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000204 })
205 })
206 }
207}
208
209func TestGenruleLocationsAbsoluteLabel(t *testing.T) {
210 testCases := []struct {
211 moduleType string
212 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400213 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000214 }{
215 {
216 moduleType: "genrule",
217 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400218 },
219 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000220 moduleType: "cc_genrule",
221 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400222 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000223 },
224 {
225 moduleType: "java_genrule",
226 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400227 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000228 },
229 {
230 moduleType: "java_genrule_host",
231 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400232 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000233 },
234 }
235
236 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400237 name: "foo",
238 out: ["foo.out"],
239 srcs: ["foo.in"],
240 tool_files: [":foo.tool"],
241 cmd: "$(locations :foo.tool) -s $(out) $(in)",
242 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000243}`
244
Sam Delmerico75539d62022-01-31 14:37:29 +0000245 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000246 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000247 "cmd": `"$(locations //other:foo.tool) -s $(OUTS) $(SRCS)"`,
248 "outs": `["foo.out"]`,
249 "srcs": `["foo.in"]`,
250 "tools": `["//other:foo.tool"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000251 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000252
Sam Delmerico75539d62022-01-31 14:37:29 +0000253 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400254 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000255 }
256
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000257 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000258 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
259 Bp2buildTestCase{
260 ModuleTypeUnderTest: tc.moduleType,
261 ModuleTypeUnderTestFactory: tc.factory,
262 Blueprint: fmt.Sprintf(bp, tc.moduleType),
263 ExpectedBazelTargets: expectedBazelTargets,
264 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000265 })
266 })
267 }
268}
269
270func TestGenruleSrcsLocationsAbsoluteLabel(t *testing.T) {
271 testCases := []struct {
272 moduleType string
273 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400274 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000275 }{
276 {
277 moduleType: "genrule",
278 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400279 },
280 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000281 moduleType: "cc_genrule",
282 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400283 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000284 },
285 {
286 moduleType: "java_genrule",
287 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400288 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000289 },
290 {
291 moduleType: "java_genrule_host",
292 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400293 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000294 },
295 }
296
297 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400298 name: "foo",
299 out: ["foo.out"],
Liz Kammer1e753242023-06-02 19:03:06 -0400300 srcs: [":other.tool", "other/file.txt",],
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400301 tool_files: [":foo.tool"],
Liz Kammer1e753242023-06-02 19:03:06 -0400302 cmd: "$(locations :foo.tool) $(location other/file.txt) -s $(out) $(location :other.tool)",
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400303 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000304}`
305
Sam Delmerico75539d62022-01-31 14:37:29 +0000306 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000307 moduleAttrs := AttrNameToString{
Liz Kammer1e753242023-06-02 19:03:06 -0400308 "cmd": `"$(locations //other:foo.tool) $(location //other:file.txt) -s $(OUTS) $(location //other:other.tool)"`,
309 "outs": `["foo.out"]`,
310 "srcs": `[
311 "//other:other.tool",
312 "//other:file.txt",
313 ]`,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000314 "tools": `["//other:foo.tool"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000315 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000316
Sam Delmerico75539d62022-01-31 14:37:29 +0000317 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400318 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000319 }
320
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000321 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000322 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
323 Bp2buildTestCase{
324 ModuleTypeUnderTest: tc.moduleType,
325 ModuleTypeUnderTestFactory: tc.factory,
326 Blueprint: fmt.Sprintf(bp, tc.moduleType),
327 ExpectedBazelTargets: expectedBazelTargets,
328 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000329 })
330 })
331 }
332}
333
334func TestGenruleLocationLabelShouldSubstituteFirstToolLabel(t *testing.T) {
335 testCases := []struct {
336 moduleType string
337 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400338 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000339 }{
340 {
341 moduleType: "genrule",
342 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400343 },
344 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000345 moduleType: "cc_genrule",
346 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400347 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000348 },
349 {
350 moduleType: "java_genrule",
351 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400352 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000353 },
354 {
355 moduleType: "java_genrule_host",
356 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400357 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000358 },
359 }
360
361 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400362 name: "foo",
363 out: ["foo.out"],
364 srcs: ["foo.in"],
365 tool_files: [":foo.tool", ":other.tool"],
366 cmd: "$(location) -s $(out) $(in)",
367 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000368}`
369
Sam Delmerico75539d62022-01-31 14:37:29 +0000370 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000371 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000372 "cmd": `"$(location //other:foo.tool) -s $(OUTS) $(SRCS)"`,
373 "outs": `["foo.out"]`,
374 "srcs": `["foo.in"]`,
375 "tools": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400376 "//other:foo.tool",
377 "//other:other.tool",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500378 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000379 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000380
Sam Delmerico75539d62022-01-31 14:37:29 +0000381 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400382 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000383 }
384
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000385 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000386 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
387 Bp2buildTestCase{
388 ModuleTypeUnderTest: tc.moduleType,
389 ModuleTypeUnderTestFactory: tc.factory,
390 Blueprint: fmt.Sprintf(bp, tc.moduleType),
391 ExpectedBazelTargets: expectedBazelTargets,
392 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000393 })
394 })
395 }
396}
397
398func TestGenruleLocationsLabelShouldSubstituteFirstToolLabel(t *testing.T) {
399 testCases := []struct {
400 moduleType string
401 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400402 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000403 }{
404 {
405 moduleType: "genrule",
406 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400407 },
408 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000409 moduleType: "cc_genrule",
410 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400411 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000412 },
413 {
414 moduleType: "java_genrule",
415 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400416 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000417 },
418 {
419 moduleType: "java_genrule_host",
420 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400421 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000422 },
423 }
424
425 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400426 name: "foo",
427 out: ["foo.out"],
428 srcs: ["foo.in"],
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000429 tool_files: [":foo.tool", ":other.tool"],
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400430 cmd: "$(locations) -s $(out) $(in)",
431 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000432}`
433
Sam Delmerico75539d62022-01-31 14:37:29 +0000434 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000435 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000436 "cmd": `"$(locations //other:foo.tool) -s $(OUTS) $(SRCS)"`,
437 "outs": `["foo.out"]`,
438 "srcs": `["foo.in"]`,
439 "tools": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400440 "//other:foo.tool",
441 "//other:other.tool",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500442 ]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000443 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000444
Sam Delmerico75539d62022-01-31 14:37:29 +0000445 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400446 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000447 }
448
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000449 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000450 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
451 Bp2buildTestCase{
452 ModuleTypeUnderTest: tc.moduleType,
453 ModuleTypeUnderTestFactory: tc.factory,
454 Blueprint: fmt.Sprintf(bp, tc.moduleType),
455 ExpectedBazelTargets: expectedBazelTargets,
456 Filesystem: otherGenruleBp(tc.moduleType),
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000457 })
458 })
459 }
460}
461
462func TestGenruleWithoutToolsOrToolFiles(t *testing.T) {
463 testCases := []struct {
464 moduleType string
465 factory android.ModuleFactory
Liz Kammerdfeb1202022-05-13 17:20:20 -0400466 hod android.HostOrDeviceSupported
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000467 }{
468 {
469 moduleType: "genrule",
470 factory: genrule.GenRuleFactory,
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400471 },
472 {
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000473 moduleType: "cc_genrule",
474 factory: cc.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400475 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000476 },
477 {
478 moduleType: "java_genrule",
479 factory: java.GenRuleFactory,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400480 hod: android.DeviceSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000481 },
482 {
483 moduleType: "java_genrule_host",
484 factory: java.GenRuleFactoryHost,
Liz Kammerdfeb1202022-05-13 17:20:20 -0400485 hod: android.HostSupported,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000486 },
487 }
488
489 bp := `%s {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400490 name: "foo",
491 out: ["foo.out"],
492 srcs: ["foo.in"],
493 cmd: "cp $(in) $(out)",
494 bazel_module: { bp2build_available: true },
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000495}`
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400496
Sam Delmerico75539d62022-01-31 14:37:29 +0000497 for _, tc := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000498 moduleAttrs := AttrNameToString{
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000499 "cmd": `"cp $(SRCS) $(OUTS)"`,
500 "outs": `["foo.out"]`,
501 "srcs": `["foo.in"]`,
Sam Delmerico75539d62022-01-31 14:37:29 +0000502 }
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000503
Sam Delmerico75539d62022-01-31 14:37:29 +0000504 expectedBazelTargets := []string{
Liz Kammerdfeb1202022-05-13 17:20:20 -0400505 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
Sam Delmerico75539d62022-01-31 14:37:29 +0000506 }
507
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000508 t.Run(tc.moduleType, func(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000509 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
510 Bp2buildTestCase{
511 ModuleTypeUnderTest: tc.moduleType,
512 ModuleTypeUnderTestFactory: tc.factory,
513 Blueprint: fmt.Sprintf(bp, tc.moduleType),
514 ExpectedBazelTargets: expectedBazelTargets,
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000515 })
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500516 })
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400517 }
518}
519
Sam Delmericocd1b80f2022-01-11 21:55:46 +0000520func TestGenruleBp2BuildInlinesDefaults(t *testing.T) {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000521 testCases := []Bp2buildTestCase{
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400522 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000523 Description: "genrule applies properties from a genrule_defaults dependency if not specified",
524 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400525 name: "gen_defaults",
526 cmd: "do-something $(in) $(out)",
527}
528genrule {
529 name: "gen",
530 out: ["out"],
531 srcs: ["in1"],
532 defaults: ["gen_defaults"],
533 bazel_module: { bp2build_available: true },
534}
535`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000536 ExpectedBazelTargets: []string{
537 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500538 "cmd": `"do-something $(SRCS) $(OUTS)"`,
539 "outs": `["out"]`,
540 "srcs": `["in1"]`,
541 }),
542 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400543 },
544 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000545 Description: "genrule does merges properties from a genrule_defaults dependency, latest-first",
546 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400547 name: "gen_defaults",
548 out: ["out-from-defaults"],
549 srcs: ["in-from-defaults"],
550 cmd: "cmd-from-defaults",
551}
552genrule {
553 name: "gen",
554 out: ["out"],
555 srcs: ["in1"],
556 defaults: ["gen_defaults"],
557 cmd: "do-something $(in) $(out)",
558 bazel_module: { bp2build_available: true },
559}
560`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000561 ExpectedBazelTargets: []string{
562 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500563 "cmd": `"do-something $(SRCS) $(OUTS)"`,
564 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400565 "out-from-defaults",
566 "out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500567 ]`,
568 "srcs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400569 "in-from-defaults",
570 "in1",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500571 ]`,
572 }),
573 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400574 },
575 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000576 Description: "genrule applies properties from list of genrule_defaults",
577 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400578 name: "gen_defaults1",
579 cmd: "cp $(in) $(out)",
580}
581
582genrule_defaults {
583 name: "gen_defaults2",
584 srcs: ["in1"],
585}
586
587genrule {
588 name: "gen",
589 out: ["out"],
590 defaults: ["gen_defaults1", "gen_defaults2"],
591 bazel_module: { bp2build_available: true },
592}
593`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000594 ExpectedBazelTargets: []string{
595 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500596 "cmd": `"cp $(SRCS) $(OUTS)"`,
597 "outs": `["out"]`,
598 "srcs": `["in1"]`,
599 }),
600 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400601 },
602 {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000603 Description: "genrule applies properties from genrule_defaults transitively",
604 Blueprint: `genrule_defaults {
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400605 name: "gen_defaults1",
606 defaults: ["gen_defaults2"],
607 cmd: "cmd1 $(in) $(out)", // overrides gen_defaults2's cmd property value.
608}
609
610genrule_defaults {
611 name: "gen_defaults2",
612 defaults: ["gen_defaults3"],
613 cmd: "cmd2 $(in) $(out)",
614 out: ["out-from-2"],
615 srcs: ["in1"],
616}
617
618genrule_defaults {
619 name: "gen_defaults3",
620 out: ["out-from-3"],
621 srcs: ["srcs-from-3"],
622}
623
624genrule {
625 name: "gen",
626 out: ["out"],
627 defaults: ["gen_defaults1"],
628 bazel_module: { bp2build_available: true },
629}
630`,
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000631 ExpectedBazelTargets: []string{
632 MakeBazelTargetNoRestrictions("genrule", "gen", AttrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500633 "cmd": `"cmd1 $(SRCS) $(OUTS)"`,
634 "outs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400635 "out-from-3",
636 "out-from-2",
637 "out",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500638 ]`,
639 "srcs": `[
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400640 "srcs-from-3",
641 "in1",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500642 ]`,
643 }),
644 },
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400645 },
646 }
647
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400648 for _, testCase := range testCases {
Sam Delmerico3177a6e2022-06-21 19:28:33 +0000649 t.Run(testCase.Description, func(t *testing.T) {
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500650 runGenruleTestCase(t, testCase)
651 })
Rupert Shuttleworthc5fa3062021-09-08 10:36:41 -0400652 }
653}
Yu Liud6201012022-10-17 12:29:15 -0700654
655func TestCcGenruleArchAndExcludeSrcs(t *testing.T) {
656 name := "cc_genrule with arch"
657 bp := `
658 cc_genrule {
659 name: "foo",
660 srcs: [
661 "foo1.in",
662 "foo2.in",
663 ],
664 exclude_srcs: ["foo2.in"],
665 arch: {
666 arm: {
667 srcs: [
668 "foo1_arch.in",
669 "foo2_arch.in",
670 ],
671 exclude_srcs: ["foo2_arch.in"],
672 },
673 },
674 cmd: "cat $(in) > $(out)",
675 bazel_module: { bp2build_available: true },
676 }`
677
678 expectedBazelAttrs := AttrNameToString{
679 "srcs": `["foo1.in"] + select({
680 "//build/bazel/platforms/arch:arm": ["foo1_arch.in"],
681 "//conditions:default": [],
682 })`,
683 "cmd": `"cat $(SRCS) > $(OUTS)"`,
684 "target_compatible_with": `["//build/bazel/platforms/os:android"]`,
685 }
686
687 expectedBazelTargets := []string{
688 MakeBazelTargetNoRestrictions("genrule", "foo", expectedBazelAttrs),
689 }
690
691 t.Run(name, func(t *testing.T) {
692 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
693 Bp2buildTestCase{
694 ModuleTypeUnderTest: "cc_genrule",
695 ModuleTypeUnderTestFactory: cc.GenRuleFactory,
696 Blueprint: bp,
697 ExpectedBazelTargets: expectedBazelTargets,
698 })
699 })
700}
Liz Kammer0db0e342023-07-18 11:39:30 -0400701
702func TestGenruleWithExportIncludeDirs(t *testing.T) {
703 testCases := []struct {
704 moduleType string
705 factory android.ModuleFactory
706 hod android.HostOrDeviceSupported
707 }{
708 {
709 moduleType: "genrule",
710 factory: genrule.GenRuleFactory,
711 },
712 {
713 moduleType: "cc_genrule",
714 factory: cc.GenRuleFactory,
715 hod: android.DeviceSupported,
716 },
717 {
718 moduleType: "java_genrule",
719 factory: java.GenRuleFactory,
720 hod: android.DeviceSupported,
721 },
722 {
723 moduleType: "java_genrule_host",
724 factory: java.GenRuleFactoryHost,
725 hod: android.HostSupported,
726 },
727 }
728
729 dir := "baz"
730
731 bp := `%s {
732 name: "foo",
733 out: ["foo.out.h"],
734 srcs: ["foo.in"],
735 cmd: "cp $(in) $(out)",
736 export_include_dirs: ["foo", "bar", "."],
737 bazel_module: { bp2build_available: true },
738}`
739
740 for _, tc := range testCases {
741 moduleAttrs := AttrNameToString{
742 "cmd": `"cp $(SRCS) $(OUTS)"`,
743 "outs": `["foo.out.h"]`,
744 "srcs": `["foo.in"]`,
745 }
746
747 expectedBazelTargets := []string{
748 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
749 makeBazelTargetHostOrDevice("cc_library_headers", "foo__header_library", AttrNameToString{
750 "hdrs": `[":foo"]`,
751 "export_includes": `[
752 "foo",
753 "baz/foo",
754 "bar",
755 "baz/bar",
756 ".",
757 "baz",
758 ]`,
759 },
760 tc.hod),
761 }
762
763 t.Run(tc.moduleType, func(t *testing.T) {
764 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
765 Bp2buildTestCase{
766 ModuleTypeUnderTest: tc.moduleType,
767 ModuleTypeUnderTestFactory: tc.factory,
768 Filesystem: map[string]string{
769 filepath.Join(dir, "Android.bp"): fmt.Sprintf(bp, tc.moduleType),
770 },
771 Dir: dir,
772 ExpectedBazelTargets: expectedBazelTargets,
773 })
774 })
775 }
776}
Cole Faustf0d4d4f2023-08-14 11:37:54 -0700777
Cole Fausted940002023-08-15 11:59:24 -0700778func TestGenruleWithSoongConfigVariableConfiguredCmd(t *testing.T) {
Cole Faustf0d4d4f2023-08-14 11:37:54 -0700779 testCases := []struct {
780 moduleType string
781 factory android.ModuleFactory
782 hod android.HostOrDeviceSupported
783 }{
784 {
785 moduleType: "genrule",
786 factory: genrule.GenRuleFactory,
787 },
788 {
789 moduleType: "cc_genrule",
790 factory: cc.GenRuleFactory,
791 hod: android.DeviceSupported,
792 },
793 {
794 moduleType: "java_genrule",
795 factory: java.GenRuleFactory,
796 hod: android.DeviceSupported,
797 },
798 {
799 moduleType: "java_genrule_host",
800 factory: java.GenRuleFactoryHost,
801 hod: android.HostSupported,
802 },
803 }
804
805 bp := `
806soong_config_module_type {
807 name: "my_genrule",
808 module_type: "%s",
809 config_namespace: "my_namespace",
810 bool_variables: ["my_variable"],
811 properties: ["cmd"],
812}
813
814my_genrule {
815 name: "foo",
816 out: ["foo.txt"],
817 cmd: "echo 'no variable' > $(out)",
818 soong_config_variables: {
819 my_variable: {
820 cmd: "echo 'with variable' > $(out)",
821 },
822 },
823 bazel_module: { bp2build_available: true },
824}
825`
826
827 for _, tc := range testCases {
828 moduleAttrs := AttrNameToString{
829 "cmd": `select({
830 "//build/bazel/product_config/config_settings:my_namespace__my_variable": "echo 'with variable' > $(OUTS)",
831 "//conditions:default": "echo 'no variable' > $(OUTS)",
832 })`,
833 "outs": `["foo.txt"]`,
834 }
835
836 expectedBazelTargets := []string{
837 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
838 }
839
840 t.Run(tc.moduleType, func(t *testing.T) {
841 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) { android.RegisterSoongConfigModuleBuildComponents(ctx) },
842 Bp2buildTestCase{
843 Blueprint: fmt.Sprintf(bp, tc.moduleType),
844 ModuleTypeUnderTest: tc.moduleType,
845 ModuleTypeUnderTestFactory: tc.factory,
846 ExpectedBazelTargets: expectedBazelTargets,
847 })
848 })
849 }
850}
Cole Fausted940002023-08-15 11:59:24 -0700851
852func TestGenruleWithProductVariableConfiguredCmd(t *testing.T) {
853 testCases := []struct {
854 moduleType string
855 factory android.ModuleFactory
856 hod android.HostOrDeviceSupported
857 }{
858 {
859 moduleType: "genrule",
860 factory: genrule.GenRuleFactory,
861 },
862 {
863 moduleType: "cc_genrule",
864 factory: cc.GenRuleFactory,
865 hod: android.DeviceSupported,
866 },
867 {
868 moduleType: "java_genrule",
869 factory: java.GenRuleFactory,
870 hod: android.DeviceSupported,
871 },
872 {
873 moduleType: "java_genrule_host",
874 factory: java.GenRuleFactoryHost,
875 hod: android.HostSupported,
876 },
877 }
878
879 bp := `
880
881%s {
882 name: "foo",
883 out: ["foo.txt"],
884 cmd: "echo 'no variable' > $(out)",
885 product_variables: {
886 debuggable: {
887 cmd: "echo 'with variable' > $(out)",
888 },
889 },
890 bazel_module: { bp2build_available: true },
891}
892`
893
894 for _, tc := range testCases {
895 moduleAttrs := AttrNameToString{
896 "cmd": `select({
897 "//build/bazel/product_config/config_settings:debuggable": "echo 'with variable' > $(OUTS)",
898 "//conditions:default": "echo 'no variable' > $(OUTS)",
899 })`,
900 "outs": `["foo.txt"]`,
901 }
902
903 expectedBazelTargets := []string{
904 makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
905 }
906
907 t.Run(tc.moduleType, func(t *testing.T) {
908 RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) { android.RegisterSoongConfigModuleBuildComponents(ctx) },
909 Bp2buildTestCase{
910 Blueprint: fmt.Sprintf(bp, tc.moduleType),
911 ModuleTypeUnderTest: tc.moduleType,
912 ModuleTypeUnderTestFactory: tc.factory,
913 ExpectedBazelTargets: expectedBazelTargets,
914 })
915 })
916 }
917}
Spandan Dasf62e80a2023-08-17 22:35:04 +0000918
919func TestGenruleWithModulesInNamespaces(t *testing.T) {
920 bp := `
921genrule {
922 name: "mygenrule",
923 cmd: "echo $(location //mynamespace:mymodule) > $(out)",
924 srcs: ["//mynamespace:mymodule"],
925 out: ["myout"],
926}
927`
928 fs := map[string]string{
929 "mynamespace/Android.bp": `soong_namespace {}`,
930 "mynamespace/dir/Android.bp": `cc_binary {name: "mymodule"}`,
931 }
932 expectedBazelTargets := []string{
933 MakeBazelTargetNoRestrictions("genrule", "mygenrule", AttrNameToString{
934 // The fully qualified soong label is <namespace>:<module_name>
935 // - here the prefix is mynamespace
936 // The fully qualifed bazel label is <package>:<module_name>
937 // - here the prefix is mynamespace/dir, since there is a BUILD file at each level of this FS path
938 "cmd": `"echo $(location //mynamespace/dir:mymodule) > $(OUTS)"`,
939 "outs": `["myout"]`,
940 "srcs": `["//mynamespace/dir:mymodule"]`,
941 }),
942 }
943
944 t.Run("genrule that uses module from a different namespace", func(t *testing.T) {
945 runGenruleTestCase(t, Bp2buildTestCase{
946 Blueprint: bp,
947 Filesystem: fs,
948 ModuleTypeUnderTest: "genrule",
949 ModuleTypeUnderTestFactory: genrule.GenRuleFactory,
950 ExpectedBazelTargets: expectedBazelTargets,
951 })
952 })
953
954}