blob: 22c9dfedf3cea0e484a1fddbb2bdcfd3a973cd4c [file] [log] [blame]
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +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 (
Jingwen Chen6ada5892021-09-17 11:38:09 +000018 "fmt"
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +000019 "testing"
20
21 "android/soong/android"
22 "android/soong/cc"
23)
24
25const (
26 // See cc/testing.go for more context
27 // TODO(alexmarquez): Split out the preamble into common code?
28 soongCcLibrarySharedPreamble = soongCcLibraryStaticPreamble
29)
30
31func registerCcLibrarySharedModuleTypes(ctx android.RegistrationContext) {
32 cc.RegisterCCBuildComponents(ctx)
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +000033 ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
34 ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
Liz Kammer12615db2021-09-28 09:19:17 -040035 ctx.RegisterModuleType("cc_library", cc.LibraryFactory)
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +000036}
37
38func runCcLibrarySharedTestCase(t *testing.T, tc bp2buildTestCase) {
39 t.Helper()
Liz Kammer78cfdaa2021-11-08 12:56:31 -050040 (&tc).moduleTypeUnderTest = "cc_library_shared"
41 (&tc).moduleTypeUnderTestFactory = cc.LibrarySharedFactory
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +000042 runBp2BuildTestCase(t, registerCcLibrarySharedModuleTypes, tc)
43}
44
45func TestCcLibrarySharedSimple(t *testing.T) {
46 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -050047 description: "cc_library_shared simple overall test",
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +000048 filesystem: map[string]string{
49 // NOTE: include_dir headers *should not* appear in Bazel hdrs later (?)
50 "include_dir_1/include_dir_1_a.h": "",
51 "include_dir_1/include_dir_1_b.h": "",
52 "include_dir_2/include_dir_2_a.h": "",
53 "include_dir_2/include_dir_2_b.h": "",
54 // NOTE: local_include_dir headers *should not* appear in Bazel hdrs later (?)
55 "local_include_dir_1/local_include_dir_1_a.h": "",
56 "local_include_dir_1/local_include_dir_1_b.h": "",
57 "local_include_dir_2/local_include_dir_2_a.h": "",
58 "local_include_dir_2/local_include_dir_2_b.h": "",
59 // NOTE: export_include_dir headers *should* appear in Bazel hdrs later
60 "export_include_dir_1/export_include_dir_1_a.h": "",
61 "export_include_dir_1/export_include_dir_1_b.h": "",
62 "export_include_dir_2/export_include_dir_2_a.h": "",
63 "export_include_dir_2/export_include_dir_2_b.h": "",
64 // NOTE: Soong implicitly includes headers in the current directory
65 "implicit_include_1.h": "",
66 "implicit_include_2.h": "",
67 },
68 blueprint: soongCcLibrarySharedPreamble + `
69cc_library_headers {
70 name: "header_lib_1",
71 export_include_dirs: ["header_lib_1"],
72 bazel_module: { bp2build_available: false },
73}
74
75cc_library_headers {
76 name: "header_lib_2",
77 export_include_dirs: ["header_lib_2"],
78 bazel_module: { bp2build_available: false },
79}
80
81cc_library_shared {
82 name: "shared_lib_1",
83 srcs: ["shared_lib_1.cc"],
84 bazel_module: { bp2build_available: false },
85}
86
87cc_library_shared {
88 name: "shared_lib_2",
89 srcs: ["shared_lib_2.cc"],
90 bazel_module: { bp2build_available: false },
91}
92
93cc_library_static {
94 name: "whole_static_lib_1",
95 srcs: ["whole_static_lib_1.cc"],
96 bazel_module: { bp2build_available: false },
97}
98
99cc_library_static {
100 name: "whole_static_lib_2",
101 srcs: ["whole_static_lib_2.cc"],
102 bazel_module: { bp2build_available: false },
103}
104
105cc_library_shared {
106 name: "foo_shared",
107 srcs: [
108 "foo_shared1.cc",
109 "foo_shared2.cc",
110 ],
111 cflags: [
112 "-Dflag1",
113 "-Dflag2"
114 ],
115 shared_libs: [
116 "shared_lib_1",
117 "shared_lib_2"
118 ],
119 whole_static_libs: [
120 "whole_static_lib_1",
121 "whole_static_lib_2"
122 ],
123 include_dirs: [
124 "include_dir_1",
125 "include_dir_2",
126 ],
127 local_include_dirs: [
128 "local_include_dir_1",
129 "local_include_dir_2",
130 ],
131 export_include_dirs: [
132 "export_include_dir_1",
133 "export_include_dir_2"
134 ],
135 header_libs: [
136 "header_lib_1",
137 "header_lib_2"
138 ],
Yu Liufc603162022-03-01 15:44:08 -0800139 sdk_version: "current",
140 min_sdk_version: "29",
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000141
142 // TODO: Also support export_header_lib_headers
143}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500144 expectedBazelTargets: []string{
145 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
146 "absolute_includes": `[
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000147 "include_dir_1",
148 "include_dir_2",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500149 ]`,
150 "copts": `[
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000151 "-Dflag1",
152 "-Dflag2",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500153 ]`,
154 "export_includes": `[
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000155 "export_include_dir_1",
156 "export_include_dir_2",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500157 ]`,
158 "implementation_deps": `[
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000159 ":header_lib_1",
160 ":header_lib_2",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500161 ]`,
162 "implementation_dynamic_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400163 ":shared_lib_1",
164 ":shared_lib_2",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500165 ]`,
166 "local_includes": `[
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000167 "local_include_dir_1",
168 "local_include_dir_2",
169 ".",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500170 ]`,
171 "srcs": `[
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000172 "foo_shared1.cc",
173 "foo_shared2.cc",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500174 ]`,
175 "whole_archive_deps": `[
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000176 ":whole_static_lib_1",
177 ":whole_static_lib_2",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500178 ]`,
Yu Liufc603162022-03-01 15:44:08 -0800179 "sdk_version": `"current"`,
180 "min_sdk_version": `"29"`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500181 }),
182 },
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000183 })
184}
185
186func TestCcLibrarySharedArchSpecificSharedLib(t *testing.T) {
187 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500188 description: "cc_library_shared arch-specific shared_libs with whole_static_libs",
189 filesystem: map[string]string{},
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000190 blueprint: soongCcLibrarySharedPreamble + `
191cc_library_static {
192 name: "static_dep",
193 bazel_module: { bp2build_available: false },
194}
195cc_library_shared {
196 name: "shared_dep",
197 bazel_module: { bp2build_available: false },
198}
199cc_library_shared {
200 name: "foo_shared",
201 arch: { arm64: { shared_libs: ["shared_dep"], whole_static_libs: ["static_dep"] } },
202 include_build_directory: false,
203}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500204 expectedBazelTargets: []string{
205 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
206 "implementation_dynamic_deps": `select({
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000207 "//build/bazel/platforms/arch:arm64": [":shared_dep"],
208 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500209 })`,
210 "whole_archive_deps": `select({
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000211 "//build/bazel/platforms/arch:arm64": [":static_dep"],
212 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500213 })`,
214 }),
215 },
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000216 })
217}
218
219func TestCcLibrarySharedOsSpecificSharedLib(t *testing.T) {
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500220 runCcLibrarySharedTestCase(t, bp2buildTestCase{
221 description: "cc_library_shared os-specific shared_libs",
222 filesystem: map[string]string{},
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000223 blueprint: soongCcLibrarySharedPreamble + `
224cc_library_shared {
225 name: "shared_dep",
226 bazel_module: { bp2build_available: false },
227}
228cc_library_shared {
229 name: "foo_shared",
230 target: { android: { shared_libs: ["shared_dep"], } },
231 include_build_directory: false,
232}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500233 expectedBazelTargets: []string{
234 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
235 "implementation_dynamic_deps": `select({
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000236 "//build/bazel/platforms/os:android": [":shared_dep"],
237 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500238 })`,
239 }),
240 },
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000241 })
242}
243
244func TestCcLibrarySharedBaseArchOsSpecificSharedLib(t *testing.T) {
245 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500246 description: "cc_library_shared base, arch, and os-specific shared_libs",
247 filesystem: map[string]string{},
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000248 blueprint: soongCcLibrarySharedPreamble + `
249cc_library_shared {
250 name: "shared_dep",
251 bazel_module: { bp2build_available: false },
252}
253cc_library_shared {
254 name: "shared_dep2",
255 bazel_module: { bp2build_available: false },
256}
257cc_library_shared {
258 name: "shared_dep3",
259 bazel_module: { bp2build_available: false },
260}
261cc_library_shared {
262 name: "foo_shared",
263 shared_libs: ["shared_dep"],
264 target: { android: { shared_libs: ["shared_dep2"] } },
265 arch: { arm64: { shared_libs: ["shared_dep3"] } },
266 include_build_directory: false,
267}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500268 expectedBazelTargets: []string{
269 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
270 "implementation_dynamic_deps": `[":shared_dep"] + select({
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000271 "//build/bazel/platforms/arch:arm64": [":shared_dep3"],
272 "//conditions:default": [],
273 }) + select({
274 "//build/bazel/platforms/os:android": [":shared_dep2"],
275 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500276 })`,
277 }),
278 },
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000279 })
280}
281
282func TestCcLibrarySharedSimpleExcludeSrcs(t *testing.T) {
283 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500284 description: "cc_library_shared simple exclude_srcs",
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000285 filesystem: map[string]string{
286 "common.c": "",
287 "foo-a.c": "",
288 "foo-excluded.c": "",
289 },
290 blueprint: soongCcLibrarySharedPreamble + `
291cc_library_shared {
292 name: "foo_shared",
293 srcs: ["common.c", "foo-*.c"],
294 exclude_srcs: ["foo-excluded.c"],
295 include_build_directory: false,
296}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500297 expectedBazelTargets: []string{
298 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
299 "srcs_c": `[
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000300 "common.c",
301 "foo-a.c",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500302 ]`,
303 }),
304 },
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000305 })
306}
307
308func TestCcLibrarySharedStrip(t *testing.T) {
309 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500310 description: "cc_library_shared stripping",
311 filesystem: map[string]string{},
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000312 blueprint: soongCcLibrarySharedPreamble + `
313cc_library_shared {
314 name: "foo_shared",
315 strip: {
316 keep_symbols: false,
317 keep_symbols_and_debug_frame: true,
318 keep_symbols_list: ["sym", "sym2"],
319 all: true,
320 none: false,
321 },
322 include_build_directory: false,
323}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500324 expectedBazelTargets: []string{
325 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
326 "strip": `{
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000327 "all": True,
328 "keep_symbols": False,
329 "keep_symbols_and_debug_frame": True,
330 "keep_symbols_list": [
331 "sym",
332 "sym2",
333 ],
334 "none": False,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500335 }`,
336 }),
337 },
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000338 })
339}
340
341func TestCcLibrarySharedVersionScript(t *testing.T) {
342 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500343 description: "cc_library_shared version script",
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000344 filesystem: map[string]string{
345 "version_script": "",
346 },
347 blueprint: soongCcLibrarySharedPreamble + `
348cc_library_shared {
349 name: "foo_shared",
350 version_script: "version_script",
351 include_build_directory: false,
352}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500353 expectedBazelTargets: []string{
354 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
355 "additional_linker_inputs": `["version_script"]`,
356 "linkopts": `["-Wl,--version-script,$(location version_script)"]`,
357 }),
358 },
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000359 })
360}
Jingwen Chen6ada5892021-09-17 11:38:09 +0000361
362func TestCcLibrarySharedNoCrtTrue(t *testing.T) {
363 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500364 description: "cc_library_shared - nocrt: true emits attribute",
Jingwen Chen6ada5892021-09-17 11:38:09 +0000365 filesystem: map[string]string{
366 "impl.cpp": "",
367 },
368 blueprint: soongCcLibraryPreamble + `
369cc_library_shared {
370 name: "foo_shared",
371 srcs: ["impl.cpp"],
372 nocrt: true,
373 include_build_directory: false,
374}
375`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500376 expectedBazelTargets: []string{
377 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
378 "link_crt": `False`,
379 "srcs": `["impl.cpp"]`,
380 }),
381 },
382 })
Jingwen Chen6ada5892021-09-17 11:38:09 +0000383}
384
385func TestCcLibrarySharedNoCrtFalse(t *testing.T) {
386 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500387 description: "cc_library_shared - nocrt: false doesn't emit attribute",
Jingwen Chen6ada5892021-09-17 11:38:09 +0000388 filesystem: map[string]string{
389 "impl.cpp": "",
390 },
391 blueprint: soongCcLibraryPreamble + `
392cc_library_shared {
393 name: "foo_shared",
394 srcs: ["impl.cpp"],
395 nocrt: false,
396 include_build_directory: false,
397}
398`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500399 expectedBazelTargets: []string{
400 makeBazelTarget("cc_library_shared", "foo_shared", attrNameToString{
401 "srcs": `["impl.cpp"]`,
402 }),
403 },
404 })
Jingwen Chen6ada5892021-09-17 11:38:09 +0000405}
406
407func TestCcLibrarySharedNoCrtArchVariant(t *testing.T) {
408 runCcLibrarySharedTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500409 description: "cc_library_shared - nocrt in select",
Jingwen Chen6ada5892021-09-17 11:38:09 +0000410 filesystem: map[string]string{
411 "impl.cpp": "",
412 },
413 blueprint: soongCcLibraryPreamble + `
414cc_library_shared {
415 name: "foo_shared",
416 srcs: ["impl.cpp"],
417 arch: {
418 arm: {
419 nocrt: true,
420 },
421 x86: {
422 nocrt: false,
423 },
424 },
425 include_build_directory: false,
426}
427`,
Liz Kammer718eb272022-01-07 10:53:37 -0500428 expectedErr: fmt.Errorf("module \"foo_shared\": nocrt is not supported for arch variants"),
Jingwen Chen6ada5892021-09-17 11:38:09 +0000429 })
430}
Liz Kammer12615db2021-09-28 09:19:17 -0400431
432func TestCcLibrarySharedProto(t *testing.T) {
433 runCcLibrarySharedTestCase(t, bp2buildTestCase{
434 blueprint: soongCcProtoPreamble + `cc_library_shared {
435 name: "foo",
436 srcs: ["foo.proto"],
437 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -0400438 export_proto_headers: true,
439 },
440 include_build_directory: false,
441}`,
442 expectedBazelTargets: []string{
443 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
444 "srcs": `["foo.proto"]`,
445 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
446 "deps": `[":foo_proto"]`,
447 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
448 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
449 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
450 }),
451 },
452 })
453}
Rupert Shuttleworth484aa252021-12-10 07:22:53 -0500454
455func TestCcLibrarySharedUseVersionLib(t *testing.T) {
456 runCcLibrarySharedTestCase(t, bp2buildTestCase{
457 blueprint: soongCcProtoPreamble + `cc_library_shared {
458 name: "foo",
459 use_version_lib: true,
460 include_build_directory: false,
461}`,
462 expectedBazelTargets: []string{
463 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
464 "use_version_lib": "True",
465 }),
466 },
467 })
468}
Jingwen Chen0ee88a62022-01-07 14:55:29 +0000469
470func TestCcLibrarySharedStubs(t *testing.T) {
471 runCcLibrarySharedTestCase(t, bp2buildTestCase{
472 description: "cc_library_shared stubs",
473 moduleTypeUnderTest: "cc_library_shared",
474 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
475 dir: "foo/bar",
476 filesystem: map[string]string{
477 "foo/bar/Android.bp": `
478cc_library_shared {
479 name: "a",
480 stubs: { symbol_file: "a.map.txt", versions: ["28", "29", "current"] },
481 bazel_module: { bp2build_available: true },
482 include_build_directory: false,
483}
484`,
485 },
486 blueprint: soongCcLibraryPreamble,
487 expectedBazelTargets: []string{makeBazelTarget("cc_library_shared", "a", attrNameToString{
488 "stubs_symbol_file": `"a.map.txt"`,
489 "stubs_versions": `[
490 "28",
491 "29",
492 "current",
493 ]`,
494 }),
495 },
496 },
497 )
498}