blob: 59a23897698432cda32cb255d826bc67740dd26b [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}
31
32toolchain_library {
Liz Kammer8337ea42021-09-10 10:06:32 -040033 name: "libclang_rt.builtins-x86_64-android",
34 defaults: ["linux_bionic_supported"],
35 vendor_available: true,
36 vendor_ramdisk_available: true,
37 product_available: true,
38 recovery_available: true,
39 native_bridge_supported: true,
40 src: "",
Jingwen Chen63930982021-03-24 10:04:33 -040041}`
Liz Kammer12615db2021-09-28 09:19:17 -040042
43 soongCcProtoLibraries = `
44cc_library {
45 name: "libprotobuf-cpp-lite",
46 bazel_module: { bp2build_available: false },
47}
48
49cc_library {
50 name: "libprotobuf-cpp-full",
51 bazel_module: { bp2build_available: false },
52}`
53
54 soongCcProtoPreamble = soongCcLibraryPreamble + soongCcProtoLibraries
Jingwen Chen63930982021-03-24 10:04:33 -040055)
56
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020057func runCcLibraryTestCase(t *testing.T, tc bp2buildTestCase) {
Liz Kammere4982e82021-05-25 10:39:35 -040058 t.Helper()
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020059 runBp2BuildTestCase(t, registerCcLibraryModuleTypes, tc)
60}
61
62func registerCcLibraryModuleTypes(ctx android.RegistrationContext) {
63 cc.RegisterCCBuildComponents(ctx)
Jingwen Chen14a8bda2021-06-02 11:10:02 +000064 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020065 ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
Liz Kammer2d7bbe32021-06-10 18:20:06 -040066 ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020067 ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
68 ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
69}
70
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020071func TestCcLibrarySimple(t *testing.T) {
72 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -040073 description: "cc_library - simple example",
74 moduleTypeUnderTest: "cc_library",
75 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020076 filesystem: map[string]string{
77 "android.cpp": "",
Liz Kammer01a16e82021-07-16 16:33:47 -040078 "bionic.cpp": "",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020079 "darwin.cpp": "",
80 // Refer to cc.headerExts for the supported header extensions in Soong.
81 "header.h": "",
82 "header.hh": "",
83 "header.hpp": "",
84 "header.hxx": "",
85 "header.h++": "",
86 "header.inl": "",
87 "header.inc": "",
88 "header.ipp": "",
89 "header.h.generic": "",
90 "impl.cpp": "",
91 "linux.cpp": "",
92 "x86.cpp": "",
93 "x86_64.cpp": "",
94 "foo-dir/a.h": "",
95 },
Liz Kammer78cfdaa2021-11-08 12:56:31 -050096 blueprint: soongCcLibraryPreamble +
97 simpleModuleDoNotConvertBp2build("cc_library_headers", "some-headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -040098cc_library {
99 name: "foo-lib",
100 srcs: ["impl.cpp"],
101 cflags: ["-Wall"],
102 header_libs: ["some-headers"],
103 export_include_dirs: ["foo-dir"],
104 ldflags: ["-Wl,--exclude-libs=bar.a"],
105 arch: {
106 x86: {
107 ldflags: ["-Wl,--exclude-libs=baz.a"],
108 srcs: ["x86.cpp"],
109 },
110 x86_64: {
111 ldflags: ["-Wl,--exclude-libs=qux.a"],
112 srcs: ["x86_64.cpp"],
113 },
114 },
115 target: {
116 android: {
117 srcs: ["android.cpp"],
118 },
119 linux_glibc: {
120 srcs: ["linux.cpp"],
121 },
122 darwin: {
123 srcs: ["darwin.cpp"],
124 },
Liz Kammer01a16e82021-07-16 16:33:47 -0400125 bionic: {
126 srcs: ["bionic.cpp"]
127 },
Jingwen Chen63930982021-03-24 10:04:33 -0400128 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400129 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400130}
131`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500132 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
133 "copts": `["-Wall"]`,
134 "export_includes": `["foo-dir"]`,
135 "implementation_deps": `[":some-headers"]`,
136 "linkopts": `["-Wl,--exclude-libs=bar.a"] + select({
Jingwen Chened9c17d2021-04-13 07:14:55 +0000137 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
138 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
139 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500140 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500141 "srcs": `["impl.cpp"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000142 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
143 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen63930982021-03-24 10:04:33 -0400144 "//conditions:default": [],
145 }) + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400146 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400147 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -0400148 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400149 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000150 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
151 "//build/bazel/platforms/os:linux": ["linux.cpp"],
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400152 "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"],
Liz Kammer01a16e82021-07-16 16:33:47 -0400153 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500154 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500155 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500156 })
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200157}
158
159func TestCcLibraryTrimmedLdAndroid(t *testing.T) {
160 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400161 description: "cc_library - trimmed example of //bionic/linker:ld-android",
162 moduleTypeUnderTest: "cc_library",
163 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200164 filesystem: map[string]string{
165 "ld-android.cpp": "",
166 "linked_list.h": "",
167 "linker.h": "",
168 "linker_block_allocator.h": "",
169 "linker_cfi.h": "",
Jingwen Chen63930982021-03-24 10:04:33 -0400170 },
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400171 blueprint: soongCcLibraryPreamble +
172 simpleModuleDoNotConvertBp2build("cc_library_headers", "libc_headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -0400173cc_library {
174 name: "fake-ld-android",
175 srcs: ["ld_android.cpp"],
176 cflags: [
177 "-Wall",
178 "-Wextra",
179 "-Wunused",
180 "-Werror",
181 ],
182 header_libs: ["libc_headers"],
183 ldflags: [
184 "-Wl,--exclude-libs=libgcc.a",
185 "-Wl,--exclude-libs=libgcc_stripped.a",
186 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
187 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
188 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
189 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
190 ],
191 arch: {
192 x86: {
193 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
194 },
195 x86_64: {
196 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
197 },
198 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400199 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400200}
201`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500202 expectedBazelTargets: makeCcLibraryTargets("fake-ld-android", attrNameToString{
203 "srcs": `["ld_android.cpp"]`,
204 "copts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400205 "-Wall",
206 "-Wextra",
207 "-Wunused",
208 "-Werror",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500209 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500210 "implementation_deps": `[":libc_headers"]`,
211 "linkopts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400212 "-Wl,--exclude-libs=libgcc.a",
213 "-Wl,--exclude-libs=libgcc_stripped.a",
214 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
215 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
216 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
217 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
218 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000219 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=libgcc_eh.a"],
220 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"],
Jingwen Chen63930982021-03-24 10:04:33 -0400221 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500222 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500223 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200224 })
225}
226
227func TestCcLibraryExcludeSrcs(t *testing.T) {
228 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400229 description: "cc_library exclude_srcs - trimmed example of //external/arm-optimized-routines:libarm-optimized-routines-math",
230 moduleTypeUnderTest: "cc_library",
231 moduleTypeUnderTestFactory: cc.LibraryFactory,
232 dir: "external",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200233 filesystem: map[string]string{
234 "external/math/cosf.c": "",
235 "external/math/erf.c": "",
236 "external/math/erf_data.c": "",
237 "external/math/erff.c": "",
238 "external/math/erff_data.c": "",
239 "external/Android.bp": `
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000240cc_library {
241 name: "fake-libarm-optimized-routines-math",
242 exclude_srcs: [
243 // Provided by:
244 // bionic/libm/upstream-freebsd/lib/msun/src/s_erf.c
245 // bionic/libm/upstream-freebsd/lib/msun/src/s_erff.c
246 "math/erf.c",
247 "math/erf_data.c",
248 "math/erff.c",
249 "math/erff_data.c",
250 ],
251 srcs: [
252 "math/*.c",
253 ],
254 // arch-specific settings
255 arch: {
256 arm64: {
257 cflags: [
258 "-DHAVE_FAST_FMA=1",
259 ],
260 },
261 },
262 bazel_module: { bp2build_available: true },
263}
264`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200265 },
266 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500267 expectedBazelTargets: makeCcLibraryTargets("fake-libarm-optimized-routines-math", attrNameToString{
268 "copts": `select({
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000269 "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"],
270 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500271 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500272 "local_includes": `["."]`,
273 "srcs_c": `["math/cosf.c"]`,
274 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200275 })
276}
277
278func TestCcLibrarySharedStaticProps(t *testing.T) {
279 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400280 description: "cc_library shared/static props",
281 moduleTypeUnderTest: "cc_library",
282 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200283 filesystem: map[string]string{
Liz Kammer8337ea42021-09-10 10:06:32 -0400284 "both.cpp": "",
285 "sharedonly.cpp": "",
286 "staticonly.cpp": "",
287 },
288 blueprint: soongCcLibraryPreamble + `
Jingwen Chen53681ef2021-04-29 08:15:13 +0000289cc_library {
290 name: "a",
Chris Parsons08648312021-05-06 16:23:19 -0400291 srcs: ["both.cpp"],
292 cflags: ["bothflag"],
293 shared_libs: ["shared_dep_for_both"],
294 static_libs: ["static_dep_for_both"],
295 whole_static_libs: ["whole_static_lib_for_both"],
296 static: {
297 srcs: ["staticonly.cpp"],
298 cflags: ["staticflag"],
299 shared_libs: ["shared_dep_for_static"],
300 static_libs: ["static_dep_for_static"],
301 whole_static_libs: ["whole_static_lib_for_static"],
302 },
303 shared: {
304 srcs: ["sharedonly.cpp"],
305 cflags: ["sharedflag"],
306 shared_libs: ["shared_dep_for_shared"],
307 static_libs: ["static_dep_for_shared"],
308 whole_static_libs: ["whole_static_lib_for_shared"],
309 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400310 include_build_directory: false,
Jingwen Chen53681ef2021-04-29 08:15:13 +0000311}
312
Liz Kammer8337ea42021-09-10 10:06:32 -0400313cc_library_static {
314 name: "static_dep_for_shared",
315 bazel_module: { bp2build_available: false },
316}
Chris Parsons08648312021-05-06 16:23:19 -0400317
Liz Kammer8337ea42021-09-10 10:06:32 -0400318cc_library_static {
319 name: "static_dep_for_static",
320 bazel_module: { bp2build_available: false },
321}
Chris Parsons08648312021-05-06 16:23:19 -0400322
Liz Kammer8337ea42021-09-10 10:06:32 -0400323cc_library_static {
324 name: "static_dep_for_both",
325 bazel_module: { bp2build_available: false },
326}
Chris Parsons08648312021-05-06 16:23:19 -0400327
Liz Kammer8337ea42021-09-10 10:06:32 -0400328cc_library_static {
329 name: "whole_static_lib_for_shared",
330 bazel_module: { bp2build_available: false },
331}
Chris Parsons08648312021-05-06 16:23:19 -0400332
Liz Kammer8337ea42021-09-10 10:06:32 -0400333cc_library_static {
334 name: "whole_static_lib_for_static",
335 bazel_module: { bp2build_available: false },
336}
Chris Parsons08648312021-05-06 16:23:19 -0400337
Liz Kammer8337ea42021-09-10 10:06:32 -0400338cc_library_static {
339 name: "whole_static_lib_for_both",
340 bazel_module: { bp2build_available: false },
341}
Chris Parsons08648312021-05-06 16:23:19 -0400342
Liz Kammer8337ea42021-09-10 10:06:32 -0400343cc_library {
344 name: "shared_dep_for_shared",
345 bazel_module: { bp2build_available: false },
346}
Chris Parsons08648312021-05-06 16:23:19 -0400347
Liz Kammer8337ea42021-09-10 10:06:32 -0400348cc_library {
349 name: "shared_dep_for_static",
350 bazel_module: { bp2build_available: false },
351}
Chris Parsons08648312021-05-06 16:23:19 -0400352
Liz Kammer8337ea42021-09-10 10:06:32 -0400353cc_library {
354 name: "shared_dep_for_both",
355 bazel_module: { bp2build_available: false },
356}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000357`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500358 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500359 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
360 "copts": `[
361 "bothflag",
362 "staticflag",
363 ]`,
364 "implementation_deps": `[
365 ":static_dep_for_both",
366 ":static_dep_for_static",
367 ]`,
368 "implementation_dynamic_deps": `[
369 ":shared_dep_for_both",
370 ":shared_dep_for_static",
371 ]`,
372 "srcs": `[
373 "both.cpp",
374 "staticonly.cpp",
375 ]`,
376 "whole_archive_deps": `[
377 ":whole_static_lib_for_both",
378 ":whole_static_lib_for_static",
379 ]`}),
380 makeBazelTarget("cc_library_shared", "a", attrNameToString{
381 "copts": `[
382 "bothflag",
383 "sharedflag",
384 ]`,
385 "implementation_deps": `[
386 ":static_dep_for_both",
387 ":static_dep_for_shared",
388 ]`,
389 "implementation_dynamic_deps": `[
390 ":shared_dep_for_both",
391 ":shared_dep_for_shared",
392 ]`,
393 "srcs": `[
394 "both.cpp",
395 "sharedonly.cpp",
396 ]`,
397 "whole_archive_deps": `[
398 ":whole_static_lib_for_both",
399 ":whole_static_lib_for_shared",
400 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500401 }),
402 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200403 })
404}
405
Liz Kammer7a210ac2021-09-22 15:52:58 -0400406func TestCcLibraryDeps(t *testing.T) {
407 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400408 description: "cc_library shared/static props",
409 moduleTypeUnderTest: "cc_library",
410 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer7a210ac2021-09-22 15:52:58 -0400411 filesystem: map[string]string{
412 "both.cpp": "",
413 "sharedonly.cpp": "",
414 "staticonly.cpp": "",
415 },
416 blueprint: soongCcLibraryPreamble + `
417cc_library {
418 name: "a",
419 srcs: ["both.cpp"],
420 cflags: ["bothflag"],
421 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
422 export_shared_lib_headers: ["shared_dep_for_both"],
423 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
424 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
425 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
426 static: {
427 srcs: ["staticonly.cpp"],
428 cflags: ["staticflag"],
429 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
430 export_shared_lib_headers: ["shared_dep_for_static"],
431 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
432 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
433 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
434 },
435 shared: {
436 srcs: ["sharedonly.cpp"],
437 cflags: ["sharedflag"],
438 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
439 export_shared_lib_headers: ["shared_dep_for_shared"],
440 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
441 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
442 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
443 },
444 include_build_directory: false,
445}
446` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
447 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
448 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
449 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
450 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
451 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
452 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
453 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
454 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
455 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
456 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
457 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
458 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
459 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
460 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
461 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
462 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
463 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500464 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500465 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
466 "copts": `[
467 "bothflag",
468 "staticflag",
469 ]`,
470 "deps": `[
471 ":static_dep_for_both",
472 ":static_dep_for_static",
473 ]`,
474 "dynamic_deps": `[
475 ":shared_dep_for_both",
476 ":shared_dep_for_static",
477 ]`,
478 "implementation_deps": `[
479 ":implementation_static_dep_for_both",
480 ":implementation_static_dep_for_static",
481 ]`,
482 "implementation_dynamic_deps": `[
483 ":implementation_shared_dep_for_both",
484 ":implementation_shared_dep_for_static",
485 ]`,
486 "srcs": `[
487 "both.cpp",
488 "staticonly.cpp",
489 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500490 "whole_archive_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400491 ":not_explicitly_exported_whole_static_dep_for_both",
492 ":whole_static_dep_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500493 ":not_explicitly_exported_whole_static_dep_for_static",
494 ":whole_static_dep_for_static",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500495 ]`,
496 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500497 makeBazelTarget("cc_library_shared", "a", attrNameToString{
498 "copts": `[
499 "bothflag",
500 "sharedflag",
501 ]`,
502 "deps": `[
503 ":static_dep_for_both",
504 ":static_dep_for_shared",
505 ]`,
506 "dynamic_deps": `[
507 ":shared_dep_for_both",
508 ":shared_dep_for_shared",
509 ]`,
510 "implementation_deps": `[
511 ":implementation_static_dep_for_both",
512 ":implementation_static_dep_for_shared",
513 ]`,
514 "implementation_dynamic_deps": `[
515 ":implementation_shared_dep_for_both",
516 ":implementation_shared_dep_for_shared",
517 ]`,
518 "srcs": `[
519 "both.cpp",
520 "sharedonly.cpp",
521 ]`,
522 "whole_archive_deps": `[
523 ":not_explicitly_exported_whole_static_dep_for_both",
524 ":whole_static_dep_for_both",
525 ":not_explicitly_exported_whole_static_dep_for_shared",
526 ":whole_static_dep_for_shared",
527 ]`,
528 })},
529 },
530 )
Liz Kammer7a210ac2021-09-22 15:52:58 -0400531}
532
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400533func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
534 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400535 moduleTypeUnderTest: "cc_library",
536 moduleTypeUnderTestFactory: cc.LibraryFactory,
537 dir: "foo/bar",
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400538 filesystem: map[string]string{
539 "foo/bar/Android.bp": `
540cc_library {
541 name: "a",
542 whole_static_libs: ["whole_static_lib_for_both"],
543 static: {
544 whole_static_libs: ["whole_static_lib_for_static"],
545 },
546 shared: {
547 whole_static_libs: ["whole_static_lib_for_shared"],
548 },
549 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400550 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400551}
552
553cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
554
555cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
556
557cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
558`,
559 },
560 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500561 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500562 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
563 "whole_archive_deps": `[
564 ":whole_static_lib_for_both_alwayslink",
565 ":whole_static_lib_for_static_alwayslink",
566 ]`,
567 }),
568 makeBazelTarget("cc_library_shared", "a", attrNameToString{
569 "whole_archive_deps": `[
570 ":whole_static_lib_for_both_alwayslink",
571 ":whole_static_lib_for_shared_alwayslink",
572 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500573 }),
574 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500575 },
576 )
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400577}
578
Jingwen Chenbcf53042021-05-26 04:42:42 +0000579func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
580 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400581 description: "cc_library shared/static props in arch",
582 moduleTypeUnderTest: "cc_library",
583 moduleTypeUnderTestFactory: cc.LibraryFactory,
584 dir: "foo/bar",
Jingwen Chenbcf53042021-05-26 04:42:42 +0000585 filesystem: map[string]string{
586 "foo/bar/arm.cpp": "",
587 "foo/bar/x86.cpp": "",
588 "foo/bar/sharedonly.cpp": "",
589 "foo/bar/staticonly.cpp": "",
590 "foo/bar/Android.bp": `
591cc_library {
592 name: "a",
593 arch: {
594 arm: {
595 shared: {
596 srcs: ["arm_shared.cpp"],
597 cflags: ["-DARM_SHARED"],
598 static_libs: ["arm_static_dep_for_shared"],
599 whole_static_libs: ["arm_whole_static_dep_for_shared"],
600 shared_libs: ["arm_shared_dep_for_shared"],
601 },
602 },
603 x86: {
604 static: {
605 srcs: ["x86_static.cpp"],
606 cflags: ["-DX86_STATIC"],
607 static_libs: ["x86_dep_for_static"],
608 },
609 },
610 },
611 target: {
612 android: {
613 shared: {
614 srcs: ["android_shared.cpp"],
615 cflags: ["-DANDROID_SHARED"],
616 static_libs: ["android_dep_for_shared"],
617 },
618 },
619 android_arm: {
620 shared: {
621 cflags: ["-DANDROID_ARM_SHARED"],
622 },
623 },
624 },
625 srcs: ["both.cpp"],
626 cflags: ["bothflag"],
627 static_libs: ["static_dep_for_both"],
628 static: {
629 srcs: ["staticonly.cpp"],
630 cflags: ["staticflag"],
631 static_libs: ["static_dep_for_static"],
632 },
633 shared: {
634 srcs: ["sharedonly.cpp"],
635 cflags: ["sharedflag"],
636 static_libs: ["static_dep_for_shared"],
637 },
638 bazel_module: { bp2build_available: true },
639}
640
641cc_library_static { name: "static_dep_for_shared" }
642cc_library_static { name: "static_dep_for_static" }
643cc_library_static { name: "static_dep_for_both" }
644
645cc_library_static { name: "arm_static_dep_for_shared" }
646cc_library_static { name: "arm_whole_static_dep_for_shared" }
647cc_library_static { name: "arm_shared_dep_for_shared" }
648
649cc_library_static { name: "x86_dep_for_static" }
650
651cc_library_static { name: "android_dep_for_shared" }
652`,
653 },
654 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500655 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500656 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
657 "copts": `[
658 "bothflag",
659 "staticflag",
660 ] + select({
661 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
662 "//conditions:default": [],
663 })`,
664 "implementation_deps": `[
665 ":static_dep_for_both",
666 ":static_dep_for_static",
667 ] + select({
668 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
669 "//conditions:default": [],
670 })`,
671 "local_includes": `["."]`,
672 "srcs": `[
673 "both.cpp",
674 "staticonly.cpp",
675 ] + select({
676 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
677 "//conditions:default": [],
678 })`,
679 }),
680 makeBazelTarget("cc_library_shared", "a", attrNameToString{
681 "copts": `[
682 "bothflag",
683 "sharedflag",
684 ] + select({
685 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
686 "//conditions:default": [],
687 }) + select({
688 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
689 "//conditions:default": [],
690 }) + select({
691 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
692 "//conditions:default": [],
693 })`,
694 "implementation_deps": `[
695 ":static_dep_for_both",
696 ":static_dep_for_shared",
697 ] + select({
698 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
699 "//conditions:default": [],
700 }) + select({
701 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
702 "//conditions:default": [],
703 })`,
704 "implementation_dynamic_deps": `select({
705 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
706 "//conditions:default": [],
707 })`,
708 "local_includes": `["."]`,
709 "srcs": `[
710 "both.cpp",
711 "sharedonly.cpp",
712 ] + select({
713 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
714 "//conditions:default": [],
715 }) + select({
716 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
717 "//conditions:default": [],
718 })`,
719 "whole_archive_deps": `select({
720 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
721 "//conditions:default": [],
722 })`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500723 }),
724 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500725 },
726 )
Jingwen Chenbcf53042021-05-26 04:42:42 +0000727}
728
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000729func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
730 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400731 description: "cc_library shared/static props with c/cpp/s mixed sources",
732 moduleTypeUnderTest: "cc_library",
733 moduleTypeUnderTestFactory: cc.LibraryFactory,
734 dir: "foo/bar",
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000735 filesystem: map[string]string{
736 "foo/bar/both_source.cpp": "",
737 "foo/bar/both_source.cc": "",
738 "foo/bar/both_source.c": "",
739 "foo/bar/both_source.s": "",
740 "foo/bar/both_source.S": "",
741 "foo/bar/shared_source.cpp": "",
742 "foo/bar/shared_source.cc": "",
743 "foo/bar/shared_source.c": "",
744 "foo/bar/shared_source.s": "",
745 "foo/bar/shared_source.S": "",
746 "foo/bar/static_source.cpp": "",
747 "foo/bar/static_source.cc": "",
748 "foo/bar/static_source.c": "",
749 "foo/bar/static_source.s": "",
750 "foo/bar/static_source.S": "",
751 "foo/bar/Android.bp": `
752cc_library {
753 name: "a",
754 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400755 "both_source.cpp",
756 "both_source.cc",
757 "both_source.c",
758 "both_source.s",
759 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400760 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400761 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000762 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400763 srcs: [
764 "static_source.cpp",
765 "static_source.cc",
766 "static_source.c",
767 "static_source.s",
768 "static_source.S",
769 ":static_filegroup",
770 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000771 },
772 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400773 srcs: [
774 "shared_source.cpp",
775 "shared_source.cc",
776 "shared_source.c",
777 "shared_source.s",
778 "shared_source.S",
779 ":shared_filegroup",
780 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000781 },
782 bazel_module: { bp2build_available: true },
783}
784
785filegroup {
786 name: "both_filegroup",
787 srcs: [
788 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400789 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000790}
791
792filegroup {
793 name: "shared_filegroup",
794 srcs: [
795 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400796 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000797}
798
799filegroup {
800 name: "static_filegroup",
801 srcs: [
802 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400803 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000804}
805`,
806 },
807 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500808 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500809 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500810 "local_includes": `["."]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500811 "srcs": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000812 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400813 "both_source.cc",
814 ":both_filegroup_cpp_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500815 "static_source.cpp",
816 "static_source.cc",
817 ":static_filegroup_cpp_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500818 ]`,
819 "srcs_as": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000820 "both_source.s",
821 "both_source.S",
822 ":both_filegroup_as_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500823 "static_source.s",
824 "static_source.S",
825 ":static_filegroup_as_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500826 ]`,
827 "srcs_c": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000828 "both_source.c",
829 ":both_filegroup_c_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500830 "static_source.c",
831 ":static_filegroup_c_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500832 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500833 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500834 makeBazelTarget("cc_library_shared", "a", attrNameToString{
835 "local_includes": `["."]`,
836 "srcs": `[
837 "both_source.cpp",
838 "both_source.cc",
839 ":both_filegroup_cpp_srcs",
840 "shared_source.cpp",
841 "shared_source.cc",
842 ":shared_filegroup_cpp_srcs",
843 ]`,
844 "srcs_as": `[
845 "both_source.s",
846 "both_source.S",
847 ":both_filegroup_as_srcs",
848 "shared_source.s",
849 "shared_source.S",
850 ":shared_filegroup_as_srcs",
851 ]`,
852 "srcs_c": `[
853 "both_source.c",
854 ":both_filegroup_c_srcs",
855 "shared_source.c",
856 ":shared_filegroup_c_srcs",
857 ]`,
858 })}})
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000859}
860
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200861func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
862 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400863 description: "cc_library non-configured version script",
864 moduleTypeUnderTest: "cc_library",
865 moduleTypeUnderTestFactory: cc.LibraryFactory,
866 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200867 filesystem: map[string]string{
868 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200869cc_library {
870 name: "a",
871 srcs: ["a.cpp"],
872 version_script: "v.map",
873 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400874 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200875}
876`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200877 },
878 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500879 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
880 "additional_linker_inputs": `["v.map"]`,
881 "linkopts": `["-Wl,--version-script,$(location v.map)"]`,
882 "srcs": `["a.cpp"]`,
883 }),
884 },
885 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200886}
887
888func TestCcLibraryConfiguredVersionScript(t *testing.T) {
889 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400890 description: "cc_library configured version script",
891 moduleTypeUnderTest: "cc_library",
892 moduleTypeUnderTestFactory: cc.LibraryFactory,
893 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200894 filesystem: map[string]string{
895 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400896cc_library {
897 name: "a",
898 srcs: ["a.cpp"],
899 arch: {
900 arm: {
901 version_script: "arm.map",
902 },
903 arm64: {
904 version_script: "arm64.map",
905 },
906 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200907
Liz Kammer8337ea42021-09-10 10:06:32 -0400908 bazel_module: { bp2build_available: true },
909 include_build_directory: false,
910}
Liz Kammerd366c902021-06-03 13:43:01 -0400911 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200912 },
913 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500914 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
915 "additional_linker_inputs": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400916 "//build/bazel/platforms/arch:arm": ["arm.map"],
917 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
918 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500919 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500920 "linkopts": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400921 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
922 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
923 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500924 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500925 "srcs": `["a.cpp"]`,
926 }),
927 },
928 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200929}
930
931func TestCcLibrarySharedLibs(t *testing.T) {
932 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400933 description: "cc_library shared_libs",
934 moduleTypeUnderTest: "cc_library",
935 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400936 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400937cc_library {
938 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400939 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400940}
941
942cc_library {
943 name: "a",
944 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400945 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400946}
947`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500948 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
949 "implementation_dynamic_deps": `[":mylib"]`,
950 }),
951 },
952 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200953}
954
Liz Kammer0eae52e2021-10-06 10:32:26 -0400955func TestCcLibraryFeatures(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -0500956 expected_targets := []string{}
957 expected_targets = append(expected_targets, makeCcLibraryTargets("a", attrNameToString{
958 "features": `[
959 "disable_pack_relocations",
960 "-no_undefined_symbols",
961 ]`,
962 "srcs": `["a.cpp"]`,
963 })...)
964 expected_targets = append(expected_targets, makeCcLibraryTargets("b", attrNameToString{
965 "features": `select({
966 "//build/bazel/platforms/arch:x86_64": [
967 "disable_pack_relocations",
968 "-no_undefined_symbols",
969 ],
970 "//conditions:default": [],
971 })`,
972 "srcs": `["b.cpp"]`,
973 })...)
974 expected_targets = append(expected_targets, makeCcLibraryTargets("c", attrNameToString{
975 "features": `select({
976 "//build/bazel/platforms/os:darwin": [
977 "disable_pack_relocations",
978 "-no_undefined_symbols",
979 ],
980 "//conditions:default": [],
981 })`,
982 "srcs": `["c.cpp"]`,
983 })...)
984
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200985 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400986 description: "cc_library pack_relocations test",
987 moduleTypeUnderTest: "cc_library",
988 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400989 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400990cc_library {
991 name: "a",
992 srcs: ["a.cpp"],
993 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400994 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400995 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400996}
997
998cc_library {
999 name: "b",
1000 srcs: ["b.cpp"],
1001 arch: {
1002 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001003 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001004 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001005 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001006 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001007 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001008}
1009
1010cc_library {
1011 name: "c",
1012 srcs: ["c.cpp"],
1013 target: {
1014 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001015 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001016 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001017 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001018 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001019 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001020}`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001021 expectedBazelTargets: expected_targets,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001022 })
1023}
1024
1025func TestCcLibrarySpacesInCopts(t *testing.T) {
1026 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001027 description: "cc_library spaces in copts",
1028 moduleTypeUnderTest: "cc_library",
1029 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001030 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +00001031cc_library {
1032 name: "a",
1033 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -04001034 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +00001035}
1036`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001037 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1038 "copts": `[
Jingwen Chen3950cd62021-05-12 04:33:00 +00001039 "-include",
1040 "header.h",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001041 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001042 }),
1043 },
1044 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001045}
1046
1047func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
1048 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001049 description: "cc_library cppflags usage",
1050 moduleTypeUnderTest: "cc_library",
1051 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001052 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001053 name: "a",
1054 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001055 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001056 cppflags: [
1057 "-fsigned-char",
1058 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -04001059 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001060 arch: {
1061 arm64: {
1062 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001063 },
Liz Kammerd366c902021-06-03 13:43:01 -04001064 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001065 target: {
1066 android: {
1067 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001068 },
Liz Kammerd366c902021-06-03 13:43:01 -04001069 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001070 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001071}
1072`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001073 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1074 "copts": `["-Wall"]`,
1075 "cppflags": `[
Chris Parsons990c4f42021-05-25 12:10:58 -04001076 "-fsigned-char",
1077 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001078 ] + select({
1079 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1080 "//conditions:default": [],
1081 }) + select({
1082 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1083 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001084 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001085 "srcs": `["a.cpp"]`,
1086 }),
1087 },
1088 )
Jingwen Chen63930982021-03-24 10:04:33 -04001089}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001090
Liz Kammer47535c52021-06-02 16:02:22 -04001091func TestCcLibraryExcludeLibs(t *testing.T) {
1092 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001093 moduleTypeUnderTest: "cc_library",
1094 moduleTypeUnderTestFactory: cc.LibraryFactory,
1095 filesystem: map[string]string{},
Liz Kammer47535c52021-06-02 16:02:22 -04001096 blueprint: soongCcLibraryStaticPreamble + `
1097cc_library {
1098 name: "foo_static",
1099 srcs: ["common.c"],
1100 whole_static_libs: [
1101 "arm_whole_static_lib_excludes",
1102 "malloc_not_svelte_whole_static_lib_excludes"
1103 ],
1104 static_libs: [
1105 "arm_static_lib_excludes",
1106 "malloc_not_svelte_static_lib_excludes"
1107 ],
1108 shared_libs: [
1109 "arm_shared_lib_excludes",
1110 ],
1111 arch: {
1112 arm: {
1113 exclude_shared_libs: [
1114 "arm_shared_lib_excludes",
1115 ],
1116 exclude_static_libs: [
1117 "arm_static_lib_excludes",
1118 "arm_whole_static_lib_excludes",
1119 ],
1120 },
1121 },
1122 product_variables: {
1123 malloc_not_svelte: {
1124 shared_libs: ["malloc_not_svelte_shared_lib"],
1125 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1126 exclude_static_libs: [
1127 "malloc_not_svelte_static_lib_excludes",
1128 "malloc_not_svelte_whole_static_lib_excludes",
1129 ],
1130 },
1131 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001132 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001133}
1134
1135cc_library {
1136 name: "arm_whole_static_lib_excludes",
1137 bazel_module: { bp2build_available: false },
1138}
1139
1140cc_library {
1141 name: "malloc_not_svelte_whole_static_lib",
1142 bazel_module: { bp2build_available: false },
1143}
1144
1145cc_library {
1146 name: "malloc_not_svelte_whole_static_lib_excludes",
1147 bazel_module: { bp2build_available: false },
1148}
1149
1150cc_library {
1151 name: "arm_static_lib_excludes",
1152 bazel_module: { bp2build_available: false },
1153}
1154
1155cc_library {
1156 name: "malloc_not_svelte_static_lib_excludes",
1157 bazel_module: { bp2build_available: false },
1158}
1159
1160cc_library {
1161 name: "arm_shared_lib_excludes",
1162 bazel_module: { bp2build_available: false },
1163}
1164
1165cc_library {
1166 name: "malloc_not_svelte_shared_lib",
1167 bazel_module: { bp2build_available: false },
1168}
1169`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001170 expectedBazelTargets: makeCcLibraryTargets("foo_static", attrNameToString{
1171 "implementation_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001172 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001173 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001174 }) + select({
1175 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001176 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001177 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001178 "implementation_dynamic_deps": `select({
Liz Kammer7a210ac2021-09-22 15:52:58 -04001179 "//build/bazel/platforms/arch:arm": [],
1180 "//conditions:default": [":arm_shared_lib_excludes"],
1181 }) + select({
1182 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1183 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001184 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001185 "srcs_c": `["common.c"]`,
1186 "whole_archive_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001187 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001188 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001189 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001190 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1191 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001192 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001193 }),
1194 },
1195 )
Liz Kammer47535c52021-06-02 16:02:22 -04001196}
Liz Kammerd366c902021-06-03 13:43:01 -04001197
1198func TestCCLibraryNoCrtTrue(t *testing.T) {
1199 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001200 description: "cc_library - nocrt: true emits attribute",
1201 moduleTypeUnderTest: "cc_library",
1202 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001203 filesystem: map[string]string{
1204 "impl.cpp": "",
1205 },
1206 blueprint: soongCcLibraryPreamble + `
1207cc_library {
1208 name: "foo-lib",
1209 srcs: ["impl.cpp"],
1210 nocrt: true,
1211 include_build_directory: false,
1212}
1213`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001214 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1215 "link_crt": `False`,
1216 "srcs": `["impl.cpp"]`,
1217 }),
1218 },
1219 )
Jingwen Chen6ada5892021-09-17 11:38:09 +00001220}
1221
1222func TestCCLibraryNoCrtFalse(t *testing.T) {
1223 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001224 description: "cc_library - nocrt: false - does not emit attribute",
1225 moduleTypeUnderTest: "cc_library",
1226 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001227 filesystem: map[string]string{
1228 "impl.cpp": "",
1229 },
1230 blueprint: soongCcLibraryPreamble + `
1231cc_library {
1232 name: "foo-lib",
1233 srcs: ["impl.cpp"],
1234 nocrt: false,
1235 include_build_directory: false,
1236}
1237`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001238 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1239 "srcs": `["impl.cpp"]`,
1240 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001241 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001242}
1243
1244func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1245 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001246 description: "cc_library - nocrt in select",
1247 moduleTypeUnderTest: "cc_library",
1248 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001249 filesystem: map[string]string{
1250 "impl.cpp": "",
1251 },
1252 blueprint: soongCcLibraryPreamble + `
1253cc_library {
1254 name: "foo-lib",
1255 srcs: ["impl.cpp"],
1256 arch: {
1257 arm: {
1258 nocrt: true,
1259 },
1260 x86: {
1261 nocrt: false,
1262 },
1263 },
1264 include_build_directory: false,
1265}
1266`,
1267 expectedErr: fmt.Errorf("Android.bp:16:1: module \"foo-lib\": nocrt is not supported for arch variants"),
1268 })
1269}
1270
1271func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1272 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001273 moduleTypeUnderTest: "cc_library",
1274 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001275 filesystem: map[string]string{
1276 "impl.cpp": "",
1277 },
1278 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001279cc_library {
1280 name: "foo-lib",
1281 srcs: ["impl.cpp"],
1282 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001283 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001284}
1285`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001286 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1287 "srcs": `["impl.cpp"]`,
1288 "use_libcrt": `False`,
1289 }),
1290 })
1291}
1292
1293func makeCcLibraryTargets(name string, attrs attrNameToString) []string {
1294 STATIC_ONLY_ATTRS := map[string]bool{}
1295 SHARED_ONLY_ATTRS := map[string]bool{
1296 "link_crt": true,
1297 "additional_linker_inputs": true,
1298 "linkopts": true,
1299 "strip": true,
1300 }
1301 sharedAttrs := attrNameToString{}
1302 staticAttrs := attrNameToString{}
1303 for key, val := range attrs {
1304 if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly {
1305 sharedAttrs[key] = val
1306 }
1307 if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly {
1308 staticAttrs[key] = val
1309 }
1310 }
1311 sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
1312 staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
1313
1314 return []string{staticTarget, sharedTarget}
Liz Kammerd366c902021-06-03 13:43:01 -04001315}
1316
Jingwen Chen6ada5892021-09-17 11:38:09 +00001317func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001318 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001319 moduleTypeUnderTest: "cc_library",
1320 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001321 filesystem: map[string]string{
1322 "impl.cpp": "",
1323 },
1324 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001325cc_library {
1326 name: "foo-lib",
1327 srcs: ["impl.cpp"],
1328 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001329 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001330}
1331`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001332 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1333 "srcs": `["impl.cpp"]`,
1334 "use_libcrt": `True`,
1335 }),
1336 })
Liz Kammerd366c902021-06-03 13:43:01 -04001337}
1338
Jingwen Chen6ada5892021-09-17 11:38:09 +00001339func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001340 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001341 moduleTypeUnderTest: "cc_library",
1342 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001343 filesystem: map[string]string{
1344 "impl.cpp": "",
1345 },
1346 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001347cc_library {
1348 name: "foo-lib",
1349 srcs: ["impl.cpp"],
1350 arch: {
1351 arm: {
1352 no_libcrt: true,
1353 },
1354 x86: {
1355 no_libcrt: true,
1356 },
1357 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001358 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001359}
1360`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001361 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1362 "srcs": `["impl.cpp"]`,
1363 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001364 "//build/bazel/platforms/arch:arm": False,
1365 "//build/bazel/platforms/arch:x86": False,
1366 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001367 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001368 }),
1369 })
Liz Kammerd366c902021-06-03 13:43:01 -04001370}
1371
Chris Parsons58852a02021-12-09 18:10:18 -05001372func TestCCLibraryNoLibCrtArchAndTargetVariant(t *testing.T) {
1373 runCcLibraryTestCase(t, bp2buildTestCase{
1374 moduleTypeUnderTest: "cc_library",
1375 moduleTypeUnderTestFactory: cc.LibraryFactory,
1376 filesystem: map[string]string{
1377 "impl.cpp": "",
1378 },
1379 blueprint: soongCcLibraryPreamble + `
1380cc_library {
1381 name: "foo-lib",
1382 srcs: ["impl.cpp"],
1383 arch: {
1384 arm: {
1385 no_libcrt: true,
1386 },
1387 x86: {
1388 no_libcrt: true,
1389 },
1390 },
1391 target: {
1392 darwin: {
1393 no_libcrt: true,
1394 }
1395 },
1396 include_build_directory: false,
1397}
1398`,
1399 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1400 "srcs": `["impl.cpp"]`,
1401 "use_libcrt": `select({
1402 "//build/bazel/platforms/os_arch:android_arm": False,
1403 "//build/bazel/platforms/os_arch:android_x86": False,
1404 "//build/bazel/platforms/os_arch:darwin_arm64": False,
1405 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1406 "//build/bazel/platforms/os_arch:linux_glibc_x86": False,
1407 "//build/bazel/platforms/os_arch:linux_musl_x86": False,
1408 "//build/bazel/platforms/os_arch:windows_x86": False,
1409 "//conditions:default": None,
1410 })`,
1411 }),
1412 })
1413}
1414
1415func TestCCLibraryNoLibCrtArchAndTargetVariantConflict(t *testing.T) {
1416 runCcLibraryTestCase(t, bp2buildTestCase{
1417 moduleTypeUnderTest: "cc_library",
1418 moduleTypeUnderTestFactory: cc.LibraryFactory,
1419 filesystem: map[string]string{
1420 "impl.cpp": "",
1421 },
1422 blueprint: soongCcLibraryPreamble + `
1423cc_library {
1424 name: "foo-lib",
1425 srcs: ["impl.cpp"],
1426 arch: {
1427 arm: {
1428 no_libcrt: true,
1429 },
1430 // This is expected to override the value for darwin_x86_64.
1431 x86_64: {
1432 no_libcrt: true,
1433 },
1434 },
1435 target: {
1436 darwin: {
1437 no_libcrt: false,
1438 }
1439 },
1440 include_build_directory: false,
1441}
1442`,
1443 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1444 "srcs": `["impl.cpp"]`,
1445 "use_libcrt": `select({
1446 "//build/bazel/platforms/os_arch:android_arm": False,
1447 "//build/bazel/platforms/os_arch:android_x86_64": False,
1448 "//build/bazel/platforms/os_arch:darwin_arm64": True,
1449 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1450 "//build/bazel/platforms/os_arch:linux_bionic_x86_64": False,
1451 "//build/bazel/platforms/os_arch:linux_glibc_x86_64": False,
1452 "//build/bazel/platforms/os_arch:linux_musl_x86_64": False,
1453 "//build/bazel/platforms/os_arch:windows_x86_64": False,
1454 "//conditions:default": None,
1455 })`,
1456 }),
1457 })
1458}
1459
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001460func TestCcLibraryStrip(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001461 expectedTargets := []string{}
1462 expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{
1463 "strip": `{
1464 "all": True,
1465 }`,
1466 })...)
1467 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{
1468 "strip": `{
1469 "keep_symbols": True,
1470 }`,
1471 })...)
1472 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{
1473 "strip": `{
1474 "keep_symbols_and_debug_frame": True,
1475 }`,
1476 })...)
1477 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{
1478 "strip": `{
1479 "keep_symbols_list": ["symbol"],
1480 }`,
1481 })...)
1482 expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{
1483 "strip": `{
1484 "none": True,
1485 }`,
1486 })...)
1487 expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...)
1488
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001489 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001490 description: "cc_library strip args",
1491 moduleTypeUnderTest: "cc_library",
1492 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001493 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001494cc_library {
1495 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001496 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001497}
1498cc_library {
1499 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001500 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001501 keep_symbols: true,
1502 },
1503 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001504}
1505cc_library {
1506 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001507 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001508 keep_symbols_and_debug_frame: true,
1509 },
1510 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001511}
1512cc_library {
1513 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001514 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001515 none: true,
1516 },
1517 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001518}
1519cc_library {
1520 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001521 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001522 keep_symbols_list: ["symbol"],
1523 },
1524 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001525}
1526cc_library {
1527 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001528 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001529 all: true,
1530 },
1531 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001532}
1533`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001534 expectedBazelTargets: expectedTargets,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001535 })
1536}
1537
1538func TestCcLibraryStripWithArch(t *testing.T) {
1539 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001540 description: "cc_library strip args",
1541 moduleTypeUnderTest: "cc_library",
1542 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001543 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001544cc_library {
1545 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001546 target: {
1547 darwin: {
1548 strip: {
1549 keep_symbols_list: ["foo", "bar"]
1550 }
1551 },
1552 },
1553 arch: {
1554 arm: {
1555 strip: {
1556 keep_symbols_and_debug_frame: true,
1557 },
1558 },
1559 arm64: {
1560 strip: {
1561 keep_symbols: true,
1562 },
1563 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001564 },
1565 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001566}
1567`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001568 expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{
1569 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001570 "keep_symbols": select({
1571 "//build/bazel/platforms/arch:arm64": True,
1572 "//conditions:default": None,
1573 }),
1574 "keep_symbols_and_debug_frame": select({
1575 "//build/bazel/platforms/arch:arm": True,
1576 "//conditions:default": None,
1577 }),
1578 "keep_symbols_list": select({
1579 "//build/bazel/platforms/os:darwin": [
1580 "foo",
1581 "bar",
1582 ],
1583 "//conditions:default": [],
1584 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001585 }`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001586 }),
1587 },
1588 )
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001589}
Chris Parsons51f8c392021-08-03 21:01:05 -04001590
1591func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1592 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001593 description: "cc_library system_shared_libs empty at root",
1594 moduleTypeUnderTest: "cc_library",
1595 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001596 blueprint: soongCcLibraryPreamble + `
1597cc_library {
1598 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001599 system_shared_libs: [],
1600 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001601}
1602`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001603 expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{
1604 "system_dynamic_deps": `[]`,
1605 }),
1606 },
1607 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001608}
1609
1610func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1611 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001612 description: "cc_library system_shared_libs empty for static variant",
1613 moduleTypeUnderTest: "cc_library",
1614 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001615 blueprint: soongCcLibraryPreamble + `
1616cc_library {
1617 name: "static_empty",
1618 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001619 system_shared_libs: [],
1620 },
1621 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001622}
1623`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001624 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001625 makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{
1626 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001627 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001628 makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001629 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001630 })
1631}
1632
1633func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1634 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001635 description: "cc_library system_shared_libs empty for shared variant",
1636 moduleTypeUnderTest: "cc_library",
1637 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001638 blueprint: soongCcLibraryPreamble + `
1639cc_library {
1640 name: "shared_empty",
1641 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001642 system_shared_libs: [],
1643 },
1644 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001645}
1646`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001647 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001648 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1649 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1650 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001651 }),
1652 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001653 })
1654}
1655
1656func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1657 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001658 description: "cc_library system_shared_libs empty for shared, bionic variant",
1659 moduleTypeUnderTest: "cc_library",
1660 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001661 blueprint: soongCcLibraryPreamble + `
1662cc_library {
1663 name: "shared_empty",
1664 target: {
1665 bionic: {
1666 shared: {
1667 system_shared_libs: [],
1668 }
1669 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001670 },
1671 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001672}
1673`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001674 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001675 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1676 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1677 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001678 }),
1679 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001680 })
1681}
1682
1683func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1684 // Note that this behavior is technically incorrect (it's a simplification).
1685 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1686 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1687 // b/195791252 tracks the fix.
1688 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001689 description: "cc_library system_shared_libs empty for linux_bionic variant",
1690 moduleTypeUnderTest: "cc_library",
1691 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001692 blueprint: soongCcLibraryPreamble + `
1693cc_library {
1694 name: "target_linux_bionic_empty",
1695 target: {
1696 linux_bionic: {
1697 system_shared_libs: [],
1698 },
1699 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001700 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001701}
1702`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001703 expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{
1704 "system_dynamic_deps": `[]`,
1705 }),
1706 },
1707 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001708}
1709
1710func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1711 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001712 description: "cc_library system_shared_libs empty for bionic variant",
1713 moduleTypeUnderTest: "cc_library",
1714 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001715 blueprint: soongCcLibraryPreamble + `
1716cc_library {
1717 name: "target_bionic_empty",
1718 target: {
1719 bionic: {
1720 system_shared_libs: [],
1721 },
1722 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001723 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001724}
1725`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001726 expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{
1727 "system_dynamic_deps": `[]`,
1728 }),
1729 },
1730 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001731}
1732
1733func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1734 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001735 description: "cc_library system_shared_libs set for shared and root",
1736 moduleTypeUnderTest: "cc_library",
1737 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001738 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001739cc_library {
1740 name: "libc",
1741 bazel_module: { bp2build_available: false },
1742}
1743cc_library {
1744 name: "libm",
1745 bazel_module: { bp2build_available: false },
1746}
Chris Parsons51f8c392021-08-03 21:01:05 -04001747
1748cc_library {
1749 name: "foo",
1750 system_shared_libs: ["libc"],
1751 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001752 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001753 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001754 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001755}
1756`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001757 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001758 makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001759 "system_dynamic_deps": `[":libc"]`,
1760 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001761 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1762 "system_dynamic_deps": `[
1763 ":libc",
1764 ":libm",
1765 ]`,
1766 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001767 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001768 })
1769}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001770
1771func TestCcLibraryOsSelects(t *testing.T) {
1772 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001773 description: "cc_library - selects for all os targets",
1774 moduleTypeUnderTest: "cc_library",
1775 moduleTypeUnderTestFactory: cc.LibraryFactory,
1776 filesystem: map[string]string{},
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001777 blueprint: soongCcLibraryPreamble + `
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001778cc_library {
1779 name: "foo-lib",
1780 srcs: ["base.cpp"],
1781 target: {
1782 android: {
1783 srcs: ["android.cpp"],
1784 },
1785 linux: {
1786 srcs: ["linux.cpp"],
1787 },
1788 linux_glibc: {
1789 srcs: ["linux_glibc.cpp"],
1790 },
1791 darwin: {
1792 srcs: ["darwin.cpp"],
1793 },
1794 bionic: {
1795 srcs: ["bionic.cpp"],
1796 },
1797 linux_musl: {
1798 srcs: ["linux_musl.cpp"],
1799 },
1800 windows: {
1801 srcs: ["windows.cpp"],
1802 },
1803 },
1804 include_build_directory: false,
1805}
1806`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001807 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1808 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001809 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001810 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001811 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001812 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001813 ],
1814 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1815 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001816 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001817 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001818 ],
1819 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001820 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001821 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001822 ],
1823 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001824 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001825 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001826 ],
1827 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1828 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001829 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001830 }),
1831 },
1832 )
Jingwen Chen97b85312021-10-08 10:41:31 +00001833}
1834
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001835func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001836 type testCase struct {
1837 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001838 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001839 gnu_extensions string
1840 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001841 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001842 }
1843
1844 testCases := []testCase{
1845 // Existing usages of cpp_std in AOSP are:
1846 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1847 //
1848 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1849 // is set in the toolchain.)
1850 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001851 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001852 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1853 // experimental defaults to gnu++2a
1854 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001855 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001856 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1857 // Explicitly setting a c++ std does not use replace gnu++ std even if
1858 // gnu_extensions is true.
1859 // "c++11",
1860 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001861 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001862 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1863 // "c++17",
1864 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001865 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001866 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1867 // "c++2a",
1868 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001869 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001870 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1871 // "c++98",
1872 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001873 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001874 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1875 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1876 // "gnu++11",
1877 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001878 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001879 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1880 // "gnu++17",
1881 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001882 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001883 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001884
1885 // some c_std test cases
1886 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1887 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1888 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1889 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1890 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1891 {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 +00001892 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001893 for i, tc := range testCases {
1894 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001895 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001896 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001897 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001898 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001899 cStdProp := ""
1900 if tc.c_std != "" {
1901 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1902 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001903 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001904 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001905 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001906 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001907 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001908 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001909 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001910 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001911 if tc.bazel_c_std != "" {
1912 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1913 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001914
1915 runCcLibraryTestCase(t, bp2buildTestCase{
1916 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001917 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1918 moduleTypeUnderTest: "cc_library",
1919 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen97b85312021-10-08 10:41:31 +00001920 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1921cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001922 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001923%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001924%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001925%s // gnu_extensions: *bool
1926 include_build_directory: false,
1927}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001928`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001929 expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
Jingwen Chen97b85312021-10-08 10:41:31 +00001930 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001931
1932 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1933 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001934 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1935 moduleTypeUnderTest: "cc_library_static",
1936 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001937 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1938cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001939 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001940%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001941%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001942%s // gnu_extensions: *bool
1943 include_build_directory: false,
1944}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001945`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001946 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001947 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001948 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001949 })
1950
1951 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1952 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001953 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1954 moduleTypeUnderTest: "cc_library_shared",
1955 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001956 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1957cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001958 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001959%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001960%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001961%s // gnu_extensions: *bool
1962 include_build_directory: false,
1963}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001964`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001965 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001966 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001967 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001968 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001969 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001970}
Liz Kammer12615db2021-09-28 09:19:17 -04001971
1972func TestCcLibraryProtoSimple(t *testing.T) {
1973 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001974 moduleTypeUnderTest: "cc_library",
1975 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001976 blueprint: soongCcProtoPreamble + `cc_library {
1977 name: "foo",
1978 srcs: ["foo.proto"],
1979 include_build_directory: false,
1980}`,
1981 expectedBazelTargets: []string{
1982 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1983 "srcs": `["foo.proto"]`,
1984 "strip_import_prefix": `""`,
1985 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1986 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001987 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04001988 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001989 "deps": `[":libprotobuf-cpp-lite"]`,
1990 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1991 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04001992 }),
1993 },
1994 })
1995}
1996
1997func TestCcLibraryProtoNoCanonicalPathFromRoot(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 proto: { canonical_path_from_root: false},
2005 include_build_directory: false,
2006}`,
2007 expectedBazelTargets: []string{
2008 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2009 "srcs": `["foo.proto"]`,
2010 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2011 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002012 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002013 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002014 "deps": `[":libprotobuf-cpp-lite"]`,
2015 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2016 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002017 }),
2018 },
2019 })
2020}
2021
2022func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
2023 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002024 moduleTypeUnderTest: "cc_library",
2025 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002026 blueprint: soongCcProtoPreamble + `cc_library {
2027 name: "foo",
2028 srcs: ["foo.proto"],
2029 proto: { canonical_path_from_root: true},
2030 include_build_directory: false,
2031}`,
2032 expectedBazelTargets: []string{
2033 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2034 "srcs": `["foo.proto"]`,
2035 "strip_import_prefix": `""`,
2036 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2037 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002038 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002039 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002040 "deps": `[":libprotobuf-cpp-lite"]`,
2041 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2042 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002043 }),
2044 },
2045 })
2046}
2047
2048func TestCcLibraryProtoFull(t *testing.T) {
2049 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002050 moduleTypeUnderTest: "cc_library",
2051 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002052 blueprint: soongCcProtoPreamble + `cc_library {
2053 name: "foo",
2054 srcs: ["foo.proto"],
2055 proto: {
2056 canonical_path_from_root: false,
2057 type: "full",
2058 },
2059 include_build_directory: false,
2060}`,
2061 expectedBazelTargets: []string{
2062 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2063 "srcs": `["foo.proto"]`,
2064 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
2065 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002066 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002067 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002068 "deps": `[":libprotobuf-cpp-full"]`,
2069 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2070 "dynamic_deps": `[":libprotobuf-cpp-full"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002071 }),
2072 },
2073 })
2074}
2075
2076func TestCcLibraryProtoLite(t *testing.T) {
2077 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002078 moduleTypeUnderTest: "cc_library",
2079 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002080 blueprint: soongCcProtoPreamble + `cc_library {
2081 name: "foo",
2082 srcs: ["foo.proto"],
2083 proto: {
2084 canonical_path_from_root: false,
2085 type: "lite",
2086 },
2087 include_build_directory: false,
2088}`,
2089 expectedBazelTargets: []string{
2090 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2091 "srcs": `["foo.proto"]`,
2092 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2093 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002094 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002095 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002096 "deps": `[":libprotobuf-cpp-lite"]`,
2097 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2098 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002099 }),
2100 },
2101 })
2102}
2103
2104func TestCcLibraryProtoExportHeaders(t *testing.T) {
2105 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002106 moduleTypeUnderTest: "cc_library",
2107 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002108 blueprint: soongCcProtoPreamble + `cc_library {
2109 name: "foo",
2110 srcs: ["foo.proto"],
2111 proto: {
2112 canonical_path_from_root: false,
2113 export_proto_headers: true,
2114 },
2115 include_build_directory: false,
2116}`,
2117 expectedBazelTargets: []string{
2118 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2119 "srcs": `["foo.proto"]`,
2120 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2121 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002122 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2123 "deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002124 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002125 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2126 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2127 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002128 }),
2129 },
2130 })
2131}
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002132
2133func TestCcLibraryProtoFilegroups(t *testing.T) {
2134 runCcLibraryTestCase(t, bp2buildTestCase{
2135 moduleTypeUnderTest: "cc_library",
2136 moduleTypeUnderTestFactory: cc.LibraryFactory,
2137 blueprint: soongCcProtoPreamble +
2138 simpleModuleDoNotConvertBp2build("filegroup", "a_fg_proto") +
2139 simpleModuleDoNotConvertBp2build("filegroup", "b_protos") +
2140 simpleModuleDoNotConvertBp2build("filegroup", "c-proto-srcs") +
2141 simpleModuleDoNotConvertBp2build("filegroup", "proto-srcs-d") + `
2142cc_library {
2143 name: "a",
2144 srcs: [":a_fg_proto"],
2145 proto: {
2146 canonical_path_from_root: false,
2147 export_proto_headers: true,
2148 },
2149 include_build_directory: false,
2150}
2151
2152cc_library {
2153 name: "b",
2154 srcs: [":b_protos"],
2155 proto: {
2156 canonical_path_from_root: false,
2157 export_proto_headers: true,
2158 },
2159 include_build_directory: false,
2160}
2161
2162cc_library {
2163 name: "c",
2164 srcs: [":c-proto-srcs"],
2165 proto: {
2166 canonical_path_from_root: false,
2167 export_proto_headers: true,
2168 },
2169 include_build_directory: false,
2170}
2171
2172cc_library {
2173 name: "d",
2174 srcs: [":proto-srcs-d"],
2175 proto: {
2176 canonical_path_from_root: false,
2177 export_proto_headers: true,
2178 },
2179 include_build_directory: false,
2180}`,
2181 expectedBazelTargets: []string{
2182 makeBazelTarget("proto_library", "a_proto", attrNameToString{
2183 "srcs": `[":a_fg_proto"]`,
2184 }), makeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", attrNameToString{
2185 "deps": `[":a_proto"]`,
2186 }), makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
2187 "deps": `[":libprotobuf-cpp-lite"]`,
2188 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2189 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2190 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2191 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2192 }), makeBazelTarget("cc_library_shared", "a", attrNameToString{
2193 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2194 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2195 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2196 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2197 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2198 }), makeBazelTarget("proto_library", "b_proto", attrNameToString{
2199 "srcs": `[":b_protos"]`,
2200 }), makeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", attrNameToString{
2201 "deps": `[":b_proto"]`,
2202 }), makeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", attrNameToString{
2203 "deps": `[":libprotobuf-cpp-lite"]`,
2204 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2205 "srcs": `[":b_protos_cpp_srcs"]`,
2206 "srcs_as": `[":b_protos_as_srcs"]`,
2207 "srcs_c": `[":b_protos_c_srcs"]`,
2208 }), makeBazelTarget("cc_library_shared", "b", attrNameToString{
2209 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2210 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2211 "srcs": `[":b_protos_cpp_srcs"]`,
2212 "srcs_as": `[":b_protos_as_srcs"]`,
2213 "srcs_c": `[":b_protos_c_srcs"]`,
2214 }), makeBazelTarget("proto_library", "c_proto", attrNameToString{
2215 "srcs": `[":c-proto-srcs"]`,
2216 }), makeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", attrNameToString{
2217 "deps": `[":c_proto"]`,
2218 }), makeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", attrNameToString{
2219 "deps": `[":libprotobuf-cpp-lite"]`,
2220 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2221 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2222 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2223 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2224 }), makeBazelTarget("cc_library_shared", "c", attrNameToString{
2225 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2226 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2227 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2228 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2229 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2230 }), makeBazelTarget("proto_library", "d_proto", attrNameToString{
2231 "srcs": `[":proto-srcs-d"]`,
2232 }), makeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", attrNameToString{
2233 "deps": `[":d_proto"]`,
2234 }), makeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", attrNameToString{
2235 "deps": `[":libprotobuf-cpp-lite"]`,
2236 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2237 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2238 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2239 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2240 }), makeBazelTarget("cc_library_shared", "d", attrNameToString{
2241 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2242 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2243 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2244 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2245 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2246 }),
2247 },
2248 })
2249}
Chris Parsons58852a02021-12-09 18:10:18 -05002250
2251func TestCcLibraryDisabledArchAndTarget(t *testing.T) {
2252 runCcLibraryTestCase(t, bp2buildTestCase{
2253 moduleTypeUnderTest: "cc_library",
2254 moduleTypeUnderTestFactory: cc.LibraryFactory,
2255 blueprint: soongCcProtoPreamble + `cc_library {
2256 name: "foo",
2257 srcs: ["foo.cpp"],
2258 target: {
2259 darwin: {
2260 enabled: false,
2261 },
2262 windows: {
2263 enabled: false,
2264 },
2265 linux_glibc_x86: {
2266 enabled: false,
2267 },
2268 },
2269 include_build_directory: false,
2270}`,
2271 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2272 "srcs": `["foo.cpp"]`,
2273 "target_compatible_with": `select({
2274 "//build/bazel/platforms/os_arch:darwin_arm64": ["@platforms//:incompatible"],
2275 "//build/bazel/platforms/os_arch:darwin_x86_64": ["@platforms//:incompatible"],
2276 "//build/bazel/platforms/os_arch:linux_glibc_x86": ["@platforms//:incompatible"],
2277 "//build/bazel/platforms/os_arch:windows_x86": ["@platforms//:incompatible"],
2278 "//build/bazel/platforms/os_arch:windows_x86_64": ["@platforms//:incompatible"],
2279 "//conditions:default": [],
2280 })`,
2281 }),
2282 })
2283}
2284
2285func TestCcLibraryDisabledArchAndTargetWithDefault(t *testing.T) {
2286 runCcLibraryTestCase(t, bp2buildTestCase{
2287 moduleTypeUnderTest: "cc_library",
2288 moduleTypeUnderTestFactory: cc.LibraryFactory,
2289 blueprint: soongCcProtoPreamble + `cc_library {
2290 name: "foo",
2291 srcs: ["foo.cpp"],
2292 enabled: false,
2293 target: {
2294 darwin: {
2295 enabled: true,
2296 },
2297 windows: {
2298 enabled: false,
2299 },
2300 linux_glibc_x86: {
2301 enabled: false,
2302 },
2303 },
2304 include_build_directory: false,
2305}`,
2306 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2307 "srcs": `["foo.cpp"]`,
2308 "target_compatible_with": `select({
2309 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2310 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2311 "//conditions:default": ["@platforms//:incompatible"],
2312 })`,
2313 }),
2314 })
2315}
2316
2317func TestCcLibrarySharedDisabled(t *testing.T) {
2318 runCcLibraryTestCase(t, bp2buildTestCase{
2319 moduleTypeUnderTest: "cc_library",
2320 moduleTypeUnderTestFactory: cc.LibraryFactory,
2321 blueprint: soongCcProtoPreamble + `cc_library {
2322 name: "foo",
2323 srcs: ["foo.cpp"],
2324 enabled: false,
2325 shared: {
2326 enabled: true,
2327 },
2328 target: {
2329 android: {
2330 shared: {
2331 enabled: false,
2332 },
2333 }
2334 },
2335 include_build_directory: false,
2336}`,
2337 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2338 "srcs": `["foo.cpp"]`,
2339 "target_compatible_with": `["@platforms//:incompatible"]`,
2340 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2341 "srcs": `["foo.cpp"]`,
2342 "target_compatible_with": `select({
2343 "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
2344 "//conditions:default": [],
2345 })`,
2346 }),
2347 },
2348 })
2349}
2350
2351func TestCcLibraryStaticDisabledForSomeArch(t *testing.T) {
2352 runCcLibraryTestCase(t, bp2buildTestCase{
2353 moduleTypeUnderTest: "cc_library",
2354 moduleTypeUnderTestFactory: cc.LibraryFactory,
2355 blueprint: soongCcProtoPreamble + `cc_library {
2356 name: "foo",
2357 srcs: ["foo.cpp"],
2358 shared: {
2359 enabled: false
2360 },
2361 target: {
2362 darwin: {
2363 enabled: true,
2364 },
2365 windows: {
2366 enabled: false,
2367 },
2368 linux_glibc_x86: {
2369 shared: {
2370 enabled: true,
2371 },
2372 },
2373 },
2374 include_build_directory: false,
2375}`,
2376 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2377 "srcs": `["foo.cpp"]`,
2378 "target_compatible_with": `select({
2379 "//build/bazel/platforms/os:windows": ["@platforms//:incompatible"],
2380 "//conditions:default": [],
2381 })`,
2382 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2383 "srcs": `["foo.cpp"]`,
2384 "target_compatible_with": `select({
2385 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2386 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2387 "//build/bazel/platforms/os_arch:linux_glibc_x86": [],
2388 "//conditions:default": ["@platforms//:incompatible"],
2389 })`,
2390 }),
2391 }})
2392}