blob: 17212b838c95d84a0badb24734865aa1a493cea3 [file] [log] [blame]
Jingwen Chen63930982021-03-24 10:04:33 -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 (
Jingwen Chen6ada5892021-09-17 11:38:09 +000018 "fmt"
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000019 "testing"
20
Jingwen Chen63930982021-03-24 10:04:33 -040021 "android/soong/android"
22 "android/soong/cc"
Jingwen Chen63930982021-03-24 10:04:33 -040023)
24
25const (
26 // See cc/testing.go for more context
27 soongCcLibraryPreamble = `
28cc_defaults {
Liz Kammer8337ea42021-09-10 10:06:32 -040029 name: "linux_bionic_supported",
Jingwen Chen63930982021-03-24 10:04:33 -040030}`
Liz Kammer12615db2021-09-28 09:19:17 -040031
32 soongCcProtoLibraries = `
33cc_library {
34 name: "libprotobuf-cpp-lite",
35 bazel_module: { bp2build_available: false },
36}
37
38cc_library {
39 name: "libprotobuf-cpp-full",
40 bazel_module: { bp2build_available: false },
41}`
42
43 soongCcProtoPreamble = soongCcLibraryPreamble + soongCcProtoLibraries
Jingwen Chen63930982021-03-24 10:04:33 -040044)
45
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020046func runCcLibraryTestCase(t *testing.T, tc bp2buildTestCase) {
Liz Kammere4982e82021-05-25 10:39:35 -040047 t.Helper()
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020048 runBp2BuildTestCase(t, registerCcLibraryModuleTypes, tc)
49}
50
51func registerCcLibraryModuleTypes(ctx android.RegistrationContext) {
52 cc.RegisterCCBuildComponents(ctx)
Jingwen Chen14a8bda2021-06-02 11:10:02 +000053 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020054 ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
Liz Kammer2d7bbe32021-06-10 18:20:06 -040055 ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020056 ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
57}
58
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020059func TestCcLibrarySimple(t *testing.T) {
60 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -040061 description: "cc_library - simple example",
62 moduleTypeUnderTest: "cc_library",
63 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020064 filesystem: map[string]string{
65 "android.cpp": "",
Liz Kammer01a16e82021-07-16 16:33:47 -040066 "bionic.cpp": "",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020067 "darwin.cpp": "",
68 // Refer to cc.headerExts for the supported header extensions in Soong.
69 "header.h": "",
70 "header.hh": "",
71 "header.hpp": "",
72 "header.hxx": "",
73 "header.h++": "",
74 "header.inl": "",
75 "header.inc": "",
76 "header.ipp": "",
77 "header.h.generic": "",
78 "impl.cpp": "",
79 "linux.cpp": "",
80 "x86.cpp": "",
81 "x86_64.cpp": "",
82 "foo-dir/a.h": "",
83 },
Liz Kammer78cfdaa2021-11-08 12:56:31 -050084 blueprint: soongCcLibraryPreamble +
85 simpleModuleDoNotConvertBp2build("cc_library_headers", "some-headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -040086cc_library {
87 name: "foo-lib",
88 srcs: ["impl.cpp"],
89 cflags: ["-Wall"],
90 header_libs: ["some-headers"],
91 export_include_dirs: ["foo-dir"],
92 ldflags: ["-Wl,--exclude-libs=bar.a"],
93 arch: {
94 x86: {
95 ldflags: ["-Wl,--exclude-libs=baz.a"],
96 srcs: ["x86.cpp"],
97 },
98 x86_64: {
99 ldflags: ["-Wl,--exclude-libs=qux.a"],
100 srcs: ["x86_64.cpp"],
101 },
102 },
103 target: {
104 android: {
105 srcs: ["android.cpp"],
106 },
107 linux_glibc: {
108 srcs: ["linux.cpp"],
109 },
110 darwin: {
111 srcs: ["darwin.cpp"],
112 },
Liz Kammer01a16e82021-07-16 16:33:47 -0400113 bionic: {
114 srcs: ["bionic.cpp"]
115 },
Jingwen Chen63930982021-03-24 10:04:33 -0400116 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400117 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400118}
119`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500120 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
121 "copts": `["-Wall"]`,
122 "export_includes": `["foo-dir"]`,
123 "implementation_deps": `[":some-headers"]`,
124 "linkopts": `["-Wl,--exclude-libs=bar.a"] + select({
Jingwen Chened9c17d2021-04-13 07:14:55 +0000125 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
126 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
127 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500128 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500129 "srcs": `["impl.cpp"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000130 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
131 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen63930982021-03-24 10:04:33 -0400132 "//conditions:default": [],
133 }) + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400134 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400135 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -0400136 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400137 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000138 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
139 "//build/bazel/platforms/os:linux": ["linux.cpp"],
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400140 "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"],
Liz Kammer01a16e82021-07-16 16:33:47 -0400141 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500142 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500143 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500144 })
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200145}
146
147func TestCcLibraryTrimmedLdAndroid(t *testing.T) {
148 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400149 description: "cc_library - trimmed example of //bionic/linker:ld-android",
150 moduleTypeUnderTest: "cc_library",
151 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200152 filesystem: map[string]string{
153 "ld-android.cpp": "",
154 "linked_list.h": "",
155 "linker.h": "",
156 "linker_block_allocator.h": "",
157 "linker_cfi.h": "",
Jingwen Chen63930982021-03-24 10:04:33 -0400158 },
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400159 blueprint: soongCcLibraryPreamble +
160 simpleModuleDoNotConvertBp2build("cc_library_headers", "libc_headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -0400161cc_library {
162 name: "fake-ld-android",
163 srcs: ["ld_android.cpp"],
164 cflags: [
165 "-Wall",
166 "-Wextra",
167 "-Wunused",
168 "-Werror",
169 ],
170 header_libs: ["libc_headers"],
171 ldflags: [
172 "-Wl,--exclude-libs=libgcc.a",
173 "-Wl,--exclude-libs=libgcc_stripped.a",
174 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
175 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
176 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
177 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
178 ],
179 arch: {
180 x86: {
181 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
182 },
183 x86_64: {
184 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
185 },
186 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400187 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400188}
189`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500190 expectedBazelTargets: makeCcLibraryTargets("fake-ld-android", attrNameToString{
191 "srcs": `["ld_android.cpp"]`,
192 "copts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400193 "-Wall",
194 "-Wextra",
195 "-Wunused",
196 "-Werror",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500197 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500198 "implementation_deps": `[":libc_headers"]`,
199 "linkopts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400200 "-Wl,--exclude-libs=libgcc.a",
201 "-Wl,--exclude-libs=libgcc_stripped.a",
202 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
203 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
204 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
205 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
206 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000207 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=libgcc_eh.a"],
208 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"],
Jingwen Chen63930982021-03-24 10:04:33 -0400209 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500210 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500211 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200212 })
213}
214
215func TestCcLibraryExcludeSrcs(t *testing.T) {
216 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400217 description: "cc_library exclude_srcs - trimmed example of //external/arm-optimized-routines:libarm-optimized-routines-math",
218 moduleTypeUnderTest: "cc_library",
219 moduleTypeUnderTestFactory: cc.LibraryFactory,
220 dir: "external",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200221 filesystem: map[string]string{
222 "external/math/cosf.c": "",
223 "external/math/erf.c": "",
224 "external/math/erf_data.c": "",
225 "external/math/erff.c": "",
226 "external/math/erff_data.c": "",
227 "external/Android.bp": `
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000228cc_library {
229 name: "fake-libarm-optimized-routines-math",
230 exclude_srcs: [
231 // Provided by:
232 // bionic/libm/upstream-freebsd/lib/msun/src/s_erf.c
233 // bionic/libm/upstream-freebsd/lib/msun/src/s_erff.c
234 "math/erf.c",
235 "math/erf_data.c",
236 "math/erff.c",
237 "math/erff_data.c",
238 ],
239 srcs: [
240 "math/*.c",
241 ],
242 // arch-specific settings
243 arch: {
244 arm64: {
245 cflags: [
246 "-DHAVE_FAST_FMA=1",
247 ],
248 },
249 },
250 bazel_module: { bp2build_available: true },
251}
252`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200253 },
254 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500255 expectedBazelTargets: makeCcLibraryTargets("fake-libarm-optimized-routines-math", attrNameToString{
256 "copts": `select({
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000257 "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"],
258 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500259 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500260 "local_includes": `["."]`,
261 "srcs_c": `["math/cosf.c"]`,
262 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200263 })
264}
265
266func TestCcLibrarySharedStaticProps(t *testing.T) {
267 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400268 description: "cc_library shared/static props",
269 moduleTypeUnderTest: "cc_library",
270 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200271 filesystem: map[string]string{
Liz Kammer8337ea42021-09-10 10:06:32 -0400272 "both.cpp": "",
273 "sharedonly.cpp": "",
274 "staticonly.cpp": "",
275 },
276 blueprint: soongCcLibraryPreamble + `
Jingwen Chen53681ef2021-04-29 08:15:13 +0000277cc_library {
278 name: "a",
Chris Parsons08648312021-05-06 16:23:19 -0400279 srcs: ["both.cpp"],
280 cflags: ["bothflag"],
281 shared_libs: ["shared_dep_for_both"],
282 static_libs: ["static_dep_for_both"],
283 whole_static_libs: ["whole_static_lib_for_both"],
284 static: {
285 srcs: ["staticonly.cpp"],
286 cflags: ["staticflag"],
287 shared_libs: ["shared_dep_for_static"],
288 static_libs: ["static_dep_for_static"],
289 whole_static_libs: ["whole_static_lib_for_static"],
290 },
291 shared: {
292 srcs: ["sharedonly.cpp"],
293 cflags: ["sharedflag"],
294 shared_libs: ["shared_dep_for_shared"],
295 static_libs: ["static_dep_for_shared"],
296 whole_static_libs: ["whole_static_lib_for_shared"],
297 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400298 include_build_directory: false,
Jingwen Chen53681ef2021-04-29 08:15:13 +0000299}
300
Liz Kammer8337ea42021-09-10 10:06:32 -0400301cc_library_static {
302 name: "static_dep_for_shared",
303 bazel_module: { bp2build_available: false },
304}
Chris Parsons08648312021-05-06 16:23:19 -0400305
Liz Kammer8337ea42021-09-10 10:06:32 -0400306cc_library_static {
307 name: "static_dep_for_static",
308 bazel_module: { bp2build_available: false },
309}
Chris Parsons08648312021-05-06 16:23:19 -0400310
Liz Kammer8337ea42021-09-10 10:06:32 -0400311cc_library_static {
312 name: "static_dep_for_both",
313 bazel_module: { bp2build_available: false },
314}
Chris Parsons08648312021-05-06 16:23:19 -0400315
Liz Kammer8337ea42021-09-10 10:06:32 -0400316cc_library_static {
317 name: "whole_static_lib_for_shared",
318 bazel_module: { bp2build_available: false },
319}
Chris Parsons08648312021-05-06 16:23:19 -0400320
Liz Kammer8337ea42021-09-10 10:06:32 -0400321cc_library_static {
322 name: "whole_static_lib_for_static",
323 bazel_module: { bp2build_available: false },
324}
Chris Parsons08648312021-05-06 16:23:19 -0400325
Liz Kammer8337ea42021-09-10 10:06:32 -0400326cc_library_static {
327 name: "whole_static_lib_for_both",
328 bazel_module: { bp2build_available: false },
329}
Chris Parsons08648312021-05-06 16:23:19 -0400330
Liz Kammer8337ea42021-09-10 10:06:32 -0400331cc_library {
332 name: "shared_dep_for_shared",
333 bazel_module: { bp2build_available: false },
334}
Chris Parsons08648312021-05-06 16:23:19 -0400335
Liz Kammer8337ea42021-09-10 10:06:32 -0400336cc_library {
337 name: "shared_dep_for_static",
338 bazel_module: { bp2build_available: false },
339}
Chris Parsons08648312021-05-06 16:23:19 -0400340
Liz Kammer8337ea42021-09-10 10:06:32 -0400341cc_library {
342 name: "shared_dep_for_both",
343 bazel_module: { bp2build_available: false },
344}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000345`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500346 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500347 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
348 "copts": `[
349 "bothflag",
350 "staticflag",
351 ]`,
352 "implementation_deps": `[
353 ":static_dep_for_both",
354 ":static_dep_for_static",
355 ]`,
356 "implementation_dynamic_deps": `[
357 ":shared_dep_for_both",
358 ":shared_dep_for_static",
359 ]`,
360 "srcs": `[
361 "both.cpp",
362 "staticonly.cpp",
363 ]`,
364 "whole_archive_deps": `[
365 ":whole_static_lib_for_both",
366 ":whole_static_lib_for_static",
367 ]`}),
368 makeBazelTarget("cc_library_shared", "a", attrNameToString{
369 "copts": `[
370 "bothflag",
371 "sharedflag",
372 ]`,
373 "implementation_deps": `[
374 ":static_dep_for_both",
375 ":static_dep_for_shared",
376 ]`,
377 "implementation_dynamic_deps": `[
378 ":shared_dep_for_both",
379 ":shared_dep_for_shared",
380 ]`,
381 "srcs": `[
382 "both.cpp",
383 "sharedonly.cpp",
384 ]`,
385 "whole_archive_deps": `[
386 ":whole_static_lib_for_both",
387 ":whole_static_lib_for_shared",
388 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500389 }),
390 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200391 })
392}
393
Liz Kammer7a210ac2021-09-22 15:52:58 -0400394func TestCcLibraryDeps(t *testing.T) {
395 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400396 description: "cc_library shared/static props",
397 moduleTypeUnderTest: "cc_library",
398 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer7a210ac2021-09-22 15:52:58 -0400399 filesystem: map[string]string{
400 "both.cpp": "",
401 "sharedonly.cpp": "",
402 "staticonly.cpp": "",
403 },
404 blueprint: soongCcLibraryPreamble + `
405cc_library {
406 name: "a",
407 srcs: ["both.cpp"],
408 cflags: ["bothflag"],
409 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
410 export_shared_lib_headers: ["shared_dep_for_both"],
411 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
412 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
413 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
414 static: {
415 srcs: ["staticonly.cpp"],
416 cflags: ["staticflag"],
417 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
418 export_shared_lib_headers: ["shared_dep_for_static"],
419 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
420 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
421 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
422 },
423 shared: {
424 srcs: ["sharedonly.cpp"],
425 cflags: ["sharedflag"],
426 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
427 export_shared_lib_headers: ["shared_dep_for_shared"],
428 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
429 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
430 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
431 },
432 include_build_directory: false,
433}
434` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
435 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
436 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
437 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
438 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
439 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
440 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
441 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
442 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
443 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
444 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
445 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
446 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
447 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
448 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
449 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
450 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
451 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500452 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500453 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
454 "copts": `[
455 "bothflag",
456 "staticflag",
457 ]`,
458 "deps": `[
459 ":static_dep_for_both",
460 ":static_dep_for_static",
461 ]`,
462 "dynamic_deps": `[
463 ":shared_dep_for_both",
464 ":shared_dep_for_static",
465 ]`,
466 "implementation_deps": `[
467 ":implementation_static_dep_for_both",
468 ":implementation_static_dep_for_static",
469 ]`,
470 "implementation_dynamic_deps": `[
471 ":implementation_shared_dep_for_both",
472 ":implementation_shared_dep_for_static",
473 ]`,
474 "srcs": `[
475 "both.cpp",
476 "staticonly.cpp",
477 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500478 "whole_archive_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400479 ":not_explicitly_exported_whole_static_dep_for_both",
480 ":whole_static_dep_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500481 ":not_explicitly_exported_whole_static_dep_for_static",
482 ":whole_static_dep_for_static",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500483 ]`,
484 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500485 makeBazelTarget("cc_library_shared", "a", attrNameToString{
486 "copts": `[
487 "bothflag",
488 "sharedflag",
489 ]`,
490 "deps": `[
491 ":static_dep_for_both",
492 ":static_dep_for_shared",
493 ]`,
494 "dynamic_deps": `[
495 ":shared_dep_for_both",
496 ":shared_dep_for_shared",
497 ]`,
498 "implementation_deps": `[
499 ":implementation_static_dep_for_both",
500 ":implementation_static_dep_for_shared",
501 ]`,
502 "implementation_dynamic_deps": `[
503 ":implementation_shared_dep_for_both",
504 ":implementation_shared_dep_for_shared",
505 ]`,
506 "srcs": `[
507 "both.cpp",
508 "sharedonly.cpp",
509 ]`,
510 "whole_archive_deps": `[
511 ":not_explicitly_exported_whole_static_dep_for_both",
512 ":whole_static_dep_for_both",
513 ":not_explicitly_exported_whole_static_dep_for_shared",
514 ":whole_static_dep_for_shared",
515 ]`,
516 })},
517 },
518 )
Liz Kammer7a210ac2021-09-22 15:52:58 -0400519}
520
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400521func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
522 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400523 moduleTypeUnderTest: "cc_library",
524 moduleTypeUnderTestFactory: cc.LibraryFactory,
525 dir: "foo/bar",
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400526 filesystem: map[string]string{
527 "foo/bar/Android.bp": `
528cc_library {
529 name: "a",
530 whole_static_libs: ["whole_static_lib_for_both"],
531 static: {
532 whole_static_libs: ["whole_static_lib_for_static"],
533 },
534 shared: {
535 whole_static_libs: ["whole_static_lib_for_shared"],
536 },
537 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400538 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400539}
540
541cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
542
543cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
544
545cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
546`,
547 },
548 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500549 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500550 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
551 "whole_archive_deps": `[
552 ":whole_static_lib_for_both_alwayslink",
553 ":whole_static_lib_for_static_alwayslink",
554 ]`,
555 }),
556 makeBazelTarget("cc_library_shared", "a", attrNameToString{
557 "whole_archive_deps": `[
558 ":whole_static_lib_for_both_alwayslink",
559 ":whole_static_lib_for_shared_alwayslink",
560 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500561 }),
562 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500563 },
564 )
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400565}
566
Jingwen Chenbcf53042021-05-26 04:42:42 +0000567func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
568 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400569 description: "cc_library shared/static props in arch",
570 moduleTypeUnderTest: "cc_library",
571 moduleTypeUnderTestFactory: cc.LibraryFactory,
572 dir: "foo/bar",
Jingwen Chenbcf53042021-05-26 04:42:42 +0000573 filesystem: map[string]string{
574 "foo/bar/arm.cpp": "",
575 "foo/bar/x86.cpp": "",
576 "foo/bar/sharedonly.cpp": "",
577 "foo/bar/staticonly.cpp": "",
578 "foo/bar/Android.bp": `
579cc_library {
580 name: "a",
581 arch: {
582 arm: {
583 shared: {
584 srcs: ["arm_shared.cpp"],
585 cflags: ["-DARM_SHARED"],
586 static_libs: ["arm_static_dep_for_shared"],
587 whole_static_libs: ["arm_whole_static_dep_for_shared"],
588 shared_libs: ["arm_shared_dep_for_shared"],
589 },
590 },
591 x86: {
592 static: {
593 srcs: ["x86_static.cpp"],
594 cflags: ["-DX86_STATIC"],
595 static_libs: ["x86_dep_for_static"],
596 },
597 },
598 },
599 target: {
600 android: {
601 shared: {
602 srcs: ["android_shared.cpp"],
603 cflags: ["-DANDROID_SHARED"],
604 static_libs: ["android_dep_for_shared"],
605 },
606 },
607 android_arm: {
608 shared: {
609 cflags: ["-DANDROID_ARM_SHARED"],
610 },
611 },
612 },
613 srcs: ["both.cpp"],
614 cflags: ["bothflag"],
615 static_libs: ["static_dep_for_both"],
616 static: {
617 srcs: ["staticonly.cpp"],
618 cflags: ["staticflag"],
619 static_libs: ["static_dep_for_static"],
620 },
621 shared: {
622 srcs: ["sharedonly.cpp"],
623 cflags: ["sharedflag"],
624 static_libs: ["static_dep_for_shared"],
625 },
626 bazel_module: { bp2build_available: true },
627}
628
629cc_library_static { name: "static_dep_for_shared" }
630cc_library_static { name: "static_dep_for_static" }
631cc_library_static { name: "static_dep_for_both" }
632
633cc_library_static { name: "arm_static_dep_for_shared" }
634cc_library_static { name: "arm_whole_static_dep_for_shared" }
635cc_library_static { name: "arm_shared_dep_for_shared" }
636
637cc_library_static { name: "x86_dep_for_static" }
638
639cc_library_static { name: "android_dep_for_shared" }
640`,
641 },
642 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500643 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500644 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
645 "copts": `[
646 "bothflag",
647 "staticflag",
648 ] + select({
649 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
650 "//conditions:default": [],
651 })`,
652 "implementation_deps": `[
653 ":static_dep_for_both",
654 ":static_dep_for_static",
655 ] + select({
656 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
657 "//conditions:default": [],
658 })`,
659 "local_includes": `["."]`,
660 "srcs": `[
661 "both.cpp",
662 "staticonly.cpp",
663 ] + select({
664 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
665 "//conditions:default": [],
666 })`,
667 }),
668 makeBazelTarget("cc_library_shared", "a", attrNameToString{
669 "copts": `[
670 "bothflag",
671 "sharedflag",
672 ] + select({
673 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
674 "//conditions:default": [],
675 }) + select({
676 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
677 "//conditions:default": [],
678 }) + select({
679 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
680 "//conditions:default": [],
681 })`,
682 "implementation_deps": `[
683 ":static_dep_for_both",
684 ":static_dep_for_shared",
685 ] + select({
686 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
687 "//conditions:default": [],
688 }) + select({
689 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
690 "//conditions:default": [],
691 })`,
692 "implementation_dynamic_deps": `select({
693 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
694 "//conditions:default": [],
695 })`,
696 "local_includes": `["."]`,
697 "srcs": `[
698 "both.cpp",
699 "sharedonly.cpp",
700 ] + select({
701 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
702 "//conditions:default": [],
703 }) + select({
704 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
705 "//conditions:default": [],
706 })`,
707 "whole_archive_deps": `select({
708 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
709 "//conditions:default": [],
710 })`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500711 }),
712 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500713 },
714 )
Jingwen Chenbcf53042021-05-26 04:42:42 +0000715}
716
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000717func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
718 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400719 description: "cc_library shared/static props with c/cpp/s mixed sources",
720 moduleTypeUnderTest: "cc_library",
721 moduleTypeUnderTestFactory: cc.LibraryFactory,
722 dir: "foo/bar",
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000723 filesystem: map[string]string{
724 "foo/bar/both_source.cpp": "",
725 "foo/bar/both_source.cc": "",
726 "foo/bar/both_source.c": "",
727 "foo/bar/both_source.s": "",
728 "foo/bar/both_source.S": "",
729 "foo/bar/shared_source.cpp": "",
730 "foo/bar/shared_source.cc": "",
731 "foo/bar/shared_source.c": "",
732 "foo/bar/shared_source.s": "",
733 "foo/bar/shared_source.S": "",
734 "foo/bar/static_source.cpp": "",
735 "foo/bar/static_source.cc": "",
736 "foo/bar/static_source.c": "",
737 "foo/bar/static_source.s": "",
738 "foo/bar/static_source.S": "",
739 "foo/bar/Android.bp": `
740cc_library {
741 name: "a",
742 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400743 "both_source.cpp",
744 "both_source.cc",
745 "both_source.c",
746 "both_source.s",
747 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400748 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400749 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000750 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400751 srcs: [
752 "static_source.cpp",
753 "static_source.cc",
754 "static_source.c",
755 "static_source.s",
756 "static_source.S",
757 ":static_filegroup",
758 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000759 },
760 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400761 srcs: [
762 "shared_source.cpp",
763 "shared_source.cc",
764 "shared_source.c",
765 "shared_source.s",
766 "shared_source.S",
767 ":shared_filegroup",
768 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000769 },
770 bazel_module: { bp2build_available: true },
771}
772
773filegroup {
774 name: "both_filegroup",
775 srcs: [
776 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400777 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000778}
779
780filegroup {
781 name: "shared_filegroup",
782 srcs: [
783 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400784 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000785}
786
787filegroup {
788 name: "static_filegroup",
789 srcs: [
790 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400791 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000792}
793`,
794 },
795 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500796 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500797 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500798 "local_includes": `["."]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500799 "srcs": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000800 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400801 "both_source.cc",
802 ":both_filegroup_cpp_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500803 "static_source.cpp",
804 "static_source.cc",
805 ":static_filegroup_cpp_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500806 ]`,
807 "srcs_as": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000808 "both_source.s",
809 "both_source.S",
810 ":both_filegroup_as_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500811 "static_source.s",
812 "static_source.S",
813 ":static_filegroup_as_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500814 ]`,
815 "srcs_c": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000816 "both_source.c",
817 ":both_filegroup_c_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500818 "static_source.c",
819 ":static_filegroup_c_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500820 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500821 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500822 makeBazelTarget("cc_library_shared", "a", attrNameToString{
823 "local_includes": `["."]`,
824 "srcs": `[
825 "both_source.cpp",
826 "both_source.cc",
827 ":both_filegroup_cpp_srcs",
828 "shared_source.cpp",
829 "shared_source.cc",
830 ":shared_filegroup_cpp_srcs",
831 ]`,
832 "srcs_as": `[
833 "both_source.s",
834 "both_source.S",
835 ":both_filegroup_as_srcs",
836 "shared_source.s",
837 "shared_source.S",
838 ":shared_filegroup_as_srcs",
839 ]`,
840 "srcs_c": `[
841 "both_source.c",
842 ":both_filegroup_c_srcs",
843 "shared_source.c",
844 ":shared_filegroup_c_srcs",
845 ]`,
846 })}})
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000847}
848
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200849func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
850 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400851 description: "cc_library non-configured version script",
852 moduleTypeUnderTest: "cc_library",
853 moduleTypeUnderTestFactory: cc.LibraryFactory,
854 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200855 filesystem: map[string]string{
856 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200857cc_library {
858 name: "a",
859 srcs: ["a.cpp"],
860 version_script: "v.map",
861 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400862 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200863}
864`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200865 },
866 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500867 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
868 "additional_linker_inputs": `["v.map"]`,
869 "linkopts": `["-Wl,--version-script,$(location v.map)"]`,
870 "srcs": `["a.cpp"]`,
871 }),
872 },
873 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200874}
875
876func TestCcLibraryConfiguredVersionScript(t *testing.T) {
877 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400878 description: "cc_library configured version script",
879 moduleTypeUnderTest: "cc_library",
880 moduleTypeUnderTestFactory: cc.LibraryFactory,
881 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200882 filesystem: map[string]string{
883 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400884cc_library {
885 name: "a",
886 srcs: ["a.cpp"],
887 arch: {
888 arm: {
889 version_script: "arm.map",
890 },
891 arm64: {
892 version_script: "arm64.map",
893 },
894 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200895
Liz Kammer8337ea42021-09-10 10:06:32 -0400896 bazel_module: { bp2build_available: true },
897 include_build_directory: false,
898}
Liz Kammerd366c902021-06-03 13:43:01 -0400899 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200900 },
901 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500902 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
903 "additional_linker_inputs": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400904 "//build/bazel/platforms/arch:arm": ["arm.map"],
905 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
906 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500907 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500908 "linkopts": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400909 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
910 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
911 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500912 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500913 "srcs": `["a.cpp"]`,
914 }),
915 },
916 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200917}
918
919func TestCcLibrarySharedLibs(t *testing.T) {
920 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400921 description: "cc_library shared_libs",
922 moduleTypeUnderTest: "cc_library",
923 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400924 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400925cc_library {
926 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400927 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400928}
929
930cc_library {
931 name: "a",
932 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400933 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400934}
935`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500936 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
937 "implementation_dynamic_deps": `[":mylib"]`,
938 }),
939 },
940 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200941}
942
Liz Kammer0eae52e2021-10-06 10:32:26 -0400943func TestCcLibraryFeatures(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -0500944 expected_targets := []string{}
945 expected_targets = append(expected_targets, makeCcLibraryTargets("a", attrNameToString{
946 "features": `[
947 "disable_pack_relocations",
948 "-no_undefined_symbols",
949 ]`,
950 "srcs": `["a.cpp"]`,
951 })...)
952 expected_targets = append(expected_targets, makeCcLibraryTargets("b", attrNameToString{
953 "features": `select({
954 "//build/bazel/platforms/arch:x86_64": [
955 "disable_pack_relocations",
956 "-no_undefined_symbols",
957 ],
958 "//conditions:default": [],
959 })`,
960 "srcs": `["b.cpp"]`,
961 })...)
962 expected_targets = append(expected_targets, makeCcLibraryTargets("c", attrNameToString{
963 "features": `select({
964 "//build/bazel/platforms/os:darwin": [
965 "disable_pack_relocations",
966 "-no_undefined_symbols",
967 ],
968 "//conditions:default": [],
969 })`,
970 "srcs": `["c.cpp"]`,
971 })...)
972
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200973 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400974 description: "cc_library pack_relocations test",
975 moduleTypeUnderTest: "cc_library",
976 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400977 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400978cc_library {
979 name: "a",
980 srcs: ["a.cpp"],
981 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400982 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400983 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400984}
985
986cc_library {
987 name: "b",
988 srcs: ["b.cpp"],
989 arch: {
990 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400991 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400992 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400993 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400994 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400995 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400996}
997
998cc_library {
999 name: "c",
1000 srcs: ["c.cpp"],
1001 target: {
1002 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001003 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001004 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001005 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001006 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001007 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001008}`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001009 expectedBazelTargets: expected_targets,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001010 })
1011}
1012
1013func TestCcLibrarySpacesInCopts(t *testing.T) {
1014 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001015 description: "cc_library spaces in copts",
1016 moduleTypeUnderTest: "cc_library",
1017 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001018 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +00001019cc_library {
1020 name: "a",
1021 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -04001022 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +00001023}
1024`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001025 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1026 "copts": `[
Jingwen Chen3950cd62021-05-12 04:33:00 +00001027 "-include",
1028 "header.h",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001029 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001030 }),
1031 },
1032 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001033}
1034
1035func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
1036 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001037 description: "cc_library cppflags usage",
1038 moduleTypeUnderTest: "cc_library",
1039 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001040 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001041 name: "a",
1042 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001043 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001044 cppflags: [
1045 "-fsigned-char",
1046 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -04001047 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001048 arch: {
1049 arm64: {
1050 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001051 },
Liz Kammerd366c902021-06-03 13:43:01 -04001052 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001053 target: {
1054 android: {
1055 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001056 },
Liz Kammerd366c902021-06-03 13:43:01 -04001057 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001058 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001059}
1060`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001061 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1062 "copts": `["-Wall"]`,
1063 "cppflags": `[
Chris Parsons990c4f42021-05-25 12:10:58 -04001064 "-fsigned-char",
1065 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001066 ] + select({
1067 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1068 "//conditions:default": [],
1069 }) + select({
1070 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1071 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001072 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001073 "srcs": `["a.cpp"]`,
1074 }),
1075 },
1076 )
Jingwen Chen63930982021-03-24 10:04:33 -04001077}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001078
Liz Kammer47535c52021-06-02 16:02:22 -04001079func TestCcLibraryExcludeLibs(t *testing.T) {
1080 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001081 moduleTypeUnderTest: "cc_library",
1082 moduleTypeUnderTestFactory: cc.LibraryFactory,
1083 filesystem: map[string]string{},
Liz Kammer47535c52021-06-02 16:02:22 -04001084 blueprint: soongCcLibraryStaticPreamble + `
1085cc_library {
1086 name: "foo_static",
1087 srcs: ["common.c"],
1088 whole_static_libs: [
1089 "arm_whole_static_lib_excludes",
1090 "malloc_not_svelte_whole_static_lib_excludes"
1091 ],
1092 static_libs: [
1093 "arm_static_lib_excludes",
1094 "malloc_not_svelte_static_lib_excludes"
1095 ],
1096 shared_libs: [
1097 "arm_shared_lib_excludes",
1098 ],
1099 arch: {
1100 arm: {
1101 exclude_shared_libs: [
1102 "arm_shared_lib_excludes",
1103 ],
1104 exclude_static_libs: [
1105 "arm_static_lib_excludes",
1106 "arm_whole_static_lib_excludes",
1107 ],
1108 },
1109 },
1110 product_variables: {
1111 malloc_not_svelte: {
1112 shared_libs: ["malloc_not_svelte_shared_lib"],
1113 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1114 exclude_static_libs: [
1115 "malloc_not_svelte_static_lib_excludes",
1116 "malloc_not_svelte_whole_static_lib_excludes",
1117 ],
1118 },
1119 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001120 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001121}
1122
1123cc_library {
1124 name: "arm_whole_static_lib_excludes",
1125 bazel_module: { bp2build_available: false },
1126}
1127
1128cc_library {
1129 name: "malloc_not_svelte_whole_static_lib",
1130 bazel_module: { bp2build_available: false },
1131}
1132
1133cc_library {
1134 name: "malloc_not_svelte_whole_static_lib_excludes",
1135 bazel_module: { bp2build_available: false },
1136}
1137
1138cc_library {
1139 name: "arm_static_lib_excludes",
1140 bazel_module: { bp2build_available: false },
1141}
1142
1143cc_library {
1144 name: "malloc_not_svelte_static_lib_excludes",
1145 bazel_module: { bp2build_available: false },
1146}
1147
1148cc_library {
1149 name: "arm_shared_lib_excludes",
1150 bazel_module: { bp2build_available: false },
1151}
1152
1153cc_library {
1154 name: "malloc_not_svelte_shared_lib",
1155 bazel_module: { bp2build_available: false },
1156}
1157`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001158 expectedBazelTargets: makeCcLibraryTargets("foo_static", attrNameToString{
1159 "implementation_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001160 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001161 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001162 }) + select({
1163 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001164 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001165 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001166 "implementation_dynamic_deps": `select({
Liz Kammer7a210ac2021-09-22 15:52:58 -04001167 "//build/bazel/platforms/arch:arm": [],
1168 "//conditions:default": [":arm_shared_lib_excludes"],
1169 }) + select({
1170 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1171 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001172 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001173 "srcs_c": `["common.c"]`,
1174 "whole_archive_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001175 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001176 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001177 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001178 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1179 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001180 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001181 }),
1182 },
1183 )
Liz Kammer47535c52021-06-02 16:02:22 -04001184}
Liz Kammerd366c902021-06-03 13:43:01 -04001185
1186func TestCCLibraryNoCrtTrue(t *testing.T) {
1187 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001188 description: "cc_library - nocrt: true emits attribute",
1189 moduleTypeUnderTest: "cc_library",
1190 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001191 filesystem: map[string]string{
1192 "impl.cpp": "",
1193 },
1194 blueprint: soongCcLibraryPreamble + `
1195cc_library {
1196 name: "foo-lib",
1197 srcs: ["impl.cpp"],
1198 nocrt: true,
1199 include_build_directory: false,
1200}
1201`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001202 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1203 "link_crt": `False`,
1204 "srcs": `["impl.cpp"]`,
1205 }),
1206 },
1207 )
Jingwen Chen6ada5892021-09-17 11:38:09 +00001208}
1209
1210func TestCCLibraryNoCrtFalse(t *testing.T) {
1211 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001212 description: "cc_library - nocrt: false - does not emit attribute",
1213 moduleTypeUnderTest: "cc_library",
1214 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001215 filesystem: map[string]string{
1216 "impl.cpp": "",
1217 },
1218 blueprint: soongCcLibraryPreamble + `
1219cc_library {
1220 name: "foo-lib",
1221 srcs: ["impl.cpp"],
1222 nocrt: false,
1223 include_build_directory: false,
1224}
1225`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001226 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1227 "srcs": `["impl.cpp"]`,
1228 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001229 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001230}
1231
1232func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1233 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001234 description: "cc_library - nocrt in select",
1235 moduleTypeUnderTest: "cc_library",
1236 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001237 filesystem: map[string]string{
1238 "impl.cpp": "",
1239 },
1240 blueprint: soongCcLibraryPreamble + `
1241cc_library {
1242 name: "foo-lib",
1243 srcs: ["impl.cpp"],
1244 arch: {
1245 arm: {
1246 nocrt: true,
1247 },
1248 x86: {
1249 nocrt: false,
1250 },
1251 },
1252 include_build_directory: false,
1253}
1254`,
Liz Kammer718eb272022-01-07 10:53:37 -05001255 expectedErr: fmt.Errorf("module \"foo-lib\": nocrt is not supported for arch variants"),
Jingwen Chen6ada5892021-09-17 11:38:09 +00001256 })
1257}
1258
1259func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1260 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001261 moduleTypeUnderTest: "cc_library",
1262 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001263 filesystem: map[string]string{
1264 "impl.cpp": "",
1265 },
1266 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001267cc_library {
1268 name: "foo-lib",
1269 srcs: ["impl.cpp"],
1270 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001271 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001272}
1273`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001274 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1275 "srcs": `["impl.cpp"]`,
1276 "use_libcrt": `False`,
1277 }),
1278 })
1279}
1280
1281func makeCcLibraryTargets(name string, attrs attrNameToString) []string {
1282 STATIC_ONLY_ATTRS := map[string]bool{}
1283 SHARED_ONLY_ATTRS := map[string]bool{
1284 "link_crt": true,
1285 "additional_linker_inputs": true,
1286 "linkopts": true,
1287 "strip": true,
Jingwen Chen0ee88a62022-01-07 14:55:29 +00001288 "stubs_symbol_file": true,
1289 "stubs_versions": true,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001290 }
1291 sharedAttrs := attrNameToString{}
1292 staticAttrs := attrNameToString{}
1293 for key, val := range attrs {
1294 if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly {
1295 sharedAttrs[key] = val
1296 }
1297 if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly {
1298 staticAttrs[key] = val
1299 }
1300 }
1301 sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
1302 staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
1303
1304 return []string{staticTarget, sharedTarget}
Liz Kammerd366c902021-06-03 13:43:01 -04001305}
1306
Jingwen Chen6ada5892021-09-17 11:38:09 +00001307func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001308 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001309 moduleTypeUnderTest: "cc_library",
1310 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001311 filesystem: map[string]string{
1312 "impl.cpp": "",
1313 },
1314 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001315cc_library {
1316 name: "foo-lib",
1317 srcs: ["impl.cpp"],
1318 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001319 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001320}
1321`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001322 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1323 "srcs": `["impl.cpp"]`,
1324 "use_libcrt": `True`,
1325 }),
1326 })
Liz Kammerd366c902021-06-03 13:43:01 -04001327}
1328
Jingwen Chen6ada5892021-09-17 11:38:09 +00001329func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001330 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001331 moduleTypeUnderTest: "cc_library",
1332 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001333 filesystem: map[string]string{
1334 "impl.cpp": "",
1335 },
1336 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001337cc_library {
1338 name: "foo-lib",
1339 srcs: ["impl.cpp"],
1340 arch: {
1341 arm: {
1342 no_libcrt: true,
1343 },
1344 x86: {
1345 no_libcrt: true,
1346 },
1347 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001348 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001349}
1350`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001351 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1352 "srcs": `["impl.cpp"]`,
1353 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001354 "//build/bazel/platforms/arch:arm": False,
1355 "//build/bazel/platforms/arch:x86": False,
1356 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001357 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001358 }),
1359 })
Liz Kammerd366c902021-06-03 13:43:01 -04001360}
1361
Chris Parsons58852a02021-12-09 18:10:18 -05001362func TestCCLibraryNoLibCrtArchAndTargetVariant(t *testing.T) {
1363 runCcLibraryTestCase(t, bp2buildTestCase{
1364 moduleTypeUnderTest: "cc_library",
1365 moduleTypeUnderTestFactory: cc.LibraryFactory,
1366 filesystem: map[string]string{
1367 "impl.cpp": "",
1368 },
1369 blueprint: soongCcLibraryPreamble + `
1370cc_library {
1371 name: "foo-lib",
1372 srcs: ["impl.cpp"],
1373 arch: {
1374 arm: {
1375 no_libcrt: true,
1376 },
1377 x86: {
1378 no_libcrt: true,
1379 },
1380 },
1381 target: {
1382 darwin: {
1383 no_libcrt: true,
1384 }
1385 },
1386 include_build_directory: false,
1387}
1388`,
1389 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1390 "srcs": `["impl.cpp"]`,
1391 "use_libcrt": `select({
1392 "//build/bazel/platforms/os_arch:android_arm": False,
1393 "//build/bazel/platforms/os_arch:android_x86": False,
1394 "//build/bazel/platforms/os_arch:darwin_arm64": False,
1395 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1396 "//build/bazel/platforms/os_arch:linux_glibc_x86": False,
1397 "//build/bazel/platforms/os_arch:linux_musl_x86": False,
1398 "//build/bazel/platforms/os_arch:windows_x86": False,
1399 "//conditions:default": None,
1400 })`,
1401 }),
1402 })
1403}
1404
1405func TestCCLibraryNoLibCrtArchAndTargetVariantConflict(t *testing.T) {
1406 runCcLibraryTestCase(t, bp2buildTestCase{
1407 moduleTypeUnderTest: "cc_library",
1408 moduleTypeUnderTestFactory: cc.LibraryFactory,
1409 filesystem: map[string]string{
1410 "impl.cpp": "",
1411 },
1412 blueprint: soongCcLibraryPreamble + `
1413cc_library {
1414 name: "foo-lib",
1415 srcs: ["impl.cpp"],
1416 arch: {
1417 arm: {
1418 no_libcrt: true,
1419 },
1420 // This is expected to override the value for darwin_x86_64.
1421 x86_64: {
1422 no_libcrt: true,
1423 },
1424 },
1425 target: {
1426 darwin: {
1427 no_libcrt: false,
1428 }
1429 },
1430 include_build_directory: false,
1431}
1432`,
1433 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1434 "srcs": `["impl.cpp"]`,
1435 "use_libcrt": `select({
1436 "//build/bazel/platforms/os_arch:android_arm": False,
1437 "//build/bazel/platforms/os_arch:android_x86_64": False,
1438 "//build/bazel/platforms/os_arch:darwin_arm64": True,
1439 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1440 "//build/bazel/platforms/os_arch:linux_bionic_x86_64": False,
1441 "//build/bazel/platforms/os_arch:linux_glibc_x86_64": False,
1442 "//build/bazel/platforms/os_arch:linux_musl_x86_64": False,
1443 "//build/bazel/platforms/os_arch:windows_x86_64": False,
1444 "//conditions:default": None,
1445 })`,
1446 }),
1447 })
1448}
1449
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001450func TestCcLibraryStrip(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001451 expectedTargets := []string{}
1452 expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{
1453 "strip": `{
1454 "all": True,
1455 }`,
1456 })...)
1457 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{
1458 "strip": `{
1459 "keep_symbols": True,
1460 }`,
1461 })...)
1462 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{
1463 "strip": `{
1464 "keep_symbols_and_debug_frame": True,
1465 }`,
1466 })...)
1467 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{
1468 "strip": `{
1469 "keep_symbols_list": ["symbol"],
1470 }`,
1471 })...)
1472 expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{
1473 "strip": `{
1474 "none": True,
1475 }`,
1476 })...)
1477 expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...)
1478
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001479 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001480 description: "cc_library strip args",
1481 moduleTypeUnderTest: "cc_library",
1482 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001483 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001484cc_library {
1485 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001486 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001487}
1488cc_library {
1489 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001490 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001491 keep_symbols: true,
1492 },
1493 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001494}
1495cc_library {
1496 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001497 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001498 keep_symbols_and_debug_frame: true,
1499 },
1500 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001501}
1502cc_library {
1503 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001504 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001505 none: true,
1506 },
1507 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001508}
1509cc_library {
1510 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001511 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001512 keep_symbols_list: ["symbol"],
1513 },
1514 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001515}
1516cc_library {
1517 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001518 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001519 all: true,
1520 },
1521 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001522}
1523`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001524 expectedBazelTargets: expectedTargets,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001525 })
1526}
1527
1528func TestCcLibraryStripWithArch(t *testing.T) {
1529 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001530 description: "cc_library strip args",
1531 moduleTypeUnderTest: "cc_library",
1532 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001533 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001534cc_library {
1535 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001536 target: {
1537 darwin: {
1538 strip: {
1539 keep_symbols_list: ["foo", "bar"]
1540 }
1541 },
1542 },
1543 arch: {
1544 arm: {
1545 strip: {
1546 keep_symbols_and_debug_frame: true,
1547 },
1548 },
1549 arm64: {
1550 strip: {
1551 keep_symbols: true,
1552 },
1553 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001554 },
1555 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001556}
1557`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001558 expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{
1559 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001560 "keep_symbols": select({
1561 "//build/bazel/platforms/arch:arm64": True,
1562 "//conditions:default": None,
1563 }),
1564 "keep_symbols_and_debug_frame": select({
1565 "//build/bazel/platforms/arch:arm": True,
1566 "//conditions:default": None,
1567 }),
1568 "keep_symbols_list": select({
1569 "//build/bazel/platforms/os:darwin": [
1570 "foo",
1571 "bar",
1572 ],
1573 "//conditions:default": [],
1574 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001575 }`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001576 }),
1577 },
1578 )
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001579}
Chris Parsons51f8c392021-08-03 21:01:05 -04001580
1581func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1582 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001583 description: "cc_library system_shared_libs empty at root",
1584 moduleTypeUnderTest: "cc_library",
1585 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001586 blueprint: soongCcLibraryPreamble + `
1587cc_library {
1588 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001589 system_shared_libs: [],
1590 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001591}
1592`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001593 expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{
1594 "system_dynamic_deps": `[]`,
1595 }),
1596 },
1597 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001598}
1599
1600func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1601 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001602 description: "cc_library system_shared_libs empty for static variant",
1603 moduleTypeUnderTest: "cc_library",
1604 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001605 blueprint: soongCcLibraryPreamble + `
1606cc_library {
1607 name: "static_empty",
1608 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001609 system_shared_libs: [],
1610 },
1611 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001612}
1613`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001614 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001615 makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{
1616 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001617 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001618 makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001619 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001620 })
1621}
1622
1623func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1624 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001625 description: "cc_library system_shared_libs empty for shared variant",
1626 moduleTypeUnderTest: "cc_library",
1627 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001628 blueprint: soongCcLibraryPreamble + `
1629cc_library {
1630 name: "shared_empty",
1631 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001632 system_shared_libs: [],
1633 },
1634 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001635}
1636`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001637 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001638 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1639 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1640 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001641 }),
1642 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001643 })
1644}
1645
1646func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1647 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001648 description: "cc_library system_shared_libs empty for shared, bionic variant",
1649 moduleTypeUnderTest: "cc_library",
1650 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001651 blueprint: soongCcLibraryPreamble + `
1652cc_library {
1653 name: "shared_empty",
1654 target: {
1655 bionic: {
1656 shared: {
1657 system_shared_libs: [],
1658 }
1659 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001660 },
1661 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001662}
1663`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001664 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001665 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1666 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1667 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001668 }),
1669 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001670 })
1671}
1672
1673func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1674 // Note that this behavior is technically incorrect (it's a simplification).
1675 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1676 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1677 // b/195791252 tracks the fix.
1678 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001679 description: "cc_library system_shared_libs empty for linux_bionic variant",
1680 moduleTypeUnderTest: "cc_library",
1681 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001682 blueprint: soongCcLibraryPreamble + `
1683cc_library {
1684 name: "target_linux_bionic_empty",
1685 target: {
1686 linux_bionic: {
1687 system_shared_libs: [],
1688 },
1689 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001690 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001691}
1692`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001693 expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{
1694 "system_dynamic_deps": `[]`,
1695 }),
1696 },
1697 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001698}
1699
1700func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1701 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001702 description: "cc_library system_shared_libs empty for bionic variant",
1703 moduleTypeUnderTest: "cc_library",
1704 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001705 blueprint: soongCcLibraryPreamble + `
1706cc_library {
1707 name: "target_bionic_empty",
1708 target: {
1709 bionic: {
1710 system_shared_libs: [],
1711 },
1712 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001713 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001714}
1715`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001716 expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{
1717 "system_dynamic_deps": `[]`,
1718 }),
1719 },
1720 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001721}
1722
1723func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1724 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001725 description: "cc_library system_shared_libs set for shared and root",
1726 moduleTypeUnderTest: "cc_library",
1727 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001728 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001729cc_library {
1730 name: "libc",
1731 bazel_module: { bp2build_available: false },
1732}
1733cc_library {
1734 name: "libm",
1735 bazel_module: { bp2build_available: false },
1736}
Chris Parsons51f8c392021-08-03 21:01:05 -04001737
1738cc_library {
1739 name: "foo",
1740 system_shared_libs: ["libc"],
1741 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001742 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001743 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001744 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001745}
1746`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001747 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001748 makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001749 "system_dynamic_deps": `[":libc"]`,
1750 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001751 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1752 "system_dynamic_deps": `[
1753 ":libc",
1754 ":libm",
1755 ]`,
1756 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001757 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001758 })
1759}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001760
1761func TestCcLibraryOsSelects(t *testing.T) {
1762 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001763 description: "cc_library - selects for all os targets",
1764 moduleTypeUnderTest: "cc_library",
1765 moduleTypeUnderTestFactory: cc.LibraryFactory,
1766 filesystem: map[string]string{},
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001767 blueprint: soongCcLibraryPreamble + `
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001768cc_library {
1769 name: "foo-lib",
1770 srcs: ["base.cpp"],
1771 target: {
1772 android: {
1773 srcs: ["android.cpp"],
1774 },
1775 linux: {
1776 srcs: ["linux.cpp"],
1777 },
1778 linux_glibc: {
1779 srcs: ["linux_glibc.cpp"],
1780 },
1781 darwin: {
1782 srcs: ["darwin.cpp"],
1783 },
1784 bionic: {
1785 srcs: ["bionic.cpp"],
1786 },
1787 linux_musl: {
1788 srcs: ["linux_musl.cpp"],
1789 },
1790 windows: {
1791 srcs: ["windows.cpp"],
1792 },
1793 },
1794 include_build_directory: false,
1795}
1796`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001797 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1798 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001799 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001800 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001801 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001802 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001803 ],
1804 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1805 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001806 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001807 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001808 ],
1809 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001810 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001811 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001812 ],
1813 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001814 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001815 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001816 ],
1817 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1818 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001819 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001820 }),
1821 },
1822 )
Jingwen Chen97b85312021-10-08 10:41:31 +00001823}
1824
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001825func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001826 type testCase struct {
1827 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001828 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001829 gnu_extensions string
1830 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001831 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001832 }
1833
1834 testCases := []testCase{
1835 // Existing usages of cpp_std in AOSP are:
1836 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1837 //
1838 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1839 // is set in the toolchain.)
1840 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001841 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001842 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1843 // experimental defaults to gnu++2a
1844 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001845 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001846 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1847 // Explicitly setting a c++ std does not use replace gnu++ std even if
1848 // gnu_extensions is true.
1849 // "c++11",
1850 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001851 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001852 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1853 // "c++17",
1854 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001855 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001856 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1857 // "c++2a",
1858 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001859 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001860 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1861 // "c++98",
1862 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001863 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001864 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1865 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1866 // "gnu++11",
1867 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001868 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001869 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1870 // "gnu++17",
1871 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001872 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001873 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001874
1875 // some c_std test cases
1876 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1877 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1878 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1879 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1880 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1881 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001882 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001883 for i, tc := range testCases {
1884 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001885 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001886 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001887 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001888 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001889 cStdProp := ""
1890 if tc.c_std != "" {
1891 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1892 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001893 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001894 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001895 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001896 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001897 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001898 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001899 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001900 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001901 if tc.bazel_c_std != "" {
1902 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1903 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001904
1905 runCcLibraryTestCase(t, bp2buildTestCase{
1906 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001907 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1908 moduleTypeUnderTest: "cc_library",
1909 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen97b85312021-10-08 10:41:31 +00001910 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1911cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001912 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001913%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001914%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001915%s // gnu_extensions: *bool
1916 include_build_directory: false,
1917}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001918`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001919 expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
Jingwen Chen97b85312021-10-08 10:41:31 +00001920 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001921
1922 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1923 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001924 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1925 moduleTypeUnderTest: "cc_library_static",
1926 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001927 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1928cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001929 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001930%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001931%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001932%s // gnu_extensions: *bool
1933 include_build_directory: false,
1934}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001935`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001936 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001937 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001938 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001939 })
1940
1941 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1942 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001943 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1944 moduleTypeUnderTest: "cc_library_shared",
1945 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001946 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1947cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001948 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001949%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001950%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001951%s // gnu_extensions: *bool
1952 include_build_directory: false,
1953}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001954`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001955 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001956 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001957 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001958 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001959 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001960}
Liz Kammer12615db2021-09-28 09:19:17 -04001961
1962func TestCcLibraryProtoSimple(t *testing.T) {
1963 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001964 moduleTypeUnderTest: "cc_library",
1965 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001966 blueprint: soongCcProtoPreamble + `cc_library {
1967 name: "foo",
1968 srcs: ["foo.proto"],
1969 include_build_directory: false,
1970}`,
1971 expectedBazelTargets: []string{
1972 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1973 "srcs": `["foo.proto"]`,
1974 "strip_import_prefix": `""`,
1975 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1976 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001977 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04001978 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001979 "deps": `[":libprotobuf-cpp-lite"]`,
1980 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1981 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04001982 }),
1983 },
1984 })
1985}
1986
1987func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) {
1988 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001989 moduleTypeUnderTest: "cc_library",
1990 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001991 blueprint: soongCcProtoPreamble + `cc_library {
1992 name: "foo",
1993 srcs: ["foo.proto"],
1994 proto: { canonical_path_from_root: false},
1995 include_build_directory: false,
1996}`,
1997 expectedBazelTargets: []string{
1998 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1999 "srcs": `["foo.proto"]`,
2000 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2001 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002002 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002003 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002004 "deps": `[":libprotobuf-cpp-lite"]`,
2005 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2006 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002007 }),
2008 },
2009 })
2010}
2011
2012func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
2013 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002014 moduleTypeUnderTest: "cc_library",
2015 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002016 blueprint: soongCcProtoPreamble + `cc_library {
2017 name: "foo",
2018 srcs: ["foo.proto"],
2019 proto: { canonical_path_from_root: true},
2020 include_build_directory: false,
2021}`,
2022 expectedBazelTargets: []string{
2023 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2024 "srcs": `["foo.proto"]`,
2025 "strip_import_prefix": `""`,
2026 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2027 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002028 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002029 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002030 "deps": `[":libprotobuf-cpp-lite"]`,
2031 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2032 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002033 }),
2034 },
2035 })
2036}
2037
2038func TestCcLibraryProtoFull(t *testing.T) {
2039 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002040 moduleTypeUnderTest: "cc_library",
2041 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002042 blueprint: soongCcProtoPreamble + `cc_library {
2043 name: "foo",
2044 srcs: ["foo.proto"],
2045 proto: {
2046 canonical_path_from_root: false,
2047 type: "full",
2048 },
2049 include_build_directory: false,
2050}`,
2051 expectedBazelTargets: []string{
2052 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2053 "srcs": `["foo.proto"]`,
2054 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
2055 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002056 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002057 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002058 "deps": `[":libprotobuf-cpp-full"]`,
2059 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2060 "dynamic_deps": `[":libprotobuf-cpp-full"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002061 }),
2062 },
2063 })
2064}
2065
2066func TestCcLibraryProtoLite(t *testing.T) {
2067 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002068 moduleTypeUnderTest: "cc_library",
2069 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002070 blueprint: soongCcProtoPreamble + `cc_library {
2071 name: "foo",
2072 srcs: ["foo.proto"],
2073 proto: {
2074 canonical_path_from_root: false,
2075 type: "lite",
2076 },
2077 include_build_directory: false,
2078}`,
2079 expectedBazelTargets: []string{
2080 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2081 "srcs": `["foo.proto"]`,
2082 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2083 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002084 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002085 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002086 "deps": `[":libprotobuf-cpp-lite"]`,
2087 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2088 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002089 }),
2090 },
2091 })
2092}
2093
2094func TestCcLibraryProtoExportHeaders(t *testing.T) {
2095 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002096 moduleTypeUnderTest: "cc_library",
2097 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002098 blueprint: soongCcProtoPreamble + `cc_library {
2099 name: "foo",
2100 srcs: ["foo.proto"],
2101 proto: {
2102 canonical_path_from_root: false,
2103 export_proto_headers: true,
2104 },
2105 include_build_directory: false,
2106}`,
2107 expectedBazelTargets: []string{
2108 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2109 "srcs": `["foo.proto"]`,
2110 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2111 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002112 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2113 "deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002114 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002115 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2116 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2117 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002118 }),
2119 },
2120 })
2121}
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002122
2123func TestCcLibraryProtoFilegroups(t *testing.T) {
2124 runCcLibraryTestCase(t, bp2buildTestCase{
2125 moduleTypeUnderTest: "cc_library",
2126 moduleTypeUnderTestFactory: cc.LibraryFactory,
2127 blueprint: soongCcProtoPreamble +
2128 simpleModuleDoNotConvertBp2build("filegroup", "a_fg_proto") +
2129 simpleModuleDoNotConvertBp2build("filegroup", "b_protos") +
2130 simpleModuleDoNotConvertBp2build("filegroup", "c-proto-srcs") +
2131 simpleModuleDoNotConvertBp2build("filegroup", "proto-srcs-d") + `
2132cc_library {
2133 name: "a",
2134 srcs: [":a_fg_proto"],
2135 proto: {
2136 canonical_path_from_root: false,
2137 export_proto_headers: true,
2138 },
2139 include_build_directory: false,
2140}
2141
2142cc_library {
2143 name: "b",
2144 srcs: [":b_protos"],
2145 proto: {
2146 canonical_path_from_root: false,
2147 export_proto_headers: true,
2148 },
2149 include_build_directory: false,
2150}
2151
2152cc_library {
2153 name: "c",
2154 srcs: [":c-proto-srcs"],
2155 proto: {
2156 canonical_path_from_root: false,
2157 export_proto_headers: true,
2158 },
2159 include_build_directory: false,
2160}
2161
2162cc_library {
2163 name: "d",
2164 srcs: [":proto-srcs-d"],
2165 proto: {
2166 canonical_path_from_root: false,
2167 export_proto_headers: true,
2168 },
2169 include_build_directory: false,
2170}`,
2171 expectedBazelTargets: []string{
2172 makeBazelTarget("proto_library", "a_proto", attrNameToString{
2173 "srcs": `[":a_fg_proto"]`,
2174 }), makeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", attrNameToString{
2175 "deps": `[":a_proto"]`,
2176 }), makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
2177 "deps": `[":libprotobuf-cpp-lite"]`,
2178 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2179 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2180 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2181 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2182 }), makeBazelTarget("cc_library_shared", "a", attrNameToString{
2183 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2184 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2185 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2186 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2187 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2188 }), makeBazelTarget("proto_library", "b_proto", attrNameToString{
2189 "srcs": `[":b_protos"]`,
2190 }), makeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", attrNameToString{
2191 "deps": `[":b_proto"]`,
2192 }), makeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", attrNameToString{
2193 "deps": `[":libprotobuf-cpp-lite"]`,
2194 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2195 "srcs": `[":b_protos_cpp_srcs"]`,
2196 "srcs_as": `[":b_protos_as_srcs"]`,
2197 "srcs_c": `[":b_protos_c_srcs"]`,
2198 }), makeBazelTarget("cc_library_shared", "b", attrNameToString{
2199 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2200 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2201 "srcs": `[":b_protos_cpp_srcs"]`,
2202 "srcs_as": `[":b_protos_as_srcs"]`,
2203 "srcs_c": `[":b_protos_c_srcs"]`,
2204 }), makeBazelTarget("proto_library", "c_proto", attrNameToString{
2205 "srcs": `[":c-proto-srcs"]`,
2206 }), makeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", attrNameToString{
2207 "deps": `[":c_proto"]`,
2208 }), makeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", attrNameToString{
2209 "deps": `[":libprotobuf-cpp-lite"]`,
2210 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2211 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2212 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2213 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2214 }), makeBazelTarget("cc_library_shared", "c", attrNameToString{
2215 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2216 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2217 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2218 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2219 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2220 }), makeBazelTarget("proto_library", "d_proto", attrNameToString{
2221 "srcs": `[":proto-srcs-d"]`,
2222 }), makeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", attrNameToString{
2223 "deps": `[":d_proto"]`,
2224 }), makeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", attrNameToString{
2225 "deps": `[":libprotobuf-cpp-lite"]`,
2226 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2227 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2228 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2229 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2230 }), makeBazelTarget("cc_library_shared", "d", attrNameToString{
2231 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2232 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2233 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2234 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2235 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2236 }),
2237 },
2238 })
2239}
Chris Parsons58852a02021-12-09 18:10:18 -05002240
2241func TestCcLibraryDisabledArchAndTarget(t *testing.T) {
2242 runCcLibraryTestCase(t, bp2buildTestCase{
2243 moduleTypeUnderTest: "cc_library",
2244 moduleTypeUnderTestFactory: cc.LibraryFactory,
2245 blueprint: soongCcProtoPreamble + `cc_library {
2246 name: "foo",
2247 srcs: ["foo.cpp"],
2248 target: {
2249 darwin: {
2250 enabled: false,
2251 },
2252 windows: {
2253 enabled: false,
2254 },
2255 linux_glibc_x86: {
2256 enabled: false,
2257 },
2258 },
2259 include_build_directory: false,
2260}`,
2261 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2262 "srcs": `["foo.cpp"]`,
2263 "target_compatible_with": `select({
2264 "//build/bazel/platforms/os_arch:darwin_arm64": ["@platforms//:incompatible"],
2265 "//build/bazel/platforms/os_arch:darwin_x86_64": ["@platforms//:incompatible"],
2266 "//build/bazel/platforms/os_arch:linux_glibc_x86": ["@platforms//:incompatible"],
2267 "//build/bazel/platforms/os_arch:windows_x86": ["@platforms//:incompatible"],
2268 "//build/bazel/platforms/os_arch:windows_x86_64": ["@platforms//:incompatible"],
2269 "//conditions:default": [],
2270 })`,
2271 }),
2272 })
2273}
2274
2275func TestCcLibraryDisabledArchAndTargetWithDefault(t *testing.T) {
2276 runCcLibraryTestCase(t, bp2buildTestCase{
2277 moduleTypeUnderTest: "cc_library",
2278 moduleTypeUnderTestFactory: cc.LibraryFactory,
2279 blueprint: soongCcProtoPreamble + `cc_library {
2280 name: "foo",
2281 srcs: ["foo.cpp"],
2282 enabled: false,
2283 target: {
2284 darwin: {
2285 enabled: true,
2286 },
2287 windows: {
2288 enabled: false,
2289 },
2290 linux_glibc_x86: {
2291 enabled: false,
2292 },
2293 },
2294 include_build_directory: false,
2295}`,
2296 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2297 "srcs": `["foo.cpp"]`,
2298 "target_compatible_with": `select({
2299 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2300 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2301 "//conditions:default": ["@platforms//:incompatible"],
2302 })`,
2303 }),
2304 })
2305}
2306
2307func TestCcLibrarySharedDisabled(t *testing.T) {
2308 runCcLibraryTestCase(t, bp2buildTestCase{
2309 moduleTypeUnderTest: "cc_library",
2310 moduleTypeUnderTestFactory: cc.LibraryFactory,
2311 blueprint: soongCcProtoPreamble + `cc_library {
2312 name: "foo",
2313 srcs: ["foo.cpp"],
2314 enabled: false,
2315 shared: {
2316 enabled: true,
2317 },
2318 target: {
2319 android: {
2320 shared: {
2321 enabled: false,
2322 },
2323 }
2324 },
2325 include_build_directory: false,
2326}`,
2327 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2328 "srcs": `["foo.cpp"]`,
2329 "target_compatible_with": `["@platforms//:incompatible"]`,
2330 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2331 "srcs": `["foo.cpp"]`,
2332 "target_compatible_with": `select({
2333 "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
2334 "//conditions:default": [],
2335 })`,
2336 }),
2337 },
2338 })
2339}
2340
2341func TestCcLibraryStaticDisabledForSomeArch(t *testing.T) {
2342 runCcLibraryTestCase(t, bp2buildTestCase{
2343 moduleTypeUnderTest: "cc_library",
2344 moduleTypeUnderTestFactory: cc.LibraryFactory,
2345 blueprint: soongCcProtoPreamble + `cc_library {
2346 name: "foo",
2347 srcs: ["foo.cpp"],
2348 shared: {
2349 enabled: false
2350 },
2351 target: {
2352 darwin: {
2353 enabled: true,
2354 },
2355 windows: {
2356 enabled: false,
2357 },
2358 linux_glibc_x86: {
2359 shared: {
2360 enabled: true,
2361 },
2362 },
2363 },
2364 include_build_directory: false,
2365}`,
2366 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2367 "srcs": `["foo.cpp"]`,
2368 "target_compatible_with": `select({
2369 "//build/bazel/platforms/os:windows": ["@platforms//:incompatible"],
2370 "//conditions:default": [],
2371 })`,
2372 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2373 "srcs": `["foo.cpp"]`,
2374 "target_compatible_with": `select({
2375 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2376 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2377 "//build/bazel/platforms/os_arch:linux_glibc_x86": [],
2378 "//conditions:default": ["@platforms//:incompatible"],
2379 })`,
2380 }),
2381 }})
2382}
Jingwen Chen0ee88a62022-01-07 14:55:29 +00002383
2384func TestCcLibraryStubs(t *testing.T) {
2385 runCcLibraryTestCase(t, bp2buildTestCase{
2386 description: "cc_library stubs",
2387 moduleTypeUnderTest: "cc_library",
2388 moduleTypeUnderTestFactory: cc.LibraryFactory,
2389 dir: "foo/bar",
2390 filesystem: map[string]string{
2391 "foo/bar/Android.bp": `
2392cc_library {
2393 name: "a",
2394 stubs: { symbol_file: "a.map.txt", versions: ["28", "29", "current"] },
2395 bazel_module: { bp2build_available: true },
2396 include_build_directory: false,
2397}
2398`,
2399 },
2400 blueprint: soongCcLibraryPreamble,
2401 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
2402 "stubs_symbol_file": `"a.map.txt"`,
2403 "stubs_versions": `[
2404 "28",
2405 "29",
2406 "current",
2407 ]`,
2408 }),
2409 },
2410 )
2411}
Liz Kammerf38a8372022-02-04 15:39:00 -05002412
2413func TestCcLibraryEscapeLdflags(t *testing.T) {
2414 runCcLibraryTestCase(t, bp2buildTestCase{
2415 moduleTypeUnderTest: "cc_library",
2416 moduleTypeUnderTestFactory: cc.LibraryFactory,
2417 blueprint: soongCcProtoPreamble + `cc_library {
2418 name: "foo",
2419 ldflags: ["-Wl,--rpath,${ORIGIN}"],
2420 include_build_directory: false,
2421}`,
2422 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2423 "linkopts": `["-Wl,--rpath,$${ORIGIN}"]`,
2424 }),
2425 })
2426}