blob: 640adbaad209b39a5322b48b1ad91df281f5f4dd [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"],
Liz Kammercc2c1ef2022-03-21 09:03:29 -0400282 static_libs: ["static_dep_for_both", "whole_and_static_lib_for_both"],
283 whole_static_libs: ["whole_static_lib_for_both", "whole_and_static_lib_for_both"],
Chris Parsons08648312021-05-06 16:23:19 -0400284 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 Kammercc2c1ef2022-03-21 09:03:29 -0400331cc_library_static {
332 name: "whole_and_static_lib_for_both",
333 bazel_module: { bp2build_available: false },
334}
335
Liz Kammer8337ea42021-09-10 10:06:32 -0400336cc_library {
337 name: "shared_dep_for_shared",
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_static",
343 bazel_module: { bp2build_available: false },
344}
Chris Parsons08648312021-05-06 16:23:19 -0400345
Liz Kammer8337ea42021-09-10 10:06:32 -0400346cc_library {
347 name: "shared_dep_for_both",
348 bazel_module: { bp2build_available: false },
349}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000350`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500351 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500352 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
353 "copts": `[
354 "bothflag",
355 "staticflag",
356 ]`,
357 "implementation_deps": `[
358 ":static_dep_for_both",
359 ":static_dep_for_static",
360 ]`,
361 "implementation_dynamic_deps": `[
362 ":shared_dep_for_both",
363 ":shared_dep_for_static",
364 ]`,
365 "srcs": `[
366 "both.cpp",
367 "staticonly.cpp",
368 ]`,
369 "whole_archive_deps": `[
370 ":whole_static_lib_for_both",
Liz Kammercc2c1ef2022-03-21 09:03:29 -0400371 ":whole_and_static_lib_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500372 ":whole_static_lib_for_static",
373 ]`}),
374 makeBazelTarget("cc_library_shared", "a", attrNameToString{
375 "copts": `[
376 "bothflag",
377 "sharedflag",
378 ]`,
379 "implementation_deps": `[
380 ":static_dep_for_both",
381 ":static_dep_for_shared",
382 ]`,
383 "implementation_dynamic_deps": `[
384 ":shared_dep_for_both",
385 ":shared_dep_for_shared",
386 ]`,
387 "srcs": `[
388 "both.cpp",
389 "sharedonly.cpp",
390 ]`,
391 "whole_archive_deps": `[
392 ":whole_static_lib_for_both",
Liz Kammercc2c1ef2022-03-21 09:03:29 -0400393 ":whole_and_static_lib_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500394 ":whole_static_lib_for_shared",
395 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500396 }),
397 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200398 })
399}
400
Liz Kammer7a210ac2021-09-22 15:52:58 -0400401func TestCcLibraryDeps(t *testing.T) {
402 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400403 description: "cc_library shared/static props",
404 moduleTypeUnderTest: "cc_library",
405 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer7a210ac2021-09-22 15:52:58 -0400406 filesystem: map[string]string{
407 "both.cpp": "",
408 "sharedonly.cpp": "",
409 "staticonly.cpp": "",
410 },
411 blueprint: soongCcLibraryPreamble + `
412cc_library {
413 name: "a",
414 srcs: ["both.cpp"],
415 cflags: ["bothflag"],
416 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
417 export_shared_lib_headers: ["shared_dep_for_both"],
418 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
419 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
420 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
421 static: {
422 srcs: ["staticonly.cpp"],
423 cflags: ["staticflag"],
424 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
425 export_shared_lib_headers: ["shared_dep_for_static"],
426 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
427 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
428 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
429 },
430 shared: {
431 srcs: ["sharedonly.cpp"],
432 cflags: ["sharedflag"],
433 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
434 export_shared_lib_headers: ["shared_dep_for_shared"],
435 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
436 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
437 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
438 },
439 include_build_directory: false,
440}
441` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
442 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
443 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
444 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
445 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
446 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
447 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
448 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
449 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
450 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
451 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
452 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
453 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
454 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
455 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
456 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
457 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
458 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500459 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500460 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
461 "copts": `[
462 "bothflag",
463 "staticflag",
464 ]`,
465 "deps": `[
466 ":static_dep_for_both",
467 ":static_dep_for_static",
468 ]`,
469 "dynamic_deps": `[
470 ":shared_dep_for_both",
471 ":shared_dep_for_static",
472 ]`,
473 "implementation_deps": `[
474 ":implementation_static_dep_for_both",
475 ":implementation_static_dep_for_static",
476 ]`,
477 "implementation_dynamic_deps": `[
478 ":implementation_shared_dep_for_both",
479 ":implementation_shared_dep_for_static",
480 ]`,
481 "srcs": `[
482 "both.cpp",
483 "staticonly.cpp",
484 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500485 "whole_archive_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400486 ":not_explicitly_exported_whole_static_dep_for_both",
487 ":whole_static_dep_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500488 ":not_explicitly_exported_whole_static_dep_for_static",
489 ":whole_static_dep_for_static",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500490 ]`,
491 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500492 makeBazelTarget("cc_library_shared", "a", attrNameToString{
493 "copts": `[
494 "bothflag",
495 "sharedflag",
496 ]`,
497 "deps": `[
498 ":static_dep_for_both",
499 ":static_dep_for_shared",
500 ]`,
501 "dynamic_deps": `[
502 ":shared_dep_for_both",
503 ":shared_dep_for_shared",
504 ]`,
505 "implementation_deps": `[
506 ":implementation_static_dep_for_both",
507 ":implementation_static_dep_for_shared",
508 ]`,
509 "implementation_dynamic_deps": `[
510 ":implementation_shared_dep_for_both",
511 ":implementation_shared_dep_for_shared",
512 ]`,
513 "srcs": `[
514 "both.cpp",
515 "sharedonly.cpp",
516 ]`,
517 "whole_archive_deps": `[
518 ":not_explicitly_exported_whole_static_dep_for_both",
519 ":whole_static_dep_for_both",
520 ":not_explicitly_exported_whole_static_dep_for_shared",
521 ":whole_static_dep_for_shared",
522 ]`,
523 })},
524 },
525 )
Liz Kammer7a210ac2021-09-22 15:52:58 -0400526}
527
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400528func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
529 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400530 moduleTypeUnderTest: "cc_library",
531 moduleTypeUnderTestFactory: cc.LibraryFactory,
532 dir: "foo/bar",
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400533 filesystem: map[string]string{
534 "foo/bar/Android.bp": `
535cc_library {
536 name: "a",
537 whole_static_libs: ["whole_static_lib_for_both"],
538 static: {
539 whole_static_libs: ["whole_static_lib_for_static"],
540 },
541 shared: {
542 whole_static_libs: ["whole_static_lib_for_shared"],
543 },
544 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400545 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400546}
547
548cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
549
550cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
551
552cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
553`,
554 },
555 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500556 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500557 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
558 "whole_archive_deps": `[
559 ":whole_static_lib_for_both_alwayslink",
560 ":whole_static_lib_for_static_alwayslink",
561 ]`,
562 }),
563 makeBazelTarget("cc_library_shared", "a", attrNameToString{
564 "whole_archive_deps": `[
565 ":whole_static_lib_for_both_alwayslink",
566 ":whole_static_lib_for_shared_alwayslink",
567 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500568 }),
569 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500570 },
571 )
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400572}
573
Jingwen Chenbcf53042021-05-26 04:42:42 +0000574func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
575 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400576 description: "cc_library shared/static props in arch",
577 moduleTypeUnderTest: "cc_library",
578 moduleTypeUnderTestFactory: cc.LibraryFactory,
579 dir: "foo/bar",
Jingwen Chenbcf53042021-05-26 04:42:42 +0000580 filesystem: map[string]string{
581 "foo/bar/arm.cpp": "",
582 "foo/bar/x86.cpp": "",
583 "foo/bar/sharedonly.cpp": "",
584 "foo/bar/staticonly.cpp": "",
585 "foo/bar/Android.bp": `
586cc_library {
587 name: "a",
588 arch: {
589 arm: {
590 shared: {
591 srcs: ["arm_shared.cpp"],
592 cflags: ["-DARM_SHARED"],
593 static_libs: ["arm_static_dep_for_shared"],
594 whole_static_libs: ["arm_whole_static_dep_for_shared"],
595 shared_libs: ["arm_shared_dep_for_shared"],
596 },
597 },
598 x86: {
599 static: {
600 srcs: ["x86_static.cpp"],
601 cflags: ["-DX86_STATIC"],
602 static_libs: ["x86_dep_for_static"],
603 },
604 },
605 },
606 target: {
607 android: {
608 shared: {
609 srcs: ["android_shared.cpp"],
610 cflags: ["-DANDROID_SHARED"],
611 static_libs: ["android_dep_for_shared"],
612 },
613 },
614 android_arm: {
615 shared: {
616 cflags: ["-DANDROID_ARM_SHARED"],
617 },
618 },
619 },
620 srcs: ["both.cpp"],
621 cflags: ["bothflag"],
622 static_libs: ["static_dep_for_both"],
623 static: {
624 srcs: ["staticonly.cpp"],
625 cflags: ["staticflag"],
626 static_libs: ["static_dep_for_static"],
627 },
628 shared: {
629 srcs: ["sharedonly.cpp"],
630 cflags: ["sharedflag"],
631 static_libs: ["static_dep_for_shared"],
632 },
633 bazel_module: { bp2build_available: true },
634}
635
636cc_library_static { name: "static_dep_for_shared" }
637cc_library_static { name: "static_dep_for_static" }
638cc_library_static { name: "static_dep_for_both" }
639
640cc_library_static { name: "arm_static_dep_for_shared" }
641cc_library_static { name: "arm_whole_static_dep_for_shared" }
642cc_library_static { name: "arm_shared_dep_for_shared" }
643
644cc_library_static { name: "x86_dep_for_static" }
645
646cc_library_static { name: "android_dep_for_shared" }
647`,
648 },
649 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500650 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500651 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
652 "copts": `[
653 "bothflag",
654 "staticflag",
655 ] + select({
656 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
657 "//conditions:default": [],
658 })`,
659 "implementation_deps": `[
660 ":static_dep_for_both",
661 ":static_dep_for_static",
662 ] + select({
663 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
664 "//conditions:default": [],
665 })`,
666 "local_includes": `["."]`,
667 "srcs": `[
668 "both.cpp",
669 "staticonly.cpp",
670 ] + select({
671 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
672 "//conditions:default": [],
673 })`,
674 }),
675 makeBazelTarget("cc_library_shared", "a", attrNameToString{
676 "copts": `[
677 "bothflag",
678 "sharedflag",
679 ] + select({
680 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
681 "//conditions:default": [],
682 }) + select({
683 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
684 "//conditions:default": [],
685 }) + select({
686 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
687 "//conditions:default": [],
688 })`,
689 "implementation_deps": `[
690 ":static_dep_for_both",
691 ":static_dep_for_shared",
692 ] + select({
693 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
694 "//conditions:default": [],
695 }) + select({
696 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
697 "//conditions:default": [],
698 })`,
699 "implementation_dynamic_deps": `select({
700 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
701 "//conditions:default": [],
702 })`,
703 "local_includes": `["."]`,
704 "srcs": `[
705 "both.cpp",
706 "sharedonly.cpp",
707 ] + select({
708 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
709 "//conditions:default": [],
710 }) + select({
711 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
712 "//conditions:default": [],
713 })`,
714 "whole_archive_deps": `select({
715 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
716 "//conditions:default": [],
717 })`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500718 }),
719 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500720 },
721 )
Jingwen Chenbcf53042021-05-26 04:42:42 +0000722}
723
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000724func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
725 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400726 description: "cc_library shared/static props with c/cpp/s mixed sources",
727 moduleTypeUnderTest: "cc_library",
728 moduleTypeUnderTestFactory: cc.LibraryFactory,
729 dir: "foo/bar",
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000730 filesystem: map[string]string{
731 "foo/bar/both_source.cpp": "",
732 "foo/bar/both_source.cc": "",
733 "foo/bar/both_source.c": "",
734 "foo/bar/both_source.s": "",
735 "foo/bar/both_source.S": "",
736 "foo/bar/shared_source.cpp": "",
737 "foo/bar/shared_source.cc": "",
738 "foo/bar/shared_source.c": "",
739 "foo/bar/shared_source.s": "",
740 "foo/bar/shared_source.S": "",
741 "foo/bar/static_source.cpp": "",
742 "foo/bar/static_source.cc": "",
743 "foo/bar/static_source.c": "",
744 "foo/bar/static_source.s": "",
745 "foo/bar/static_source.S": "",
746 "foo/bar/Android.bp": `
747cc_library {
748 name: "a",
749 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400750 "both_source.cpp",
751 "both_source.cc",
752 "both_source.c",
753 "both_source.s",
754 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400755 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400756 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000757 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400758 srcs: [
759 "static_source.cpp",
760 "static_source.cc",
761 "static_source.c",
762 "static_source.s",
763 "static_source.S",
764 ":static_filegroup",
765 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000766 },
767 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400768 srcs: [
769 "shared_source.cpp",
770 "shared_source.cc",
771 "shared_source.c",
772 "shared_source.s",
773 "shared_source.S",
774 ":shared_filegroup",
775 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000776 },
777 bazel_module: { bp2build_available: true },
778}
779
780filegroup {
781 name: "both_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: "shared_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
794filegroup {
795 name: "static_filegroup",
796 srcs: [
797 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400798 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000799}
800`,
801 },
802 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500803 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500804 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500805 "local_includes": `["."]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500806 "srcs": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000807 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400808 "both_source.cc",
809 ":both_filegroup_cpp_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500810 "static_source.cpp",
811 "static_source.cc",
812 ":static_filegroup_cpp_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500813 ]`,
814 "srcs_as": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000815 "both_source.s",
816 "both_source.S",
817 ":both_filegroup_as_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500818 "static_source.s",
819 "static_source.S",
820 ":static_filegroup_as_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500821 ]`,
822 "srcs_c": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000823 "both_source.c",
824 ":both_filegroup_c_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500825 "static_source.c",
826 ":static_filegroup_c_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500827 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500828 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500829 makeBazelTarget("cc_library_shared", "a", attrNameToString{
830 "local_includes": `["."]`,
831 "srcs": `[
832 "both_source.cpp",
833 "both_source.cc",
834 ":both_filegroup_cpp_srcs",
835 "shared_source.cpp",
836 "shared_source.cc",
837 ":shared_filegroup_cpp_srcs",
838 ]`,
839 "srcs_as": `[
840 "both_source.s",
841 "both_source.S",
842 ":both_filegroup_as_srcs",
843 "shared_source.s",
844 "shared_source.S",
845 ":shared_filegroup_as_srcs",
846 ]`,
847 "srcs_c": `[
848 "both_source.c",
849 ":both_filegroup_c_srcs",
850 "shared_source.c",
851 ":shared_filegroup_c_srcs",
852 ]`,
853 })}})
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000854}
855
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200856func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
857 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400858 description: "cc_library non-configured version script",
859 moduleTypeUnderTest: "cc_library",
860 moduleTypeUnderTestFactory: cc.LibraryFactory,
861 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200862 filesystem: map[string]string{
863 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200864cc_library {
865 name: "a",
866 srcs: ["a.cpp"],
867 version_script: "v.map",
868 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400869 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200870}
871`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200872 },
873 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500874 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
875 "additional_linker_inputs": `["v.map"]`,
876 "linkopts": `["-Wl,--version-script,$(location v.map)"]`,
877 "srcs": `["a.cpp"]`,
878 }),
879 },
880 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200881}
882
883func TestCcLibraryConfiguredVersionScript(t *testing.T) {
884 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400885 description: "cc_library configured version script",
886 moduleTypeUnderTest: "cc_library",
887 moduleTypeUnderTestFactory: cc.LibraryFactory,
888 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200889 filesystem: map[string]string{
890 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400891cc_library {
892 name: "a",
893 srcs: ["a.cpp"],
894 arch: {
895 arm: {
896 version_script: "arm.map",
897 },
898 arm64: {
899 version_script: "arm64.map",
900 },
901 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200902
Liz Kammer8337ea42021-09-10 10:06:32 -0400903 bazel_module: { bp2build_available: true },
904 include_build_directory: false,
905}
Liz Kammerd366c902021-06-03 13:43:01 -0400906 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200907 },
908 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500909 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
910 "additional_linker_inputs": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400911 "//build/bazel/platforms/arch:arm": ["arm.map"],
912 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
913 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500914 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500915 "linkopts": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400916 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
917 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
918 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500919 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500920 "srcs": `["a.cpp"]`,
921 }),
922 },
923 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200924}
925
926func TestCcLibrarySharedLibs(t *testing.T) {
927 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400928 description: "cc_library shared_libs",
929 moduleTypeUnderTest: "cc_library",
930 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400931 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400932cc_library {
933 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400934 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400935}
936
937cc_library {
938 name: "a",
939 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400940 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400941}
942`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500943 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
944 "implementation_dynamic_deps": `[":mylib"]`,
945 }),
946 },
947 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200948}
949
Liz Kammer0eae52e2021-10-06 10:32:26 -0400950func TestCcLibraryFeatures(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -0500951 expected_targets := []string{}
952 expected_targets = append(expected_targets, makeCcLibraryTargets("a", attrNameToString{
953 "features": `[
954 "disable_pack_relocations",
955 "-no_undefined_symbols",
956 ]`,
957 "srcs": `["a.cpp"]`,
958 })...)
959 expected_targets = append(expected_targets, makeCcLibraryTargets("b", attrNameToString{
960 "features": `select({
961 "//build/bazel/platforms/arch:x86_64": [
962 "disable_pack_relocations",
963 "-no_undefined_symbols",
964 ],
965 "//conditions:default": [],
966 })`,
967 "srcs": `["b.cpp"]`,
968 })...)
969 expected_targets = append(expected_targets, makeCcLibraryTargets("c", attrNameToString{
970 "features": `select({
971 "//build/bazel/platforms/os:darwin": [
972 "disable_pack_relocations",
973 "-no_undefined_symbols",
974 ],
975 "//conditions:default": [],
976 })`,
977 "srcs": `["c.cpp"]`,
978 })...)
979
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200980 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400981 description: "cc_library pack_relocations test",
982 moduleTypeUnderTest: "cc_library",
983 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400984 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400985cc_library {
986 name: "a",
987 srcs: ["a.cpp"],
988 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400989 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400990 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400991}
992
993cc_library {
994 name: "b",
995 srcs: ["b.cpp"],
996 arch: {
997 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400998 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400999 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001000 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001001 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001002 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001003}
1004
1005cc_library {
1006 name: "c",
1007 srcs: ["c.cpp"],
1008 target: {
1009 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001010 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001011 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001012 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001013 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001014 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001015}`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001016 expectedBazelTargets: expected_targets,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001017 })
1018}
1019
1020func TestCcLibrarySpacesInCopts(t *testing.T) {
1021 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001022 description: "cc_library spaces in copts",
1023 moduleTypeUnderTest: "cc_library",
1024 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001025 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +00001026cc_library {
1027 name: "a",
1028 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -04001029 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +00001030}
1031`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001032 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1033 "copts": `[
Jingwen Chen3950cd62021-05-12 04:33:00 +00001034 "-include",
1035 "header.h",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001036 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001037 }),
1038 },
1039 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001040}
1041
1042func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
1043 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001044 description: "cc_library cppflags usage",
1045 moduleTypeUnderTest: "cc_library",
1046 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001047 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001048 name: "a",
1049 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001050 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001051 cppflags: [
1052 "-fsigned-char",
1053 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -04001054 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001055 arch: {
1056 arm64: {
1057 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001058 },
Liz Kammerd366c902021-06-03 13:43:01 -04001059 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001060 target: {
1061 android: {
1062 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001063 },
Liz Kammerd366c902021-06-03 13:43:01 -04001064 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001065 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001066}
1067`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001068 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1069 "copts": `["-Wall"]`,
1070 "cppflags": `[
Chris Parsons990c4f42021-05-25 12:10:58 -04001071 "-fsigned-char",
1072 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001073 ] + select({
1074 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1075 "//conditions:default": [],
1076 }) + select({
1077 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1078 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001079 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001080 "srcs": `["a.cpp"]`,
1081 }),
1082 },
1083 )
Jingwen Chen63930982021-03-24 10:04:33 -04001084}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001085
Liz Kammer47535c52021-06-02 16:02:22 -04001086func TestCcLibraryExcludeLibs(t *testing.T) {
1087 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001088 moduleTypeUnderTest: "cc_library",
1089 moduleTypeUnderTestFactory: cc.LibraryFactory,
1090 filesystem: map[string]string{},
Liz Kammer47535c52021-06-02 16:02:22 -04001091 blueprint: soongCcLibraryStaticPreamble + `
1092cc_library {
1093 name: "foo_static",
1094 srcs: ["common.c"],
1095 whole_static_libs: [
1096 "arm_whole_static_lib_excludes",
1097 "malloc_not_svelte_whole_static_lib_excludes"
1098 ],
1099 static_libs: [
1100 "arm_static_lib_excludes",
1101 "malloc_not_svelte_static_lib_excludes"
1102 ],
1103 shared_libs: [
1104 "arm_shared_lib_excludes",
1105 ],
1106 arch: {
1107 arm: {
1108 exclude_shared_libs: [
1109 "arm_shared_lib_excludes",
1110 ],
1111 exclude_static_libs: [
1112 "arm_static_lib_excludes",
1113 "arm_whole_static_lib_excludes",
1114 ],
1115 },
1116 },
1117 product_variables: {
1118 malloc_not_svelte: {
1119 shared_libs: ["malloc_not_svelte_shared_lib"],
1120 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1121 exclude_static_libs: [
1122 "malloc_not_svelte_static_lib_excludes",
1123 "malloc_not_svelte_whole_static_lib_excludes",
1124 ],
1125 },
1126 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001127 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001128}
1129
1130cc_library {
1131 name: "arm_whole_static_lib_excludes",
1132 bazel_module: { bp2build_available: false },
1133}
1134
1135cc_library {
1136 name: "malloc_not_svelte_whole_static_lib",
1137 bazel_module: { bp2build_available: false },
1138}
1139
1140cc_library {
1141 name: "malloc_not_svelte_whole_static_lib_excludes",
1142 bazel_module: { bp2build_available: false },
1143}
1144
1145cc_library {
1146 name: "arm_static_lib_excludes",
1147 bazel_module: { bp2build_available: false },
1148}
1149
1150cc_library {
1151 name: "malloc_not_svelte_static_lib_excludes",
1152 bazel_module: { bp2build_available: false },
1153}
1154
1155cc_library {
1156 name: "arm_shared_lib_excludes",
1157 bazel_module: { bp2build_available: false },
1158}
1159
1160cc_library {
1161 name: "malloc_not_svelte_shared_lib",
1162 bazel_module: { bp2build_available: false },
1163}
1164`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001165 expectedBazelTargets: makeCcLibraryTargets("foo_static", attrNameToString{
1166 "implementation_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001167 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001168 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001169 }) + select({
1170 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001171 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001172 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001173 "implementation_dynamic_deps": `select({
Liz Kammer7a210ac2021-09-22 15:52:58 -04001174 "//build/bazel/platforms/arch:arm": [],
1175 "//conditions:default": [":arm_shared_lib_excludes"],
1176 }) + select({
1177 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1178 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001179 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001180 "srcs_c": `["common.c"]`,
1181 "whole_archive_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001182 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001183 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001184 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001185 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1186 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001187 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001188 }),
1189 },
1190 )
Liz Kammer47535c52021-06-02 16:02:22 -04001191}
Liz Kammerd366c902021-06-03 13:43:01 -04001192
1193func TestCCLibraryNoCrtTrue(t *testing.T) {
1194 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001195 description: "cc_library - nocrt: true emits attribute",
1196 moduleTypeUnderTest: "cc_library",
1197 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001198 filesystem: map[string]string{
1199 "impl.cpp": "",
1200 },
1201 blueprint: soongCcLibraryPreamble + `
1202cc_library {
1203 name: "foo-lib",
1204 srcs: ["impl.cpp"],
1205 nocrt: true,
1206 include_build_directory: false,
1207}
1208`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001209 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1210 "link_crt": `False`,
1211 "srcs": `["impl.cpp"]`,
1212 }),
1213 },
1214 )
Jingwen Chen6ada5892021-09-17 11:38:09 +00001215}
1216
1217func TestCCLibraryNoCrtFalse(t *testing.T) {
1218 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001219 description: "cc_library - nocrt: false - does not emit attribute",
1220 moduleTypeUnderTest: "cc_library",
1221 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001222 filesystem: map[string]string{
1223 "impl.cpp": "",
1224 },
1225 blueprint: soongCcLibraryPreamble + `
1226cc_library {
1227 name: "foo-lib",
1228 srcs: ["impl.cpp"],
1229 nocrt: false,
1230 include_build_directory: false,
1231}
1232`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001233 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1234 "srcs": `["impl.cpp"]`,
1235 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001236 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001237}
1238
1239func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1240 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001241 description: "cc_library - nocrt in select",
1242 moduleTypeUnderTest: "cc_library",
1243 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001244 filesystem: map[string]string{
1245 "impl.cpp": "",
1246 },
1247 blueprint: soongCcLibraryPreamble + `
1248cc_library {
1249 name: "foo-lib",
1250 srcs: ["impl.cpp"],
1251 arch: {
1252 arm: {
1253 nocrt: true,
1254 },
1255 x86: {
1256 nocrt: false,
1257 },
1258 },
1259 include_build_directory: false,
1260}
1261`,
Liz Kammer718eb272022-01-07 10:53:37 -05001262 expectedErr: fmt.Errorf("module \"foo-lib\": nocrt is not supported for arch variants"),
Jingwen Chen6ada5892021-09-17 11:38:09 +00001263 })
1264}
1265
1266func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1267 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001268 moduleTypeUnderTest: "cc_library",
1269 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001270 filesystem: map[string]string{
1271 "impl.cpp": "",
1272 },
1273 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001274cc_library {
1275 name: "foo-lib",
1276 srcs: ["impl.cpp"],
1277 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001278 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001279}
1280`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001281 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1282 "srcs": `["impl.cpp"]`,
1283 "use_libcrt": `False`,
1284 }),
1285 })
1286}
1287
1288func makeCcLibraryTargets(name string, attrs attrNameToString) []string {
1289 STATIC_ONLY_ATTRS := map[string]bool{}
1290 SHARED_ONLY_ATTRS := map[string]bool{
1291 "link_crt": true,
1292 "additional_linker_inputs": true,
1293 "linkopts": true,
1294 "strip": true,
Jingwen Chen0ee88a62022-01-07 14:55:29 +00001295 "stubs_symbol_file": true,
1296 "stubs_versions": true,
Yu Liu75be7b92022-02-01 09:54:09 -08001297 "inject_bssl_hash": true,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001298 }
1299 sharedAttrs := attrNameToString{}
1300 staticAttrs := attrNameToString{}
1301 for key, val := range attrs {
1302 if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly {
1303 sharedAttrs[key] = val
1304 }
1305 if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly {
1306 staticAttrs[key] = val
1307 }
1308 }
1309 sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
1310 staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
1311
1312 return []string{staticTarget, sharedTarget}
Liz Kammerd366c902021-06-03 13:43:01 -04001313}
1314
Jingwen Chen6ada5892021-09-17 11:38:09 +00001315func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001316 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001317 moduleTypeUnderTest: "cc_library",
1318 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001319 filesystem: map[string]string{
1320 "impl.cpp": "",
1321 },
1322 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001323cc_library {
1324 name: "foo-lib",
1325 srcs: ["impl.cpp"],
1326 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001327 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001328}
1329`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001330 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1331 "srcs": `["impl.cpp"]`,
1332 "use_libcrt": `True`,
1333 }),
1334 })
Liz Kammerd366c902021-06-03 13:43:01 -04001335}
1336
Jingwen Chen6ada5892021-09-17 11:38:09 +00001337func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001338 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001339 moduleTypeUnderTest: "cc_library",
1340 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001341 filesystem: map[string]string{
1342 "impl.cpp": "",
1343 },
1344 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001345cc_library {
1346 name: "foo-lib",
1347 srcs: ["impl.cpp"],
1348 arch: {
1349 arm: {
1350 no_libcrt: true,
1351 },
1352 x86: {
1353 no_libcrt: true,
1354 },
1355 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001356 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001357}
1358`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001359 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1360 "srcs": `["impl.cpp"]`,
1361 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001362 "//build/bazel/platforms/arch:arm": False,
1363 "//build/bazel/platforms/arch:x86": False,
1364 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001365 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001366 }),
1367 })
Liz Kammerd366c902021-06-03 13:43:01 -04001368}
1369
Chris Parsons58852a02021-12-09 18:10:18 -05001370func TestCCLibraryNoLibCrtArchAndTargetVariant(t *testing.T) {
1371 runCcLibraryTestCase(t, bp2buildTestCase{
1372 moduleTypeUnderTest: "cc_library",
1373 moduleTypeUnderTestFactory: cc.LibraryFactory,
1374 filesystem: map[string]string{
1375 "impl.cpp": "",
1376 },
1377 blueprint: soongCcLibraryPreamble + `
1378cc_library {
1379 name: "foo-lib",
1380 srcs: ["impl.cpp"],
1381 arch: {
1382 arm: {
1383 no_libcrt: true,
1384 },
1385 x86: {
1386 no_libcrt: true,
1387 },
1388 },
1389 target: {
1390 darwin: {
1391 no_libcrt: true,
1392 }
1393 },
1394 include_build_directory: false,
1395}
1396`,
1397 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1398 "srcs": `["impl.cpp"]`,
1399 "use_libcrt": `select({
1400 "//build/bazel/platforms/os_arch:android_arm": False,
1401 "//build/bazel/platforms/os_arch:android_x86": False,
1402 "//build/bazel/platforms/os_arch:darwin_arm64": False,
1403 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1404 "//build/bazel/platforms/os_arch:linux_glibc_x86": False,
1405 "//build/bazel/platforms/os_arch:linux_musl_x86": False,
1406 "//build/bazel/platforms/os_arch:windows_x86": False,
1407 "//conditions:default": None,
1408 })`,
1409 }),
1410 })
1411}
1412
1413func TestCCLibraryNoLibCrtArchAndTargetVariantConflict(t *testing.T) {
1414 runCcLibraryTestCase(t, bp2buildTestCase{
1415 moduleTypeUnderTest: "cc_library",
1416 moduleTypeUnderTestFactory: cc.LibraryFactory,
1417 filesystem: map[string]string{
1418 "impl.cpp": "",
1419 },
1420 blueprint: soongCcLibraryPreamble + `
1421cc_library {
1422 name: "foo-lib",
1423 srcs: ["impl.cpp"],
1424 arch: {
1425 arm: {
1426 no_libcrt: true,
1427 },
1428 // This is expected to override the value for darwin_x86_64.
1429 x86_64: {
1430 no_libcrt: true,
1431 },
1432 },
1433 target: {
1434 darwin: {
1435 no_libcrt: false,
1436 }
1437 },
1438 include_build_directory: false,
1439}
1440`,
1441 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1442 "srcs": `["impl.cpp"]`,
1443 "use_libcrt": `select({
1444 "//build/bazel/platforms/os_arch:android_arm": False,
1445 "//build/bazel/platforms/os_arch:android_x86_64": False,
1446 "//build/bazel/platforms/os_arch:darwin_arm64": True,
1447 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1448 "//build/bazel/platforms/os_arch:linux_bionic_x86_64": False,
1449 "//build/bazel/platforms/os_arch:linux_glibc_x86_64": False,
1450 "//build/bazel/platforms/os_arch:linux_musl_x86_64": False,
1451 "//build/bazel/platforms/os_arch:windows_x86_64": False,
1452 "//conditions:default": None,
1453 })`,
1454 }),
1455 })
1456}
1457
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001458func TestCcLibraryStrip(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001459 expectedTargets := []string{}
1460 expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{
1461 "strip": `{
1462 "all": True,
1463 }`,
1464 })...)
1465 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{
1466 "strip": `{
1467 "keep_symbols": True,
1468 }`,
1469 })...)
1470 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{
1471 "strip": `{
1472 "keep_symbols_and_debug_frame": True,
1473 }`,
1474 })...)
1475 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{
1476 "strip": `{
1477 "keep_symbols_list": ["symbol"],
1478 }`,
1479 })...)
1480 expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{
1481 "strip": `{
1482 "none": True,
1483 }`,
1484 })...)
1485 expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...)
1486
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001487 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001488 description: "cc_library strip args",
1489 moduleTypeUnderTest: "cc_library",
1490 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001491 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001492cc_library {
1493 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001494 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001495}
1496cc_library {
1497 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001498 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001499 keep_symbols: true,
1500 },
1501 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001502}
1503cc_library {
1504 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001505 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001506 keep_symbols_and_debug_frame: true,
1507 },
1508 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001509}
1510cc_library {
1511 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001512 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001513 none: true,
1514 },
1515 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001516}
1517cc_library {
1518 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001519 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001520 keep_symbols_list: ["symbol"],
1521 },
1522 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001523}
1524cc_library {
1525 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001526 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001527 all: true,
1528 },
1529 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001530}
1531`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001532 expectedBazelTargets: expectedTargets,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001533 })
1534}
1535
1536func TestCcLibraryStripWithArch(t *testing.T) {
1537 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001538 description: "cc_library strip args",
1539 moduleTypeUnderTest: "cc_library",
1540 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001541 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001542cc_library {
1543 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001544 target: {
1545 darwin: {
1546 strip: {
1547 keep_symbols_list: ["foo", "bar"]
1548 }
1549 },
1550 },
1551 arch: {
1552 arm: {
1553 strip: {
1554 keep_symbols_and_debug_frame: true,
1555 },
1556 },
1557 arm64: {
1558 strip: {
1559 keep_symbols: true,
1560 },
1561 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001562 },
1563 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001564}
1565`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001566 expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{
1567 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001568 "keep_symbols": select({
1569 "//build/bazel/platforms/arch:arm64": True,
1570 "//conditions:default": None,
1571 }),
1572 "keep_symbols_and_debug_frame": select({
1573 "//build/bazel/platforms/arch:arm": True,
1574 "//conditions:default": None,
1575 }),
1576 "keep_symbols_list": select({
1577 "//build/bazel/platforms/os:darwin": [
1578 "foo",
1579 "bar",
1580 ],
1581 "//conditions:default": [],
1582 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001583 }`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001584 }),
1585 },
1586 )
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001587}
Chris Parsons51f8c392021-08-03 21:01:05 -04001588
1589func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1590 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001591 description: "cc_library system_shared_libs empty at root",
1592 moduleTypeUnderTest: "cc_library",
1593 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001594 blueprint: soongCcLibraryPreamble + `
1595cc_library {
1596 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001597 system_shared_libs: [],
1598 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001599}
1600`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001601 expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{
1602 "system_dynamic_deps": `[]`,
1603 }),
1604 },
1605 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001606}
1607
1608func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1609 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001610 description: "cc_library system_shared_libs empty for static variant",
1611 moduleTypeUnderTest: "cc_library",
1612 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001613 blueprint: soongCcLibraryPreamble + `
1614cc_library {
1615 name: "static_empty",
1616 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001617 system_shared_libs: [],
1618 },
1619 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001620}
1621`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001622 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001623 makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{
1624 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001625 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001626 makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001627 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001628 })
1629}
1630
1631func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1632 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001633 description: "cc_library system_shared_libs empty for shared variant",
1634 moduleTypeUnderTest: "cc_library",
1635 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001636 blueprint: soongCcLibraryPreamble + `
1637cc_library {
1638 name: "shared_empty",
1639 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001640 system_shared_libs: [],
1641 },
1642 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001643}
1644`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001645 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001646 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1647 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1648 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001649 }),
1650 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001651 })
1652}
1653
1654func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1655 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001656 description: "cc_library system_shared_libs empty for shared, bionic variant",
1657 moduleTypeUnderTest: "cc_library",
1658 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001659 blueprint: soongCcLibraryPreamble + `
1660cc_library {
1661 name: "shared_empty",
1662 target: {
1663 bionic: {
1664 shared: {
1665 system_shared_libs: [],
1666 }
1667 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001668 },
1669 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001670}
1671`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001672 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001673 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1674 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1675 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001676 }),
1677 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001678 })
1679}
1680
1681func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1682 // Note that this behavior is technically incorrect (it's a simplification).
1683 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1684 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1685 // b/195791252 tracks the fix.
1686 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001687 description: "cc_library system_shared_libs empty for linux_bionic variant",
1688 moduleTypeUnderTest: "cc_library",
1689 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001690 blueprint: soongCcLibraryPreamble + `
1691cc_library {
1692 name: "target_linux_bionic_empty",
1693 target: {
1694 linux_bionic: {
1695 system_shared_libs: [],
1696 },
1697 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001698 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001699}
1700`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001701 expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{
1702 "system_dynamic_deps": `[]`,
1703 }),
1704 },
1705 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001706}
1707
1708func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1709 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001710 description: "cc_library system_shared_libs empty for bionic variant",
1711 moduleTypeUnderTest: "cc_library",
1712 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001713 blueprint: soongCcLibraryPreamble + `
1714cc_library {
1715 name: "target_bionic_empty",
1716 target: {
1717 bionic: {
1718 system_shared_libs: [],
1719 },
1720 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001721 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001722}
1723`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001724 expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{
1725 "system_dynamic_deps": `[]`,
1726 }),
1727 },
1728 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001729}
1730
1731func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1732 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001733 description: "cc_library system_shared_libs set for shared and root",
1734 moduleTypeUnderTest: "cc_library",
1735 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001736 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001737cc_library {
1738 name: "libc",
1739 bazel_module: { bp2build_available: false },
1740}
1741cc_library {
1742 name: "libm",
1743 bazel_module: { bp2build_available: false },
1744}
Chris Parsons51f8c392021-08-03 21:01:05 -04001745
1746cc_library {
1747 name: "foo",
1748 system_shared_libs: ["libc"],
1749 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001750 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001751 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001752 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001753}
1754`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001755 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001756 makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001757 "system_dynamic_deps": `[":libc"]`,
1758 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001759 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1760 "system_dynamic_deps": `[
1761 ":libc",
1762 ":libm",
1763 ]`,
1764 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001765 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001766 })
1767}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001768
1769func TestCcLibraryOsSelects(t *testing.T) {
1770 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001771 description: "cc_library - selects for all os targets",
1772 moduleTypeUnderTest: "cc_library",
1773 moduleTypeUnderTestFactory: cc.LibraryFactory,
1774 filesystem: map[string]string{},
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001775 blueprint: soongCcLibraryPreamble + `
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001776cc_library {
1777 name: "foo-lib",
1778 srcs: ["base.cpp"],
1779 target: {
1780 android: {
1781 srcs: ["android.cpp"],
1782 },
1783 linux: {
1784 srcs: ["linux.cpp"],
1785 },
1786 linux_glibc: {
1787 srcs: ["linux_glibc.cpp"],
1788 },
1789 darwin: {
1790 srcs: ["darwin.cpp"],
1791 },
1792 bionic: {
1793 srcs: ["bionic.cpp"],
1794 },
1795 linux_musl: {
1796 srcs: ["linux_musl.cpp"],
1797 },
1798 windows: {
1799 srcs: ["windows.cpp"],
1800 },
1801 },
1802 include_build_directory: false,
1803}
1804`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001805 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1806 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001807 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001808 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001809 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001810 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001811 ],
1812 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1813 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001814 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001815 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001816 ],
1817 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001818 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001819 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001820 ],
1821 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001822 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001823 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001824 ],
1825 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1826 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001827 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001828 }),
1829 },
1830 )
Jingwen Chen97b85312021-10-08 10:41:31 +00001831}
1832
Yu Liu75be7b92022-02-01 09:54:09 -08001833func TestLibcryptoHashInjection(t *testing.T) {
1834 runCcLibraryTestCase(t, bp2buildTestCase{
1835 description: "cc_library - libcrypto hash injection",
1836 moduleTypeUnderTest: "cc_library",
1837 moduleTypeUnderTestFactory: cc.LibraryFactory,
1838 filesystem: map[string]string{},
1839 blueprint: soongCcLibraryPreamble + `
1840cc_library {
1841 name: "libcrypto",
1842 target: {
1843 android: {
1844 inject_bssl_hash: true,
1845 },
1846 },
1847 include_build_directory: false,
1848}
1849`,
1850 expectedBazelTargets: makeCcLibraryTargets("libcrypto", attrNameToString{
1851 "inject_bssl_hash": `select({
1852 "//build/bazel/platforms/os:android": True,
1853 "//conditions:default": None,
1854 })`,
1855 }),
1856 },
1857 )
1858}
1859
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001860func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001861 type testCase struct {
1862 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001863 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001864 gnu_extensions string
1865 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001866 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001867 }
1868
1869 testCases := []testCase{
1870 // Existing usages of cpp_std in AOSP are:
1871 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1872 //
1873 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1874 // is set in the toolchain.)
1875 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001876 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001877 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1878 // experimental defaults to gnu++2a
1879 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001880 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001881 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1882 // Explicitly setting a c++ std does not use replace gnu++ std even if
1883 // gnu_extensions is true.
1884 // "c++11",
1885 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001886 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001887 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1888 // "c++17",
1889 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001890 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001891 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1892 // "c++2a",
1893 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001894 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001895 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1896 // "c++98",
1897 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001898 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001899 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1900 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1901 // "gnu++11",
1902 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001903 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001904 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1905 // "gnu++17",
1906 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001907 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001908 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001909
1910 // some c_std test cases
1911 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1912 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1913 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1914 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1915 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1916 {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 +00001917 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001918 for i, tc := range testCases {
1919 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001920 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001921 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001922 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001923 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001924 cStdProp := ""
1925 if tc.c_std != "" {
1926 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1927 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001928 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001929 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001930 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001931 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001932 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001933 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001934 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001935 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001936 if tc.bazel_c_std != "" {
1937 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1938 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001939
1940 runCcLibraryTestCase(t, bp2buildTestCase{
1941 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001942 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1943 moduleTypeUnderTest: "cc_library",
1944 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen97b85312021-10-08 10:41:31 +00001945 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1946cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001947 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001948%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001949%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001950%s // gnu_extensions: *bool
1951 include_build_directory: false,
1952}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001953`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001954 expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
Jingwen Chen97b85312021-10-08 10:41:31 +00001955 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001956
1957 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1958 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001959 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1960 moduleTypeUnderTest: "cc_library_static",
1961 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001962 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1963cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001964 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001965%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001966%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001967%s // gnu_extensions: *bool
1968 include_build_directory: false,
1969}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001970`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001971 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001972 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001973 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001974 })
1975
1976 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1977 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001978 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1979 moduleTypeUnderTest: "cc_library_shared",
1980 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001981 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1982cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001983 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001984%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001985%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001986%s // gnu_extensions: *bool
1987 include_build_directory: false,
1988}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001989`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001990 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001991 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001992 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001993 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001994 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001995}
Liz Kammer12615db2021-09-28 09:19:17 -04001996
1997func TestCcLibraryProtoSimple(t *testing.T) {
1998 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001999 moduleTypeUnderTest: "cc_library",
2000 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002001 blueprint: soongCcProtoPreamble + `cc_library {
2002 name: "foo",
2003 srcs: ["foo.proto"],
2004 include_build_directory: false,
2005}`,
2006 expectedBazelTargets: []string{
2007 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002008 "srcs": `["foo.proto"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002009 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2010 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002011 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002012 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002013 "deps": `[":libprotobuf-cpp-lite"]`,
2014 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2015 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002016 }),
2017 },
2018 })
2019}
2020
2021func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) {
2022 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002023 moduleTypeUnderTest: "cc_library",
2024 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002025 blueprint: soongCcProtoPreamble + `cc_library {
2026 name: "foo",
2027 srcs: ["foo.proto"],
2028 proto: { canonical_path_from_root: false},
2029 include_build_directory: false,
2030}`,
2031 expectedBazelTargets: []string{
2032 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002033 "srcs": `["foo.proto"]`,
2034 "strip_import_prefix": `""`,
Liz Kammer12615db2021-09-28 09:19:17 -04002035 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2036 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002037 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002038 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002039 "deps": `[":libprotobuf-cpp-lite"]`,
2040 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2041 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002042 }),
2043 },
2044 })
2045}
2046
2047func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
2048 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002049 moduleTypeUnderTest: "cc_library",
2050 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002051 blueprint: soongCcProtoPreamble + `cc_library {
2052 name: "foo",
2053 srcs: ["foo.proto"],
2054 proto: { canonical_path_from_root: true},
2055 include_build_directory: false,
2056}`,
2057 expectedBazelTargets: []string{
2058 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002059 "srcs": `["foo.proto"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002060 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2061 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002062 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002063 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002064 "deps": `[":libprotobuf-cpp-lite"]`,
2065 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2066 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002067 }),
2068 },
2069 })
2070}
2071
2072func TestCcLibraryProtoFull(t *testing.T) {
2073 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002074 moduleTypeUnderTest: "cc_library",
2075 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002076 blueprint: soongCcProtoPreamble + `cc_library {
2077 name: "foo",
2078 srcs: ["foo.proto"],
2079 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002080 type: "full",
2081 },
2082 include_build_directory: false,
2083}`,
2084 expectedBazelTargets: []string{
2085 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2086 "srcs": `["foo.proto"]`,
2087 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
2088 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002089 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002090 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002091 "deps": `[":libprotobuf-cpp-full"]`,
2092 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2093 "dynamic_deps": `[":libprotobuf-cpp-full"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002094 }),
2095 },
2096 })
2097}
2098
2099func TestCcLibraryProtoLite(t *testing.T) {
2100 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002101 moduleTypeUnderTest: "cc_library",
2102 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002103 blueprint: soongCcProtoPreamble + `cc_library {
2104 name: "foo",
2105 srcs: ["foo.proto"],
2106 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002107 type: "lite",
2108 },
2109 include_build_directory: false,
2110}`,
2111 expectedBazelTargets: []string{
2112 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2113 "srcs": `["foo.proto"]`,
2114 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2115 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002116 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002117 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002118 "deps": `[":libprotobuf-cpp-lite"]`,
2119 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2120 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002121 }),
2122 },
2123 })
2124}
2125
2126func TestCcLibraryProtoExportHeaders(t *testing.T) {
2127 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002128 moduleTypeUnderTest: "cc_library",
2129 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002130 blueprint: soongCcProtoPreamble + `cc_library {
2131 name: "foo",
2132 srcs: ["foo.proto"],
2133 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002134 export_proto_headers: true,
2135 },
2136 include_build_directory: false,
2137}`,
2138 expectedBazelTargets: []string{
2139 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2140 "srcs": `["foo.proto"]`,
2141 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2142 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002143 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2144 "deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002145 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002146 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2147 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2148 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002149 }),
2150 },
2151 })
2152}
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002153
2154func TestCcLibraryProtoFilegroups(t *testing.T) {
2155 runCcLibraryTestCase(t, bp2buildTestCase{
2156 moduleTypeUnderTest: "cc_library",
2157 moduleTypeUnderTestFactory: cc.LibraryFactory,
2158 blueprint: soongCcProtoPreamble +
2159 simpleModuleDoNotConvertBp2build("filegroup", "a_fg_proto") +
2160 simpleModuleDoNotConvertBp2build("filegroup", "b_protos") +
2161 simpleModuleDoNotConvertBp2build("filegroup", "c-proto-srcs") +
2162 simpleModuleDoNotConvertBp2build("filegroup", "proto-srcs-d") + `
2163cc_library {
2164 name: "a",
2165 srcs: [":a_fg_proto"],
2166 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002167 export_proto_headers: true,
2168 },
2169 include_build_directory: false,
2170}
2171
2172cc_library {
2173 name: "b",
2174 srcs: [":b_protos"],
2175 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002176 export_proto_headers: true,
2177 },
2178 include_build_directory: false,
2179}
2180
2181cc_library {
2182 name: "c",
2183 srcs: [":c-proto-srcs"],
2184 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002185 export_proto_headers: true,
2186 },
2187 include_build_directory: false,
2188}
2189
2190cc_library {
2191 name: "d",
2192 srcs: [":proto-srcs-d"],
2193 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002194 export_proto_headers: true,
2195 },
2196 include_build_directory: false,
2197}`,
2198 expectedBazelTargets: []string{
2199 makeBazelTarget("proto_library", "a_proto", attrNameToString{
2200 "srcs": `[":a_fg_proto"]`,
2201 }), makeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", attrNameToString{
2202 "deps": `[":a_proto"]`,
2203 }), makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
2204 "deps": `[":libprotobuf-cpp-lite"]`,
2205 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2206 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2207 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2208 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2209 }), makeBazelTarget("cc_library_shared", "a", attrNameToString{
2210 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2211 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2212 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2213 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2214 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2215 }), makeBazelTarget("proto_library", "b_proto", attrNameToString{
2216 "srcs": `[":b_protos"]`,
2217 }), makeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", attrNameToString{
2218 "deps": `[":b_proto"]`,
2219 }), makeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", attrNameToString{
2220 "deps": `[":libprotobuf-cpp-lite"]`,
2221 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2222 "srcs": `[":b_protos_cpp_srcs"]`,
2223 "srcs_as": `[":b_protos_as_srcs"]`,
2224 "srcs_c": `[":b_protos_c_srcs"]`,
2225 }), makeBazelTarget("cc_library_shared", "b", attrNameToString{
2226 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2227 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2228 "srcs": `[":b_protos_cpp_srcs"]`,
2229 "srcs_as": `[":b_protos_as_srcs"]`,
2230 "srcs_c": `[":b_protos_c_srcs"]`,
2231 }), makeBazelTarget("proto_library", "c_proto", attrNameToString{
2232 "srcs": `[":c-proto-srcs"]`,
2233 }), makeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", attrNameToString{
2234 "deps": `[":c_proto"]`,
2235 }), makeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", attrNameToString{
2236 "deps": `[":libprotobuf-cpp-lite"]`,
2237 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2238 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2239 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2240 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2241 }), makeBazelTarget("cc_library_shared", "c", attrNameToString{
2242 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2243 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2244 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2245 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2246 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2247 }), makeBazelTarget("proto_library", "d_proto", attrNameToString{
2248 "srcs": `[":proto-srcs-d"]`,
2249 }), makeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", attrNameToString{
2250 "deps": `[":d_proto"]`,
2251 }), makeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", attrNameToString{
2252 "deps": `[":libprotobuf-cpp-lite"]`,
2253 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2254 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2255 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2256 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2257 }), makeBazelTarget("cc_library_shared", "d", attrNameToString{
2258 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2259 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2260 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2261 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2262 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2263 }),
2264 },
2265 })
2266}
Chris Parsons58852a02021-12-09 18:10:18 -05002267
2268func TestCcLibraryDisabledArchAndTarget(t *testing.T) {
2269 runCcLibraryTestCase(t, bp2buildTestCase{
2270 moduleTypeUnderTest: "cc_library",
2271 moduleTypeUnderTestFactory: cc.LibraryFactory,
2272 blueprint: soongCcProtoPreamble + `cc_library {
2273 name: "foo",
2274 srcs: ["foo.cpp"],
2275 target: {
2276 darwin: {
2277 enabled: false,
2278 },
2279 windows: {
2280 enabled: false,
2281 },
2282 linux_glibc_x86: {
2283 enabled: false,
2284 },
2285 },
2286 include_build_directory: false,
2287}`,
2288 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2289 "srcs": `["foo.cpp"]`,
2290 "target_compatible_with": `select({
2291 "//build/bazel/platforms/os_arch:darwin_arm64": ["@platforms//:incompatible"],
2292 "//build/bazel/platforms/os_arch:darwin_x86_64": ["@platforms//:incompatible"],
2293 "//build/bazel/platforms/os_arch:linux_glibc_x86": ["@platforms//:incompatible"],
2294 "//build/bazel/platforms/os_arch:windows_x86": ["@platforms//:incompatible"],
2295 "//build/bazel/platforms/os_arch:windows_x86_64": ["@platforms//:incompatible"],
2296 "//conditions:default": [],
2297 })`,
2298 }),
2299 })
2300}
2301
2302func TestCcLibraryDisabledArchAndTargetWithDefault(t *testing.T) {
2303 runCcLibraryTestCase(t, bp2buildTestCase{
2304 moduleTypeUnderTest: "cc_library",
2305 moduleTypeUnderTestFactory: cc.LibraryFactory,
2306 blueprint: soongCcProtoPreamble + `cc_library {
2307 name: "foo",
2308 srcs: ["foo.cpp"],
2309 enabled: false,
2310 target: {
2311 darwin: {
2312 enabled: true,
2313 },
2314 windows: {
2315 enabled: false,
2316 },
2317 linux_glibc_x86: {
2318 enabled: false,
2319 },
2320 },
2321 include_build_directory: false,
2322}`,
2323 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2324 "srcs": `["foo.cpp"]`,
2325 "target_compatible_with": `select({
2326 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2327 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2328 "//conditions:default": ["@platforms//:incompatible"],
2329 })`,
2330 }),
2331 })
2332}
2333
2334func TestCcLibrarySharedDisabled(t *testing.T) {
2335 runCcLibraryTestCase(t, bp2buildTestCase{
2336 moduleTypeUnderTest: "cc_library",
2337 moduleTypeUnderTestFactory: cc.LibraryFactory,
2338 blueprint: soongCcProtoPreamble + `cc_library {
2339 name: "foo",
2340 srcs: ["foo.cpp"],
2341 enabled: false,
2342 shared: {
2343 enabled: true,
2344 },
2345 target: {
2346 android: {
2347 shared: {
2348 enabled: false,
2349 },
2350 }
2351 },
2352 include_build_directory: false,
2353}`,
2354 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2355 "srcs": `["foo.cpp"]`,
2356 "target_compatible_with": `["@platforms//:incompatible"]`,
2357 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2358 "srcs": `["foo.cpp"]`,
2359 "target_compatible_with": `select({
2360 "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
2361 "//conditions:default": [],
2362 })`,
2363 }),
2364 },
2365 })
2366}
2367
2368func TestCcLibraryStaticDisabledForSomeArch(t *testing.T) {
2369 runCcLibraryTestCase(t, bp2buildTestCase{
2370 moduleTypeUnderTest: "cc_library",
2371 moduleTypeUnderTestFactory: cc.LibraryFactory,
2372 blueprint: soongCcProtoPreamble + `cc_library {
2373 name: "foo",
2374 srcs: ["foo.cpp"],
2375 shared: {
2376 enabled: false
2377 },
2378 target: {
2379 darwin: {
2380 enabled: true,
2381 },
2382 windows: {
2383 enabled: false,
2384 },
2385 linux_glibc_x86: {
2386 shared: {
2387 enabled: true,
2388 },
2389 },
2390 },
2391 include_build_directory: false,
2392}`,
2393 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2394 "srcs": `["foo.cpp"]`,
2395 "target_compatible_with": `select({
2396 "//build/bazel/platforms/os:windows": ["@platforms//:incompatible"],
2397 "//conditions:default": [],
2398 })`,
2399 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2400 "srcs": `["foo.cpp"]`,
2401 "target_compatible_with": `select({
2402 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2403 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2404 "//build/bazel/platforms/os_arch:linux_glibc_x86": [],
2405 "//conditions:default": ["@platforms//:incompatible"],
2406 })`,
2407 }),
2408 }})
2409}
Jingwen Chen0ee88a62022-01-07 14:55:29 +00002410
2411func TestCcLibraryStubs(t *testing.T) {
2412 runCcLibraryTestCase(t, bp2buildTestCase{
2413 description: "cc_library stubs",
2414 moduleTypeUnderTest: "cc_library",
2415 moduleTypeUnderTestFactory: cc.LibraryFactory,
2416 dir: "foo/bar",
2417 filesystem: map[string]string{
2418 "foo/bar/Android.bp": `
2419cc_library {
2420 name: "a",
2421 stubs: { symbol_file: "a.map.txt", versions: ["28", "29", "current"] },
2422 bazel_module: { bp2build_available: true },
2423 include_build_directory: false,
2424}
2425`,
2426 },
2427 blueprint: soongCcLibraryPreamble,
2428 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
2429 "stubs_symbol_file": `"a.map.txt"`,
2430 "stubs_versions": `[
2431 "28",
2432 "29",
2433 "current",
2434 ]`,
2435 }),
2436 },
2437 )
2438}
Liz Kammerf38a8372022-02-04 15:39:00 -05002439
2440func TestCcLibraryEscapeLdflags(t *testing.T) {
2441 runCcLibraryTestCase(t, bp2buildTestCase{
2442 moduleTypeUnderTest: "cc_library",
2443 moduleTypeUnderTestFactory: cc.LibraryFactory,
2444 blueprint: soongCcProtoPreamble + `cc_library {
2445 name: "foo",
2446 ldflags: ["-Wl,--rpath,${ORIGIN}"],
2447 include_build_directory: false,
2448}`,
2449 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2450 "linkopts": `["-Wl,--rpath,$${ORIGIN}"]`,
2451 }),
2452 })
2453}