blob: 8fde6550f726bfdd7c9ac02e755d64eb93f1554a [file] [log] [blame]
Jingwen Chen63930982021-03-24 10:04:33 -04001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package bp2build
16
17import (
Jingwen Chen6ada5892021-09-17 11:38:09 +000018 "fmt"
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000019 "testing"
20
Jingwen Chen63930982021-03-24 10:04:33 -040021 "android/soong/android"
22 "android/soong/cc"
Jingwen Chen63930982021-03-24 10:04:33 -040023)
24
25const (
26 // See cc/testing.go for more context
27 soongCcLibraryPreamble = `
28cc_defaults {
Liz Kammer8337ea42021-09-10 10:06:32 -040029 name: "linux_bionic_supported",
Jingwen Chen63930982021-03-24 10:04:33 -040030}`
Liz Kammer12615db2021-09-28 09:19:17 -040031
32 soongCcProtoLibraries = `
33cc_library {
34 name: "libprotobuf-cpp-lite",
35 bazel_module: { bp2build_available: false },
36}
37
38cc_library {
39 name: "libprotobuf-cpp-full",
40 bazel_module: { bp2build_available: false },
41}`
42
43 soongCcProtoPreamble = soongCcLibraryPreamble + soongCcProtoLibraries
Jingwen Chen63930982021-03-24 10:04:33 -040044)
45
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020046func runCcLibraryTestCase(t *testing.T, tc bp2buildTestCase) {
Liz Kammere4982e82021-05-25 10:39:35 -040047 t.Helper()
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020048 runBp2BuildTestCase(t, registerCcLibraryModuleTypes, tc)
49}
50
51func registerCcLibraryModuleTypes(ctx android.RegistrationContext) {
52 cc.RegisterCCBuildComponents(ctx)
Jingwen Chen14a8bda2021-06-02 11:10:02 +000053 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020054 ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
Liz Kammer2d7bbe32021-06-10 18:20:06 -040055 ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020056 ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
57}
58
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020059func TestCcLibrarySimple(t *testing.T) {
60 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -040061 description: "cc_library - simple example",
62 moduleTypeUnderTest: "cc_library",
63 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020064 filesystem: map[string]string{
65 "android.cpp": "",
Liz Kammer01a16e82021-07-16 16:33:47 -040066 "bionic.cpp": "",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020067 "darwin.cpp": "",
68 // Refer to cc.headerExts for the supported header extensions in Soong.
69 "header.h": "",
70 "header.hh": "",
71 "header.hpp": "",
72 "header.hxx": "",
73 "header.h++": "",
74 "header.inl": "",
75 "header.inc": "",
76 "header.ipp": "",
77 "header.h.generic": "",
78 "impl.cpp": "",
79 "linux.cpp": "",
80 "x86.cpp": "",
81 "x86_64.cpp": "",
82 "foo-dir/a.h": "",
83 },
Liz Kammer78cfdaa2021-11-08 12:56:31 -050084 blueprint: soongCcLibraryPreamble +
85 simpleModuleDoNotConvertBp2build("cc_library_headers", "some-headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -040086cc_library {
87 name: "foo-lib",
88 srcs: ["impl.cpp"],
89 cflags: ["-Wall"],
90 header_libs: ["some-headers"],
91 export_include_dirs: ["foo-dir"],
92 ldflags: ["-Wl,--exclude-libs=bar.a"],
93 arch: {
94 x86: {
95 ldflags: ["-Wl,--exclude-libs=baz.a"],
96 srcs: ["x86.cpp"],
97 },
98 x86_64: {
99 ldflags: ["-Wl,--exclude-libs=qux.a"],
100 srcs: ["x86_64.cpp"],
101 },
102 },
103 target: {
104 android: {
105 srcs: ["android.cpp"],
106 },
107 linux_glibc: {
108 srcs: ["linux.cpp"],
109 },
110 darwin: {
111 srcs: ["darwin.cpp"],
112 },
Liz Kammer01a16e82021-07-16 16:33:47 -0400113 bionic: {
114 srcs: ["bionic.cpp"]
115 },
Jingwen Chen63930982021-03-24 10:04:33 -0400116 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400117 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400118}
119`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500120 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
121 "copts": `["-Wall"]`,
122 "export_includes": `["foo-dir"]`,
123 "implementation_deps": `[":some-headers"]`,
124 "linkopts": `["-Wl,--exclude-libs=bar.a"] + select({
Jingwen Chened9c17d2021-04-13 07:14:55 +0000125 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
126 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
127 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500128 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500129 "srcs": `["impl.cpp"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000130 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
131 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen63930982021-03-24 10:04:33 -0400132 "//conditions:default": [],
133 }) + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400134 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400135 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -0400136 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400137 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000138 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
139 "//build/bazel/platforms/os:linux": ["linux.cpp"],
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400140 "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"],
Liz Kammer01a16e82021-07-16 16:33:47 -0400141 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500142 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500143 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500144 })
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200145}
146
147func TestCcLibraryTrimmedLdAndroid(t *testing.T) {
148 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400149 description: "cc_library - trimmed example of //bionic/linker:ld-android",
150 moduleTypeUnderTest: "cc_library",
151 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200152 filesystem: map[string]string{
153 "ld-android.cpp": "",
154 "linked_list.h": "",
155 "linker.h": "",
156 "linker_block_allocator.h": "",
157 "linker_cfi.h": "",
Jingwen Chen63930982021-03-24 10:04:33 -0400158 },
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400159 blueprint: soongCcLibraryPreamble +
160 simpleModuleDoNotConvertBp2build("cc_library_headers", "libc_headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -0400161cc_library {
162 name: "fake-ld-android",
163 srcs: ["ld_android.cpp"],
164 cflags: [
165 "-Wall",
166 "-Wextra",
167 "-Wunused",
168 "-Werror",
169 ],
170 header_libs: ["libc_headers"],
171 ldflags: [
172 "-Wl,--exclude-libs=libgcc.a",
173 "-Wl,--exclude-libs=libgcc_stripped.a",
174 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
175 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
176 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
177 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
178 ],
179 arch: {
180 x86: {
181 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
182 },
183 x86_64: {
184 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
185 },
186 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400187 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400188}
189`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500190 expectedBazelTargets: makeCcLibraryTargets("fake-ld-android", attrNameToString{
191 "srcs": `["ld_android.cpp"]`,
192 "copts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400193 "-Wall",
194 "-Wextra",
195 "-Wunused",
196 "-Werror",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500197 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500198 "implementation_deps": `[":libc_headers"]`,
199 "linkopts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400200 "-Wl,--exclude-libs=libgcc.a",
201 "-Wl,--exclude-libs=libgcc_stripped.a",
202 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
203 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
204 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
205 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
206 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000207 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=libgcc_eh.a"],
208 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"],
Jingwen Chen63930982021-03-24 10:04:33 -0400209 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500210 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500211 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200212 })
213}
214
215func TestCcLibraryExcludeSrcs(t *testing.T) {
216 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400217 description: "cc_library exclude_srcs - trimmed example of //external/arm-optimized-routines:libarm-optimized-routines-math",
218 moduleTypeUnderTest: "cc_library",
219 moduleTypeUnderTestFactory: cc.LibraryFactory,
220 dir: "external",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200221 filesystem: map[string]string{
222 "external/math/cosf.c": "",
223 "external/math/erf.c": "",
224 "external/math/erf_data.c": "",
225 "external/math/erff.c": "",
226 "external/math/erff_data.c": "",
227 "external/Android.bp": `
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000228cc_library {
229 name: "fake-libarm-optimized-routines-math",
230 exclude_srcs: [
231 // Provided by:
232 // bionic/libm/upstream-freebsd/lib/msun/src/s_erf.c
233 // bionic/libm/upstream-freebsd/lib/msun/src/s_erff.c
234 "math/erf.c",
235 "math/erf_data.c",
236 "math/erff.c",
237 "math/erff_data.c",
238 ],
239 srcs: [
240 "math/*.c",
241 ],
242 // arch-specific settings
243 arch: {
244 arm64: {
245 cflags: [
246 "-DHAVE_FAST_FMA=1",
247 ],
248 },
249 },
250 bazel_module: { bp2build_available: true },
251}
252`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200253 },
254 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500255 expectedBazelTargets: makeCcLibraryTargets("fake-libarm-optimized-routines-math", attrNameToString{
256 "copts": `select({
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000257 "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"],
258 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500259 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500260 "local_includes": `["."]`,
261 "srcs_c": `["math/cosf.c"]`,
262 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200263 })
264}
265
266func TestCcLibrarySharedStaticProps(t *testing.T) {
267 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400268 description: "cc_library shared/static props",
269 moduleTypeUnderTest: "cc_library",
270 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200271 filesystem: map[string]string{
Liz Kammer8337ea42021-09-10 10:06:32 -0400272 "both.cpp": "",
273 "sharedonly.cpp": "",
274 "staticonly.cpp": "",
275 },
276 blueprint: soongCcLibraryPreamble + `
Jingwen Chen53681ef2021-04-29 08:15:13 +0000277cc_library {
278 name: "a",
Chris Parsons08648312021-05-06 16:23:19 -0400279 srcs: ["both.cpp"],
280 cflags: ["bothflag"],
281 shared_libs: ["shared_dep_for_both"],
282 static_libs: ["static_dep_for_both"],
283 whole_static_libs: ["whole_static_lib_for_both"],
284 static: {
285 srcs: ["staticonly.cpp"],
286 cflags: ["staticflag"],
287 shared_libs: ["shared_dep_for_static"],
288 static_libs: ["static_dep_for_static"],
289 whole_static_libs: ["whole_static_lib_for_static"],
290 },
291 shared: {
292 srcs: ["sharedonly.cpp"],
293 cflags: ["sharedflag"],
294 shared_libs: ["shared_dep_for_shared"],
295 static_libs: ["static_dep_for_shared"],
296 whole_static_libs: ["whole_static_lib_for_shared"],
297 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400298 include_build_directory: false,
Jingwen Chen53681ef2021-04-29 08:15:13 +0000299}
300
Liz Kammer8337ea42021-09-10 10:06:32 -0400301cc_library_static {
302 name: "static_dep_for_shared",
303 bazel_module: { bp2build_available: false },
304}
Chris Parsons08648312021-05-06 16:23:19 -0400305
Liz Kammer8337ea42021-09-10 10:06:32 -0400306cc_library_static {
307 name: "static_dep_for_static",
308 bazel_module: { bp2build_available: false },
309}
Chris Parsons08648312021-05-06 16:23:19 -0400310
Liz Kammer8337ea42021-09-10 10:06:32 -0400311cc_library_static {
312 name: "static_dep_for_both",
313 bazel_module: { bp2build_available: false },
314}
Chris Parsons08648312021-05-06 16:23:19 -0400315
Liz Kammer8337ea42021-09-10 10:06:32 -0400316cc_library_static {
317 name: "whole_static_lib_for_shared",
318 bazel_module: { bp2build_available: false },
319}
Chris Parsons08648312021-05-06 16:23:19 -0400320
Liz Kammer8337ea42021-09-10 10:06:32 -0400321cc_library_static {
322 name: "whole_static_lib_for_static",
323 bazel_module: { bp2build_available: false },
324}
Chris Parsons08648312021-05-06 16:23:19 -0400325
Liz Kammer8337ea42021-09-10 10:06:32 -0400326cc_library_static {
327 name: "whole_static_lib_for_both",
328 bazel_module: { bp2build_available: false },
329}
Chris Parsons08648312021-05-06 16:23:19 -0400330
Liz Kammer8337ea42021-09-10 10:06:32 -0400331cc_library {
332 name: "shared_dep_for_shared",
333 bazel_module: { bp2build_available: false },
334}
Chris Parsons08648312021-05-06 16:23:19 -0400335
Liz Kammer8337ea42021-09-10 10:06:32 -0400336cc_library {
337 name: "shared_dep_for_static",
338 bazel_module: { bp2build_available: false },
339}
Chris Parsons08648312021-05-06 16:23:19 -0400340
Liz Kammer8337ea42021-09-10 10:06:32 -0400341cc_library {
342 name: "shared_dep_for_both",
343 bazel_module: { bp2build_available: false },
344}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000345`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500346 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500347 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
348 "copts": `[
349 "bothflag",
350 "staticflag",
351 ]`,
352 "implementation_deps": `[
353 ":static_dep_for_both",
354 ":static_dep_for_static",
355 ]`,
356 "implementation_dynamic_deps": `[
357 ":shared_dep_for_both",
358 ":shared_dep_for_static",
359 ]`,
360 "srcs": `[
361 "both.cpp",
362 "staticonly.cpp",
363 ]`,
364 "whole_archive_deps": `[
365 ":whole_static_lib_for_both",
366 ":whole_static_lib_for_static",
367 ]`}),
368 makeBazelTarget("cc_library_shared", "a", attrNameToString{
369 "copts": `[
370 "bothflag",
371 "sharedflag",
372 ]`,
373 "implementation_deps": `[
374 ":static_dep_for_both",
375 ":static_dep_for_shared",
376 ]`,
377 "implementation_dynamic_deps": `[
378 ":shared_dep_for_both",
379 ":shared_dep_for_shared",
380 ]`,
381 "srcs": `[
382 "both.cpp",
383 "sharedonly.cpp",
384 ]`,
385 "whole_archive_deps": `[
386 ":whole_static_lib_for_both",
387 ":whole_static_lib_for_shared",
388 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500389 }),
390 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200391 })
392}
393
Liz Kammer7a210ac2021-09-22 15:52:58 -0400394func TestCcLibraryDeps(t *testing.T) {
395 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400396 description: "cc_library shared/static props",
397 moduleTypeUnderTest: "cc_library",
398 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer7a210ac2021-09-22 15:52:58 -0400399 filesystem: map[string]string{
400 "both.cpp": "",
401 "sharedonly.cpp": "",
402 "staticonly.cpp": "",
403 },
404 blueprint: soongCcLibraryPreamble + `
405cc_library {
406 name: "a",
407 srcs: ["both.cpp"],
408 cflags: ["bothflag"],
409 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
410 export_shared_lib_headers: ["shared_dep_for_both"],
411 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
412 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
413 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
414 static: {
415 srcs: ["staticonly.cpp"],
416 cflags: ["staticflag"],
417 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
418 export_shared_lib_headers: ["shared_dep_for_static"],
419 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
420 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
421 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
422 },
423 shared: {
424 srcs: ["sharedonly.cpp"],
425 cflags: ["sharedflag"],
426 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
427 export_shared_lib_headers: ["shared_dep_for_shared"],
428 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
429 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
430 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
431 },
432 include_build_directory: false,
433}
434` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
435 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
436 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
437 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
438 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
439 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
440 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
441 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
442 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
443 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
444 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
445 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
446 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
447 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
448 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
449 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
450 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
451 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500452 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500453 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
454 "copts": `[
455 "bothflag",
456 "staticflag",
457 ]`,
458 "deps": `[
459 ":static_dep_for_both",
460 ":static_dep_for_static",
461 ]`,
462 "dynamic_deps": `[
463 ":shared_dep_for_both",
464 ":shared_dep_for_static",
465 ]`,
466 "implementation_deps": `[
467 ":implementation_static_dep_for_both",
468 ":implementation_static_dep_for_static",
469 ]`,
470 "implementation_dynamic_deps": `[
471 ":implementation_shared_dep_for_both",
472 ":implementation_shared_dep_for_static",
473 ]`,
474 "srcs": `[
475 "both.cpp",
476 "staticonly.cpp",
477 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500478 "whole_archive_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400479 ":not_explicitly_exported_whole_static_dep_for_both",
480 ":whole_static_dep_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500481 ":not_explicitly_exported_whole_static_dep_for_static",
482 ":whole_static_dep_for_static",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500483 ]`,
484 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500485 makeBazelTarget("cc_library_shared", "a", attrNameToString{
486 "copts": `[
487 "bothflag",
488 "sharedflag",
489 ]`,
490 "deps": `[
491 ":static_dep_for_both",
492 ":static_dep_for_shared",
493 ]`,
494 "dynamic_deps": `[
495 ":shared_dep_for_both",
496 ":shared_dep_for_shared",
497 ]`,
498 "implementation_deps": `[
499 ":implementation_static_dep_for_both",
500 ":implementation_static_dep_for_shared",
501 ]`,
502 "implementation_dynamic_deps": `[
503 ":implementation_shared_dep_for_both",
504 ":implementation_shared_dep_for_shared",
505 ]`,
506 "srcs": `[
507 "both.cpp",
508 "sharedonly.cpp",
509 ]`,
510 "whole_archive_deps": `[
511 ":not_explicitly_exported_whole_static_dep_for_both",
512 ":whole_static_dep_for_both",
513 ":not_explicitly_exported_whole_static_dep_for_shared",
514 ":whole_static_dep_for_shared",
515 ]`,
516 })},
517 },
518 )
Liz Kammer7a210ac2021-09-22 15:52:58 -0400519}
520
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400521func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
522 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400523 moduleTypeUnderTest: "cc_library",
524 moduleTypeUnderTestFactory: cc.LibraryFactory,
525 dir: "foo/bar",
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400526 filesystem: map[string]string{
527 "foo/bar/Android.bp": `
528cc_library {
529 name: "a",
530 whole_static_libs: ["whole_static_lib_for_both"],
531 static: {
532 whole_static_libs: ["whole_static_lib_for_static"],
533 },
534 shared: {
535 whole_static_libs: ["whole_static_lib_for_shared"],
536 },
537 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400538 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400539}
540
541cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
542
543cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
544
545cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
546`,
547 },
548 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500549 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500550 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
551 "whole_archive_deps": `[
552 ":whole_static_lib_for_both_alwayslink",
553 ":whole_static_lib_for_static_alwayslink",
554 ]`,
555 }),
556 makeBazelTarget("cc_library_shared", "a", attrNameToString{
557 "whole_archive_deps": `[
558 ":whole_static_lib_for_both_alwayslink",
559 ":whole_static_lib_for_shared_alwayslink",
560 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500561 }),
562 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500563 },
564 )
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400565}
566
Jingwen Chenbcf53042021-05-26 04:42:42 +0000567func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
568 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400569 description: "cc_library shared/static props in arch",
570 moduleTypeUnderTest: "cc_library",
571 moduleTypeUnderTestFactory: cc.LibraryFactory,
572 dir: "foo/bar",
Jingwen Chenbcf53042021-05-26 04:42:42 +0000573 filesystem: map[string]string{
574 "foo/bar/arm.cpp": "",
575 "foo/bar/x86.cpp": "",
576 "foo/bar/sharedonly.cpp": "",
577 "foo/bar/staticonly.cpp": "",
578 "foo/bar/Android.bp": `
579cc_library {
580 name: "a",
581 arch: {
582 arm: {
583 shared: {
584 srcs: ["arm_shared.cpp"],
585 cflags: ["-DARM_SHARED"],
586 static_libs: ["arm_static_dep_for_shared"],
587 whole_static_libs: ["arm_whole_static_dep_for_shared"],
588 shared_libs: ["arm_shared_dep_for_shared"],
589 },
590 },
591 x86: {
592 static: {
593 srcs: ["x86_static.cpp"],
594 cflags: ["-DX86_STATIC"],
595 static_libs: ["x86_dep_for_static"],
596 },
597 },
598 },
599 target: {
600 android: {
601 shared: {
602 srcs: ["android_shared.cpp"],
603 cflags: ["-DANDROID_SHARED"],
604 static_libs: ["android_dep_for_shared"],
605 },
606 },
607 android_arm: {
608 shared: {
609 cflags: ["-DANDROID_ARM_SHARED"],
610 },
611 },
612 },
613 srcs: ["both.cpp"],
614 cflags: ["bothflag"],
615 static_libs: ["static_dep_for_both"],
616 static: {
617 srcs: ["staticonly.cpp"],
618 cflags: ["staticflag"],
619 static_libs: ["static_dep_for_static"],
620 },
621 shared: {
622 srcs: ["sharedonly.cpp"],
623 cflags: ["sharedflag"],
624 static_libs: ["static_dep_for_shared"],
625 },
626 bazel_module: { bp2build_available: true },
627}
628
629cc_library_static { name: "static_dep_for_shared" }
630cc_library_static { name: "static_dep_for_static" }
631cc_library_static { name: "static_dep_for_both" }
632
633cc_library_static { name: "arm_static_dep_for_shared" }
634cc_library_static { name: "arm_whole_static_dep_for_shared" }
635cc_library_static { name: "arm_shared_dep_for_shared" }
636
637cc_library_static { name: "x86_dep_for_static" }
638
639cc_library_static { name: "android_dep_for_shared" }
640`,
641 },
642 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500643 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500644 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
645 "copts": `[
646 "bothflag",
647 "staticflag",
648 ] + select({
649 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
650 "//conditions:default": [],
651 })`,
652 "implementation_deps": `[
653 ":static_dep_for_both",
654 ":static_dep_for_static",
655 ] + select({
656 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
657 "//conditions:default": [],
658 })`,
659 "local_includes": `["."]`,
660 "srcs": `[
661 "both.cpp",
662 "staticonly.cpp",
663 ] + select({
664 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
665 "//conditions:default": [],
666 })`,
667 }),
668 makeBazelTarget("cc_library_shared", "a", attrNameToString{
669 "copts": `[
670 "bothflag",
671 "sharedflag",
672 ] + select({
673 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
674 "//conditions:default": [],
675 }) + select({
676 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
677 "//conditions:default": [],
678 }) + select({
679 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
680 "//conditions:default": [],
681 })`,
682 "implementation_deps": `[
683 ":static_dep_for_both",
684 ":static_dep_for_shared",
685 ] + select({
686 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
687 "//conditions:default": [],
688 }) + select({
689 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
690 "//conditions:default": [],
691 })`,
692 "implementation_dynamic_deps": `select({
693 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
694 "//conditions:default": [],
695 })`,
696 "local_includes": `["."]`,
697 "srcs": `[
698 "both.cpp",
699 "sharedonly.cpp",
700 ] + select({
701 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
702 "//conditions:default": [],
703 }) + select({
704 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
705 "//conditions:default": [],
706 })`,
707 "whole_archive_deps": `select({
708 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
709 "//conditions:default": [],
710 })`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500711 }),
712 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500713 },
714 )
Jingwen Chenbcf53042021-05-26 04:42:42 +0000715}
716
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000717func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
718 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400719 description: "cc_library shared/static props with c/cpp/s mixed sources",
720 moduleTypeUnderTest: "cc_library",
721 moduleTypeUnderTestFactory: cc.LibraryFactory,
722 dir: "foo/bar",
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000723 filesystem: map[string]string{
724 "foo/bar/both_source.cpp": "",
725 "foo/bar/both_source.cc": "",
726 "foo/bar/both_source.c": "",
727 "foo/bar/both_source.s": "",
728 "foo/bar/both_source.S": "",
729 "foo/bar/shared_source.cpp": "",
730 "foo/bar/shared_source.cc": "",
731 "foo/bar/shared_source.c": "",
732 "foo/bar/shared_source.s": "",
733 "foo/bar/shared_source.S": "",
734 "foo/bar/static_source.cpp": "",
735 "foo/bar/static_source.cc": "",
736 "foo/bar/static_source.c": "",
737 "foo/bar/static_source.s": "",
738 "foo/bar/static_source.S": "",
739 "foo/bar/Android.bp": `
740cc_library {
741 name: "a",
742 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400743 "both_source.cpp",
744 "both_source.cc",
745 "both_source.c",
746 "both_source.s",
747 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400748 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400749 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000750 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400751 srcs: [
752 "static_source.cpp",
753 "static_source.cc",
754 "static_source.c",
755 "static_source.s",
756 "static_source.S",
757 ":static_filegroup",
758 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000759 },
760 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400761 srcs: [
762 "shared_source.cpp",
763 "shared_source.cc",
764 "shared_source.c",
765 "shared_source.s",
766 "shared_source.S",
767 ":shared_filegroup",
768 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000769 },
770 bazel_module: { bp2build_available: true },
771}
772
773filegroup {
774 name: "both_filegroup",
775 srcs: [
776 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400777 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000778}
779
780filegroup {
781 name: "shared_filegroup",
782 srcs: [
783 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400784 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000785}
786
787filegroup {
788 name: "static_filegroup",
789 srcs: [
790 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400791 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000792}
793`,
794 },
795 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500796 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500797 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500798 "local_includes": `["."]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500799 "srcs": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000800 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400801 "both_source.cc",
802 ":both_filegroup_cpp_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500803 "static_source.cpp",
804 "static_source.cc",
805 ":static_filegroup_cpp_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500806 ]`,
807 "srcs_as": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000808 "both_source.s",
809 "both_source.S",
810 ":both_filegroup_as_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500811 "static_source.s",
812 "static_source.S",
813 ":static_filegroup_as_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500814 ]`,
815 "srcs_c": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000816 "both_source.c",
817 ":both_filegroup_c_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500818 "static_source.c",
819 ":static_filegroup_c_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500820 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500821 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500822 makeBazelTarget("cc_library_shared", "a", attrNameToString{
823 "local_includes": `["."]`,
824 "srcs": `[
825 "both_source.cpp",
826 "both_source.cc",
827 ":both_filegroup_cpp_srcs",
828 "shared_source.cpp",
829 "shared_source.cc",
830 ":shared_filegroup_cpp_srcs",
831 ]`,
832 "srcs_as": `[
833 "both_source.s",
834 "both_source.S",
835 ":both_filegroup_as_srcs",
836 "shared_source.s",
837 "shared_source.S",
838 ":shared_filegroup_as_srcs",
839 ]`,
840 "srcs_c": `[
841 "both_source.c",
842 ":both_filegroup_c_srcs",
843 "shared_source.c",
844 ":shared_filegroup_c_srcs",
845 ]`,
846 })}})
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000847}
848
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200849func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
850 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400851 description: "cc_library non-configured version script",
852 moduleTypeUnderTest: "cc_library",
853 moduleTypeUnderTestFactory: cc.LibraryFactory,
854 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200855 filesystem: map[string]string{
856 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200857cc_library {
858 name: "a",
859 srcs: ["a.cpp"],
860 version_script: "v.map",
861 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400862 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200863}
864`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200865 },
866 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500867 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
868 "additional_linker_inputs": `["v.map"]`,
869 "linkopts": `["-Wl,--version-script,$(location v.map)"]`,
870 "srcs": `["a.cpp"]`,
871 }),
872 },
873 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200874}
875
876func TestCcLibraryConfiguredVersionScript(t *testing.T) {
877 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400878 description: "cc_library configured version script",
879 moduleTypeUnderTest: "cc_library",
880 moduleTypeUnderTestFactory: cc.LibraryFactory,
881 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200882 filesystem: map[string]string{
883 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400884cc_library {
885 name: "a",
886 srcs: ["a.cpp"],
887 arch: {
888 arm: {
889 version_script: "arm.map",
890 },
891 arm64: {
892 version_script: "arm64.map",
893 },
894 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200895
Liz Kammer8337ea42021-09-10 10:06:32 -0400896 bazel_module: { bp2build_available: true },
897 include_build_directory: false,
898}
Liz Kammerd366c902021-06-03 13:43:01 -0400899 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200900 },
901 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500902 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
903 "additional_linker_inputs": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400904 "//build/bazel/platforms/arch:arm": ["arm.map"],
905 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
906 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500907 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500908 "linkopts": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400909 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
910 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
911 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500912 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500913 "srcs": `["a.cpp"]`,
914 }),
915 },
916 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200917}
918
919func TestCcLibrarySharedLibs(t *testing.T) {
920 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400921 description: "cc_library shared_libs",
922 moduleTypeUnderTest: "cc_library",
923 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400924 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400925cc_library {
926 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400927 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400928}
929
930cc_library {
931 name: "a",
932 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400933 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400934}
935`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500936 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
937 "implementation_dynamic_deps": `[":mylib"]`,
938 }),
939 },
940 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200941}
942
Liz Kammer0eae52e2021-10-06 10:32:26 -0400943func TestCcLibraryFeatures(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -0500944 expected_targets := []string{}
945 expected_targets = append(expected_targets, makeCcLibraryTargets("a", attrNameToString{
946 "features": `[
947 "disable_pack_relocations",
948 "-no_undefined_symbols",
949 ]`,
950 "srcs": `["a.cpp"]`,
951 })...)
952 expected_targets = append(expected_targets, makeCcLibraryTargets("b", attrNameToString{
953 "features": `select({
954 "//build/bazel/platforms/arch:x86_64": [
955 "disable_pack_relocations",
956 "-no_undefined_symbols",
957 ],
958 "//conditions:default": [],
959 })`,
960 "srcs": `["b.cpp"]`,
961 })...)
962 expected_targets = append(expected_targets, makeCcLibraryTargets("c", attrNameToString{
963 "features": `select({
964 "//build/bazel/platforms/os:darwin": [
965 "disable_pack_relocations",
966 "-no_undefined_symbols",
967 ],
968 "//conditions:default": [],
969 })`,
970 "srcs": `["c.cpp"]`,
971 })...)
972
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200973 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400974 description: "cc_library pack_relocations test",
975 moduleTypeUnderTest: "cc_library",
976 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400977 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400978cc_library {
979 name: "a",
980 srcs: ["a.cpp"],
981 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400982 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400983 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400984}
985
986cc_library {
987 name: "b",
988 srcs: ["b.cpp"],
989 arch: {
990 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400991 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400992 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400993 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400994 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400995 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400996}
997
998cc_library {
999 name: "c",
1000 srcs: ["c.cpp"],
1001 target: {
1002 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001003 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001004 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001005 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001006 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001007 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001008}`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001009 expectedBazelTargets: expected_targets,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001010 })
1011}
1012
1013func TestCcLibrarySpacesInCopts(t *testing.T) {
1014 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001015 description: "cc_library spaces in copts",
1016 moduleTypeUnderTest: "cc_library",
1017 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001018 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +00001019cc_library {
1020 name: "a",
1021 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -04001022 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +00001023}
1024`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001025 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1026 "copts": `[
Jingwen Chen3950cd62021-05-12 04:33:00 +00001027 "-include",
1028 "header.h",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001029 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001030 }),
1031 },
1032 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001033}
1034
1035func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
1036 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001037 description: "cc_library cppflags usage",
1038 moduleTypeUnderTest: "cc_library",
1039 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001040 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001041 name: "a",
1042 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001043 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001044 cppflags: [
1045 "-fsigned-char",
1046 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -04001047 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001048 arch: {
1049 arm64: {
1050 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001051 },
Liz Kammerd366c902021-06-03 13:43:01 -04001052 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001053 target: {
1054 android: {
1055 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001056 },
Liz Kammerd366c902021-06-03 13:43:01 -04001057 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001058 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001059}
1060`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001061 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1062 "copts": `["-Wall"]`,
1063 "cppflags": `[
Chris Parsons990c4f42021-05-25 12:10:58 -04001064 "-fsigned-char",
1065 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001066 ] + select({
1067 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1068 "//conditions:default": [],
1069 }) + select({
1070 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1071 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001072 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001073 "srcs": `["a.cpp"]`,
1074 }),
1075 },
1076 )
Jingwen Chen63930982021-03-24 10:04:33 -04001077}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001078
Liz Kammer47535c52021-06-02 16:02:22 -04001079func TestCcLibraryExcludeLibs(t *testing.T) {
1080 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001081 moduleTypeUnderTest: "cc_library",
1082 moduleTypeUnderTestFactory: cc.LibraryFactory,
1083 filesystem: map[string]string{},
Liz Kammer47535c52021-06-02 16:02:22 -04001084 blueprint: soongCcLibraryStaticPreamble + `
1085cc_library {
1086 name: "foo_static",
1087 srcs: ["common.c"],
1088 whole_static_libs: [
1089 "arm_whole_static_lib_excludes",
1090 "malloc_not_svelte_whole_static_lib_excludes"
1091 ],
1092 static_libs: [
1093 "arm_static_lib_excludes",
1094 "malloc_not_svelte_static_lib_excludes"
1095 ],
1096 shared_libs: [
1097 "arm_shared_lib_excludes",
1098 ],
1099 arch: {
1100 arm: {
1101 exclude_shared_libs: [
1102 "arm_shared_lib_excludes",
1103 ],
1104 exclude_static_libs: [
1105 "arm_static_lib_excludes",
1106 "arm_whole_static_lib_excludes",
1107 ],
1108 },
1109 },
1110 product_variables: {
1111 malloc_not_svelte: {
1112 shared_libs: ["malloc_not_svelte_shared_lib"],
1113 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1114 exclude_static_libs: [
1115 "malloc_not_svelte_static_lib_excludes",
1116 "malloc_not_svelte_whole_static_lib_excludes",
1117 ],
1118 },
1119 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001120 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001121}
1122
1123cc_library {
1124 name: "arm_whole_static_lib_excludes",
1125 bazel_module: { bp2build_available: false },
1126}
1127
1128cc_library {
1129 name: "malloc_not_svelte_whole_static_lib",
1130 bazel_module: { bp2build_available: false },
1131}
1132
1133cc_library {
1134 name: "malloc_not_svelte_whole_static_lib_excludes",
1135 bazel_module: { bp2build_available: false },
1136}
1137
1138cc_library {
1139 name: "arm_static_lib_excludes",
1140 bazel_module: { bp2build_available: false },
1141}
1142
1143cc_library {
1144 name: "malloc_not_svelte_static_lib_excludes",
1145 bazel_module: { bp2build_available: false },
1146}
1147
1148cc_library {
1149 name: "arm_shared_lib_excludes",
1150 bazel_module: { bp2build_available: false },
1151}
1152
1153cc_library {
1154 name: "malloc_not_svelte_shared_lib",
1155 bazel_module: { bp2build_available: false },
1156}
1157`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001158 expectedBazelTargets: makeCcLibraryTargets("foo_static", attrNameToString{
1159 "implementation_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001160 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001161 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001162 }) + select({
1163 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001164 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001165 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001166 "implementation_dynamic_deps": `select({
Liz Kammer7a210ac2021-09-22 15:52:58 -04001167 "//build/bazel/platforms/arch:arm": [],
1168 "//conditions:default": [":arm_shared_lib_excludes"],
1169 }) + select({
1170 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1171 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001172 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001173 "srcs_c": `["common.c"]`,
1174 "whole_archive_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001175 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001176 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001177 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001178 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1179 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001180 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001181 }),
1182 },
1183 )
Liz Kammer47535c52021-06-02 16:02:22 -04001184}
Liz Kammerd366c902021-06-03 13:43:01 -04001185
1186func TestCCLibraryNoCrtTrue(t *testing.T) {
1187 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001188 description: "cc_library - nocrt: true emits attribute",
1189 moduleTypeUnderTest: "cc_library",
1190 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001191 filesystem: map[string]string{
1192 "impl.cpp": "",
1193 },
1194 blueprint: soongCcLibraryPreamble + `
1195cc_library {
1196 name: "foo-lib",
1197 srcs: ["impl.cpp"],
1198 nocrt: true,
1199 include_build_directory: false,
1200}
1201`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001202 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1203 "link_crt": `False`,
1204 "srcs": `["impl.cpp"]`,
1205 }),
1206 },
1207 )
Jingwen Chen6ada5892021-09-17 11:38:09 +00001208}
1209
1210func TestCCLibraryNoCrtFalse(t *testing.T) {
1211 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001212 description: "cc_library - nocrt: false - does not emit attribute",
1213 moduleTypeUnderTest: "cc_library",
1214 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001215 filesystem: map[string]string{
1216 "impl.cpp": "",
1217 },
1218 blueprint: soongCcLibraryPreamble + `
1219cc_library {
1220 name: "foo-lib",
1221 srcs: ["impl.cpp"],
1222 nocrt: false,
1223 include_build_directory: false,
1224}
1225`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001226 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1227 "srcs": `["impl.cpp"]`,
1228 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001229 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001230}
1231
1232func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1233 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001234 description: "cc_library - nocrt in select",
1235 moduleTypeUnderTest: "cc_library",
1236 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001237 filesystem: map[string]string{
1238 "impl.cpp": "",
1239 },
1240 blueprint: soongCcLibraryPreamble + `
1241cc_library {
1242 name: "foo-lib",
1243 srcs: ["impl.cpp"],
1244 arch: {
1245 arm: {
1246 nocrt: true,
1247 },
1248 x86: {
1249 nocrt: false,
1250 },
1251 },
1252 include_build_directory: false,
1253}
1254`,
Liz Kammer718eb272022-01-07 10:53:37 -05001255 expectedErr: fmt.Errorf("module \"foo-lib\": nocrt is not supported for arch variants"),
Jingwen Chen6ada5892021-09-17 11:38:09 +00001256 })
1257}
1258
1259func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1260 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001261 moduleTypeUnderTest: "cc_library",
1262 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001263 filesystem: map[string]string{
1264 "impl.cpp": "",
1265 },
1266 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001267cc_library {
1268 name: "foo-lib",
1269 srcs: ["impl.cpp"],
1270 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001271 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001272}
1273`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001274 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1275 "srcs": `["impl.cpp"]`,
1276 "use_libcrt": `False`,
1277 }),
1278 })
1279}
1280
1281func makeCcLibraryTargets(name string, attrs attrNameToString) []string {
1282 STATIC_ONLY_ATTRS := map[string]bool{}
1283 SHARED_ONLY_ATTRS := map[string]bool{
1284 "link_crt": true,
1285 "additional_linker_inputs": true,
1286 "linkopts": true,
1287 "strip": true,
Jingwen Chen0ee88a62022-01-07 14:55:29 +00001288 "stubs_symbol_file": true,
1289 "stubs_versions": true,
Yu Liu75be7b92022-02-01 09:54:09 -08001290 "inject_bssl_hash": true,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001291 }
1292 sharedAttrs := attrNameToString{}
1293 staticAttrs := attrNameToString{}
1294 for key, val := range attrs {
1295 if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly {
1296 sharedAttrs[key] = val
1297 }
1298 if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly {
1299 staticAttrs[key] = val
1300 }
1301 }
1302 sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
1303 staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
1304
1305 return []string{staticTarget, sharedTarget}
Liz Kammerd366c902021-06-03 13:43:01 -04001306}
1307
Jingwen Chen6ada5892021-09-17 11:38:09 +00001308func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001309 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001310 moduleTypeUnderTest: "cc_library",
1311 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001312 filesystem: map[string]string{
1313 "impl.cpp": "",
1314 },
1315 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001316cc_library {
1317 name: "foo-lib",
1318 srcs: ["impl.cpp"],
1319 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001320 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001321}
1322`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001323 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1324 "srcs": `["impl.cpp"]`,
1325 "use_libcrt": `True`,
1326 }),
1327 })
Liz Kammerd366c902021-06-03 13:43:01 -04001328}
1329
Jingwen Chen6ada5892021-09-17 11:38:09 +00001330func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001331 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001332 moduleTypeUnderTest: "cc_library",
1333 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001334 filesystem: map[string]string{
1335 "impl.cpp": "",
1336 },
1337 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001338cc_library {
1339 name: "foo-lib",
1340 srcs: ["impl.cpp"],
1341 arch: {
1342 arm: {
1343 no_libcrt: true,
1344 },
1345 x86: {
1346 no_libcrt: true,
1347 },
1348 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001349 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001350}
1351`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001352 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1353 "srcs": `["impl.cpp"]`,
1354 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001355 "//build/bazel/platforms/arch:arm": False,
1356 "//build/bazel/platforms/arch:x86": False,
1357 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001358 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001359 }),
1360 })
Liz Kammerd366c902021-06-03 13:43:01 -04001361}
1362
Chris Parsons58852a02021-12-09 18:10:18 -05001363func TestCCLibraryNoLibCrtArchAndTargetVariant(t *testing.T) {
1364 runCcLibraryTestCase(t, bp2buildTestCase{
1365 moduleTypeUnderTest: "cc_library",
1366 moduleTypeUnderTestFactory: cc.LibraryFactory,
1367 filesystem: map[string]string{
1368 "impl.cpp": "",
1369 },
1370 blueprint: soongCcLibraryPreamble + `
1371cc_library {
1372 name: "foo-lib",
1373 srcs: ["impl.cpp"],
1374 arch: {
1375 arm: {
1376 no_libcrt: true,
1377 },
1378 x86: {
1379 no_libcrt: true,
1380 },
1381 },
1382 target: {
1383 darwin: {
1384 no_libcrt: true,
1385 }
1386 },
1387 include_build_directory: false,
1388}
1389`,
1390 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1391 "srcs": `["impl.cpp"]`,
1392 "use_libcrt": `select({
1393 "//build/bazel/platforms/os_arch:android_arm": False,
1394 "//build/bazel/platforms/os_arch:android_x86": False,
1395 "//build/bazel/platforms/os_arch:darwin_arm64": False,
1396 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1397 "//build/bazel/platforms/os_arch:linux_glibc_x86": False,
1398 "//build/bazel/platforms/os_arch:linux_musl_x86": False,
1399 "//build/bazel/platforms/os_arch:windows_x86": False,
1400 "//conditions:default": None,
1401 })`,
1402 }),
1403 })
1404}
1405
1406func TestCCLibraryNoLibCrtArchAndTargetVariantConflict(t *testing.T) {
1407 runCcLibraryTestCase(t, bp2buildTestCase{
1408 moduleTypeUnderTest: "cc_library",
1409 moduleTypeUnderTestFactory: cc.LibraryFactory,
1410 filesystem: map[string]string{
1411 "impl.cpp": "",
1412 },
1413 blueprint: soongCcLibraryPreamble + `
1414cc_library {
1415 name: "foo-lib",
1416 srcs: ["impl.cpp"],
1417 arch: {
1418 arm: {
1419 no_libcrt: true,
1420 },
1421 // This is expected to override the value for darwin_x86_64.
1422 x86_64: {
1423 no_libcrt: true,
1424 },
1425 },
1426 target: {
1427 darwin: {
1428 no_libcrt: false,
1429 }
1430 },
1431 include_build_directory: false,
1432}
1433`,
1434 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1435 "srcs": `["impl.cpp"]`,
1436 "use_libcrt": `select({
1437 "//build/bazel/platforms/os_arch:android_arm": False,
1438 "//build/bazel/platforms/os_arch:android_x86_64": False,
1439 "//build/bazel/platforms/os_arch:darwin_arm64": True,
1440 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1441 "//build/bazel/platforms/os_arch:linux_bionic_x86_64": False,
1442 "//build/bazel/platforms/os_arch:linux_glibc_x86_64": False,
1443 "//build/bazel/platforms/os_arch:linux_musl_x86_64": False,
1444 "//build/bazel/platforms/os_arch:windows_x86_64": False,
1445 "//conditions:default": None,
1446 })`,
1447 }),
1448 })
1449}
1450
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001451func TestCcLibraryStrip(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001452 expectedTargets := []string{}
1453 expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{
1454 "strip": `{
1455 "all": True,
1456 }`,
1457 })...)
1458 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{
1459 "strip": `{
1460 "keep_symbols": True,
1461 }`,
1462 })...)
1463 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{
1464 "strip": `{
1465 "keep_symbols_and_debug_frame": True,
1466 }`,
1467 })...)
1468 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{
1469 "strip": `{
1470 "keep_symbols_list": ["symbol"],
1471 }`,
1472 })...)
1473 expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{
1474 "strip": `{
1475 "none": True,
1476 }`,
1477 })...)
1478 expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...)
1479
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001480 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001481 description: "cc_library strip args",
1482 moduleTypeUnderTest: "cc_library",
1483 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001484 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001485cc_library {
1486 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001487 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001488}
1489cc_library {
1490 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001491 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001492 keep_symbols: true,
1493 },
1494 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001495}
1496cc_library {
1497 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001498 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001499 keep_symbols_and_debug_frame: true,
1500 },
1501 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001502}
1503cc_library {
1504 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001505 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001506 none: true,
1507 },
1508 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001509}
1510cc_library {
1511 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001512 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001513 keep_symbols_list: ["symbol"],
1514 },
1515 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001516}
1517cc_library {
1518 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001519 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001520 all: true,
1521 },
1522 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001523}
1524`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001525 expectedBazelTargets: expectedTargets,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001526 })
1527}
1528
1529func TestCcLibraryStripWithArch(t *testing.T) {
1530 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001531 description: "cc_library strip args",
1532 moduleTypeUnderTest: "cc_library",
1533 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001534 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001535cc_library {
1536 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001537 target: {
1538 darwin: {
1539 strip: {
1540 keep_symbols_list: ["foo", "bar"]
1541 }
1542 },
1543 },
1544 arch: {
1545 arm: {
1546 strip: {
1547 keep_symbols_and_debug_frame: true,
1548 },
1549 },
1550 arm64: {
1551 strip: {
1552 keep_symbols: true,
1553 },
1554 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001555 },
1556 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001557}
1558`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001559 expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{
1560 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001561 "keep_symbols": select({
1562 "//build/bazel/platforms/arch:arm64": True,
1563 "//conditions:default": None,
1564 }),
1565 "keep_symbols_and_debug_frame": select({
1566 "//build/bazel/platforms/arch:arm": True,
1567 "//conditions:default": None,
1568 }),
1569 "keep_symbols_list": select({
1570 "//build/bazel/platforms/os:darwin": [
1571 "foo",
1572 "bar",
1573 ],
1574 "//conditions:default": [],
1575 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001576 }`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001577 }),
1578 },
1579 )
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001580}
Chris Parsons51f8c392021-08-03 21:01:05 -04001581
1582func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1583 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001584 description: "cc_library system_shared_libs empty at root",
1585 moduleTypeUnderTest: "cc_library",
1586 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001587 blueprint: soongCcLibraryPreamble + `
1588cc_library {
1589 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001590 system_shared_libs: [],
1591 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001592}
1593`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001594 expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{
1595 "system_dynamic_deps": `[]`,
1596 }),
1597 },
1598 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001599}
1600
1601func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1602 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001603 description: "cc_library system_shared_libs empty for static variant",
1604 moduleTypeUnderTest: "cc_library",
1605 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001606 blueprint: soongCcLibraryPreamble + `
1607cc_library {
1608 name: "static_empty",
1609 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001610 system_shared_libs: [],
1611 },
1612 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001613}
1614`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001615 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001616 makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{
1617 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001618 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001619 makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001620 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001621 })
1622}
1623
1624func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1625 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001626 description: "cc_library system_shared_libs empty for shared variant",
1627 moduleTypeUnderTest: "cc_library",
1628 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001629 blueprint: soongCcLibraryPreamble + `
1630cc_library {
1631 name: "shared_empty",
1632 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001633 system_shared_libs: [],
1634 },
1635 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001636}
1637`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001638 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001639 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1640 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1641 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001642 }),
1643 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001644 })
1645}
1646
1647func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1648 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001649 description: "cc_library system_shared_libs empty for shared, bionic variant",
1650 moduleTypeUnderTest: "cc_library",
1651 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001652 blueprint: soongCcLibraryPreamble + `
1653cc_library {
1654 name: "shared_empty",
1655 target: {
1656 bionic: {
1657 shared: {
1658 system_shared_libs: [],
1659 }
1660 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001661 },
1662 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001663}
1664`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001665 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001666 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1667 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1668 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001669 }),
1670 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001671 })
1672}
1673
1674func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1675 // Note that this behavior is technically incorrect (it's a simplification).
1676 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1677 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1678 // b/195791252 tracks the fix.
1679 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001680 description: "cc_library system_shared_libs empty for linux_bionic variant",
1681 moduleTypeUnderTest: "cc_library",
1682 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001683 blueprint: soongCcLibraryPreamble + `
1684cc_library {
1685 name: "target_linux_bionic_empty",
1686 target: {
1687 linux_bionic: {
1688 system_shared_libs: [],
1689 },
1690 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001691 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001692}
1693`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001694 expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{
1695 "system_dynamic_deps": `[]`,
1696 }),
1697 },
1698 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001699}
1700
1701func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1702 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001703 description: "cc_library system_shared_libs empty for bionic variant",
1704 moduleTypeUnderTest: "cc_library",
1705 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001706 blueprint: soongCcLibraryPreamble + `
1707cc_library {
1708 name: "target_bionic_empty",
1709 target: {
1710 bionic: {
1711 system_shared_libs: [],
1712 },
1713 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001714 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001715}
1716`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001717 expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{
1718 "system_dynamic_deps": `[]`,
1719 }),
1720 },
1721 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001722}
1723
1724func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1725 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001726 description: "cc_library system_shared_libs set for shared and root",
1727 moduleTypeUnderTest: "cc_library",
1728 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001729 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001730cc_library {
1731 name: "libc",
1732 bazel_module: { bp2build_available: false },
1733}
1734cc_library {
1735 name: "libm",
1736 bazel_module: { bp2build_available: false },
1737}
Chris Parsons51f8c392021-08-03 21:01:05 -04001738
1739cc_library {
1740 name: "foo",
1741 system_shared_libs: ["libc"],
1742 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001743 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001744 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001745 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001746}
1747`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001748 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001749 makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001750 "system_dynamic_deps": `[":libc"]`,
1751 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001752 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1753 "system_dynamic_deps": `[
1754 ":libc",
1755 ":libm",
1756 ]`,
1757 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001758 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001759 })
1760}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001761
1762func TestCcLibraryOsSelects(t *testing.T) {
1763 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001764 description: "cc_library - selects for all os targets",
1765 moduleTypeUnderTest: "cc_library",
1766 moduleTypeUnderTestFactory: cc.LibraryFactory,
1767 filesystem: map[string]string{},
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001768 blueprint: soongCcLibraryPreamble + `
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001769cc_library {
1770 name: "foo-lib",
1771 srcs: ["base.cpp"],
1772 target: {
1773 android: {
1774 srcs: ["android.cpp"],
1775 },
1776 linux: {
1777 srcs: ["linux.cpp"],
1778 },
1779 linux_glibc: {
1780 srcs: ["linux_glibc.cpp"],
1781 },
1782 darwin: {
1783 srcs: ["darwin.cpp"],
1784 },
1785 bionic: {
1786 srcs: ["bionic.cpp"],
1787 },
1788 linux_musl: {
1789 srcs: ["linux_musl.cpp"],
1790 },
1791 windows: {
1792 srcs: ["windows.cpp"],
1793 },
1794 },
1795 include_build_directory: false,
1796}
1797`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001798 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1799 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001800 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001801 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001802 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001803 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001804 ],
1805 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1806 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001807 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001808 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001809 ],
1810 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001811 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001812 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001813 ],
1814 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001815 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001816 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001817 ],
1818 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1819 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001820 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001821 }),
1822 },
1823 )
Jingwen Chen97b85312021-10-08 10:41:31 +00001824}
1825
Yu Liu75be7b92022-02-01 09:54:09 -08001826func TestLibcryptoHashInjection(t *testing.T) {
1827 runCcLibraryTestCase(t, bp2buildTestCase{
1828 description: "cc_library - libcrypto hash injection",
1829 moduleTypeUnderTest: "cc_library",
1830 moduleTypeUnderTestFactory: cc.LibraryFactory,
1831 filesystem: map[string]string{},
1832 blueprint: soongCcLibraryPreamble + `
1833cc_library {
1834 name: "libcrypto",
1835 target: {
1836 android: {
1837 inject_bssl_hash: true,
1838 },
1839 },
1840 include_build_directory: false,
1841}
1842`,
1843 expectedBazelTargets: makeCcLibraryTargets("libcrypto", attrNameToString{
1844 "inject_bssl_hash": `select({
1845 "//build/bazel/platforms/os:android": True,
1846 "//conditions:default": None,
1847 })`,
1848 }),
1849 },
1850 )
1851}
1852
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001853func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001854 type testCase struct {
1855 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001856 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001857 gnu_extensions string
1858 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001859 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001860 }
1861
1862 testCases := []testCase{
1863 // Existing usages of cpp_std in AOSP are:
1864 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1865 //
1866 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1867 // is set in the toolchain.)
1868 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001869 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001870 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1871 // experimental defaults to gnu++2a
1872 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001873 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001874 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1875 // Explicitly setting a c++ std does not use replace gnu++ std even if
1876 // gnu_extensions is true.
1877 // "c++11",
1878 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001879 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001880 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1881 // "c++17",
1882 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001883 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001884 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1885 // "c++2a",
1886 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001887 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001888 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1889 // "c++98",
1890 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001891 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001892 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1893 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1894 // "gnu++11",
1895 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001896 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001897 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1898 // "gnu++17",
1899 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001900 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001901 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001902
1903 // some c_std test cases
1904 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1905 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1906 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1907 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1908 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1909 {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 +00001910 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001911 for i, tc := range testCases {
1912 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001913 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001914 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001915 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001916 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001917 cStdProp := ""
1918 if tc.c_std != "" {
1919 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1920 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001921 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001922 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001923 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001924 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001925 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001926 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001927 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001928 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001929 if tc.bazel_c_std != "" {
1930 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1931 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001932
1933 runCcLibraryTestCase(t, bp2buildTestCase{
1934 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001935 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1936 moduleTypeUnderTest: "cc_library",
1937 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen97b85312021-10-08 10:41:31 +00001938 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1939cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001940 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001941%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001942%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001943%s // gnu_extensions: *bool
1944 include_build_directory: false,
1945}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001946`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001947 expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
Jingwen Chen97b85312021-10-08 10:41:31 +00001948 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001949
1950 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1951 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001952 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1953 moduleTypeUnderTest: "cc_library_static",
1954 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001955 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1956cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001957 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001958%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001959%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001960%s // gnu_extensions: *bool
1961 include_build_directory: false,
1962}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001963`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001964 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001965 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001966 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001967 })
1968
1969 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1970 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001971 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1972 moduleTypeUnderTest: "cc_library_shared",
1973 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001974 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1975cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001976 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001977%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001978%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001979%s // gnu_extensions: *bool
1980 include_build_directory: false,
1981}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001982`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001983 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001984 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001985 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001986 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001987 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001988}
Liz Kammer12615db2021-09-28 09:19:17 -04001989
1990func TestCcLibraryProtoSimple(t *testing.T) {
1991 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001992 moduleTypeUnderTest: "cc_library",
1993 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001994 blueprint: soongCcProtoPreamble + `cc_library {
1995 name: "foo",
1996 srcs: ["foo.proto"],
1997 include_build_directory: false,
1998}`,
1999 expectedBazelTargets: []string{
2000 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002001 "srcs": `["foo.proto"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002002 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2003 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002004 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002005 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002006 "deps": `[":libprotobuf-cpp-lite"]`,
2007 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2008 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002009 }),
2010 },
2011 })
2012}
2013
2014func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) {
2015 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002016 moduleTypeUnderTest: "cc_library",
2017 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002018 blueprint: soongCcProtoPreamble + `cc_library {
2019 name: "foo",
2020 srcs: ["foo.proto"],
2021 proto: { canonical_path_from_root: false},
2022 include_build_directory: false,
2023}`,
2024 expectedBazelTargets: []string{
2025 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002026 "srcs": `["foo.proto"]`,
2027 "strip_import_prefix": `""`,
Liz Kammer12615db2021-09-28 09:19:17 -04002028 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2029 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002030 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002031 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002032 "deps": `[":libprotobuf-cpp-lite"]`,
2033 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2034 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002035 }),
2036 },
2037 })
2038}
2039
2040func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
2041 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002042 moduleTypeUnderTest: "cc_library",
2043 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002044 blueprint: soongCcProtoPreamble + `cc_library {
2045 name: "foo",
2046 srcs: ["foo.proto"],
2047 proto: { canonical_path_from_root: true},
2048 include_build_directory: false,
2049}`,
2050 expectedBazelTargets: []string{
2051 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002052 "srcs": `["foo.proto"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002053 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2054 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002055 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002056 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002057 "deps": `[":libprotobuf-cpp-lite"]`,
2058 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2059 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002060 }),
2061 },
2062 })
2063}
2064
2065func TestCcLibraryProtoFull(t *testing.T) {
2066 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002067 moduleTypeUnderTest: "cc_library",
2068 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002069 blueprint: soongCcProtoPreamble + `cc_library {
2070 name: "foo",
2071 srcs: ["foo.proto"],
2072 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002073 type: "full",
2074 },
2075 include_build_directory: false,
2076}`,
2077 expectedBazelTargets: []string{
2078 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2079 "srcs": `["foo.proto"]`,
2080 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
2081 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002082 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002083 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002084 "deps": `[":libprotobuf-cpp-full"]`,
2085 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2086 "dynamic_deps": `[":libprotobuf-cpp-full"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002087 }),
2088 },
2089 })
2090}
2091
2092func TestCcLibraryProtoLite(t *testing.T) {
2093 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002094 moduleTypeUnderTest: "cc_library",
2095 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002096 blueprint: soongCcProtoPreamble + `cc_library {
2097 name: "foo",
2098 srcs: ["foo.proto"],
2099 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002100 type: "lite",
2101 },
2102 include_build_directory: false,
2103}`,
2104 expectedBazelTargets: []string{
2105 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2106 "srcs": `["foo.proto"]`,
2107 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2108 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002109 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002110 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002111 "deps": `[":libprotobuf-cpp-lite"]`,
2112 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2113 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002114 }),
2115 },
2116 })
2117}
2118
2119func TestCcLibraryProtoExportHeaders(t *testing.T) {
2120 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002121 moduleTypeUnderTest: "cc_library",
2122 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002123 blueprint: soongCcProtoPreamble + `cc_library {
2124 name: "foo",
2125 srcs: ["foo.proto"],
2126 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002127 export_proto_headers: true,
2128 },
2129 include_build_directory: false,
2130}`,
2131 expectedBazelTargets: []string{
2132 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2133 "srcs": `["foo.proto"]`,
2134 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2135 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002136 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2137 "deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002138 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002139 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2140 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2141 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002142 }),
2143 },
2144 })
2145}
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002146
2147func TestCcLibraryProtoFilegroups(t *testing.T) {
2148 runCcLibraryTestCase(t, bp2buildTestCase{
2149 moduleTypeUnderTest: "cc_library",
2150 moduleTypeUnderTestFactory: cc.LibraryFactory,
2151 blueprint: soongCcProtoPreamble +
2152 simpleModuleDoNotConvertBp2build("filegroup", "a_fg_proto") +
2153 simpleModuleDoNotConvertBp2build("filegroup", "b_protos") +
2154 simpleModuleDoNotConvertBp2build("filegroup", "c-proto-srcs") +
2155 simpleModuleDoNotConvertBp2build("filegroup", "proto-srcs-d") + `
2156cc_library {
2157 name: "a",
2158 srcs: [":a_fg_proto"],
2159 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002160 export_proto_headers: true,
2161 },
2162 include_build_directory: false,
2163}
2164
2165cc_library {
2166 name: "b",
2167 srcs: [":b_protos"],
2168 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002169 export_proto_headers: true,
2170 },
2171 include_build_directory: false,
2172}
2173
2174cc_library {
2175 name: "c",
2176 srcs: [":c-proto-srcs"],
2177 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002178 export_proto_headers: true,
2179 },
2180 include_build_directory: false,
2181}
2182
2183cc_library {
2184 name: "d",
2185 srcs: [":proto-srcs-d"],
2186 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002187 export_proto_headers: true,
2188 },
2189 include_build_directory: false,
2190}`,
2191 expectedBazelTargets: []string{
2192 makeBazelTarget("proto_library", "a_proto", attrNameToString{
2193 "srcs": `[":a_fg_proto"]`,
2194 }), makeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", attrNameToString{
2195 "deps": `[":a_proto"]`,
2196 }), makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
2197 "deps": `[":libprotobuf-cpp-lite"]`,
2198 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2199 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2200 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2201 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2202 }), makeBazelTarget("cc_library_shared", "a", attrNameToString{
2203 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2204 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2205 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2206 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2207 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2208 }), makeBazelTarget("proto_library", "b_proto", attrNameToString{
2209 "srcs": `[":b_protos"]`,
2210 }), makeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", attrNameToString{
2211 "deps": `[":b_proto"]`,
2212 }), makeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", attrNameToString{
2213 "deps": `[":libprotobuf-cpp-lite"]`,
2214 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2215 "srcs": `[":b_protos_cpp_srcs"]`,
2216 "srcs_as": `[":b_protos_as_srcs"]`,
2217 "srcs_c": `[":b_protos_c_srcs"]`,
2218 }), makeBazelTarget("cc_library_shared", "b", attrNameToString{
2219 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2220 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2221 "srcs": `[":b_protos_cpp_srcs"]`,
2222 "srcs_as": `[":b_protos_as_srcs"]`,
2223 "srcs_c": `[":b_protos_c_srcs"]`,
2224 }), makeBazelTarget("proto_library", "c_proto", attrNameToString{
2225 "srcs": `[":c-proto-srcs"]`,
2226 }), makeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", attrNameToString{
2227 "deps": `[":c_proto"]`,
2228 }), makeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", attrNameToString{
2229 "deps": `[":libprotobuf-cpp-lite"]`,
2230 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2231 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2232 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2233 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2234 }), makeBazelTarget("cc_library_shared", "c", attrNameToString{
2235 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2236 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2237 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2238 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2239 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2240 }), makeBazelTarget("proto_library", "d_proto", attrNameToString{
2241 "srcs": `[":proto-srcs-d"]`,
2242 }), makeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", attrNameToString{
2243 "deps": `[":d_proto"]`,
2244 }), makeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", attrNameToString{
2245 "deps": `[":libprotobuf-cpp-lite"]`,
2246 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2247 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2248 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2249 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2250 }), makeBazelTarget("cc_library_shared", "d", attrNameToString{
2251 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2252 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2253 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2254 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2255 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2256 }),
2257 },
2258 })
2259}
Chris Parsons58852a02021-12-09 18:10:18 -05002260
2261func TestCcLibraryDisabledArchAndTarget(t *testing.T) {
2262 runCcLibraryTestCase(t, bp2buildTestCase{
2263 moduleTypeUnderTest: "cc_library",
2264 moduleTypeUnderTestFactory: cc.LibraryFactory,
2265 blueprint: soongCcProtoPreamble + `cc_library {
2266 name: "foo",
2267 srcs: ["foo.cpp"],
2268 target: {
2269 darwin: {
2270 enabled: false,
2271 },
2272 windows: {
2273 enabled: false,
2274 },
2275 linux_glibc_x86: {
2276 enabled: false,
2277 },
2278 },
2279 include_build_directory: false,
2280}`,
2281 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2282 "srcs": `["foo.cpp"]`,
2283 "target_compatible_with": `select({
2284 "//build/bazel/platforms/os_arch:darwin_arm64": ["@platforms//:incompatible"],
2285 "//build/bazel/platforms/os_arch:darwin_x86_64": ["@platforms//:incompatible"],
2286 "//build/bazel/platforms/os_arch:linux_glibc_x86": ["@platforms//:incompatible"],
2287 "//build/bazel/platforms/os_arch:windows_x86": ["@platforms//:incompatible"],
2288 "//build/bazel/platforms/os_arch:windows_x86_64": ["@platforms//:incompatible"],
2289 "//conditions:default": [],
2290 })`,
2291 }),
2292 })
2293}
2294
2295func TestCcLibraryDisabledArchAndTargetWithDefault(t *testing.T) {
2296 runCcLibraryTestCase(t, bp2buildTestCase{
2297 moduleTypeUnderTest: "cc_library",
2298 moduleTypeUnderTestFactory: cc.LibraryFactory,
2299 blueprint: soongCcProtoPreamble + `cc_library {
2300 name: "foo",
2301 srcs: ["foo.cpp"],
2302 enabled: false,
2303 target: {
2304 darwin: {
2305 enabled: true,
2306 },
2307 windows: {
2308 enabled: false,
2309 },
2310 linux_glibc_x86: {
2311 enabled: false,
2312 },
2313 },
2314 include_build_directory: false,
2315}`,
2316 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2317 "srcs": `["foo.cpp"]`,
2318 "target_compatible_with": `select({
2319 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2320 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2321 "//conditions:default": ["@platforms//:incompatible"],
2322 })`,
2323 }),
2324 })
2325}
2326
2327func TestCcLibrarySharedDisabled(t *testing.T) {
2328 runCcLibraryTestCase(t, bp2buildTestCase{
2329 moduleTypeUnderTest: "cc_library",
2330 moduleTypeUnderTestFactory: cc.LibraryFactory,
2331 blueprint: soongCcProtoPreamble + `cc_library {
2332 name: "foo",
2333 srcs: ["foo.cpp"],
2334 enabled: false,
2335 shared: {
2336 enabled: true,
2337 },
2338 target: {
2339 android: {
2340 shared: {
2341 enabled: false,
2342 },
2343 }
2344 },
2345 include_build_directory: false,
2346}`,
2347 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2348 "srcs": `["foo.cpp"]`,
2349 "target_compatible_with": `["@platforms//:incompatible"]`,
2350 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2351 "srcs": `["foo.cpp"]`,
2352 "target_compatible_with": `select({
2353 "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
2354 "//conditions:default": [],
2355 })`,
2356 }),
2357 },
2358 })
2359}
2360
2361func TestCcLibraryStaticDisabledForSomeArch(t *testing.T) {
2362 runCcLibraryTestCase(t, bp2buildTestCase{
2363 moduleTypeUnderTest: "cc_library",
2364 moduleTypeUnderTestFactory: cc.LibraryFactory,
2365 blueprint: soongCcProtoPreamble + `cc_library {
2366 name: "foo",
2367 srcs: ["foo.cpp"],
2368 shared: {
2369 enabled: false
2370 },
2371 target: {
2372 darwin: {
2373 enabled: true,
2374 },
2375 windows: {
2376 enabled: false,
2377 },
2378 linux_glibc_x86: {
2379 shared: {
2380 enabled: true,
2381 },
2382 },
2383 },
2384 include_build_directory: false,
2385}`,
2386 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2387 "srcs": `["foo.cpp"]`,
2388 "target_compatible_with": `select({
2389 "//build/bazel/platforms/os:windows": ["@platforms//:incompatible"],
2390 "//conditions:default": [],
2391 })`,
2392 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2393 "srcs": `["foo.cpp"]`,
2394 "target_compatible_with": `select({
2395 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2396 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2397 "//build/bazel/platforms/os_arch:linux_glibc_x86": [],
2398 "//conditions:default": ["@platforms//:incompatible"],
2399 })`,
2400 }),
2401 }})
2402}
Jingwen Chen0ee88a62022-01-07 14:55:29 +00002403
2404func TestCcLibraryStubs(t *testing.T) {
2405 runCcLibraryTestCase(t, bp2buildTestCase{
2406 description: "cc_library stubs",
2407 moduleTypeUnderTest: "cc_library",
2408 moduleTypeUnderTestFactory: cc.LibraryFactory,
2409 dir: "foo/bar",
2410 filesystem: map[string]string{
2411 "foo/bar/Android.bp": `
2412cc_library {
2413 name: "a",
2414 stubs: { symbol_file: "a.map.txt", versions: ["28", "29", "current"] },
2415 bazel_module: { bp2build_available: true },
2416 include_build_directory: false,
2417}
2418`,
2419 },
2420 blueprint: soongCcLibraryPreamble,
2421 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
2422 "stubs_symbol_file": `"a.map.txt"`,
2423 "stubs_versions": `[
2424 "28",
2425 "29",
2426 "current",
2427 ]`,
2428 }),
2429 },
2430 )
2431}
Liz Kammerf38a8372022-02-04 15:39:00 -05002432
2433func TestCcLibraryEscapeLdflags(t *testing.T) {
2434 runCcLibraryTestCase(t, bp2buildTestCase{
2435 moduleTypeUnderTest: "cc_library",
2436 moduleTypeUnderTestFactory: cc.LibraryFactory,
2437 blueprint: soongCcProtoPreamble + `cc_library {
2438 name: "foo",
2439 ldflags: ["-Wl,--rpath,${ORIGIN}"],
2440 include_build_directory: false,
2441}`,
2442 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2443 "linkopts": `["-Wl,--rpath,$${ORIGIN}"]`,
2444 }),
2445 })
2446}