blob: de4f437b6928aef041719957bf5441c275d7df8e [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,
Jingwen Chen0ee88a62022-01-07 14:55:29 +00001300 "stubs_symbol_file": true,
1301 "stubs_versions": true,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001302 }
1303 sharedAttrs := attrNameToString{}
1304 staticAttrs := attrNameToString{}
1305 for key, val := range attrs {
1306 if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly {
1307 sharedAttrs[key] = val
1308 }
1309 if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly {
1310 staticAttrs[key] = val
1311 }
1312 }
1313 sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
1314 staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
1315
1316 return []string{staticTarget, sharedTarget}
Liz Kammerd366c902021-06-03 13:43:01 -04001317}
1318
Jingwen Chen6ada5892021-09-17 11:38:09 +00001319func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001320 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001321 moduleTypeUnderTest: "cc_library",
1322 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001323 filesystem: map[string]string{
1324 "impl.cpp": "",
1325 },
1326 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001327cc_library {
1328 name: "foo-lib",
1329 srcs: ["impl.cpp"],
1330 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001331 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001332}
1333`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001334 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1335 "srcs": `["impl.cpp"]`,
1336 "use_libcrt": `True`,
1337 }),
1338 })
Liz Kammerd366c902021-06-03 13:43:01 -04001339}
1340
Jingwen Chen6ada5892021-09-17 11:38:09 +00001341func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001342 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001343 moduleTypeUnderTest: "cc_library",
1344 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001345 filesystem: map[string]string{
1346 "impl.cpp": "",
1347 },
1348 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001349cc_library {
1350 name: "foo-lib",
1351 srcs: ["impl.cpp"],
1352 arch: {
1353 arm: {
1354 no_libcrt: true,
1355 },
1356 x86: {
1357 no_libcrt: true,
1358 },
1359 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001360 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001361}
1362`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001363 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1364 "srcs": `["impl.cpp"]`,
1365 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001366 "//build/bazel/platforms/arch:arm": False,
1367 "//build/bazel/platforms/arch:x86": False,
1368 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001369 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001370 }),
1371 })
Liz Kammerd366c902021-06-03 13:43:01 -04001372}
1373
Chris Parsons58852a02021-12-09 18:10:18 -05001374func TestCCLibraryNoLibCrtArchAndTargetVariant(t *testing.T) {
1375 runCcLibraryTestCase(t, bp2buildTestCase{
1376 moduleTypeUnderTest: "cc_library",
1377 moduleTypeUnderTestFactory: cc.LibraryFactory,
1378 filesystem: map[string]string{
1379 "impl.cpp": "",
1380 },
1381 blueprint: soongCcLibraryPreamble + `
1382cc_library {
1383 name: "foo-lib",
1384 srcs: ["impl.cpp"],
1385 arch: {
1386 arm: {
1387 no_libcrt: true,
1388 },
1389 x86: {
1390 no_libcrt: true,
1391 },
1392 },
1393 target: {
1394 darwin: {
1395 no_libcrt: true,
1396 }
1397 },
1398 include_build_directory: false,
1399}
1400`,
1401 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1402 "srcs": `["impl.cpp"]`,
1403 "use_libcrt": `select({
1404 "//build/bazel/platforms/os_arch:android_arm": False,
1405 "//build/bazel/platforms/os_arch:android_x86": False,
1406 "//build/bazel/platforms/os_arch:darwin_arm64": False,
1407 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1408 "//build/bazel/platforms/os_arch:linux_glibc_x86": False,
1409 "//build/bazel/platforms/os_arch:linux_musl_x86": False,
1410 "//build/bazel/platforms/os_arch:windows_x86": False,
1411 "//conditions:default": None,
1412 })`,
1413 }),
1414 })
1415}
1416
1417func TestCCLibraryNoLibCrtArchAndTargetVariantConflict(t *testing.T) {
1418 runCcLibraryTestCase(t, bp2buildTestCase{
1419 moduleTypeUnderTest: "cc_library",
1420 moduleTypeUnderTestFactory: cc.LibraryFactory,
1421 filesystem: map[string]string{
1422 "impl.cpp": "",
1423 },
1424 blueprint: soongCcLibraryPreamble + `
1425cc_library {
1426 name: "foo-lib",
1427 srcs: ["impl.cpp"],
1428 arch: {
1429 arm: {
1430 no_libcrt: true,
1431 },
1432 // This is expected to override the value for darwin_x86_64.
1433 x86_64: {
1434 no_libcrt: true,
1435 },
1436 },
1437 target: {
1438 darwin: {
1439 no_libcrt: false,
1440 }
1441 },
1442 include_build_directory: false,
1443}
1444`,
1445 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1446 "srcs": `["impl.cpp"]`,
1447 "use_libcrt": `select({
1448 "//build/bazel/platforms/os_arch:android_arm": False,
1449 "//build/bazel/platforms/os_arch:android_x86_64": False,
1450 "//build/bazel/platforms/os_arch:darwin_arm64": True,
1451 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1452 "//build/bazel/platforms/os_arch:linux_bionic_x86_64": False,
1453 "//build/bazel/platforms/os_arch:linux_glibc_x86_64": False,
1454 "//build/bazel/platforms/os_arch:linux_musl_x86_64": False,
1455 "//build/bazel/platforms/os_arch:windows_x86_64": False,
1456 "//conditions:default": None,
1457 })`,
1458 }),
1459 })
1460}
1461
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001462func TestCcLibraryStrip(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001463 expectedTargets := []string{}
1464 expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{
1465 "strip": `{
1466 "all": True,
1467 }`,
1468 })...)
1469 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{
1470 "strip": `{
1471 "keep_symbols": True,
1472 }`,
1473 })...)
1474 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{
1475 "strip": `{
1476 "keep_symbols_and_debug_frame": True,
1477 }`,
1478 })...)
1479 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{
1480 "strip": `{
1481 "keep_symbols_list": ["symbol"],
1482 }`,
1483 })...)
1484 expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{
1485 "strip": `{
1486 "none": True,
1487 }`,
1488 })...)
1489 expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...)
1490
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001491 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001492 description: "cc_library strip args",
1493 moduleTypeUnderTest: "cc_library",
1494 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001495 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001496cc_library {
1497 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001498 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001499}
1500cc_library {
1501 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001502 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001503 keep_symbols: true,
1504 },
1505 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001506}
1507cc_library {
1508 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001509 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001510 keep_symbols_and_debug_frame: true,
1511 },
1512 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001513}
1514cc_library {
1515 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001516 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001517 none: true,
1518 },
1519 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001520}
1521cc_library {
1522 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001523 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001524 keep_symbols_list: ["symbol"],
1525 },
1526 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001527}
1528cc_library {
1529 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001530 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001531 all: true,
1532 },
1533 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001534}
1535`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001536 expectedBazelTargets: expectedTargets,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001537 })
1538}
1539
1540func TestCcLibraryStripWithArch(t *testing.T) {
1541 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001542 description: "cc_library strip args",
1543 moduleTypeUnderTest: "cc_library",
1544 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001545 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001546cc_library {
1547 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001548 target: {
1549 darwin: {
1550 strip: {
1551 keep_symbols_list: ["foo", "bar"]
1552 }
1553 },
1554 },
1555 arch: {
1556 arm: {
1557 strip: {
1558 keep_symbols_and_debug_frame: true,
1559 },
1560 },
1561 arm64: {
1562 strip: {
1563 keep_symbols: true,
1564 },
1565 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001566 },
1567 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001568}
1569`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001570 expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{
1571 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001572 "keep_symbols": select({
1573 "//build/bazel/platforms/arch:arm64": True,
1574 "//conditions:default": None,
1575 }),
1576 "keep_symbols_and_debug_frame": select({
1577 "//build/bazel/platforms/arch:arm": True,
1578 "//conditions:default": None,
1579 }),
1580 "keep_symbols_list": select({
1581 "//build/bazel/platforms/os:darwin": [
1582 "foo",
1583 "bar",
1584 ],
1585 "//conditions:default": [],
1586 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001587 }`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001588 }),
1589 },
1590 )
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001591}
Chris Parsons51f8c392021-08-03 21:01:05 -04001592
1593func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1594 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001595 description: "cc_library system_shared_libs empty at root",
1596 moduleTypeUnderTest: "cc_library",
1597 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001598 blueprint: soongCcLibraryPreamble + `
1599cc_library {
1600 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001601 system_shared_libs: [],
1602 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001603}
1604`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001605 expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{
1606 "system_dynamic_deps": `[]`,
1607 }),
1608 },
1609 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001610}
1611
1612func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1613 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001614 description: "cc_library system_shared_libs empty for static variant",
1615 moduleTypeUnderTest: "cc_library",
1616 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001617 blueprint: soongCcLibraryPreamble + `
1618cc_library {
1619 name: "static_empty",
1620 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001621 system_shared_libs: [],
1622 },
1623 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001624}
1625`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001626 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001627 makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{
1628 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001629 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001630 makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001631 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001632 })
1633}
1634
1635func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1636 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001637 description: "cc_library system_shared_libs empty for shared variant",
1638 moduleTypeUnderTest: "cc_library",
1639 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001640 blueprint: soongCcLibraryPreamble + `
1641cc_library {
1642 name: "shared_empty",
1643 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001644 system_shared_libs: [],
1645 },
1646 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001647}
1648`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001649 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001650 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1651 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1652 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001653 }),
1654 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001655 })
1656}
1657
1658func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1659 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001660 description: "cc_library system_shared_libs empty for shared, bionic variant",
1661 moduleTypeUnderTest: "cc_library",
1662 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001663 blueprint: soongCcLibraryPreamble + `
1664cc_library {
1665 name: "shared_empty",
1666 target: {
1667 bionic: {
1668 shared: {
1669 system_shared_libs: [],
1670 }
1671 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001672 },
1673 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001674}
1675`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001676 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001677 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1678 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1679 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001680 }),
1681 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001682 })
1683}
1684
1685func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1686 // Note that this behavior is technically incorrect (it's a simplification).
1687 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1688 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1689 // b/195791252 tracks the fix.
1690 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001691 description: "cc_library system_shared_libs empty for linux_bionic variant",
1692 moduleTypeUnderTest: "cc_library",
1693 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001694 blueprint: soongCcLibraryPreamble + `
1695cc_library {
1696 name: "target_linux_bionic_empty",
1697 target: {
1698 linux_bionic: {
1699 system_shared_libs: [],
1700 },
1701 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001702 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001703}
1704`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001705 expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{
1706 "system_dynamic_deps": `[]`,
1707 }),
1708 },
1709 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001710}
1711
1712func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1713 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001714 description: "cc_library system_shared_libs empty for bionic variant",
1715 moduleTypeUnderTest: "cc_library",
1716 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001717 blueprint: soongCcLibraryPreamble + `
1718cc_library {
1719 name: "target_bionic_empty",
1720 target: {
1721 bionic: {
1722 system_shared_libs: [],
1723 },
1724 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001725 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001726}
1727`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001728 expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{
1729 "system_dynamic_deps": `[]`,
1730 }),
1731 },
1732 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001733}
1734
1735func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1736 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001737 description: "cc_library system_shared_libs set for shared and root",
1738 moduleTypeUnderTest: "cc_library",
1739 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001740 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001741cc_library {
1742 name: "libc",
1743 bazel_module: { bp2build_available: false },
1744}
1745cc_library {
1746 name: "libm",
1747 bazel_module: { bp2build_available: false },
1748}
Chris Parsons51f8c392021-08-03 21:01:05 -04001749
1750cc_library {
1751 name: "foo",
1752 system_shared_libs: ["libc"],
1753 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001754 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001755 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001756 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001757}
1758`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001759 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001760 makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001761 "system_dynamic_deps": `[":libc"]`,
1762 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001763 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1764 "system_dynamic_deps": `[
1765 ":libc",
1766 ":libm",
1767 ]`,
1768 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001769 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001770 })
1771}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001772
1773func TestCcLibraryOsSelects(t *testing.T) {
1774 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001775 description: "cc_library - selects for all os targets",
1776 moduleTypeUnderTest: "cc_library",
1777 moduleTypeUnderTestFactory: cc.LibraryFactory,
1778 filesystem: map[string]string{},
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001779 blueprint: soongCcLibraryPreamble + `
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001780cc_library {
1781 name: "foo-lib",
1782 srcs: ["base.cpp"],
1783 target: {
1784 android: {
1785 srcs: ["android.cpp"],
1786 },
1787 linux: {
1788 srcs: ["linux.cpp"],
1789 },
1790 linux_glibc: {
1791 srcs: ["linux_glibc.cpp"],
1792 },
1793 darwin: {
1794 srcs: ["darwin.cpp"],
1795 },
1796 bionic: {
1797 srcs: ["bionic.cpp"],
1798 },
1799 linux_musl: {
1800 srcs: ["linux_musl.cpp"],
1801 },
1802 windows: {
1803 srcs: ["windows.cpp"],
1804 },
1805 },
1806 include_build_directory: false,
1807}
1808`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001809 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1810 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001811 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001812 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001813 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001814 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001815 ],
1816 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1817 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001818 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001819 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001820 ],
1821 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001822 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001823 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001824 ],
1825 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001826 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001827 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001828 ],
1829 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1830 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001831 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001832 }),
1833 },
1834 )
Jingwen Chen97b85312021-10-08 10:41:31 +00001835}
1836
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001837func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001838 type testCase struct {
1839 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001840 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001841 gnu_extensions string
1842 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001843 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001844 }
1845
1846 testCases := []testCase{
1847 // Existing usages of cpp_std in AOSP are:
1848 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1849 //
1850 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1851 // is set in the toolchain.)
1852 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001853 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001854 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1855 // experimental defaults to gnu++2a
1856 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001857 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001858 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1859 // Explicitly setting a c++ std does not use replace gnu++ std even if
1860 // gnu_extensions is true.
1861 // "c++11",
1862 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001863 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001864 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1865 // "c++17",
1866 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001867 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001868 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1869 // "c++2a",
1870 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001871 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001872 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1873 // "c++98",
1874 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001875 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001876 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1877 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1878 // "gnu++11",
1879 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001880 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001881 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1882 // "gnu++17",
1883 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001884 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001885 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001886
1887 // some c_std test cases
1888 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1889 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1890 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1891 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1892 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1893 {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 +00001894 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001895 for i, tc := range testCases {
1896 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001897 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001898 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001899 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001900 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001901 cStdProp := ""
1902 if tc.c_std != "" {
1903 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1904 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001905 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001906 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001907 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001908 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001909 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001910 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001911 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001912 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001913 if tc.bazel_c_std != "" {
1914 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1915 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001916
1917 runCcLibraryTestCase(t, bp2buildTestCase{
1918 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001919 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1920 moduleTypeUnderTest: "cc_library",
1921 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen97b85312021-10-08 10:41:31 +00001922 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1923cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001924 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001925%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001926%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001927%s // gnu_extensions: *bool
1928 include_build_directory: false,
1929}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001930`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001931 expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
Jingwen Chen97b85312021-10-08 10:41:31 +00001932 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001933
1934 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1935 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001936 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1937 moduleTypeUnderTest: "cc_library_static",
1938 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001939 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1940cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001941 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001942%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001943%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001944%s // gnu_extensions: *bool
1945 include_build_directory: false,
1946}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001947`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001948 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001949 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001950 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001951 })
1952
1953 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1954 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001955 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1956 moduleTypeUnderTest: "cc_library_shared",
1957 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001958 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1959cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001960 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001961%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001962%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001963%s // gnu_extensions: *bool
1964 include_build_directory: false,
1965}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001966`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001967 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001968 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001969 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001970 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001971 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001972}
Liz Kammer12615db2021-09-28 09:19:17 -04001973
1974func TestCcLibraryProtoSimple(t *testing.T) {
1975 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001976 moduleTypeUnderTest: "cc_library",
1977 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001978 blueprint: soongCcProtoPreamble + `cc_library {
1979 name: "foo",
1980 srcs: ["foo.proto"],
1981 include_build_directory: false,
1982}`,
1983 expectedBazelTargets: []string{
1984 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1985 "srcs": `["foo.proto"]`,
1986 "strip_import_prefix": `""`,
1987 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1988 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001989 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04001990 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001991 "deps": `[":libprotobuf-cpp-lite"]`,
1992 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1993 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04001994 }),
1995 },
1996 })
1997}
1998
1999func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) {
2000 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002001 moduleTypeUnderTest: "cc_library",
2002 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002003 blueprint: soongCcProtoPreamble + `cc_library {
2004 name: "foo",
2005 srcs: ["foo.proto"],
2006 proto: { canonical_path_from_root: false},
2007 include_build_directory: false,
2008}`,
2009 expectedBazelTargets: []string{
2010 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2011 "srcs": `["foo.proto"]`,
2012 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2013 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002014 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002015 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002016 "deps": `[":libprotobuf-cpp-lite"]`,
2017 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2018 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002019 }),
2020 },
2021 })
2022}
2023
2024func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
2025 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002026 moduleTypeUnderTest: "cc_library",
2027 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002028 blueprint: soongCcProtoPreamble + `cc_library {
2029 name: "foo",
2030 srcs: ["foo.proto"],
2031 proto: { canonical_path_from_root: true},
2032 include_build_directory: false,
2033}`,
2034 expectedBazelTargets: []string{
2035 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2036 "srcs": `["foo.proto"]`,
2037 "strip_import_prefix": `""`,
2038 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2039 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002040 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002041 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002042 "deps": `[":libprotobuf-cpp-lite"]`,
2043 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2044 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002045 }),
2046 },
2047 })
2048}
2049
2050func TestCcLibraryProtoFull(t *testing.T) {
2051 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002052 moduleTypeUnderTest: "cc_library",
2053 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002054 blueprint: soongCcProtoPreamble + `cc_library {
2055 name: "foo",
2056 srcs: ["foo.proto"],
2057 proto: {
2058 canonical_path_from_root: false,
2059 type: "full",
2060 },
2061 include_build_directory: false,
2062}`,
2063 expectedBazelTargets: []string{
2064 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2065 "srcs": `["foo.proto"]`,
2066 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
2067 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002068 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002069 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002070 "deps": `[":libprotobuf-cpp-full"]`,
2071 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2072 "dynamic_deps": `[":libprotobuf-cpp-full"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002073 }),
2074 },
2075 })
2076}
2077
2078func TestCcLibraryProtoLite(t *testing.T) {
2079 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002080 moduleTypeUnderTest: "cc_library",
2081 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002082 blueprint: soongCcProtoPreamble + `cc_library {
2083 name: "foo",
2084 srcs: ["foo.proto"],
2085 proto: {
2086 canonical_path_from_root: false,
2087 type: "lite",
2088 },
2089 include_build_directory: false,
2090}`,
2091 expectedBazelTargets: []string{
2092 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2093 "srcs": `["foo.proto"]`,
2094 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2095 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002096 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002097 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002098 "deps": `[":libprotobuf-cpp-lite"]`,
2099 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2100 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002101 }),
2102 },
2103 })
2104}
2105
2106func TestCcLibraryProtoExportHeaders(t *testing.T) {
2107 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002108 moduleTypeUnderTest: "cc_library",
2109 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002110 blueprint: soongCcProtoPreamble + `cc_library {
2111 name: "foo",
2112 srcs: ["foo.proto"],
2113 proto: {
2114 canonical_path_from_root: false,
2115 export_proto_headers: true,
2116 },
2117 include_build_directory: false,
2118}`,
2119 expectedBazelTargets: []string{
2120 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2121 "srcs": `["foo.proto"]`,
2122 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2123 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002124 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2125 "deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002126 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002127 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2128 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2129 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002130 }),
2131 },
2132 })
2133}
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002134
2135func TestCcLibraryProtoFilegroups(t *testing.T) {
2136 runCcLibraryTestCase(t, bp2buildTestCase{
2137 moduleTypeUnderTest: "cc_library",
2138 moduleTypeUnderTestFactory: cc.LibraryFactory,
2139 blueprint: soongCcProtoPreamble +
2140 simpleModuleDoNotConvertBp2build("filegroup", "a_fg_proto") +
2141 simpleModuleDoNotConvertBp2build("filegroup", "b_protos") +
2142 simpleModuleDoNotConvertBp2build("filegroup", "c-proto-srcs") +
2143 simpleModuleDoNotConvertBp2build("filegroup", "proto-srcs-d") + `
2144cc_library {
2145 name: "a",
2146 srcs: [":a_fg_proto"],
2147 proto: {
2148 canonical_path_from_root: false,
2149 export_proto_headers: true,
2150 },
2151 include_build_directory: false,
2152}
2153
2154cc_library {
2155 name: "b",
2156 srcs: [":b_protos"],
2157 proto: {
2158 canonical_path_from_root: false,
2159 export_proto_headers: true,
2160 },
2161 include_build_directory: false,
2162}
2163
2164cc_library {
2165 name: "c",
2166 srcs: [":c-proto-srcs"],
2167 proto: {
2168 canonical_path_from_root: false,
2169 export_proto_headers: true,
2170 },
2171 include_build_directory: false,
2172}
2173
2174cc_library {
2175 name: "d",
2176 srcs: [":proto-srcs-d"],
2177 proto: {
2178 canonical_path_from_root: false,
2179 export_proto_headers: true,
2180 },
2181 include_build_directory: false,
2182}`,
2183 expectedBazelTargets: []string{
2184 makeBazelTarget("proto_library", "a_proto", attrNameToString{
2185 "srcs": `[":a_fg_proto"]`,
2186 }), makeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", attrNameToString{
2187 "deps": `[":a_proto"]`,
2188 }), makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
2189 "deps": `[":libprotobuf-cpp-lite"]`,
2190 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2191 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2192 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2193 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2194 }), makeBazelTarget("cc_library_shared", "a", attrNameToString{
2195 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2196 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2197 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2198 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2199 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2200 }), makeBazelTarget("proto_library", "b_proto", attrNameToString{
2201 "srcs": `[":b_protos"]`,
2202 }), makeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", attrNameToString{
2203 "deps": `[":b_proto"]`,
2204 }), makeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", attrNameToString{
2205 "deps": `[":libprotobuf-cpp-lite"]`,
2206 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2207 "srcs": `[":b_protos_cpp_srcs"]`,
2208 "srcs_as": `[":b_protos_as_srcs"]`,
2209 "srcs_c": `[":b_protos_c_srcs"]`,
2210 }), makeBazelTarget("cc_library_shared", "b", attrNameToString{
2211 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2212 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2213 "srcs": `[":b_protos_cpp_srcs"]`,
2214 "srcs_as": `[":b_protos_as_srcs"]`,
2215 "srcs_c": `[":b_protos_c_srcs"]`,
2216 }), makeBazelTarget("proto_library", "c_proto", attrNameToString{
2217 "srcs": `[":c-proto-srcs"]`,
2218 }), makeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", attrNameToString{
2219 "deps": `[":c_proto"]`,
2220 }), makeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", attrNameToString{
2221 "deps": `[":libprotobuf-cpp-lite"]`,
2222 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2223 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2224 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2225 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2226 }), makeBazelTarget("cc_library_shared", "c", attrNameToString{
2227 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2228 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2229 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2230 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2231 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2232 }), makeBazelTarget("proto_library", "d_proto", attrNameToString{
2233 "srcs": `[":proto-srcs-d"]`,
2234 }), makeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", attrNameToString{
2235 "deps": `[":d_proto"]`,
2236 }), makeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", attrNameToString{
2237 "deps": `[":libprotobuf-cpp-lite"]`,
2238 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2239 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2240 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2241 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2242 }), makeBazelTarget("cc_library_shared", "d", attrNameToString{
2243 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2244 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2245 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2246 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2247 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2248 }),
2249 },
2250 })
2251}
Chris Parsons58852a02021-12-09 18:10:18 -05002252
2253func TestCcLibraryDisabledArchAndTarget(t *testing.T) {
2254 runCcLibraryTestCase(t, bp2buildTestCase{
2255 moduleTypeUnderTest: "cc_library",
2256 moduleTypeUnderTestFactory: cc.LibraryFactory,
2257 blueprint: soongCcProtoPreamble + `cc_library {
2258 name: "foo",
2259 srcs: ["foo.cpp"],
2260 target: {
2261 darwin: {
2262 enabled: false,
2263 },
2264 windows: {
2265 enabled: false,
2266 },
2267 linux_glibc_x86: {
2268 enabled: false,
2269 },
2270 },
2271 include_build_directory: false,
2272}`,
2273 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2274 "srcs": `["foo.cpp"]`,
2275 "target_compatible_with": `select({
2276 "//build/bazel/platforms/os_arch:darwin_arm64": ["@platforms//:incompatible"],
2277 "//build/bazel/platforms/os_arch:darwin_x86_64": ["@platforms//:incompatible"],
2278 "//build/bazel/platforms/os_arch:linux_glibc_x86": ["@platforms//:incompatible"],
2279 "//build/bazel/platforms/os_arch:windows_x86": ["@platforms//:incompatible"],
2280 "//build/bazel/platforms/os_arch:windows_x86_64": ["@platforms//:incompatible"],
2281 "//conditions:default": [],
2282 })`,
2283 }),
2284 })
2285}
2286
2287func TestCcLibraryDisabledArchAndTargetWithDefault(t *testing.T) {
2288 runCcLibraryTestCase(t, bp2buildTestCase{
2289 moduleTypeUnderTest: "cc_library",
2290 moduleTypeUnderTestFactory: cc.LibraryFactory,
2291 blueprint: soongCcProtoPreamble + `cc_library {
2292 name: "foo",
2293 srcs: ["foo.cpp"],
2294 enabled: false,
2295 target: {
2296 darwin: {
2297 enabled: true,
2298 },
2299 windows: {
2300 enabled: false,
2301 },
2302 linux_glibc_x86: {
2303 enabled: false,
2304 },
2305 },
2306 include_build_directory: false,
2307}`,
2308 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2309 "srcs": `["foo.cpp"]`,
2310 "target_compatible_with": `select({
2311 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2312 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2313 "//conditions:default": ["@platforms//:incompatible"],
2314 })`,
2315 }),
2316 })
2317}
2318
2319func TestCcLibrarySharedDisabled(t *testing.T) {
2320 runCcLibraryTestCase(t, bp2buildTestCase{
2321 moduleTypeUnderTest: "cc_library",
2322 moduleTypeUnderTestFactory: cc.LibraryFactory,
2323 blueprint: soongCcProtoPreamble + `cc_library {
2324 name: "foo",
2325 srcs: ["foo.cpp"],
2326 enabled: false,
2327 shared: {
2328 enabled: true,
2329 },
2330 target: {
2331 android: {
2332 shared: {
2333 enabled: false,
2334 },
2335 }
2336 },
2337 include_build_directory: false,
2338}`,
2339 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2340 "srcs": `["foo.cpp"]`,
2341 "target_compatible_with": `["@platforms//:incompatible"]`,
2342 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2343 "srcs": `["foo.cpp"]`,
2344 "target_compatible_with": `select({
2345 "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
2346 "//conditions:default": [],
2347 })`,
2348 }),
2349 },
2350 })
2351}
2352
2353func TestCcLibraryStaticDisabledForSomeArch(t *testing.T) {
2354 runCcLibraryTestCase(t, bp2buildTestCase{
2355 moduleTypeUnderTest: "cc_library",
2356 moduleTypeUnderTestFactory: cc.LibraryFactory,
2357 blueprint: soongCcProtoPreamble + `cc_library {
2358 name: "foo",
2359 srcs: ["foo.cpp"],
2360 shared: {
2361 enabled: false
2362 },
2363 target: {
2364 darwin: {
2365 enabled: true,
2366 },
2367 windows: {
2368 enabled: false,
2369 },
2370 linux_glibc_x86: {
2371 shared: {
2372 enabled: true,
2373 },
2374 },
2375 },
2376 include_build_directory: false,
2377}`,
2378 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2379 "srcs": `["foo.cpp"]`,
2380 "target_compatible_with": `select({
2381 "//build/bazel/platforms/os:windows": ["@platforms//:incompatible"],
2382 "//conditions:default": [],
2383 })`,
2384 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2385 "srcs": `["foo.cpp"]`,
2386 "target_compatible_with": `select({
2387 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2388 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2389 "//build/bazel/platforms/os_arch:linux_glibc_x86": [],
2390 "//conditions:default": ["@platforms//:incompatible"],
2391 })`,
2392 }),
2393 }})
2394}
Jingwen Chen0ee88a62022-01-07 14:55:29 +00002395
2396func TestCcLibraryStubs(t *testing.T) {
2397 runCcLibraryTestCase(t, bp2buildTestCase{
2398 description: "cc_library stubs",
2399 moduleTypeUnderTest: "cc_library",
2400 moduleTypeUnderTestFactory: cc.LibraryFactory,
2401 dir: "foo/bar",
2402 filesystem: map[string]string{
2403 "foo/bar/Android.bp": `
2404cc_library {
2405 name: "a",
2406 stubs: { symbol_file: "a.map.txt", versions: ["28", "29", "current"] },
2407 bazel_module: { bp2build_available: true },
2408 include_build_directory: false,
2409}
2410`,
2411 },
2412 blueprint: soongCcLibraryPreamble,
2413 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
2414 "stubs_symbol_file": `"a.map.txt"`,
2415 "stubs_versions": `[
2416 "28",
2417 "29",
2418 "current",
2419 ]`,
2420 }),
2421 },
2422 )
2423}