blob: b4eb28f00afe417396bd500aa176517b362b5e15 [file] [log] [blame]
Jingwen Chen63930982021-03-24 10:04:33 -04001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package bp2build
16
17import (
Jingwen Chen6ada5892021-09-17 11:38:09 +000018 "fmt"
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000019 "testing"
20
Jingwen Chen63930982021-03-24 10:04:33 -040021 "android/soong/android"
22 "android/soong/cc"
Jingwen Chen63930982021-03-24 10:04:33 -040023)
24
25const (
26 // See cc/testing.go for more context
27 soongCcLibraryPreamble = `
28cc_defaults {
Liz Kammer8337ea42021-09-10 10:06:32 -040029 name: "linux_bionic_supported",
Jingwen Chen63930982021-03-24 10:04:33 -040030}
31
32toolchain_library {
Liz Kammer8337ea42021-09-10 10:06:32 -040033 name: "libclang_rt.builtins-x86_64-android",
34 defaults: ["linux_bionic_supported"],
35 vendor_available: true,
36 vendor_ramdisk_available: true,
37 product_available: true,
38 recovery_available: true,
39 native_bridge_supported: true,
40 src: "",
Jingwen Chen63930982021-03-24 10:04:33 -040041}`
Liz Kammer12615db2021-09-28 09:19:17 -040042
43 soongCcProtoLibraries = `
44cc_library {
45 name: "libprotobuf-cpp-lite",
46 bazel_module: { bp2build_available: false },
47}
48
49cc_library {
50 name: "libprotobuf-cpp-full",
51 bazel_module: { bp2build_available: false },
52}`
53
54 soongCcProtoPreamble = soongCcLibraryPreamble + soongCcProtoLibraries
Jingwen Chen63930982021-03-24 10:04:33 -040055)
56
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020057func runCcLibraryTestCase(t *testing.T, tc bp2buildTestCase) {
Liz Kammere4982e82021-05-25 10:39:35 -040058 t.Helper()
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020059 runBp2BuildTestCase(t, registerCcLibraryModuleTypes, tc)
60}
61
62func registerCcLibraryModuleTypes(ctx android.RegistrationContext) {
63 cc.RegisterCCBuildComponents(ctx)
Jingwen Chen14a8bda2021-06-02 11:10:02 +000064 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020065 ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
Liz Kammer2d7bbe32021-06-10 18:20:06 -040066 ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020067 ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
68 ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
69}
70
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020071func TestCcLibrarySimple(t *testing.T) {
72 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -040073 description: "cc_library - simple example",
74 moduleTypeUnderTest: "cc_library",
75 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020076 filesystem: map[string]string{
77 "android.cpp": "",
Liz Kammer01a16e82021-07-16 16:33:47 -040078 "bionic.cpp": "",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020079 "darwin.cpp": "",
80 // Refer to cc.headerExts for the supported header extensions in Soong.
81 "header.h": "",
82 "header.hh": "",
83 "header.hpp": "",
84 "header.hxx": "",
85 "header.h++": "",
86 "header.inl": "",
87 "header.inc": "",
88 "header.ipp": "",
89 "header.h.generic": "",
90 "impl.cpp": "",
91 "linux.cpp": "",
92 "x86.cpp": "",
93 "x86_64.cpp": "",
94 "foo-dir/a.h": "",
95 },
Liz Kammer78cfdaa2021-11-08 12:56:31 -050096 blueprint: soongCcLibraryPreamble +
97 simpleModuleDoNotConvertBp2build("cc_library_headers", "some-headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -040098cc_library {
99 name: "foo-lib",
100 srcs: ["impl.cpp"],
101 cflags: ["-Wall"],
102 header_libs: ["some-headers"],
103 export_include_dirs: ["foo-dir"],
104 ldflags: ["-Wl,--exclude-libs=bar.a"],
105 arch: {
106 x86: {
107 ldflags: ["-Wl,--exclude-libs=baz.a"],
108 srcs: ["x86.cpp"],
109 },
110 x86_64: {
111 ldflags: ["-Wl,--exclude-libs=qux.a"],
112 srcs: ["x86_64.cpp"],
113 },
114 },
115 target: {
116 android: {
117 srcs: ["android.cpp"],
118 },
119 linux_glibc: {
120 srcs: ["linux.cpp"],
121 },
122 darwin: {
123 srcs: ["darwin.cpp"],
124 },
Liz Kammer01a16e82021-07-16 16:33:47 -0400125 bionic: {
126 srcs: ["bionic.cpp"]
127 },
Jingwen Chen63930982021-03-24 10:04:33 -0400128 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400129 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400130}
131`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500132 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
133 "copts": `["-Wall"]`,
134 "export_includes": `["foo-dir"]`,
135 "implementation_deps": `[":some-headers"]`,
136 "linkopts": `["-Wl,--exclude-libs=bar.a"] + select({
Jingwen Chened9c17d2021-04-13 07:14:55 +0000137 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
138 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
139 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500140 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500141 "srcs": `["impl.cpp"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000142 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
143 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen63930982021-03-24 10:04:33 -0400144 "//conditions:default": [],
145 }) + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400146 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400147 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -0400148 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400149 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000150 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
151 "//build/bazel/platforms/os:linux": ["linux.cpp"],
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400152 "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"],
Liz Kammer01a16e82021-07-16 16:33:47 -0400153 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500154 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500155 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500156 })
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200157}
158
159func TestCcLibraryTrimmedLdAndroid(t *testing.T) {
160 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400161 description: "cc_library - trimmed example of //bionic/linker:ld-android",
162 moduleTypeUnderTest: "cc_library",
163 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200164 filesystem: map[string]string{
165 "ld-android.cpp": "",
166 "linked_list.h": "",
167 "linker.h": "",
168 "linker_block_allocator.h": "",
169 "linker_cfi.h": "",
Jingwen Chen63930982021-03-24 10:04:33 -0400170 },
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400171 blueprint: soongCcLibraryPreamble +
172 simpleModuleDoNotConvertBp2build("cc_library_headers", "libc_headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -0400173cc_library {
174 name: "fake-ld-android",
175 srcs: ["ld_android.cpp"],
176 cflags: [
177 "-Wall",
178 "-Wextra",
179 "-Wunused",
180 "-Werror",
181 ],
182 header_libs: ["libc_headers"],
183 ldflags: [
184 "-Wl,--exclude-libs=libgcc.a",
185 "-Wl,--exclude-libs=libgcc_stripped.a",
186 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
187 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
188 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
189 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
190 ],
191 arch: {
192 x86: {
193 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
194 },
195 x86_64: {
196 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
197 },
198 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400199 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400200}
201`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500202 expectedBazelTargets: makeCcLibraryTargets("fake-ld-android", attrNameToString{
203 "srcs": `["ld_android.cpp"]`,
204 "copts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400205 "-Wall",
206 "-Wextra",
207 "-Wunused",
208 "-Werror",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500209 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500210 "implementation_deps": `[":libc_headers"]`,
211 "linkopts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400212 "-Wl,--exclude-libs=libgcc.a",
213 "-Wl,--exclude-libs=libgcc_stripped.a",
214 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
215 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
216 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
217 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
218 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000219 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=libgcc_eh.a"],
220 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"],
Jingwen Chen63930982021-03-24 10:04:33 -0400221 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500222 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500223 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200224 })
225}
226
227func TestCcLibraryExcludeSrcs(t *testing.T) {
228 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400229 description: "cc_library exclude_srcs - trimmed example of //external/arm-optimized-routines:libarm-optimized-routines-math",
230 moduleTypeUnderTest: "cc_library",
231 moduleTypeUnderTestFactory: cc.LibraryFactory,
232 dir: "external",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200233 filesystem: map[string]string{
234 "external/math/cosf.c": "",
235 "external/math/erf.c": "",
236 "external/math/erf_data.c": "",
237 "external/math/erff.c": "",
238 "external/math/erff_data.c": "",
239 "external/Android.bp": `
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000240cc_library {
241 name: "fake-libarm-optimized-routines-math",
242 exclude_srcs: [
243 // Provided by:
244 // bionic/libm/upstream-freebsd/lib/msun/src/s_erf.c
245 // bionic/libm/upstream-freebsd/lib/msun/src/s_erff.c
246 "math/erf.c",
247 "math/erf_data.c",
248 "math/erff.c",
249 "math/erff_data.c",
250 ],
251 srcs: [
252 "math/*.c",
253 ],
254 // arch-specific settings
255 arch: {
256 arm64: {
257 cflags: [
258 "-DHAVE_FAST_FMA=1",
259 ],
260 },
261 },
262 bazel_module: { bp2build_available: true },
263}
264`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200265 },
266 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500267 expectedBazelTargets: makeCcLibraryTargets("fake-libarm-optimized-routines-math", attrNameToString{
268 "copts": `select({
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000269 "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"],
270 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500271 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500272 "local_includes": `["."]`,
273 "srcs_c": `["math/cosf.c"]`,
274 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200275 })
276}
277
278func TestCcLibrarySharedStaticProps(t *testing.T) {
279 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400280 description: "cc_library shared/static props",
281 moduleTypeUnderTest: "cc_library",
282 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200283 filesystem: map[string]string{
Liz Kammer8337ea42021-09-10 10:06:32 -0400284 "both.cpp": "",
285 "sharedonly.cpp": "",
286 "staticonly.cpp": "",
287 },
288 blueprint: soongCcLibraryPreamble + `
Jingwen Chen53681ef2021-04-29 08:15:13 +0000289cc_library {
290 name: "a",
Chris Parsons08648312021-05-06 16:23:19 -0400291 srcs: ["both.cpp"],
292 cflags: ["bothflag"],
293 shared_libs: ["shared_dep_for_both"],
294 static_libs: ["static_dep_for_both"],
295 whole_static_libs: ["whole_static_lib_for_both"],
296 static: {
297 srcs: ["staticonly.cpp"],
298 cflags: ["staticflag"],
299 shared_libs: ["shared_dep_for_static"],
300 static_libs: ["static_dep_for_static"],
301 whole_static_libs: ["whole_static_lib_for_static"],
302 },
303 shared: {
304 srcs: ["sharedonly.cpp"],
305 cflags: ["sharedflag"],
306 shared_libs: ["shared_dep_for_shared"],
307 static_libs: ["static_dep_for_shared"],
308 whole_static_libs: ["whole_static_lib_for_shared"],
309 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400310 include_build_directory: false,
Jingwen Chen53681ef2021-04-29 08:15:13 +0000311}
312
Liz Kammer8337ea42021-09-10 10:06:32 -0400313cc_library_static {
314 name: "static_dep_for_shared",
315 bazel_module: { bp2build_available: false },
316}
Chris Parsons08648312021-05-06 16:23:19 -0400317
Liz Kammer8337ea42021-09-10 10:06:32 -0400318cc_library_static {
319 name: "static_dep_for_static",
320 bazel_module: { bp2build_available: false },
321}
Chris Parsons08648312021-05-06 16:23:19 -0400322
Liz Kammer8337ea42021-09-10 10:06:32 -0400323cc_library_static {
324 name: "static_dep_for_both",
325 bazel_module: { bp2build_available: false },
326}
Chris Parsons08648312021-05-06 16:23:19 -0400327
Liz Kammer8337ea42021-09-10 10:06:32 -0400328cc_library_static {
329 name: "whole_static_lib_for_shared",
330 bazel_module: { bp2build_available: false },
331}
Chris Parsons08648312021-05-06 16:23:19 -0400332
Liz Kammer8337ea42021-09-10 10:06:32 -0400333cc_library_static {
334 name: "whole_static_lib_for_static",
335 bazel_module: { bp2build_available: false },
336}
Chris Parsons08648312021-05-06 16:23:19 -0400337
Liz Kammer8337ea42021-09-10 10:06:32 -0400338cc_library_static {
339 name: "whole_static_lib_for_both",
340 bazel_module: { bp2build_available: false },
341}
Chris Parsons08648312021-05-06 16:23:19 -0400342
Liz Kammer8337ea42021-09-10 10:06:32 -0400343cc_library {
344 name: "shared_dep_for_shared",
345 bazel_module: { bp2build_available: false },
346}
Chris Parsons08648312021-05-06 16:23:19 -0400347
Liz Kammer8337ea42021-09-10 10:06:32 -0400348cc_library {
349 name: "shared_dep_for_static",
350 bazel_module: { bp2build_available: false },
351}
Chris Parsons08648312021-05-06 16:23:19 -0400352
Liz Kammer8337ea42021-09-10 10:06:32 -0400353cc_library {
354 name: "shared_dep_for_both",
355 bazel_module: { bp2build_available: false },
356}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000357`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500358 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500359 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
360 "copts": `[
361 "bothflag",
362 "staticflag",
363 ]`,
364 "implementation_deps": `[
365 ":static_dep_for_both",
366 ":static_dep_for_static",
367 ]`,
368 "implementation_dynamic_deps": `[
369 ":shared_dep_for_both",
370 ":shared_dep_for_static",
371 ]`,
372 "srcs": `[
373 "both.cpp",
374 "staticonly.cpp",
375 ]`,
376 "whole_archive_deps": `[
377 ":whole_static_lib_for_both",
378 ":whole_static_lib_for_static",
379 ]`}),
380 makeBazelTarget("cc_library_shared", "a", attrNameToString{
381 "copts": `[
382 "bothflag",
383 "sharedflag",
384 ]`,
385 "implementation_deps": `[
386 ":static_dep_for_both",
387 ":static_dep_for_shared",
388 ]`,
389 "implementation_dynamic_deps": `[
390 ":shared_dep_for_both",
391 ":shared_dep_for_shared",
392 ]`,
393 "srcs": `[
394 "both.cpp",
395 "sharedonly.cpp",
396 ]`,
397 "whole_archive_deps": `[
398 ":whole_static_lib_for_both",
399 ":whole_static_lib_for_shared",
400 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500401 }),
402 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200403 })
404}
405
Liz Kammer7a210ac2021-09-22 15:52:58 -0400406func TestCcLibraryDeps(t *testing.T) {
407 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400408 description: "cc_library shared/static props",
409 moduleTypeUnderTest: "cc_library",
410 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer7a210ac2021-09-22 15:52:58 -0400411 filesystem: map[string]string{
412 "both.cpp": "",
413 "sharedonly.cpp": "",
414 "staticonly.cpp": "",
415 },
416 blueprint: soongCcLibraryPreamble + `
417cc_library {
418 name: "a",
419 srcs: ["both.cpp"],
420 cflags: ["bothflag"],
421 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
422 export_shared_lib_headers: ["shared_dep_for_both"],
423 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
424 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
425 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
426 static: {
427 srcs: ["staticonly.cpp"],
428 cflags: ["staticflag"],
429 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
430 export_shared_lib_headers: ["shared_dep_for_static"],
431 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
432 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
433 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
434 },
435 shared: {
436 srcs: ["sharedonly.cpp"],
437 cflags: ["sharedflag"],
438 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
439 export_shared_lib_headers: ["shared_dep_for_shared"],
440 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
441 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
442 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
443 },
444 include_build_directory: false,
445}
446` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
447 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
448 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
449 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
450 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
451 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
452 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
453 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
454 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
455 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
456 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
457 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
458 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
459 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
460 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
461 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
462 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
463 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500464 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500465 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
466 "copts": `[
467 "bothflag",
468 "staticflag",
469 ]`,
470 "deps": `[
471 ":static_dep_for_both",
472 ":static_dep_for_static",
473 ]`,
474 "dynamic_deps": `[
475 ":shared_dep_for_both",
476 ":shared_dep_for_static",
477 ]`,
478 "implementation_deps": `[
479 ":implementation_static_dep_for_both",
480 ":implementation_static_dep_for_static",
481 ]`,
482 "implementation_dynamic_deps": `[
483 ":implementation_shared_dep_for_both",
484 ":implementation_shared_dep_for_static",
485 ]`,
486 "srcs": `[
487 "both.cpp",
488 "staticonly.cpp",
489 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500490 "whole_archive_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400491 ":not_explicitly_exported_whole_static_dep_for_both",
492 ":whole_static_dep_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500493 ":not_explicitly_exported_whole_static_dep_for_static",
494 ":whole_static_dep_for_static",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500495 ]`,
496 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500497 makeBazelTarget("cc_library_shared", "a", attrNameToString{
498 "copts": `[
499 "bothflag",
500 "sharedflag",
501 ]`,
502 "deps": `[
503 ":static_dep_for_both",
504 ":static_dep_for_shared",
505 ]`,
506 "dynamic_deps": `[
507 ":shared_dep_for_both",
508 ":shared_dep_for_shared",
509 ]`,
510 "implementation_deps": `[
511 ":implementation_static_dep_for_both",
512 ":implementation_static_dep_for_shared",
513 ]`,
514 "implementation_dynamic_deps": `[
515 ":implementation_shared_dep_for_both",
516 ":implementation_shared_dep_for_shared",
517 ]`,
518 "srcs": `[
519 "both.cpp",
520 "sharedonly.cpp",
521 ]`,
522 "whole_archive_deps": `[
523 ":not_explicitly_exported_whole_static_dep_for_both",
524 ":whole_static_dep_for_both",
525 ":not_explicitly_exported_whole_static_dep_for_shared",
526 ":whole_static_dep_for_shared",
527 ]`,
528 })},
529 },
530 )
Liz Kammer7a210ac2021-09-22 15:52:58 -0400531}
532
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400533func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
534 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400535 moduleTypeUnderTest: "cc_library",
536 moduleTypeUnderTestFactory: cc.LibraryFactory,
537 dir: "foo/bar",
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400538 filesystem: map[string]string{
539 "foo/bar/Android.bp": `
540cc_library {
541 name: "a",
542 whole_static_libs: ["whole_static_lib_for_both"],
543 static: {
544 whole_static_libs: ["whole_static_lib_for_static"],
545 },
546 shared: {
547 whole_static_libs: ["whole_static_lib_for_shared"],
548 },
549 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400550 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400551}
552
553cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
554
555cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
556
557cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
558`,
559 },
560 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500561 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500562 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
563 "whole_archive_deps": `[
564 ":whole_static_lib_for_both_alwayslink",
565 ":whole_static_lib_for_static_alwayslink",
566 ]`,
567 }),
568 makeBazelTarget("cc_library_shared", "a", attrNameToString{
569 "whole_archive_deps": `[
570 ":whole_static_lib_for_both_alwayslink",
571 ":whole_static_lib_for_shared_alwayslink",
572 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500573 }),
574 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500575 },
576 )
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400577}
578
Jingwen Chenbcf53042021-05-26 04:42:42 +0000579func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
580 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400581 description: "cc_library shared/static props in arch",
582 moduleTypeUnderTest: "cc_library",
583 moduleTypeUnderTestFactory: cc.LibraryFactory,
584 dir: "foo/bar",
Jingwen Chenbcf53042021-05-26 04:42:42 +0000585 filesystem: map[string]string{
586 "foo/bar/arm.cpp": "",
587 "foo/bar/x86.cpp": "",
588 "foo/bar/sharedonly.cpp": "",
589 "foo/bar/staticonly.cpp": "",
590 "foo/bar/Android.bp": `
591cc_library {
592 name: "a",
593 arch: {
594 arm: {
595 shared: {
596 srcs: ["arm_shared.cpp"],
597 cflags: ["-DARM_SHARED"],
598 static_libs: ["arm_static_dep_for_shared"],
599 whole_static_libs: ["arm_whole_static_dep_for_shared"],
600 shared_libs: ["arm_shared_dep_for_shared"],
601 },
602 },
603 x86: {
604 static: {
605 srcs: ["x86_static.cpp"],
606 cflags: ["-DX86_STATIC"],
607 static_libs: ["x86_dep_for_static"],
608 },
609 },
610 },
611 target: {
612 android: {
613 shared: {
614 srcs: ["android_shared.cpp"],
615 cflags: ["-DANDROID_SHARED"],
616 static_libs: ["android_dep_for_shared"],
617 },
618 },
619 android_arm: {
620 shared: {
621 cflags: ["-DANDROID_ARM_SHARED"],
622 },
623 },
624 },
625 srcs: ["both.cpp"],
626 cflags: ["bothflag"],
627 static_libs: ["static_dep_for_both"],
628 static: {
629 srcs: ["staticonly.cpp"],
630 cflags: ["staticflag"],
631 static_libs: ["static_dep_for_static"],
632 },
633 shared: {
634 srcs: ["sharedonly.cpp"],
635 cflags: ["sharedflag"],
636 static_libs: ["static_dep_for_shared"],
637 },
638 bazel_module: { bp2build_available: true },
639}
640
641cc_library_static { name: "static_dep_for_shared" }
642cc_library_static { name: "static_dep_for_static" }
643cc_library_static { name: "static_dep_for_both" }
644
645cc_library_static { name: "arm_static_dep_for_shared" }
646cc_library_static { name: "arm_whole_static_dep_for_shared" }
647cc_library_static { name: "arm_shared_dep_for_shared" }
648
649cc_library_static { name: "x86_dep_for_static" }
650
651cc_library_static { name: "android_dep_for_shared" }
652`,
653 },
654 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500655 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500656 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
657 "copts": `[
658 "bothflag",
659 "staticflag",
660 ] + select({
661 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
662 "//conditions:default": [],
663 })`,
664 "implementation_deps": `[
665 ":static_dep_for_both",
666 ":static_dep_for_static",
667 ] + select({
668 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
669 "//conditions:default": [],
670 })`,
671 "local_includes": `["."]`,
672 "srcs": `[
673 "both.cpp",
674 "staticonly.cpp",
675 ] + select({
676 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
677 "//conditions:default": [],
678 })`,
679 }),
680 makeBazelTarget("cc_library_shared", "a", attrNameToString{
681 "copts": `[
682 "bothflag",
683 "sharedflag",
684 ] + select({
685 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
686 "//conditions:default": [],
687 }) + select({
688 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
689 "//conditions:default": [],
690 }) + select({
691 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
692 "//conditions:default": [],
693 })`,
694 "implementation_deps": `[
695 ":static_dep_for_both",
696 ":static_dep_for_shared",
697 ] + select({
698 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
699 "//conditions:default": [],
700 }) + select({
701 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
702 "//conditions:default": [],
703 })`,
704 "implementation_dynamic_deps": `select({
705 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
706 "//conditions:default": [],
707 })`,
708 "local_includes": `["."]`,
709 "srcs": `[
710 "both.cpp",
711 "sharedonly.cpp",
712 ] + select({
713 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
714 "//conditions:default": [],
715 }) + select({
716 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
717 "//conditions:default": [],
718 })`,
719 "whole_archive_deps": `select({
720 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
721 "//conditions:default": [],
722 })`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500723 }),
724 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500725 },
726 )
Jingwen Chenbcf53042021-05-26 04:42:42 +0000727}
728
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000729func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
730 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400731 description: "cc_library shared/static props with c/cpp/s mixed sources",
732 moduleTypeUnderTest: "cc_library",
733 moduleTypeUnderTestFactory: cc.LibraryFactory,
734 dir: "foo/bar",
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000735 filesystem: map[string]string{
736 "foo/bar/both_source.cpp": "",
737 "foo/bar/both_source.cc": "",
738 "foo/bar/both_source.c": "",
739 "foo/bar/both_source.s": "",
740 "foo/bar/both_source.S": "",
741 "foo/bar/shared_source.cpp": "",
742 "foo/bar/shared_source.cc": "",
743 "foo/bar/shared_source.c": "",
744 "foo/bar/shared_source.s": "",
745 "foo/bar/shared_source.S": "",
746 "foo/bar/static_source.cpp": "",
747 "foo/bar/static_source.cc": "",
748 "foo/bar/static_source.c": "",
749 "foo/bar/static_source.s": "",
750 "foo/bar/static_source.S": "",
751 "foo/bar/Android.bp": `
752cc_library {
753 name: "a",
754 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400755 "both_source.cpp",
756 "both_source.cc",
757 "both_source.c",
758 "both_source.s",
759 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400760 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400761 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000762 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400763 srcs: [
764 "static_source.cpp",
765 "static_source.cc",
766 "static_source.c",
767 "static_source.s",
768 "static_source.S",
769 ":static_filegroup",
770 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000771 },
772 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400773 srcs: [
774 "shared_source.cpp",
775 "shared_source.cc",
776 "shared_source.c",
777 "shared_source.s",
778 "shared_source.S",
779 ":shared_filegroup",
780 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000781 },
782 bazel_module: { bp2build_available: true },
783}
784
785filegroup {
786 name: "both_filegroup",
787 srcs: [
788 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400789 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000790}
791
792filegroup {
793 name: "shared_filegroup",
794 srcs: [
795 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400796 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000797}
798
799filegroup {
800 name: "static_filegroup",
801 srcs: [
802 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400803 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000804}
805`,
806 },
807 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500808 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500809 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500810 "local_includes": `["."]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500811 "srcs": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000812 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400813 "both_source.cc",
814 ":both_filegroup_cpp_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500815 "static_source.cpp",
816 "static_source.cc",
817 ":static_filegroup_cpp_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500818 ]`,
819 "srcs_as": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000820 "both_source.s",
821 "both_source.S",
822 ":both_filegroup_as_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500823 "static_source.s",
824 "static_source.S",
825 ":static_filegroup_as_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500826 ]`,
827 "srcs_c": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000828 "both_source.c",
829 ":both_filegroup_c_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500830 "static_source.c",
831 ":static_filegroup_c_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500832 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500833 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500834 makeBazelTarget("cc_library_shared", "a", attrNameToString{
835 "local_includes": `["."]`,
836 "srcs": `[
837 "both_source.cpp",
838 "both_source.cc",
839 ":both_filegroup_cpp_srcs",
840 "shared_source.cpp",
841 "shared_source.cc",
842 ":shared_filegroup_cpp_srcs",
843 ]`,
844 "srcs_as": `[
845 "both_source.s",
846 "both_source.S",
847 ":both_filegroup_as_srcs",
848 "shared_source.s",
849 "shared_source.S",
850 ":shared_filegroup_as_srcs",
851 ]`,
852 "srcs_c": `[
853 "both_source.c",
854 ":both_filegroup_c_srcs",
855 "shared_source.c",
856 ":shared_filegroup_c_srcs",
857 ]`,
858 })}})
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000859}
860
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200861func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
862 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400863 description: "cc_library non-configured version script",
864 moduleTypeUnderTest: "cc_library",
865 moduleTypeUnderTestFactory: cc.LibraryFactory,
866 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200867 filesystem: map[string]string{
868 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200869cc_library {
870 name: "a",
871 srcs: ["a.cpp"],
872 version_script: "v.map",
873 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400874 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200875}
876`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200877 },
878 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500879 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
880 "additional_linker_inputs": `["v.map"]`,
881 "linkopts": `["-Wl,--version-script,$(location v.map)"]`,
882 "srcs": `["a.cpp"]`,
883 }),
884 },
885 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200886}
887
888func TestCcLibraryConfiguredVersionScript(t *testing.T) {
889 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400890 description: "cc_library configured version script",
891 moduleTypeUnderTest: "cc_library",
892 moduleTypeUnderTestFactory: cc.LibraryFactory,
893 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200894 filesystem: map[string]string{
895 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400896cc_library {
897 name: "a",
898 srcs: ["a.cpp"],
899 arch: {
900 arm: {
901 version_script: "arm.map",
902 },
903 arm64: {
904 version_script: "arm64.map",
905 },
906 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200907
Liz Kammer8337ea42021-09-10 10:06:32 -0400908 bazel_module: { bp2build_available: true },
909 include_build_directory: false,
910}
Liz Kammerd366c902021-06-03 13:43:01 -0400911 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200912 },
913 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500914 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
915 "additional_linker_inputs": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400916 "//build/bazel/platforms/arch:arm": ["arm.map"],
917 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
918 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500919 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500920 "linkopts": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400921 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
922 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
923 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500924 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500925 "srcs": `["a.cpp"]`,
926 }),
927 },
928 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200929}
930
931func TestCcLibrarySharedLibs(t *testing.T) {
932 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400933 description: "cc_library shared_libs",
934 moduleTypeUnderTest: "cc_library",
935 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400936 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400937cc_library {
938 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400939 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400940}
941
942cc_library {
943 name: "a",
944 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400945 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400946}
947`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500948 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
949 "implementation_dynamic_deps": `[":mylib"]`,
950 }),
951 },
952 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200953}
954
Liz Kammer0eae52e2021-10-06 10:32:26 -0400955func TestCcLibraryFeatures(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -0500956 expected_targets := []string{}
957 expected_targets = append(expected_targets, makeCcLibraryTargets("a", attrNameToString{
958 "features": `[
959 "disable_pack_relocations",
960 "-no_undefined_symbols",
961 ]`,
962 "srcs": `["a.cpp"]`,
963 })...)
964 expected_targets = append(expected_targets, makeCcLibraryTargets("b", attrNameToString{
965 "features": `select({
966 "//build/bazel/platforms/arch:x86_64": [
967 "disable_pack_relocations",
968 "-no_undefined_symbols",
969 ],
970 "//conditions:default": [],
971 })`,
972 "srcs": `["b.cpp"]`,
973 })...)
974 expected_targets = append(expected_targets, makeCcLibraryTargets("c", attrNameToString{
975 "features": `select({
976 "//build/bazel/platforms/os:darwin": [
977 "disable_pack_relocations",
978 "-no_undefined_symbols",
979 ],
980 "//conditions:default": [],
981 })`,
982 "srcs": `["c.cpp"]`,
983 })...)
984
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200985 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400986 description: "cc_library pack_relocations test",
987 moduleTypeUnderTest: "cc_library",
988 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400989 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400990cc_library {
991 name: "a",
992 srcs: ["a.cpp"],
993 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400994 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400995 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400996}
997
998cc_library {
999 name: "b",
1000 srcs: ["b.cpp"],
1001 arch: {
1002 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001003 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001004 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001005 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001006 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001007 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001008}
1009
1010cc_library {
1011 name: "c",
1012 srcs: ["c.cpp"],
1013 target: {
1014 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001015 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001016 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001017 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001018 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001019 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001020}`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001021 expectedBazelTargets: expected_targets,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001022 })
1023}
1024
1025func TestCcLibrarySpacesInCopts(t *testing.T) {
1026 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001027 description: "cc_library spaces in copts",
1028 moduleTypeUnderTest: "cc_library",
1029 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001030 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +00001031cc_library {
1032 name: "a",
1033 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -04001034 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +00001035}
1036`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001037 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1038 "copts": `[
Jingwen Chen3950cd62021-05-12 04:33:00 +00001039 "-include",
1040 "header.h",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001041 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001042 }),
1043 },
1044 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001045}
1046
1047func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
1048 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001049 description: "cc_library cppflags usage",
1050 moduleTypeUnderTest: "cc_library",
1051 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001052 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001053 name: "a",
1054 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001055 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001056 cppflags: [
1057 "-fsigned-char",
1058 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -04001059 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001060 arch: {
1061 arm64: {
1062 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001063 },
Liz Kammerd366c902021-06-03 13:43:01 -04001064 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001065 target: {
1066 android: {
1067 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001068 },
Liz Kammerd366c902021-06-03 13:43:01 -04001069 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001070 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001071}
1072`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001073 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1074 "copts": `["-Wall"]`,
1075 "cppflags": `[
Chris Parsons990c4f42021-05-25 12:10:58 -04001076 "-fsigned-char",
1077 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001078 ] + select({
1079 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1080 "//conditions:default": [],
1081 }) + select({
1082 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1083 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001084 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001085 "srcs": `["a.cpp"]`,
1086 }),
1087 },
1088 )
Jingwen Chen63930982021-03-24 10:04:33 -04001089}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001090
Liz Kammer47535c52021-06-02 16:02:22 -04001091func TestCcLibraryExcludeLibs(t *testing.T) {
1092 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001093 moduleTypeUnderTest: "cc_library",
1094 moduleTypeUnderTestFactory: cc.LibraryFactory,
1095 filesystem: map[string]string{},
Liz Kammer47535c52021-06-02 16:02:22 -04001096 blueprint: soongCcLibraryStaticPreamble + `
1097cc_library {
1098 name: "foo_static",
1099 srcs: ["common.c"],
1100 whole_static_libs: [
1101 "arm_whole_static_lib_excludes",
1102 "malloc_not_svelte_whole_static_lib_excludes"
1103 ],
1104 static_libs: [
1105 "arm_static_lib_excludes",
1106 "malloc_not_svelte_static_lib_excludes"
1107 ],
1108 shared_libs: [
1109 "arm_shared_lib_excludes",
1110 ],
1111 arch: {
1112 arm: {
1113 exclude_shared_libs: [
1114 "arm_shared_lib_excludes",
1115 ],
1116 exclude_static_libs: [
1117 "arm_static_lib_excludes",
1118 "arm_whole_static_lib_excludes",
1119 ],
1120 },
1121 },
1122 product_variables: {
1123 malloc_not_svelte: {
1124 shared_libs: ["malloc_not_svelte_shared_lib"],
1125 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1126 exclude_static_libs: [
1127 "malloc_not_svelte_static_lib_excludes",
1128 "malloc_not_svelte_whole_static_lib_excludes",
1129 ],
1130 },
1131 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001132 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001133}
1134
1135cc_library {
1136 name: "arm_whole_static_lib_excludes",
1137 bazel_module: { bp2build_available: false },
1138}
1139
1140cc_library {
1141 name: "malloc_not_svelte_whole_static_lib",
1142 bazel_module: { bp2build_available: false },
1143}
1144
1145cc_library {
1146 name: "malloc_not_svelte_whole_static_lib_excludes",
1147 bazel_module: { bp2build_available: false },
1148}
1149
1150cc_library {
1151 name: "arm_static_lib_excludes",
1152 bazel_module: { bp2build_available: false },
1153}
1154
1155cc_library {
1156 name: "malloc_not_svelte_static_lib_excludes",
1157 bazel_module: { bp2build_available: false },
1158}
1159
1160cc_library {
1161 name: "arm_shared_lib_excludes",
1162 bazel_module: { bp2build_available: false },
1163}
1164
1165cc_library {
1166 name: "malloc_not_svelte_shared_lib",
1167 bazel_module: { bp2build_available: false },
1168}
1169`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001170 expectedBazelTargets: makeCcLibraryTargets("foo_static", attrNameToString{
1171 "implementation_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001172 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001173 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001174 }) + select({
1175 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001176 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001177 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001178 "implementation_dynamic_deps": `select({
Liz Kammer7a210ac2021-09-22 15:52:58 -04001179 "//build/bazel/platforms/arch:arm": [],
1180 "//conditions:default": [":arm_shared_lib_excludes"],
1181 }) + select({
1182 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1183 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001184 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001185 "srcs_c": `["common.c"]`,
1186 "whole_archive_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001187 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001188 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001189 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001190 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1191 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001192 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001193 }),
1194 },
1195 )
Liz Kammer47535c52021-06-02 16:02:22 -04001196}
Liz Kammerd366c902021-06-03 13:43:01 -04001197
1198func TestCCLibraryNoCrtTrue(t *testing.T) {
1199 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001200 description: "cc_library - nocrt: true emits attribute",
1201 moduleTypeUnderTest: "cc_library",
1202 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001203 filesystem: map[string]string{
1204 "impl.cpp": "",
1205 },
1206 blueprint: soongCcLibraryPreamble + `
1207cc_library {
1208 name: "foo-lib",
1209 srcs: ["impl.cpp"],
1210 nocrt: true,
1211 include_build_directory: false,
1212}
1213`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001214 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1215 "link_crt": `False`,
1216 "srcs": `["impl.cpp"]`,
1217 }),
1218 },
1219 )
Jingwen Chen6ada5892021-09-17 11:38:09 +00001220}
1221
1222func TestCCLibraryNoCrtFalse(t *testing.T) {
1223 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001224 description: "cc_library - nocrt: false - does not emit attribute",
1225 moduleTypeUnderTest: "cc_library",
1226 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001227 filesystem: map[string]string{
1228 "impl.cpp": "",
1229 },
1230 blueprint: soongCcLibraryPreamble + `
1231cc_library {
1232 name: "foo-lib",
1233 srcs: ["impl.cpp"],
1234 nocrt: false,
1235 include_build_directory: false,
1236}
1237`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001238 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1239 "srcs": `["impl.cpp"]`,
1240 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001241 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001242}
1243
1244func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1245 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001246 description: "cc_library - nocrt in select",
1247 moduleTypeUnderTest: "cc_library",
1248 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001249 filesystem: map[string]string{
1250 "impl.cpp": "",
1251 },
1252 blueprint: soongCcLibraryPreamble + `
1253cc_library {
1254 name: "foo-lib",
1255 srcs: ["impl.cpp"],
1256 arch: {
1257 arm: {
1258 nocrt: true,
1259 },
1260 x86: {
1261 nocrt: false,
1262 },
1263 },
1264 include_build_directory: false,
1265}
1266`,
1267 expectedErr: fmt.Errorf("Android.bp:16:1: module \"foo-lib\": nocrt is not supported for arch variants"),
1268 })
1269}
1270
1271func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1272 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001273 moduleTypeUnderTest: "cc_library",
1274 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001275 filesystem: map[string]string{
1276 "impl.cpp": "",
1277 },
1278 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001279cc_library {
1280 name: "foo-lib",
1281 srcs: ["impl.cpp"],
1282 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001283 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001284}
1285`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001286 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1287 "srcs": `["impl.cpp"]`,
1288 "use_libcrt": `False`,
1289 }),
1290 })
1291}
1292
1293func makeCcLibraryTargets(name string, attrs attrNameToString) []string {
1294 STATIC_ONLY_ATTRS := map[string]bool{}
1295 SHARED_ONLY_ATTRS := map[string]bool{
1296 "link_crt": true,
1297 "additional_linker_inputs": true,
1298 "linkopts": true,
1299 "strip": true,
1300 }
1301 sharedAttrs := attrNameToString{}
1302 staticAttrs := attrNameToString{}
1303 for key, val := range attrs {
1304 if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly {
1305 sharedAttrs[key] = val
1306 }
1307 if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly {
1308 staticAttrs[key] = val
1309 }
1310 }
1311 sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
1312 staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
1313
1314 return []string{staticTarget, sharedTarget}
Liz Kammerd366c902021-06-03 13:43:01 -04001315}
1316
Jingwen Chen6ada5892021-09-17 11:38:09 +00001317func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001318 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001319 moduleTypeUnderTest: "cc_library",
1320 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001321 filesystem: map[string]string{
1322 "impl.cpp": "",
1323 },
1324 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001325cc_library {
1326 name: "foo-lib",
1327 srcs: ["impl.cpp"],
1328 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001329 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001330}
1331`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001332 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1333 "srcs": `["impl.cpp"]`,
1334 "use_libcrt": `True`,
1335 }),
1336 })
Liz Kammerd366c902021-06-03 13:43:01 -04001337}
1338
Jingwen Chen6ada5892021-09-17 11:38:09 +00001339func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001340 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001341 moduleTypeUnderTest: "cc_library",
1342 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001343 filesystem: map[string]string{
1344 "impl.cpp": "",
1345 },
1346 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001347cc_library {
1348 name: "foo-lib",
1349 srcs: ["impl.cpp"],
1350 arch: {
1351 arm: {
1352 no_libcrt: true,
1353 },
1354 x86: {
1355 no_libcrt: true,
1356 },
1357 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001358 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001359}
1360`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001361 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1362 "srcs": `["impl.cpp"]`,
1363 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001364 "//build/bazel/platforms/arch:arm": False,
1365 "//build/bazel/platforms/arch:x86": False,
1366 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001367 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001368 }),
1369 })
Liz Kammerd366c902021-06-03 13:43:01 -04001370}
1371
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001372func TestCcLibraryStrip(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001373 expectedTargets := []string{}
1374 expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{
1375 "strip": `{
1376 "all": True,
1377 }`,
1378 })...)
1379 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{
1380 "strip": `{
1381 "keep_symbols": True,
1382 }`,
1383 })...)
1384 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{
1385 "strip": `{
1386 "keep_symbols_and_debug_frame": True,
1387 }`,
1388 })...)
1389 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{
1390 "strip": `{
1391 "keep_symbols_list": ["symbol"],
1392 }`,
1393 })...)
1394 expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{
1395 "strip": `{
1396 "none": True,
1397 }`,
1398 })...)
1399 expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...)
1400
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001401 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001402 description: "cc_library strip args",
1403 moduleTypeUnderTest: "cc_library",
1404 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001405 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001406cc_library {
1407 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001408 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001409}
1410cc_library {
1411 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001412 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001413 keep_symbols: true,
1414 },
1415 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001416}
1417cc_library {
1418 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001419 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001420 keep_symbols_and_debug_frame: true,
1421 },
1422 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001423}
1424cc_library {
1425 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001426 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001427 none: true,
1428 },
1429 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001430}
1431cc_library {
1432 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001433 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001434 keep_symbols_list: ["symbol"],
1435 },
1436 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001437}
1438cc_library {
1439 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001440 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001441 all: true,
1442 },
1443 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001444}
1445`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001446 expectedBazelTargets: expectedTargets,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001447 })
1448}
1449
1450func TestCcLibraryStripWithArch(t *testing.T) {
1451 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001452 description: "cc_library strip args",
1453 moduleTypeUnderTest: "cc_library",
1454 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001455 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001456cc_library {
1457 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001458 target: {
1459 darwin: {
1460 strip: {
1461 keep_symbols_list: ["foo", "bar"]
1462 }
1463 },
1464 },
1465 arch: {
1466 arm: {
1467 strip: {
1468 keep_symbols_and_debug_frame: true,
1469 },
1470 },
1471 arm64: {
1472 strip: {
1473 keep_symbols: true,
1474 },
1475 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001476 },
1477 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001478}
1479`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001480 expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{
1481 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001482 "keep_symbols": select({
1483 "//build/bazel/platforms/arch:arm64": True,
1484 "//conditions:default": None,
1485 }),
1486 "keep_symbols_and_debug_frame": select({
1487 "//build/bazel/platforms/arch:arm": True,
1488 "//conditions:default": None,
1489 }),
1490 "keep_symbols_list": select({
1491 "//build/bazel/platforms/os:darwin": [
1492 "foo",
1493 "bar",
1494 ],
1495 "//conditions:default": [],
1496 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001497 }`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001498 }),
1499 },
1500 )
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001501}
Chris Parsons51f8c392021-08-03 21:01:05 -04001502
1503func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1504 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001505 description: "cc_library system_shared_libs empty at root",
1506 moduleTypeUnderTest: "cc_library",
1507 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001508 blueprint: soongCcLibraryPreamble + `
1509cc_library {
1510 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001511 system_shared_libs: [],
1512 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001513}
1514`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001515 expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{
1516 "system_dynamic_deps": `[]`,
1517 }),
1518 },
1519 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001520}
1521
1522func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1523 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001524 description: "cc_library system_shared_libs empty for static variant",
1525 moduleTypeUnderTest: "cc_library",
1526 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001527 blueprint: soongCcLibraryPreamble + `
1528cc_library {
1529 name: "static_empty",
1530 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001531 system_shared_libs: [],
1532 },
1533 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001534}
1535`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001536 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001537 makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{
1538 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001539 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001540 makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001541 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001542 })
1543}
1544
1545func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1546 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001547 description: "cc_library system_shared_libs empty for shared variant",
1548 moduleTypeUnderTest: "cc_library",
1549 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001550 blueprint: soongCcLibraryPreamble + `
1551cc_library {
1552 name: "shared_empty",
1553 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001554 system_shared_libs: [],
1555 },
1556 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001557}
1558`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001559 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001560 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1561 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1562 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001563 }),
1564 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001565 })
1566}
1567
1568func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1569 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001570 description: "cc_library system_shared_libs empty for shared, bionic variant",
1571 moduleTypeUnderTest: "cc_library",
1572 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001573 blueprint: soongCcLibraryPreamble + `
1574cc_library {
1575 name: "shared_empty",
1576 target: {
1577 bionic: {
1578 shared: {
1579 system_shared_libs: [],
1580 }
1581 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001582 },
1583 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001584}
1585`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001586 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001587 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1588 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1589 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001590 }),
1591 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001592 })
1593}
1594
1595func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1596 // Note that this behavior is technically incorrect (it's a simplification).
1597 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1598 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1599 // b/195791252 tracks the fix.
1600 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001601 description: "cc_library system_shared_libs empty for linux_bionic variant",
1602 moduleTypeUnderTest: "cc_library",
1603 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001604 blueprint: soongCcLibraryPreamble + `
1605cc_library {
1606 name: "target_linux_bionic_empty",
1607 target: {
1608 linux_bionic: {
1609 system_shared_libs: [],
1610 },
1611 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001612 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001613}
1614`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001615 expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{
1616 "system_dynamic_deps": `[]`,
1617 }),
1618 },
1619 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001620}
1621
1622func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1623 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001624 description: "cc_library system_shared_libs empty for bionic variant",
1625 moduleTypeUnderTest: "cc_library",
1626 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001627 blueprint: soongCcLibraryPreamble + `
1628cc_library {
1629 name: "target_bionic_empty",
1630 target: {
1631 bionic: {
1632 system_shared_libs: [],
1633 },
1634 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001635 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001636}
1637`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001638 expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{
1639 "system_dynamic_deps": `[]`,
1640 }),
1641 },
1642 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001643}
1644
1645func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1646 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001647 description: "cc_library system_shared_libs set for shared and root",
1648 moduleTypeUnderTest: "cc_library",
1649 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001650 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001651cc_library {
1652 name: "libc",
1653 bazel_module: { bp2build_available: false },
1654}
1655cc_library {
1656 name: "libm",
1657 bazel_module: { bp2build_available: false },
1658}
Chris Parsons51f8c392021-08-03 21:01:05 -04001659
1660cc_library {
1661 name: "foo",
1662 system_shared_libs: ["libc"],
1663 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001664 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001665 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001666 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001667}
1668`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001669 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001670 makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001671 "system_dynamic_deps": `[":libc"]`,
1672 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001673 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1674 "system_dynamic_deps": `[
1675 ":libc",
1676 ":libm",
1677 ]`,
1678 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001679 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001680 })
1681}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001682
1683func TestCcLibraryOsSelects(t *testing.T) {
1684 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001685 description: "cc_library - selects for all os targets",
1686 moduleTypeUnderTest: "cc_library",
1687 moduleTypeUnderTestFactory: cc.LibraryFactory,
1688 filesystem: map[string]string{},
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001689 blueprint: soongCcLibraryPreamble + `
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001690cc_library {
1691 name: "foo-lib",
1692 srcs: ["base.cpp"],
1693 target: {
1694 android: {
1695 srcs: ["android.cpp"],
1696 },
1697 linux: {
1698 srcs: ["linux.cpp"],
1699 },
1700 linux_glibc: {
1701 srcs: ["linux_glibc.cpp"],
1702 },
1703 darwin: {
1704 srcs: ["darwin.cpp"],
1705 },
1706 bionic: {
1707 srcs: ["bionic.cpp"],
1708 },
1709 linux_musl: {
1710 srcs: ["linux_musl.cpp"],
1711 },
1712 windows: {
1713 srcs: ["windows.cpp"],
1714 },
1715 },
1716 include_build_directory: false,
1717}
1718`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001719 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1720 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001721 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001722 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001723 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001724 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001725 ],
1726 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1727 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001728 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001729 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001730 ],
1731 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001732 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001733 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001734 ],
1735 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001736 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001737 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001738 ],
1739 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1740 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001741 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001742 }),
1743 },
1744 )
Jingwen Chen97b85312021-10-08 10:41:31 +00001745}
1746
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001747func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001748 type testCase struct {
1749 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001750 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001751 gnu_extensions string
1752 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001753 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001754 }
1755
1756 testCases := []testCase{
1757 // Existing usages of cpp_std in AOSP are:
1758 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1759 //
1760 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1761 // is set in the toolchain.)
1762 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001763 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001764 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1765 // experimental defaults to gnu++2a
1766 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001767 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001768 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1769 // Explicitly setting a c++ std does not use replace gnu++ std even if
1770 // gnu_extensions is true.
1771 // "c++11",
1772 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001773 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001774 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1775 // "c++17",
1776 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001777 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001778 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1779 // "c++2a",
1780 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001781 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001782 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1783 // "c++98",
1784 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001785 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001786 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1787 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1788 // "gnu++11",
1789 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001790 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001791 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1792 // "gnu++17",
1793 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001794 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001795 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001796
1797 // some c_std test cases
1798 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1799 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1800 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1801 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1802 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1803 {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 +00001804 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001805 for i, tc := range testCases {
1806 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001807 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001808 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001809 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001810 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001811 cStdProp := ""
1812 if tc.c_std != "" {
1813 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1814 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001815 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001816 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001817 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001818 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001819 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001820 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001821 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001822 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001823 if tc.bazel_c_std != "" {
1824 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1825 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001826
1827 runCcLibraryTestCase(t, bp2buildTestCase{
1828 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001829 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1830 moduleTypeUnderTest: "cc_library",
1831 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen97b85312021-10-08 10:41:31 +00001832 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1833cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001834 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001835%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001836%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001837%s // gnu_extensions: *bool
1838 include_build_directory: false,
1839}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001840`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001841 expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
Jingwen Chen97b85312021-10-08 10:41:31 +00001842 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001843
1844 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1845 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001846 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1847 moduleTypeUnderTest: "cc_library_static",
1848 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001849 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1850cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001851 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001852%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001853%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001854%s // gnu_extensions: *bool
1855 include_build_directory: false,
1856}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001857`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001858 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001859 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001860 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001861 })
1862
1863 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1864 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001865 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1866 moduleTypeUnderTest: "cc_library_shared",
1867 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001868 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1869cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001870 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001871%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001872%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001873%s // gnu_extensions: *bool
1874 include_build_directory: false,
1875}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001876`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001877 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001878 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001879 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001880 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001881 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001882}
Liz Kammer12615db2021-09-28 09:19:17 -04001883
1884func TestCcLibraryProtoSimple(t *testing.T) {
1885 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001886 moduleTypeUnderTest: "cc_library",
1887 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001888 blueprint: soongCcProtoPreamble + `cc_library {
1889 name: "foo",
1890 srcs: ["foo.proto"],
1891 include_build_directory: false,
1892}`,
1893 expectedBazelTargets: []string{
1894 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1895 "srcs": `["foo.proto"]`,
1896 "strip_import_prefix": `""`,
1897 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1898 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001899 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04001900 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001901 "deps": `[":libprotobuf-cpp-lite"]`,
1902 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1903 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04001904 }),
1905 },
1906 })
1907}
1908
1909func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) {
1910 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001911 moduleTypeUnderTest: "cc_library",
1912 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001913 blueprint: soongCcProtoPreamble + `cc_library {
1914 name: "foo",
1915 srcs: ["foo.proto"],
1916 proto: { canonical_path_from_root: false},
1917 include_build_directory: false,
1918}`,
1919 expectedBazelTargets: []string{
1920 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1921 "srcs": `["foo.proto"]`,
1922 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1923 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001924 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04001925 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001926 "deps": `[":libprotobuf-cpp-lite"]`,
1927 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1928 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04001929 }),
1930 },
1931 })
1932}
1933
1934func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
1935 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001936 moduleTypeUnderTest: "cc_library",
1937 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001938 blueprint: soongCcProtoPreamble + `cc_library {
1939 name: "foo",
1940 srcs: ["foo.proto"],
1941 proto: { canonical_path_from_root: true},
1942 include_build_directory: false,
1943}`,
1944 expectedBazelTargets: []string{
1945 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1946 "srcs": `["foo.proto"]`,
1947 "strip_import_prefix": `""`,
1948 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1949 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001950 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04001951 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001952 "deps": `[":libprotobuf-cpp-lite"]`,
1953 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1954 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04001955 }),
1956 },
1957 })
1958}
1959
1960func TestCcLibraryProtoFull(t *testing.T) {
1961 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001962 moduleTypeUnderTest: "cc_library",
1963 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001964 blueprint: soongCcProtoPreamble + `cc_library {
1965 name: "foo",
1966 srcs: ["foo.proto"],
1967 proto: {
1968 canonical_path_from_root: false,
1969 type: "full",
1970 },
1971 include_build_directory: false,
1972}`,
1973 expectedBazelTargets: []string{
1974 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1975 "srcs": `["foo.proto"]`,
1976 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
1977 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001978 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04001979 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001980 "deps": `[":libprotobuf-cpp-full"]`,
1981 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1982 "dynamic_deps": `[":libprotobuf-cpp-full"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04001983 }),
1984 },
1985 })
1986}
1987
1988func TestCcLibraryProtoLite(t *testing.T) {
1989 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001990 moduleTypeUnderTest: "cc_library",
1991 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001992 blueprint: soongCcProtoPreamble + `cc_library {
1993 name: "foo",
1994 srcs: ["foo.proto"],
1995 proto: {
1996 canonical_path_from_root: false,
1997 type: "lite",
1998 },
1999 include_build_directory: false,
2000}`,
2001 expectedBazelTargets: []string{
2002 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2003 "srcs": `["foo.proto"]`,
2004 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2005 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002006 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002007 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002008 "deps": `[":libprotobuf-cpp-lite"]`,
2009 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2010 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002011 }),
2012 },
2013 })
2014}
2015
2016func TestCcLibraryProtoExportHeaders(t *testing.T) {
2017 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002018 moduleTypeUnderTest: "cc_library",
2019 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002020 blueprint: soongCcProtoPreamble + `cc_library {
2021 name: "foo",
2022 srcs: ["foo.proto"],
2023 proto: {
2024 canonical_path_from_root: false,
2025 export_proto_headers: true,
2026 },
2027 include_build_directory: false,
2028}`,
2029 expectedBazelTargets: []string{
2030 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2031 "srcs": `["foo.proto"]`,
2032 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2033 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002034 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2035 "deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002036 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002037 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2038 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2039 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002040 }),
2041 },
2042 })
2043}