blob: d082db1bd8541209741859003bcd0c31fa6455c2 [file] [log] [blame]
Rupert Shuttleworth095081c2021-03-25 09:06:03 +00001// 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 (
18 "android/soong/android"
19 "android/soong/cc"
20 "strings"
21 "testing"
22)
23
24const (
25 // See cc/testing.go for more context
26 soongCcLibraryStaticPreamble = `
27cc_defaults {
28 name: "linux_bionic_supported",
29}
30
31toolchain_library {
32 name: "libclang_rt.builtins-x86_64-android",
33 defaults: ["linux_bionic_supported"],
34 vendor_available: true,
35 vendor_ramdisk_available: true,
36 product_available: true,
37 recovery_available: true,
38 native_bridge_supported: true,
39 src: "",
Rupert Shuttleworth095081c2021-03-25 09:06:03 +000040}`
41)
42
43func TestCcLibraryStaticLoadStatement(t *testing.T) {
44 testCases := []struct {
45 bazelTargets BazelTargets
46 expectedLoadStatements string
47 }{
48 {
49 bazelTargets: BazelTargets{
50 BazelTarget{
51 name: "cc_library_static_target",
52 ruleClass: "cc_library_static",
53 // NOTE: No bzlLoadLocation for native rules
54 },
55 },
56 expectedLoadStatements: ``,
57 },
58 }
59
60 for _, testCase := range testCases {
61 actual := testCase.bazelTargets.LoadStatements()
62 expected := testCase.expectedLoadStatements
63 if actual != expected {
64 t.Fatalf("Expected load statements to be %s, got %s", expected, actual)
65 }
66 }
67
68}
69
70func TestCcLibraryStaticBp2Build(t *testing.T) {
71 testCases := []struct {
72 description string
73 moduleTypeUnderTest string
74 moduleTypeUnderTestFactory android.ModuleFactory
75 moduleTypeUnderTestBp2BuildMutator func(android.TopDownMutatorContext)
76 preArchMutators []android.RegisterMutatorFunc
77 depsMutators []android.RegisterMutatorFunc
78 bp string
79 expectedBazelTargets []string
80 filesystem map[string]string
81 dir string
82 }{
83 {
84 description: "cc_library_static test",
85 moduleTypeUnderTest: "cc_library_static",
86 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
87 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
88 filesystem: map[string]string{
89 // NOTE: include_dir headers *should not* appear in Bazel hdrs later (?)
90 "include_dir_1/include_dir_1_a.h": "",
91 "include_dir_1/include_dir_1_b.h": "",
92 "include_dir_2/include_dir_2_a.h": "",
93 "include_dir_2/include_dir_2_b.h": "",
94 // NOTE: local_include_dir headers *should not* appear in Bazel hdrs later (?)
95 "local_include_dir_1/local_include_dir_1_a.h": "",
96 "local_include_dir_1/local_include_dir_1_b.h": "",
97 "local_include_dir_2/local_include_dir_2_a.h": "",
98 "local_include_dir_2/local_include_dir_2_b.h": "",
99 // NOTE: export_include_dir headers *should* appear in Bazel hdrs later
100 "export_include_dir_1/export_include_dir_1_a.h": "",
101 "export_include_dir_1/export_include_dir_1_b.h": "",
102 "export_include_dir_2/export_include_dir_2_a.h": "",
103 "export_include_dir_2/export_include_dir_2_b.h": "",
Rupert Shuttleworthc58d3d22021-04-06 16:37:15 +0000104 // NOTE: Soong implicitly includes headers in the current directory
105 "implicit_include_1.h": "",
106 "implicit_include_2.h": "",
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000107 },
108 bp: soongCcLibraryStaticPreamble + `
109cc_library_headers {
110 name: "header_lib_1",
111 export_include_dirs: ["header_lib_1"],
112}
113
114cc_library_headers {
115 name: "header_lib_2",
116 export_include_dirs: ["header_lib_2"],
117}
118
119cc_library_static {
120 name: "static_lib_1",
121 srcs: ["static_lib_1.cc"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000122}
123
124cc_library_static {
125 name: "static_lib_2",
126 srcs: ["static_lib_2.cc"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000127}
128
129cc_library_static {
130 name: "whole_static_lib_1",
131 srcs: ["whole_static_lib_1.cc"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000132}
133
134cc_library_static {
135 name: "whole_static_lib_2",
136 srcs: ["whole_static_lib_2.cc"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000137}
138
139cc_library_static {
140 name: "foo_static",
141 srcs: [
142 "foo_static1.cc",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000143 "foo_static2.cc",
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000144 ],
145 cflags: [
146 "-Dflag1",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000147 "-Dflag2"
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000148 ],
149 static_libs: [
150 "static_lib_1",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000151 "static_lib_2"
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000152 ],
153 whole_static_libs: [
154 "whole_static_lib_1",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000155 "whole_static_lib_2"
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000156 ],
157 include_dirs: [
Jingwen Chened9c17d2021-04-13 07:14:55 +0000158 "include_dir_1",
159 "include_dir_2",
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000160 ],
161 local_include_dirs: [
162 "local_include_dir_1",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000163 "local_include_dir_2",
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000164 ],
165 export_include_dirs: [
Jingwen Chened9c17d2021-04-13 07:14:55 +0000166 "export_include_dir_1",
167 "export_include_dir_2"
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000168 ],
169 header_libs: [
170 "header_lib_1",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000171 "header_lib_2"
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000172 ],
173
174 // TODO: Also support export_header_lib_headers
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000175}`,
176 expectedBazelTargets: []string{`cc_library_static(
177 name = "foo_static",
178 copts = [
179 "-Dflag1",
180 "-Dflag2",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000181 "-Iinclude_dir_1",
182 "-Iinclude_dir_2",
183 "-Ilocal_include_dir_1",
184 "-Ilocal_include_dir_2",
185 "-I.",
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000186 ],
187 deps = [
188 ":header_lib_1",
189 ":header_lib_2",
190 ":static_lib_1",
191 ":static_lib_2",
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000192 ],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000193 includes = [
194 "export_include_dir_1",
195 "export_include_dir_2",
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000196 ],
197 linkstatic = True,
198 srcs = [
199 "foo_static1.cc",
200 "foo_static2.cc",
201 ],
Chris Parsons08648312021-05-06 16:23:19 -0400202 whole_archive_deps = [
203 ":whole_static_lib_1",
204 ":whole_static_lib_2",
205 ],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000206)`, `cc_library_static(
207 name = "static_lib_1",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000208 copts = ["-I."],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000209 linkstatic = True,
Jingwen Chen882bcc12021-04-27 05:54:20 +0000210 srcs = ["static_lib_1.cc"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000211)`, `cc_library_static(
212 name = "static_lib_2",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000213 copts = ["-I."],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000214 linkstatic = True,
Jingwen Chen882bcc12021-04-27 05:54:20 +0000215 srcs = ["static_lib_2.cc"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000216)`, `cc_library_static(
217 name = "whole_static_lib_1",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000218 copts = ["-I."],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000219 linkstatic = True,
Jingwen Chen882bcc12021-04-27 05:54:20 +0000220 srcs = ["whole_static_lib_1.cc"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000221)`, `cc_library_static(
222 name = "whole_static_lib_2",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000223 copts = ["-I."],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000224 linkstatic = True,
Jingwen Chen882bcc12021-04-27 05:54:20 +0000225 srcs = ["whole_static_lib_2.cc"],
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000226)`},
227 },
Rupert Shuttleworthc143cc52021-04-13 13:08:04 -0400228 {
229 description: "cc_library_static subpackage test",
230 moduleTypeUnderTest: "cc_library_static",
231 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
232 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
233 filesystem: map[string]string{
234 // subpackage with subdirectory
235 "subpackage/Android.bp": "",
236 "subpackage/subpackage_header.h": "",
237 "subpackage/subdirectory/subdirectory_header.h": "",
238 // subsubpackage with subdirectory
239 "subpackage/subsubpackage/Android.bp": "",
240 "subpackage/subsubpackage/subsubpackage_header.h": "",
241 "subpackage/subsubpackage/subdirectory/subdirectory_header.h": "",
242 // subsubsubpackage with subdirectory
243 "subpackage/subsubpackage/subsubsubpackage/Android.bp": "",
244 "subpackage/subsubpackage/subsubsubpackage/subsubsubpackage_header.h": "",
245 "subpackage/subsubpackage/subsubsubpackage/subdirectory/subdirectory_header.h": "",
246 },
247 bp: soongCcLibraryStaticPreamble + `
248cc_library_static {
249 name: "foo_static",
250 srcs: [
251 ],
252 include_dirs: [
253 "subpackage",
254 ],
Rupert Shuttleworthc143cc52021-04-13 13:08:04 -0400255}`,
256 expectedBazelTargets: []string{`cc_library_static(
257 name = "foo_static",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000258 copts = [
259 "-Isubpackage",
260 "-I.",
Rupert Shuttleworthc143cc52021-04-13 13:08:04 -0400261 ],
262 linkstatic = True,
Rupert Shuttleworthc143cc52021-04-13 13:08:04 -0400263)`},
264 },
Jingwen Chened9c17d2021-04-13 07:14:55 +0000265 {
266 description: "cc_library_static export include dir",
267 moduleTypeUnderTest: "cc_library_static",
268 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
269 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
270 filesystem: map[string]string{
271 // subpackage with subdirectory
272 "subpackage/Android.bp": "",
273 "subpackage/subpackage_header.h": "",
274 "subpackage/subdirectory/subdirectory_header.h": "",
275 },
276 bp: soongCcLibraryStaticPreamble + `
277cc_library_static {
278 name: "foo_static",
279 export_include_dirs: ["subpackage"],
280}`,
281 expectedBazelTargets: []string{`cc_library_static(
282 name = "foo_static",
283 copts = ["-I."],
Jingwen Chened9c17d2021-04-13 07:14:55 +0000284 includes = ["subpackage"],
285 linkstatic = True,
Jingwen Chened9c17d2021-04-13 07:14:55 +0000286)`},
287 },
288 {
289 description: "cc_library_static export system include dir",
290 moduleTypeUnderTest: "cc_library_static",
291 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
292 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
293 filesystem: map[string]string{
294 // subpackage with subdirectory
295 "subpackage/Android.bp": "",
296 "subpackage/subpackage_header.h": "",
297 "subpackage/subdirectory/subdirectory_header.h": "",
298 },
299 bp: soongCcLibraryStaticPreamble + `
300cc_library_static {
301 name: "foo_static",
302 export_system_include_dirs: ["subpackage"],
303}`,
304 expectedBazelTargets: []string{`cc_library_static(
305 name = "foo_static",
306 copts = ["-I."],
Jingwen Chened9c17d2021-04-13 07:14:55 +0000307 includes = ["subpackage"],
308 linkstatic = True,
Jingwen Chened9c17d2021-04-13 07:14:55 +0000309)`},
310 },
311 {
312 description: "cc_library_static include_dirs, local_include_dirs, export_include_dirs (b/183742505)",
313 moduleTypeUnderTest: "cc_library_static",
314 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
315 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
316 dir: "subpackage",
317 filesystem: map[string]string{
318 // subpackage with subdirectory
319 "subpackage/Android.bp": `
320cc_library_static {
321 name: "foo_static",
322 // include_dirs are workspace/root relative
323 include_dirs: [
324 "subpackage/subsubpackage",
325 "subpackage2",
326 "subpackage3/subsubpackage"
327 ],
328 local_include_dirs: ["subsubpackage2"], // module dir relative
329 export_include_dirs: ["./exported_subsubpackage"], // module dir relative
330 include_build_directory: true,
331 bazel_module: { bp2build_available: true },
332}`,
333 "subpackage/subsubpackage/header.h": "",
334 "subpackage/subsubpackage2/header.h": "",
335 "subpackage/exported_subsubpackage/header.h": "",
336 "subpackage2/header.h": "",
337 "subpackage3/subsubpackage/header.h": "",
338 },
339 bp: soongCcLibraryStaticPreamble,
340 expectedBazelTargets: []string{`cc_library_static(
341 name = "foo_static",
342 copts = [
343 "-Isubpackage/subsubpackage",
344 "-Isubpackage2",
345 "-Isubpackage3/subsubpackage",
346 "-Isubpackage/subsubpackage2",
347 "-Isubpackage",
348 ],
Jingwen Chened9c17d2021-04-13 07:14:55 +0000349 includes = ["./exported_subsubpackage"],
350 linkstatic = True,
Jingwen Chened9c17d2021-04-13 07:14:55 +0000351)`},
352 },
353 {
354 description: "cc_library_static include_build_directory disabled",
355 moduleTypeUnderTest: "cc_library_static",
356 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
357 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
358 filesystem: map[string]string{
359 // subpackage with subdirectory
360 "subpackage/Android.bp": "",
361 "subpackage/subpackage_header.h": "",
362 "subpackage/subdirectory/subdirectory_header.h": "",
363 },
364 bp: soongCcLibraryStaticPreamble + `
365cc_library_static {
366 name: "foo_static",
367 include_dirs: ["subpackage"], // still used, but local_include_dirs is recommended
368 local_include_dirs: ["subpackage2"],
369 include_build_directory: false,
370}`,
371 expectedBazelTargets: []string{`cc_library_static(
372 name = "foo_static",
373 copts = [
374 "-Isubpackage",
375 "-Isubpackage2",
376 ],
377 linkstatic = True,
378)`},
379 },
380 {
381 description: "cc_library_static include_build_directory enabled",
382 moduleTypeUnderTest: "cc_library_static",
383 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
384 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
385 filesystem: map[string]string{
386 // subpackage with subdirectory
387 "subpackage/Android.bp": "",
388 "subpackage/subpackage_header.h": "",
389 "subpackage2/Android.bp": "",
390 "subpackage2/subpackage2_header.h": "",
391 "subpackage/subdirectory/subdirectory_header.h": "",
392 },
393 bp: soongCcLibraryStaticPreamble + `
394cc_library_static {
395 name: "foo_static",
396 include_dirs: ["subpackage"], // still used, but local_include_dirs is recommended
397 local_include_dirs: ["subpackage2"],
398 include_build_directory: true,
399}`,
400 expectedBazelTargets: []string{`cc_library_static(
401 name = "foo_static",
402 copts = [
403 "-Isubpackage",
404 "-Isubpackage2",
405 "-I.",
406 ],
407 linkstatic = True,
Jingwen Chened9c17d2021-04-13 07:14:55 +0000408)`},
409 },
410 {
411 description: "cc_library_static arch-specific static_libs",
412 moduleTypeUnderTest: "cc_library_static",
413 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
414 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
415 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
416 filesystem: map[string]string{},
417 bp: soongCcLibraryStaticPreamble + `
418cc_library_static { name: "static_dep" }
419cc_library_static { name: "static_dep2" }
420cc_library_static {
421 name: "foo_static",
422 arch: { arm64: { static_libs: ["static_dep"], whole_static_libs: ["static_dep2"] } },
423}`,
424 expectedBazelTargets: []string{`cc_library_static(
425 name = "foo_static",
426 copts = ["-I."],
427 deps = select({
Chris Parsons08648312021-05-06 16:23:19 -0400428 "//build/bazel/platforms/arch:arm64": [":static_dep"],
Jingwen Chened9c17d2021-04-13 07:14:55 +0000429 "//conditions:default": [],
430 }),
431 linkstatic = True,
Chris Parsons08648312021-05-06 16:23:19 -0400432 whole_archive_deps = select({
433 "//build/bazel/platforms/arch:arm64": [":static_dep2"],
434 "//conditions:default": [],
435 }),
Jingwen Chened9c17d2021-04-13 07:14:55 +0000436)`, `cc_library_static(
437 name = "static_dep",
438 copts = ["-I."],
439 linkstatic = True,
440)`, `cc_library_static(
441 name = "static_dep2",
442 copts = ["-I."],
443 linkstatic = True,
444)`},
445 },
446 {
447 description: "cc_library_static os-specific static_libs",
448 moduleTypeUnderTest: "cc_library_static",
449 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
450 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
451 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
452 filesystem: map[string]string{},
453 bp: soongCcLibraryStaticPreamble + `
454cc_library_static { name: "static_dep" }
455cc_library_static { name: "static_dep2" }
456cc_library_static {
457 name: "foo_static",
458 target: { android: { static_libs: ["static_dep"], whole_static_libs: ["static_dep2"] } },
459}`,
460 expectedBazelTargets: []string{`cc_library_static(
461 name = "foo_static",
462 copts = ["-I."],
463 deps = select({
Chris Parsons08648312021-05-06 16:23:19 -0400464 "//build/bazel/platforms/os:android": [":static_dep"],
Jingwen Chened9c17d2021-04-13 07:14:55 +0000465 "//conditions:default": [],
466 }),
467 linkstatic = True,
Chris Parsons08648312021-05-06 16:23:19 -0400468 whole_archive_deps = select({
469 "//build/bazel/platforms/os:android": [":static_dep2"],
470 "//conditions:default": [],
471 }),
Jingwen Chened9c17d2021-04-13 07:14:55 +0000472)`, `cc_library_static(
473 name = "static_dep",
474 copts = ["-I."],
475 linkstatic = True,
476)`, `cc_library_static(
477 name = "static_dep2",
478 copts = ["-I."],
479 linkstatic = True,
480)`},
481 },
482 {
483 description: "cc_library_static base, arch and os-specific static_libs",
484 moduleTypeUnderTest: "cc_library_static",
485 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
486 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
487 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
488 filesystem: map[string]string{},
489 bp: soongCcLibraryStaticPreamble + `
490cc_library_static { name: "static_dep" }
491cc_library_static { name: "static_dep2" }
492cc_library_static { name: "static_dep3" }
493cc_library_static { name: "static_dep4" }
494cc_library_static {
495 name: "foo_static",
496 static_libs: ["static_dep"],
497 whole_static_libs: ["static_dep2"],
498 target: { android: { static_libs: ["static_dep3"] } },
499 arch: { arm64: { static_libs: ["static_dep4"] } },
500}`,
501 expectedBazelTargets: []string{`cc_library_static(
502 name = "foo_static",
503 copts = ["-I."],
Chris Parsons08648312021-05-06 16:23:19 -0400504 deps = [":static_dep"] + select({
Jingwen Chened9c17d2021-04-13 07:14:55 +0000505 "//build/bazel/platforms/arch:arm64": [":static_dep4"],
506 "//conditions:default": [],
507 }) + select({
508 "//build/bazel/platforms/os:android": [":static_dep3"],
509 "//conditions:default": [],
510 }),
511 linkstatic = True,
Chris Parsons08648312021-05-06 16:23:19 -0400512 whole_archive_deps = [":static_dep2"],
Jingwen Chened9c17d2021-04-13 07:14:55 +0000513)`, `cc_library_static(
514 name = "static_dep",
515 copts = ["-I."],
516 linkstatic = True,
517)`, `cc_library_static(
518 name = "static_dep2",
519 copts = ["-I."],
520 linkstatic = True,
521)`, `cc_library_static(
522 name = "static_dep3",
523 copts = ["-I."],
524 linkstatic = True,
525)`, `cc_library_static(
526 name = "static_dep4",
527 copts = ["-I."],
528 linkstatic = True,
529)`},
530 },
Jingwen Chene32e9e02021-04-23 09:17:24 +0000531 {
532 description: "cc_library_static simple exclude_srcs",
533 moduleTypeUnderTest: "cc_library_static",
534 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
535 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
536 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
537 filesystem: map[string]string{
538 "common.c": "",
539 "foo-a.c": "",
540 "foo-excluded.c": "",
541 },
542 bp: soongCcLibraryStaticPreamble + `
543cc_library_static {
544 name: "foo_static",
545 srcs: ["common.c", "foo-*.c"],
546 exclude_srcs: ["foo-excluded.c"],
547}`,
548 expectedBazelTargets: []string{`cc_library_static(
549 name = "foo_static",
550 copts = ["-I."],
551 linkstatic = True,
552 srcs = [
553 "common.c",
554 "foo-a.c",
555 ],
556)`},
557 },
558 {
559 description: "cc_library_static one arch specific srcs",
560 moduleTypeUnderTest: "cc_library_static",
561 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
562 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
563 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
564 filesystem: map[string]string{
565 "common.c": "",
566 "foo-arm.c": "",
567 },
568 bp: soongCcLibraryStaticPreamble + `
569cc_library_static {
570 name: "foo_static",
571 srcs: ["common.c"],
572 arch: { arm: { srcs: ["foo-arm.c"] } }
573}`,
574 expectedBazelTargets: []string{`cc_library_static(
575 name = "foo_static",
576 copts = ["-I."],
577 linkstatic = True,
578 srcs = ["common.c"] + select({
579 "//build/bazel/platforms/arch:arm": ["foo-arm.c"],
580 "//conditions:default": [],
581 }),
582)`},
583 },
584 {
585 description: "cc_library_static one arch specific srcs and exclude_srcs",
586 moduleTypeUnderTest: "cc_library_static",
587 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
588 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
589 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
590 filesystem: map[string]string{
591 "common.c": "",
592 "for-arm.c": "",
593 "not-for-arm.c": "",
594 "not-for-anything.c": "",
595 },
596 bp: soongCcLibraryStaticPreamble + `
597cc_library_static {
598 name: "foo_static",
599 srcs: ["common.c", "not-for-*.c"],
600 exclude_srcs: ["not-for-anything.c"],
601 arch: {
602 arm: { srcs: ["for-arm.c"], exclude_srcs: ["not-for-arm.c"] },
603 },
604}`,
605 expectedBazelTargets: []string{`cc_library_static(
606 name = "foo_static",
607 copts = ["-I."],
608 linkstatic = True,
609 srcs = ["common.c"] + select({
610 "//build/bazel/platforms/arch:arm": ["for-arm.c"],
611 "//conditions:default": ["not-for-arm.c"],
612 }),
613)`},
614 },
615 {
616 description: "cc_library_static arch specific exclude_srcs for 2 architectures",
617 moduleTypeUnderTest: "cc_library_static",
618 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
619 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
620 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
621 filesystem: map[string]string{
622 "common.c": "",
623 "for-arm.c": "",
624 "for-x86.c": "",
625 "not-for-arm.c": "",
626 "not-for-x86.c": "",
627 },
628 bp: soongCcLibraryStaticPreamble + `
629cc_library_static {
630 name: "foo_static",
631 srcs: ["common.c", "not-for-*.c"],
632 exclude_srcs: ["not-for-everything.c"],
633 arch: {
634 arm: { srcs: ["for-arm.c"], exclude_srcs: ["not-for-arm.c"] },
635 x86: { srcs: ["for-x86.c"], exclude_srcs: ["not-for-x86.c"] },
636 },
637} `,
638 expectedBazelTargets: []string{`cc_library_static(
639 name = "foo_static",
640 copts = ["-I."],
641 linkstatic = True,
642 srcs = ["common.c"] + select({
643 "//build/bazel/platforms/arch:arm": [
644 "for-arm.c",
645 "not-for-x86.c",
646 ],
647 "//build/bazel/platforms/arch:x86": [
648 "for-x86.c",
649 "not-for-arm.c",
650 ],
651 "//conditions:default": [
652 "not-for-arm.c",
653 "not-for-x86.c",
654 ],
655 }),
656)`},
657 },
658 {
659 description: "cc_library_static arch specific exclude_srcs for 4 architectures",
660 moduleTypeUnderTest: "cc_library_static",
661 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
662 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
663 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
664 filesystem: map[string]string{
665 "common.c": "",
666 "for-arm.c": "",
667 "for-arm64.c": "",
668 "for-x86.c": "",
669 "for-x86_64.c": "",
670 "not-for-arm.c": "",
671 "not-for-arm64.c": "",
672 "not-for-x86.c": "",
673 "not-for-x86_64.c": "",
674 "not-for-everything.c": "",
675 },
676 bp: soongCcLibraryStaticPreamble + `
677cc_library_static {
678 name: "foo_static",
679 srcs: ["common.c", "not-for-*.c"],
680 exclude_srcs: ["not-for-everything.c"],
681 arch: {
682 arm: { srcs: ["for-arm.c"], exclude_srcs: ["not-for-arm.c"] },
683 arm64: { srcs: ["for-arm64.c"], exclude_srcs: ["not-for-arm64.c"] },
684 x86: { srcs: ["for-x86.c"], exclude_srcs: ["not-for-x86.c"] },
685 x86_64: { srcs: ["for-x86_64.c"], exclude_srcs: ["not-for-x86_64.c"] },
686 },
687} `,
688 expectedBazelTargets: []string{`cc_library_static(
689 name = "foo_static",
690 copts = ["-I."],
691 linkstatic = True,
692 srcs = ["common.c"] + select({
693 "//build/bazel/platforms/arch:arm": [
694 "for-arm.c",
695 "not-for-arm64.c",
696 "not-for-x86.c",
697 "not-for-x86_64.c",
698 ],
699 "//build/bazel/platforms/arch:arm64": [
700 "for-arm64.c",
701 "not-for-arm.c",
702 "not-for-x86.c",
703 "not-for-x86_64.c",
704 ],
705 "//build/bazel/platforms/arch:x86": [
706 "for-x86.c",
707 "not-for-arm.c",
708 "not-for-arm64.c",
709 "not-for-x86_64.c",
710 ],
711 "//build/bazel/platforms/arch:x86_64": [
712 "for-x86_64.c",
713 "not-for-arm.c",
714 "not-for-arm64.c",
715 "not-for-x86.c",
716 ],
717 "//conditions:default": [
718 "not-for-arm.c",
719 "not-for-arm64.c",
720 "not-for-x86.c",
721 "not-for-x86_64.c",
722 ],
723 }),
724)`},
725 },
Liz Kammer2b50ce62021-04-26 15:47:28 -0400726 {
727 description: "cc_library_static multiple dep same name panic",
728 moduleTypeUnderTest: "cc_library_static",
729 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
730 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
731 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
732 filesystem: map[string]string{},
733 bp: soongCcLibraryStaticPreamble + `
734cc_library_static { name: "static_dep" }
735cc_library_static {
736 name: "foo_static",
Chris Parsons08648312021-05-06 16:23:19 -0400737 static_libs: ["static_dep", "static_dep"],
Liz Kammer2b50ce62021-04-26 15:47:28 -0400738}`,
739 expectedBazelTargets: []string{`cc_library_static(
740 name = "foo_static",
741 copts = ["-I."],
742 deps = [":static_dep"],
743 linkstatic = True,
744)`, `cc_library_static(
745 name = "static_dep",
746 copts = ["-I."],
747 linkstatic = True,
748)`},
749 },
Chris Parsonsc424b762021-04-29 18:06:50 -0400750 {
751 description: "cc_library_static 1 multilib srcs and exclude_srcs",
752 moduleTypeUnderTest: "cc_library_static",
753 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
754 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
755 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
756 filesystem: map[string]string{
757 "common.c": "",
758 "for-lib32.c": "",
759 "not-for-lib32.c": "",
760 },
761 bp: soongCcLibraryStaticPreamble + `
762cc_library_static {
763 name: "foo_static",
764 srcs: ["common.c", "not-for-*.c"],
765 multilib: {
766 lib32: { srcs: ["for-lib32.c"], exclude_srcs: ["not-for-lib32.c"] },
767 },
768} `,
769 expectedBazelTargets: []string{`cc_library_static(
770 name = "foo_static",
771 copts = ["-I."],
772 linkstatic = True,
773 srcs = ["common.c"] + select({
774 "//build/bazel/platforms/arch:arm": ["for-lib32.c"],
775 "//build/bazel/platforms/arch:x86": ["for-lib32.c"],
776 "//conditions:default": ["not-for-lib32.c"],
777 }),
778)`},
779 },
780 {
781 description: "cc_library_static 2 multilib srcs and exclude_srcs",
782 moduleTypeUnderTest: "cc_library_static",
783 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
784 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
785 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
786 filesystem: map[string]string{
787 "common.c": "",
788 "for-lib32.c": "",
789 "for-lib64.c": "",
790 "not-for-lib32.c": "",
791 "not-for-lib64.c": "",
792 },
793 bp: soongCcLibraryStaticPreamble + `
794cc_library_static {
795 name: "foo_static2",
796 srcs: ["common.c", "not-for-*.c"],
797 multilib: {
798 lib32: { srcs: ["for-lib32.c"], exclude_srcs: ["not-for-lib32.c"] },
799 lib64: { srcs: ["for-lib64.c"], exclude_srcs: ["not-for-lib64.c"] },
800 },
801} `,
802 expectedBazelTargets: []string{`cc_library_static(
803 name = "foo_static2",
804 copts = ["-I."],
805 linkstatic = True,
806 srcs = ["common.c"] + select({
807 "//build/bazel/platforms/arch:arm": [
808 "for-lib32.c",
809 "not-for-lib64.c",
810 ],
811 "//build/bazel/platforms/arch:arm64": [
812 "for-lib64.c",
813 "not-for-lib32.c",
814 ],
815 "//build/bazel/platforms/arch:x86": [
816 "for-lib32.c",
817 "not-for-lib64.c",
818 ],
819 "//build/bazel/platforms/arch:x86_64": [
820 "for-lib64.c",
821 "not-for-lib32.c",
822 ],
823 "//conditions:default": [
824 "not-for-lib32.c",
825 "not-for-lib64.c",
826 ],
827 }),
828)`},
829 },
830 {
831 description: "cc_library_static arch and multilib srcs and exclude_srcs",
832 moduleTypeUnderTest: "cc_library_static",
833 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
834 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
835 depsMutators: []android.RegisterMutatorFunc{cc.RegisterDepsBp2Build},
836 filesystem: map[string]string{
837 "common.c": "",
838 "for-arm.c": "",
839 "for-arm64.c": "",
840 "for-x86.c": "",
841 "for-x86_64.c": "",
842 "for-lib32.c": "",
843 "for-lib64.c": "",
844 "not-for-arm.c": "",
845 "not-for-arm64.c": "",
846 "not-for-x86.c": "",
847 "not-for-x86_64.c": "",
848 "not-for-lib32.c": "",
849 "not-for-lib64.c": "",
850 "not-for-everything.c": "",
851 },
852 bp: soongCcLibraryStaticPreamble + `
853cc_library_static {
854 name: "foo_static3",
855 srcs: ["common.c", "not-for-*.c"],
856 exclude_srcs: ["not-for-everything.c"],
857 arch: {
858 arm: { srcs: ["for-arm.c"], exclude_srcs: ["not-for-arm.c"] },
859 arm64: { srcs: ["for-arm64.c"], exclude_srcs: ["not-for-arm64.c"] },
860 x86: { srcs: ["for-x86.c"], exclude_srcs: ["not-for-x86.c"] },
861 x86_64: { srcs: ["for-x86_64.c"], exclude_srcs: ["not-for-x86_64.c"] },
862 },
863 multilib: {
864 lib32: { srcs: ["for-lib32.c"], exclude_srcs: ["not-for-lib32.c"] },
865 lib64: { srcs: ["for-lib64.c"], exclude_srcs: ["not-for-lib64.c"] },
866 },
867}`,
868 expectedBazelTargets: []string{`cc_library_static(
869 name = "foo_static3",
870 copts = ["-I."],
871 linkstatic = True,
872 srcs = ["common.c"] + select({
873 "//build/bazel/platforms/arch:arm": [
874 "for-arm.c",
875 "for-lib32.c",
876 "not-for-arm64.c",
877 "not-for-lib64.c",
878 "not-for-x86.c",
879 "not-for-x86_64.c",
880 ],
881 "//build/bazel/platforms/arch:arm64": [
882 "for-arm64.c",
883 "for-lib64.c",
884 "not-for-arm.c",
885 "not-for-lib32.c",
886 "not-for-x86.c",
887 "not-for-x86_64.c",
888 ],
889 "//build/bazel/platforms/arch:x86": [
890 "for-lib32.c",
891 "for-x86.c",
892 "not-for-arm.c",
893 "not-for-arm64.c",
894 "not-for-lib64.c",
895 "not-for-x86_64.c",
896 ],
897 "//build/bazel/platforms/arch:x86_64": [
898 "for-lib64.c",
899 "for-x86_64.c",
900 "not-for-arm.c",
901 "not-for-arm64.c",
902 "not-for-lib32.c",
903 "not-for-x86.c",
904 ],
905 "//conditions:default": [
906 "not-for-arm.c",
907 "not-for-arm64.c",
908 "not-for-lib32.c",
909 "not-for-lib64.c",
910 "not-for-x86.c",
911 "not-for-x86_64.c",
912 ],
913 }),
914)`},
915 },
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000916 }
917
918 dir := "."
919 for _, testCase := range testCases {
920 filesystem := make(map[string][]byte)
921 toParse := []string{
922 "Android.bp",
923 }
924 for f, content := range testCase.filesystem {
925 if strings.HasSuffix(f, "Android.bp") {
926 toParse = append(toParse, f)
927 }
928 filesystem[f] = []byte(content)
929 }
930 config := android.TestConfig(buildDir, nil, testCase.bp, filesystem)
931 ctx := android.NewTestContext(config)
932
933 cc.RegisterCCBuildComponents(ctx)
934 ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
935 ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
936
937 ctx.RegisterModuleType(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestFactory)
938 for _, m := range testCase.depsMutators {
939 ctx.DepsBp2BuildMutators(m)
940 }
941 ctx.RegisterBp2BuildMutator(testCase.moduleTypeUnderTest, testCase.moduleTypeUnderTestBp2BuildMutator)
Jingwen Chened9c17d2021-04-13 07:14:55 +0000942 ctx.RegisterBp2BuildConfig(bp2buildConfig)
Rupert Shuttleworth095081c2021-03-25 09:06:03 +0000943 ctx.RegisterForBazelConversion()
944
945 _, errs := ctx.ParseFileList(dir, toParse)
946 if Errored(t, testCase.description, errs) {
947 continue
948 }
949 _, errs = ctx.ResolveDependencies(config)
950 if Errored(t, testCase.description, errs) {
951 continue
952 }
953
954 checkDir := dir
955 if testCase.dir != "" {
956 checkDir = testCase.dir
957 }
958 codegenCtx := NewCodegenContext(config, *ctx.Context, Bp2Build)
959 bazelTargets := generateBazelTargetsForDir(codegenCtx, checkDir)
960 if actualCount, expectedCount := len(bazelTargets), len(testCase.expectedBazelTargets); actualCount != expectedCount {
961 t.Errorf("%s: Expected %d bazel target, got %d", testCase.description, expectedCount, actualCount)
962 } else {
963 for i, target := range bazelTargets {
964 if w, g := testCase.expectedBazelTargets[i], target.content; w != g {
965 t.Errorf(
966 "%s: Expected generated Bazel target to be '%s', got '%s'",
967 testCase.description,
968 w,
969 g,
970 )
971 }
972 }
973 }
974 }
975}