blob: 57678618c58d77606a542f60be87f92023b53805 [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,
Yu Liufc603162022-03-01 15:44:08 -0800118 sdk_version: "current",
119 min_sdk_version: "29",
Jingwen Chen63930982021-03-24 10:04:33 -0400120}
121`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500122 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
123 "copts": `["-Wall"]`,
124 "export_includes": `["foo-dir"]`,
125 "implementation_deps": `[":some-headers"]`,
126 "linkopts": `["-Wl,--exclude-libs=bar.a"] + select({
Jingwen Chened9c17d2021-04-13 07:14:55 +0000127 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
128 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
129 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500130 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500131 "srcs": `["impl.cpp"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000132 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
133 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen63930982021-03-24 10:04:33 -0400134 "//conditions:default": [],
135 }) + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400136 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400137 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -0400138 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400139 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000140 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
141 "//build/bazel/platforms/os:linux": ["linux.cpp"],
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400142 "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"],
Liz Kammer01a16e82021-07-16 16:33:47 -0400143 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500144 })`,
Yu Liufc603162022-03-01 15:44:08 -0800145 "sdk_version": `"current"`,
146 "min_sdk_version": `"29"`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500147 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500148 })
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200149}
150
151func TestCcLibraryTrimmedLdAndroid(t *testing.T) {
152 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400153 description: "cc_library - trimmed example of //bionic/linker:ld-android",
154 moduleTypeUnderTest: "cc_library",
155 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200156 filesystem: map[string]string{
157 "ld-android.cpp": "",
158 "linked_list.h": "",
159 "linker.h": "",
160 "linker_block_allocator.h": "",
161 "linker_cfi.h": "",
Jingwen Chen63930982021-03-24 10:04:33 -0400162 },
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400163 blueprint: soongCcLibraryPreamble +
164 simpleModuleDoNotConvertBp2build("cc_library_headers", "libc_headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -0400165cc_library {
166 name: "fake-ld-android",
167 srcs: ["ld_android.cpp"],
168 cflags: [
169 "-Wall",
170 "-Wextra",
171 "-Wunused",
172 "-Werror",
173 ],
174 header_libs: ["libc_headers"],
175 ldflags: [
176 "-Wl,--exclude-libs=libgcc.a",
177 "-Wl,--exclude-libs=libgcc_stripped.a",
178 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
179 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
180 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
181 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
182 ],
183 arch: {
184 x86: {
185 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
186 },
187 x86_64: {
188 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
189 },
190 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400191 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400192}
193`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500194 expectedBazelTargets: makeCcLibraryTargets("fake-ld-android", attrNameToString{
195 "srcs": `["ld_android.cpp"]`,
196 "copts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400197 "-Wall",
198 "-Wextra",
199 "-Wunused",
200 "-Werror",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500201 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500202 "implementation_deps": `[":libc_headers"]`,
203 "linkopts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400204 "-Wl,--exclude-libs=libgcc.a",
205 "-Wl,--exclude-libs=libgcc_stripped.a",
206 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
207 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
208 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
209 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
210 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000211 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=libgcc_eh.a"],
212 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"],
Jingwen Chen63930982021-03-24 10:04:33 -0400213 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500214 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500215 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200216 })
217}
218
219func TestCcLibraryExcludeSrcs(t *testing.T) {
220 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400221 description: "cc_library exclude_srcs - trimmed example of //external/arm-optimized-routines:libarm-optimized-routines-math",
222 moduleTypeUnderTest: "cc_library",
223 moduleTypeUnderTestFactory: cc.LibraryFactory,
224 dir: "external",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200225 filesystem: map[string]string{
226 "external/math/cosf.c": "",
227 "external/math/erf.c": "",
228 "external/math/erf_data.c": "",
229 "external/math/erff.c": "",
230 "external/math/erff_data.c": "",
231 "external/Android.bp": `
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000232cc_library {
233 name: "fake-libarm-optimized-routines-math",
234 exclude_srcs: [
235 // Provided by:
236 // bionic/libm/upstream-freebsd/lib/msun/src/s_erf.c
237 // bionic/libm/upstream-freebsd/lib/msun/src/s_erff.c
238 "math/erf.c",
239 "math/erf_data.c",
240 "math/erff.c",
241 "math/erff_data.c",
242 ],
243 srcs: [
244 "math/*.c",
245 ],
246 // arch-specific settings
247 arch: {
248 arm64: {
249 cflags: [
250 "-DHAVE_FAST_FMA=1",
251 ],
252 },
253 },
254 bazel_module: { bp2build_available: true },
255}
256`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200257 },
258 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500259 expectedBazelTargets: makeCcLibraryTargets("fake-libarm-optimized-routines-math", attrNameToString{
260 "copts": `select({
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000261 "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"],
262 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500263 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500264 "local_includes": `["."]`,
265 "srcs_c": `["math/cosf.c"]`,
266 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200267 })
268}
269
270func TestCcLibrarySharedStaticProps(t *testing.T) {
271 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400272 description: "cc_library shared/static props",
273 moduleTypeUnderTest: "cc_library",
274 moduleTypeUnderTestFactory: cc.LibraryFactory,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200275 filesystem: map[string]string{
Liz Kammer8337ea42021-09-10 10:06:32 -0400276 "both.cpp": "",
277 "sharedonly.cpp": "",
278 "staticonly.cpp": "",
279 },
280 blueprint: soongCcLibraryPreamble + `
Jingwen Chen53681ef2021-04-29 08:15:13 +0000281cc_library {
282 name: "a",
Chris Parsons08648312021-05-06 16:23:19 -0400283 srcs: ["both.cpp"],
284 cflags: ["bothflag"],
285 shared_libs: ["shared_dep_for_both"],
Liz Kammercc2c1ef2022-03-21 09:03:29 -0400286 static_libs: ["static_dep_for_both", "whole_and_static_lib_for_both"],
287 whole_static_libs: ["whole_static_lib_for_both", "whole_and_static_lib_for_both"],
Chris Parsons08648312021-05-06 16:23:19 -0400288 static: {
289 srcs: ["staticonly.cpp"],
290 cflags: ["staticflag"],
291 shared_libs: ["shared_dep_for_static"],
292 static_libs: ["static_dep_for_static"],
293 whole_static_libs: ["whole_static_lib_for_static"],
294 },
295 shared: {
296 srcs: ["sharedonly.cpp"],
297 cflags: ["sharedflag"],
298 shared_libs: ["shared_dep_for_shared"],
299 static_libs: ["static_dep_for_shared"],
300 whole_static_libs: ["whole_static_lib_for_shared"],
301 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400302 include_build_directory: false,
Jingwen Chen53681ef2021-04-29 08:15:13 +0000303}
304
Liz Kammer8337ea42021-09-10 10:06:32 -0400305cc_library_static {
306 name: "static_dep_for_shared",
307 bazel_module: { bp2build_available: false },
308}
Chris Parsons08648312021-05-06 16:23:19 -0400309
Liz Kammer8337ea42021-09-10 10:06:32 -0400310cc_library_static {
311 name: "static_dep_for_static",
312 bazel_module: { bp2build_available: false },
313}
Chris Parsons08648312021-05-06 16:23:19 -0400314
Liz Kammer8337ea42021-09-10 10:06:32 -0400315cc_library_static {
316 name: "static_dep_for_both",
317 bazel_module: { bp2build_available: false },
318}
Chris Parsons08648312021-05-06 16:23:19 -0400319
Liz Kammer8337ea42021-09-10 10:06:32 -0400320cc_library_static {
321 name: "whole_static_lib_for_shared",
322 bazel_module: { bp2build_available: false },
323}
Chris Parsons08648312021-05-06 16:23:19 -0400324
Liz Kammer8337ea42021-09-10 10:06:32 -0400325cc_library_static {
326 name: "whole_static_lib_for_static",
327 bazel_module: { bp2build_available: false },
328}
Chris Parsons08648312021-05-06 16:23:19 -0400329
Liz Kammer8337ea42021-09-10 10:06:32 -0400330cc_library_static {
331 name: "whole_static_lib_for_both",
332 bazel_module: { bp2build_available: false },
333}
Chris Parsons08648312021-05-06 16:23:19 -0400334
Liz Kammercc2c1ef2022-03-21 09:03:29 -0400335cc_library_static {
336 name: "whole_and_static_lib_for_both",
337 bazel_module: { bp2build_available: false },
338}
339
Liz Kammer8337ea42021-09-10 10:06:32 -0400340cc_library {
341 name: "shared_dep_for_shared",
342 bazel_module: { bp2build_available: false },
343}
Chris Parsons08648312021-05-06 16:23:19 -0400344
Liz Kammer8337ea42021-09-10 10:06:32 -0400345cc_library {
346 name: "shared_dep_for_static",
347 bazel_module: { bp2build_available: false },
348}
Chris Parsons08648312021-05-06 16:23:19 -0400349
Liz Kammer8337ea42021-09-10 10:06:32 -0400350cc_library {
351 name: "shared_dep_for_both",
352 bazel_module: { bp2build_available: false },
353}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000354`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500355 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500356 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
357 "copts": `[
358 "bothflag",
359 "staticflag",
360 ]`,
361 "implementation_deps": `[
362 ":static_dep_for_both",
363 ":static_dep_for_static",
364 ]`,
365 "implementation_dynamic_deps": `[
366 ":shared_dep_for_both",
367 ":shared_dep_for_static",
368 ]`,
369 "srcs": `[
370 "both.cpp",
371 "staticonly.cpp",
372 ]`,
373 "whole_archive_deps": `[
374 ":whole_static_lib_for_both",
Liz Kammercc2c1ef2022-03-21 09:03:29 -0400375 ":whole_and_static_lib_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500376 ":whole_static_lib_for_static",
377 ]`}),
378 makeBazelTarget("cc_library_shared", "a", attrNameToString{
379 "copts": `[
380 "bothflag",
381 "sharedflag",
382 ]`,
383 "implementation_deps": `[
384 ":static_dep_for_both",
385 ":static_dep_for_shared",
386 ]`,
387 "implementation_dynamic_deps": `[
388 ":shared_dep_for_both",
389 ":shared_dep_for_shared",
390 ]`,
391 "srcs": `[
392 "both.cpp",
393 "sharedonly.cpp",
394 ]`,
395 "whole_archive_deps": `[
396 ":whole_static_lib_for_both",
Liz Kammercc2c1ef2022-03-21 09:03:29 -0400397 ":whole_and_static_lib_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500398 ":whole_static_lib_for_shared",
399 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500400 }),
401 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200402 })
403}
404
Liz Kammer7a210ac2021-09-22 15:52:58 -0400405func TestCcLibraryDeps(t *testing.T) {
406 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400407 description: "cc_library shared/static props",
408 moduleTypeUnderTest: "cc_library",
409 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer7a210ac2021-09-22 15:52:58 -0400410 filesystem: map[string]string{
411 "both.cpp": "",
412 "sharedonly.cpp": "",
413 "staticonly.cpp": "",
414 },
415 blueprint: soongCcLibraryPreamble + `
416cc_library {
417 name: "a",
418 srcs: ["both.cpp"],
419 cflags: ["bothflag"],
420 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
421 export_shared_lib_headers: ["shared_dep_for_both"],
422 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
423 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
424 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
425 static: {
426 srcs: ["staticonly.cpp"],
427 cflags: ["staticflag"],
428 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
429 export_shared_lib_headers: ["shared_dep_for_static"],
430 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
431 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
432 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
433 },
434 shared: {
435 srcs: ["sharedonly.cpp"],
436 cflags: ["sharedflag"],
437 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
438 export_shared_lib_headers: ["shared_dep_for_shared"],
439 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
440 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
441 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
442 },
443 include_build_directory: false,
444}
445` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
446 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
447 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
448 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
449 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
450 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
451 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
452 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
453 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
454 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
455 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
456 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
457 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
458 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
459 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
460 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
461 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
462 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500463 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500464 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
465 "copts": `[
466 "bothflag",
467 "staticflag",
468 ]`,
469 "deps": `[
470 ":static_dep_for_both",
471 ":static_dep_for_static",
472 ]`,
473 "dynamic_deps": `[
474 ":shared_dep_for_both",
475 ":shared_dep_for_static",
476 ]`,
477 "implementation_deps": `[
478 ":implementation_static_dep_for_both",
479 ":implementation_static_dep_for_static",
480 ]`,
481 "implementation_dynamic_deps": `[
482 ":implementation_shared_dep_for_both",
483 ":implementation_shared_dep_for_static",
484 ]`,
485 "srcs": `[
486 "both.cpp",
487 "staticonly.cpp",
488 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500489 "whole_archive_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400490 ":not_explicitly_exported_whole_static_dep_for_both",
491 ":whole_static_dep_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500492 ":not_explicitly_exported_whole_static_dep_for_static",
493 ":whole_static_dep_for_static",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500494 ]`,
495 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500496 makeBazelTarget("cc_library_shared", "a", attrNameToString{
497 "copts": `[
498 "bothflag",
499 "sharedflag",
500 ]`,
501 "deps": `[
502 ":static_dep_for_both",
503 ":static_dep_for_shared",
504 ]`,
505 "dynamic_deps": `[
506 ":shared_dep_for_both",
507 ":shared_dep_for_shared",
508 ]`,
509 "implementation_deps": `[
510 ":implementation_static_dep_for_both",
511 ":implementation_static_dep_for_shared",
512 ]`,
513 "implementation_dynamic_deps": `[
514 ":implementation_shared_dep_for_both",
515 ":implementation_shared_dep_for_shared",
516 ]`,
517 "srcs": `[
518 "both.cpp",
519 "sharedonly.cpp",
520 ]`,
521 "whole_archive_deps": `[
522 ":not_explicitly_exported_whole_static_dep_for_both",
523 ":whole_static_dep_for_both",
524 ":not_explicitly_exported_whole_static_dep_for_shared",
525 ":whole_static_dep_for_shared",
526 ]`,
527 })},
528 },
529 )
Liz Kammer7a210ac2021-09-22 15:52:58 -0400530}
531
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400532func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
533 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400534 moduleTypeUnderTest: "cc_library",
535 moduleTypeUnderTestFactory: cc.LibraryFactory,
536 dir: "foo/bar",
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400537 filesystem: map[string]string{
538 "foo/bar/Android.bp": `
539cc_library {
540 name: "a",
541 whole_static_libs: ["whole_static_lib_for_both"],
542 static: {
543 whole_static_libs: ["whole_static_lib_for_static"],
544 },
545 shared: {
546 whole_static_libs: ["whole_static_lib_for_shared"],
547 },
548 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400549 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400550}
551
552cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
553
554cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
555
556cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
557`,
558 },
559 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500560 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500561 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
562 "whole_archive_deps": `[
563 ":whole_static_lib_for_both_alwayslink",
564 ":whole_static_lib_for_static_alwayslink",
565 ]`,
566 }),
567 makeBazelTarget("cc_library_shared", "a", attrNameToString{
568 "whole_archive_deps": `[
569 ":whole_static_lib_for_both_alwayslink",
570 ":whole_static_lib_for_shared_alwayslink",
571 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500572 }),
573 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500574 },
575 )
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400576}
577
Jingwen Chenbcf53042021-05-26 04:42:42 +0000578func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
579 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400580 description: "cc_library shared/static props in arch",
581 moduleTypeUnderTest: "cc_library",
582 moduleTypeUnderTestFactory: cc.LibraryFactory,
583 dir: "foo/bar",
Jingwen Chenbcf53042021-05-26 04:42:42 +0000584 filesystem: map[string]string{
585 "foo/bar/arm.cpp": "",
586 "foo/bar/x86.cpp": "",
587 "foo/bar/sharedonly.cpp": "",
588 "foo/bar/staticonly.cpp": "",
589 "foo/bar/Android.bp": `
590cc_library {
591 name: "a",
592 arch: {
593 arm: {
594 shared: {
595 srcs: ["arm_shared.cpp"],
596 cflags: ["-DARM_SHARED"],
597 static_libs: ["arm_static_dep_for_shared"],
598 whole_static_libs: ["arm_whole_static_dep_for_shared"],
599 shared_libs: ["arm_shared_dep_for_shared"],
600 },
601 },
602 x86: {
603 static: {
604 srcs: ["x86_static.cpp"],
605 cflags: ["-DX86_STATIC"],
606 static_libs: ["x86_dep_for_static"],
607 },
608 },
609 },
610 target: {
611 android: {
612 shared: {
613 srcs: ["android_shared.cpp"],
614 cflags: ["-DANDROID_SHARED"],
615 static_libs: ["android_dep_for_shared"],
616 },
617 },
618 android_arm: {
619 shared: {
620 cflags: ["-DANDROID_ARM_SHARED"],
621 },
622 },
623 },
624 srcs: ["both.cpp"],
625 cflags: ["bothflag"],
626 static_libs: ["static_dep_for_both"],
627 static: {
628 srcs: ["staticonly.cpp"],
629 cflags: ["staticflag"],
630 static_libs: ["static_dep_for_static"],
631 },
632 shared: {
633 srcs: ["sharedonly.cpp"],
634 cflags: ["sharedflag"],
635 static_libs: ["static_dep_for_shared"],
636 },
637 bazel_module: { bp2build_available: true },
638}
639
640cc_library_static { name: "static_dep_for_shared" }
641cc_library_static { name: "static_dep_for_static" }
642cc_library_static { name: "static_dep_for_both" }
643
644cc_library_static { name: "arm_static_dep_for_shared" }
645cc_library_static { name: "arm_whole_static_dep_for_shared" }
646cc_library_static { name: "arm_shared_dep_for_shared" }
647
648cc_library_static { name: "x86_dep_for_static" }
649
650cc_library_static { name: "android_dep_for_shared" }
651`,
652 },
653 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500654 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500655 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
656 "copts": `[
657 "bothflag",
658 "staticflag",
659 ] + select({
660 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
661 "//conditions:default": [],
662 })`,
663 "implementation_deps": `[
664 ":static_dep_for_both",
665 ":static_dep_for_static",
666 ] + select({
667 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
668 "//conditions:default": [],
669 })`,
670 "local_includes": `["."]`,
671 "srcs": `[
672 "both.cpp",
673 "staticonly.cpp",
674 ] + select({
675 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
676 "//conditions:default": [],
677 })`,
678 }),
679 makeBazelTarget("cc_library_shared", "a", attrNameToString{
680 "copts": `[
681 "bothflag",
682 "sharedflag",
683 ] + select({
684 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
685 "//conditions:default": [],
686 }) + select({
687 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
688 "//conditions:default": [],
689 }) + select({
690 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
691 "//conditions:default": [],
692 })`,
693 "implementation_deps": `[
694 ":static_dep_for_both",
695 ":static_dep_for_shared",
696 ] + select({
697 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
698 "//conditions:default": [],
699 }) + select({
700 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
701 "//conditions:default": [],
702 })`,
703 "implementation_dynamic_deps": `select({
704 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
705 "//conditions:default": [],
706 })`,
707 "local_includes": `["."]`,
708 "srcs": `[
709 "both.cpp",
710 "sharedonly.cpp",
711 ] + select({
712 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
713 "//conditions:default": [],
714 }) + select({
715 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
716 "//conditions:default": [],
717 })`,
718 "whole_archive_deps": `select({
719 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
720 "//conditions:default": [],
721 })`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500722 }),
723 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500724 },
725 )
Jingwen Chenbcf53042021-05-26 04:42:42 +0000726}
727
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000728func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
729 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400730 description: "cc_library shared/static props with c/cpp/s mixed sources",
731 moduleTypeUnderTest: "cc_library",
732 moduleTypeUnderTestFactory: cc.LibraryFactory,
733 dir: "foo/bar",
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000734 filesystem: map[string]string{
735 "foo/bar/both_source.cpp": "",
736 "foo/bar/both_source.cc": "",
737 "foo/bar/both_source.c": "",
738 "foo/bar/both_source.s": "",
739 "foo/bar/both_source.S": "",
740 "foo/bar/shared_source.cpp": "",
741 "foo/bar/shared_source.cc": "",
742 "foo/bar/shared_source.c": "",
743 "foo/bar/shared_source.s": "",
744 "foo/bar/shared_source.S": "",
745 "foo/bar/static_source.cpp": "",
746 "foo/bar/static_source.cc": "",
747 "foo/bar/static_source.c": "",
748 "foo/bar/static_source.s": "",
749 "foo/bar/static_source.S": "",
750 "foo/bar/Android.bp": `
751cc_library {
752 name: "a",
753 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400754 "both_source.cpp",
755 "both_source.cc",
756 "both_source.c",
757 "both_source.s",
758 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400759 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400760 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000761 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400762 srcs: [
763 "static_source.cpp",
764 "static_source.cc",
765 "static_source.c",
766 "static_source.s",
767 "static_source.S",
768 ":static_filegroup",
769 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000770 },
771 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400772 srcs: [
773 "shared_source.cpp",
774 "shared_source.cc",
775 "shared_source.c",
776 "shared_source.s",
777 "shared_source.S",
778 ":shared_filegroup",
779 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000780 },
781 bazel_module: { bp2build_available: true },
782}
783
784filegroup {
785 name: "both_filegroup",
786 srcs: [
787 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400788 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000789}
790
791filegroup {
792 name: "shared_filegroup",
793 srcs: [
794 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400795 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000796}
797
798filegroup {
799 name: "static_filegroup",
800 srcs: [
801 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400802 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000803}
804`,
805 },
806 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500807 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500808 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500809 "local_includes": `["."]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500810 "srcs": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000811 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400812 "both_source.cc",
813 ":both_filegroup_cpp_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500814 "static_source.cpp",
815 "static_source.cc",
816 ":static_filegroup_cpp_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500817 ]`,
818 "srcs_as": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000819 "both_source.s",
820 "both_source.S",
821 ":both_filegroup_as_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500822 "static_source.s",
823 "static_source.S",
824 ":static_filegroup_as_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500825 ]`,
826 "srcs_c": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000827 "both_source.c",
828 ":both_filegroup_c_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500829 "static_source.c",
830 ":static_filegroup_c_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500831 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500832 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500833 makeBazelTarget("cc_library_shared", "a", attrNameToString{
834 "local_includes": `["."]`,
835 "srcs": `[
836 "both_source.cpp",
837 "both_source.cc",
838 ":both_filegroup_cpp_srcs",
839 "shared_source.cpp",
840 "shared_source.cc",
841 ":shared_filegroup_cpp_srcs",
842 ]`,
843 "srcs_as": `[
844 "both_source.s",
845 "both_source.S",
846 ":both_filegroup_as_srcs",
847 "shared_source.s",
848 "shared_source.S",
849 ":shared_filegroup_as_srcs",
850 ]`,
851 "srcs_c": `[
852 "both_source.c",
853 ":both_filegroup_c_srcs",
854 "shared_source.c",
855 ":shared_filegroup_c_srcs",
856 ]`,
857 })}})
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000858}
859
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200860func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
861 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400862 description: "cc_library non-configured version script",
863 moduleTypeUnderTest: "cc_library",
864 moduleTypeUnderTestFactory: cc.LibraryFactory,
865 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200866 filesystem: map[string]string{
867 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200868cc_library {
869 name: "a",
870 srcs: ["a.cpp"],
871 version_script: "v.map",
872 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400873 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200874}
875`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200876 },
877 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500878 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
879 "additional_linker_inputs": `["v.map"]`,
880 "linkopts": `["-Wl,--version-script,$(location v.map)"]`,
881 "srcs": `["a.cpp"]`,
882 }),
883 },
884 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200885}
886
887func TestCcLibraryConfiguredVersionScript(t *testing.T) {
888 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400889 description: "cc_library configured version script",
890 moduleTypeUnderTest: "cc_library",
891 moduleTypeUnderTestFactory: cc.LibraryFactory,
892 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200893 filesystem: map[string]string{
894 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400895cc_library {
896 name: "a",
897 srcs: ["a.cpp"],
898 arch: {
899 arm: {
900 version_script: "arm.map",
901 },
902 arm64: {
903 version_script: "arm64.map",
904 },
905 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200906
Liz Kammer8337ea42021-09-10 10:06:32 -0400907 bazel_module: { bp2build_available: true },
908 include_build_directory: false,
909}
Liz Kammerd366c902021-06-03 13:43:01 -0400910 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200911 },
912 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500913 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
914 "additional_linker_inputs": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400915 "//build/bazel/platforms/arch:arm": ["arm.map"],
916 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
917 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500918 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500919 "linkopts": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400920 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
921 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
922 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500923 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500924 "srcs": `["a.cpp"]`,
925 }),
926 },
927 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200928}
929
930func TestCcLibrarySharedLibs(t *testing.T) {
931 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400932 description: "cc_library shared_libs",
933 moduleTypeUnderTest: "cc_library",
934 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400935 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400936cc_library {
937 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400938 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400939}
940
941cc_library {
942 name: "a",
943 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400944 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400945}
946`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500947 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
948 "implementation_dynamic_deps": `[":mylib"]`,
949 }),
950 },
951 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200952}
953
Liz Kammer0eae52e2021-10-06 10:32:26 -0400954func TestCcLibraryFeatures(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -0500955 expected_targets := []string{}
956 expected_targets = append(expected_targets, makeCcLibraryTargets("a", attrNameToString{
957 "features": `[
958 "disable_pack_relocations",
959 "-no_undefined_symbols",
960 ]`,
961 "srcs": `["a.cpp"]`,
962 })...)
963 expected_targets = append(expected_targets, makeCcLibraryTargets("b", attrNameToString{
964 "features": `select({
965 "//build/bazel/platforms/arch:x86_64": [
966 "disable_pack_relocations",
967 "-no_undefined_symbols",
968 ],
969 "//conditions:default": [],
970 })`,
971 "srcs": `["b.cpp"]`,
972 })...)
973 expected_targets = append(expected_targets, makeCcLibraryTargets("c", attrNameToString{
974 "features": `select({
975 "//build/bazel/platforms/os:darwin": [
976 "disable_pack_relocations",
977 "-no_undefined_symbols",
978 ],
979 "//conditions:default": [],
980 })`,
981 "srcs": `["c.cpp"]`,
982 })...)
983
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200984 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400985 description: "cc_library pack_relocations test",
986 moduleTypeUnderTest: "cc_library",
987 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400988 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400989cc_library {
990 name: "a",
991 srcs: ["a.cpp"],
992 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400993 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400994 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400995}
996
997cc_library {
998 name: "b",
999 srcs: ["b.cpp"],
1000 arch: {
1001 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001002 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001003 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001004 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001005 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001006 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001007}
1008
1009cc_library {
1010 name: "c",
1011 srcs: ["c.cpp"],
1012 target: {
1013 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001014 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001015 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001016 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001017 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001018 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001019}`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001020 expectedBazelTargets: expected_targets,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001021 })
1022}
1023
1024func TestCcLibrarySpacesInCopts(t *testing.T) {
1025 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001026 description: "cc_library spaces in copts",
1027 moduleTypeUnderTest: "cc_library",
1028 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001029 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +00001030cc_library {
1031 name: "a",
1032 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -04001033 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +00001034}
1035`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001036 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1037 "copts": `[
Jingwen Chen3950cd62021-05-12 04:33:00 +00001038 "-include",
1039 "header.h",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001040 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001041 }),
1042 },
1043 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001044}
1045
1046func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
1047 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001048 description: "cc_library cppflags usage",
1049 moduleTypeUnderTest: "cc_library",
1050 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001051 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001052 name: "a",
1053 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001054 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001055 cppflags: [
1056 "-fsigned-char",
1057 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -04001058 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001059 arch: {
1060 arm64: {
1061 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001062 },
Liz Kammerd366c902021-06-03 13:43:01 -04001063 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001064 target: {
1065 android: {
1066 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001067 },
Liz Kammerd366c902021-06-03 13:43:01 -04001068 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001069 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001070}
1071`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001072 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1073 "copts": `["-Wall"]`,
1074 "cppflags": `[
Chris Parsons990c4f42021-05-25 12:10:58 -04001075 "-fsigned-char",
1076 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001077 ] + select({
1078 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1079 "//conditions:default": [],
1080 }) + select({
1081 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1082 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001083 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001084 "srcs": `["a.cpp"]`,
1085 }),
1086 },
1087 )
Jingwen Chen63930982021-03-24 10:04:33 -04001088}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001089
Liz Kammer47535c52021-06-02 16:02:22 -04001090func TestCcLibraryExcludeLibs(t *testing.T) {
1091 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001092 moduleTypeUnderTest: "cc_library",
1093 moduleTypeUnderTestFactory: cc.LibraryFactory,
1094 filesystem: map[string]string{},
Liz Kammer47535c52021-06-02 16:02:22 -04001095 blueprint: soongCcLibraryStaticPreamble + `
1096cc_library {
1097 name: "foo_static",
1098 srcs: ["common.c"],
1099 whole_static_libs: [
1100 "arm_whole_static_lib_excludes",
1101 "malloc_not_svelte_whole_static_lib_excludes"
1102 ],
1103 static_libs: [
1104 "arm_static_lib_excludes",
1105 "malloc_not_svelte_static_lib_excludes"
1106 ],
1107 shared_libs: [
1108 "arm_shared_lib_excludes",
1109 ],
1110 arch: {
1111 arm: {
1112 exclude_shared_libs: [
1113 "arm_shared_lib_excludes",
1114 ],
1115 exclude_static_libs: [
1116 "arm_static_lib_excludes",
1117 "arm_whole_static_lib_excludes",
1118 ],
1119 },
1120 },
1121 product_variables: {
1122 malloc_not_svelte: {
1123 shared_libs: ["malloc_not_svelte_shared_lib"],
1124 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1125 exclude_static_libs: [
1126 "malloc_not_svelte_static_lib_excludes",
1127 "malloc_not_svelte_whole_static_lib_excludes",
1128 ],
1129 },
1130 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001131 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001132}
1133
1134cc_library {
1135 name: "arm_whole_static_lib_excludes",
1136 bazel_module: { bp2build_available: false },
1137}
1138
1139cc_library {
1140 name: "malloc_not_svelte_whole_static_lib",
1141 bazel_module: { bp2build_available: false },
1142}
1143
1144cc_library {
1145 name: "malloc_not_svelte_whole_static_lib_excludes",
1146 bazel_module: { bp2build_available: false },
1147}
1148
1149cc_library {
1150 name: "arm_static_lib_excludes",
1151 bazel_module: { bp2build_available: false },
1152}
1153
1154cc_library {
1155 name: "malloc_not_svelte_static_lib_excludes",
1156 bazel_module: { bp2build_available: false },
1157}
1158
1159cc_library {
1160 name: "arm_shared_lib_excludes",
1161 bazel_module: { bp2build_available: false },
1162}
1163
1164cc_library {
1165 name: "malloc_not_svelte_shared_lib",
1166 bazel_module: { bp2build_available: false },
1167}
1168`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001169 expectedBazelTargets: makeCcLibraryTargets("foo_static", attrNameToString{
1170 "implementation_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001171 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001172 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001173 }) + select({
1174 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001175 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001176 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001177 "implementation_dynamic_deps": `select({
Liz Kammer7a210ac2021-09-22 15:52:58 -04001178 "//build/bazel/platforms/arch:arm": [],
1179 "//conditions:default": [":arm_shared_lib_excludes"],
1180 }) + select({
1181 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1182 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001183 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001184 "srcs_c": `["common.c"]`,
1185 "whole_archive_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001186 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001187 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001188 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001189 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1190 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001191 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001192 }),
1193 },
1194 )
Liz Kammer47535c52021-06-02 16:02:22 -04001195}
Liz Kammerd366c902021-06-03 13:43:01 -04001196
1197func TestCCLibraryNoCrtTrue(t *testing.T) {
1198 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001199 description: "cc_library - nocrt: true emits attribute",
1200 moduleTypeUnderTest: "cc_library",
1201 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001202 filesystem: map[string]string{
1203 "impl.cpp": "",
1204 },
1205 blueprint: soongCcLibraryPreamble + `
1206cc_library {
1207 name: "foo-lib",
1208 srcs: ["impl.cpp"],
1209 nocrt: true,
1210 include_build_directory: false,
1211}
1212`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001213 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1214 "link_crt": `False`,
1215 "srcs": `["impl.cpp"]`,
1216 }),
1217 },
1218 )
Jingwen Chen6ada5892021-09-17 11:38:09 +00001219}
1220
1221func TestCCLibraryNoCrtFalse(t *testing.T) {
1222 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001223 description: "cc_library - nocrt: false - does not emit attribute",
1224 moduleTypeUnderTest: "cc_library",
1225 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001226 filesystem: map[string]string{
1227 "impl.cpp": "",
1228 },
1229 blueprint: soongCcLibraryPreamble + `
1230cc_library {
1231 name: "foo-lib",
1232 srcs: ["impl.cpp"],
1233 nocrt: false,
1234 include_build_directory: false,
1235}
1236`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001237 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1238 "srcs": `["impl.cpp"]`,
1239 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001240 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001241}
1242
1243func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1244 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001245 description: "cc_library - nocrt in select",
1246 moduleTypeUnderTest: "cc_library",
1247 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001248 filesystem: map[string]string{
1249 "impl.cpp": "",
1250 },
1251 blueprint: soongCcLibraryPreamble + `
1252cc_library {
1253 name: "foo-lib",
1254 srcs: ["impl.cpp"],
1255 arch: {
1256 arm: {
1257 nocrt: true,
1258 },
1259 x86: {
1260 nocrt: false,
1261 },
1262 },
1263 include_build_directory: false,
1264}
1265`,
Liz Kammer718eb272022-01-07 10:53:37 -05001266 expectedErr: fmt.Errorf("module \"foo-lib\": nocrt is not supported for arch variants"),
Jingwen Chen6ada5892021-09-17 11:38:09 +00001267 })
1268}
1269
1270func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1271 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001272 moduleTypeUnderTest: "cc_library",
1273 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001274 filesystem: map[string]string{
1275 "impl.cpp": "",
1276 },
1277 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001278cc_library {
1279 name: "foo-lib",
1280 srcs: ["impl.cpp"],
1281 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001282 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001283}
1284`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001285 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1286 "srcs": `["impl.cpp"]`,
1287 "use_libcrt": `False`,
1288 }),
1289 })
1290}
1291
1292func makeCcLibraryTargets(name string, attrs attrNameToString) []string {
1293 STATIC_ONLY_ATTRS := map[string]bool{}
1294 SHARED_ONLY_ATTRS := map[string]bool{
1295 "link_crt": true,
1296 "additional_linker_inputs": true,
1297 "linkopts": true,
1298 "strip": true,
Jingwen Chen0ee88a62022-01-07 14:55:29 +00001299 "stubs_symbol_file": true,
1300 "stubs_versions": true,
Yu Liu75be7b92022-02-01 09:54:09 -08001301 "inject_bssl_hash": true,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001302 }
1303 sharedAttrs := attrNameToString{}
1304 staticAttrs := attrNameToString{}
1305 for key, val := range attrs {
1306 if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly {
1307 sharedAttrs[key] = val
1308 }
1309 if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly {
1310 staticAttrs[key] = val
1311 }
1312 }
1313 sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
1314 staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
1315
1316 return []string{staticTarget, sharedTarget}
Liz Kammerd366c902021-06-03 13:43:01 -04001317}
1318
Jingwen Chen6ada5892021-09-17 11:38:09 +00001319func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001320 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001321 moduleTypeUnderTest: "cc_library",
1322 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001323 filesystem: map[string]string{
1324 "impl.cpp": "",
1325 },
1326 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001327cc_library {
1328 name: "foo-lib",
1329 srcs: ["impl.cpp"],
1330 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001331 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001332}
1333`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001334 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1335 "srcs": `["impl.cpp"]`,
1336 "use_libcrt": `True`,
1337 }),
1338 })
Liz Kammerd366c902021-06-03 13:43:01 -04001339}
1340
Jingwen Chen6ada5892021-09-17 11:38:09 +00001341func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001342 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001343 moduleTypeUnderTest: "cc_library",
1344 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001345 filesystem: map[string]string{
1346 "impl.cpp": "",
1347 },
1348 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001349cc_library {
1350 name: "foo-lib",
1351 srcs: ["impl.cpp"],
1352 arch: {
1353 arm: {
1354 no_libcrt: true,
1355 },
1356 x86: {
1357 no_libcrt: true,
1358 },
1359 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001360 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001361}
1362`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001363 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1364 "srcs": `["impl.cpp"]`,
1365 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001366 "//build/bazel/platforms/arch:arm": False,
1367 "//build/bazel/platforms/arch:x86": False,
1368 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001369 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001370 }),
1371 })
Liz Kammerd366c902021-06-03 13:43:01 -04001372}
1373
Chris Parsons58852a02021-12-09 18:10:18 -05001374func TestCCLibraryNoLibCrtArchAndTargetVariant(t *testing.T) {
1375 runCcLibraryTestCase(t, bp2buildTestCase{
1376 moduleTypeUnderTest: "cc_library",
1377 moduleTypeUnderTestFactory: cc.LibraryFactory,
1378 filesystem: map[string]string{
1379 "impl.cpp": "",
1380 },
1381 blueprint: soongCcLibraryPreamble + `
1382cc_library {
1383 name: "foo-lib",
1384 srcs: ["impl.cpp"],
1385 arch: {
1386 arm: {
1387 no_libcrt: true,
1388 },
1389 x86: {
1390 no_libcrt: true,
1391 },
1392 },
1393 target: {
1394 darwin: {
1395 no_libcrt: true,
1396 }
1397 },
1398 include_build_directory: false,
1399}
1400`,
1401 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1402 "srcs": `["impl.cpp"]`,
1403 "use_libcrt": `select({
1404 "//build/bazel/platforms/os_arch:android_arm": False,
1405 "//build/bazel/platforms/os_arch:android_x86": False,
1406 "//build/bazel/platforms/os_arch:darwin_arm64": False,
1407 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1408 "//build/bazel/platforms/os_arch:linux_glibc_x86": False,
1409 "//build/bazel/platforms/os_arch:linux_musl_x86": False,
1410 "//build/bazel/platforms/os_arch:windows_x86": False,
1411 "//conditions:default": None,
1412 })`,
1413 }),
1414 })
1415}
1416
1417func TestCCLibraryNoLibCrtArchAndTargetVariantConflict(t *testing.T) {
1418 runCcLibraryTestCase(t, bp2buildTestCase{
1419 moduleTypeUnderTest: "cc_library",
1420 moduleTypeUnderTestFactory: cc.LibraryFactory,
1421 filesystem: map[string]string{
1422 "impl.cpp": "",
1423 },
1424 blueprint: soongCcLibraryPreamble + `
1425cc_library {
1426 name: "foo-lib",
1427 srcs: ["impl.cpp"],
1428 arch: {
1429 arm: {
1430 no_libcrt: true,
1431 },
1432 // This is expected to override the value for darwin_x86_64.
1433 x86_64: {
1434 no_libcrt: true,
1435 },
1436 },
1437 target: {
1438 darwin: {
1439 no_libcrt: false,
1440 }
1441 },
1442 include_build_directory: false,
1443}
1444`,
1445 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1446 "srcs": `["impl.cpp"]`,
1447 "use_libcrt": `select({
1448 "//build/bazel/platforms/os_arch:android_arm": False,
1449 "//build/bazel/platforms/os_arch:android_x86_64": False,
1450 "//build/bazel/platforms/os_arch:darwin_arm64": True,
1451 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1452 "//build/bazel/platforms/os_arch:linux_bionic_x86_64": False,
1453 "//build/bazel/platforms/os_arch:linux_glibc_x86_64": False,
1454 "//build/bazel/platforms/os_arch:linux_musl_x86_64": False,
1455 "//build/bazel/platforms/os_arch:windows_x86_64": False,
1456 "//conditions:default": None,
1457 })`,
1458 }),
1459 })
1460}
1461
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001462func TestCcLibraryStrip(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001463 expectedTargets := []string{}
1464 expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{
1465 "strip": `{
1466 "all": True,
1467 }`,
1468 })...)
1469 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{
1470 "strip": `{
1471 "keep_symbols": True,
1472 }`,
1473 })...)
1474 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{
1475 "strip": `{
1476 "keep_symbols_and_debug_frame": True,
1477 }`,
1478 })...)
1479 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{
1480 "strip": `{
1481 "keep_symbols_list": ["symbol"],
1482 }`,
1483 })...)
1484 expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{
1485 "strip": `{
1486 "none": True,
1487 }`,
1488 })...)
1489 expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...)
1490
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001491 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001492 description: "cc_library strip args",
1493 moduleTypeUnderTest: "cc_library",
1494 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001495 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001496cc_library {
1497 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001498 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001499}
1500cc_library {
1501 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001502 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001503 keep_symbols: true,
1504 },
1505 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001506}
1507cc_library {
1508 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001509 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001510 keep_symbols_and_debug_frame: true,
1511 },
1512 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001513}
1514cc_library {
1515 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001516 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001517 none: true,
1518 },
1519 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001520}
1521cc_library {
1522 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001523 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001524 keep_symbols_list: ["symbol"],
1525 },
1526 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001527}
1528cc_library {
1529 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001530 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001531 all: true,
1532 },
1533 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001534}
1535`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001536 expectedBazelTargets: expectedTargets,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001537 })
1538}
1539
1540func TestCcLibraryStripWithArch(t *testing.T) {
1541 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001542 description: "cc_library strip args",
1543 moduleTypeUnderTest: "cc_library",
1544 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001545 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001546cc_library {
1547 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001548 target: {
1549 darwin: {
1550 strip: {
1551 keep_symbols_list: ["foo", "bar"]
1552 }
1553 },
1554 },
1555 arch: {
1556 arm: {
1557 strip: {
1558 keep_symbols_and_debug_frame: true,
1559 },
1560 },
1561 arm64: {
1562 strip: {
1563 keep_symbols: true,
1564 },
1565 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001566 },
1567 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001568}
1569`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001570 expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{
1571 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001572 "keep_symbols": select({
1573 "//build/bazel/platforms/arch:arm64": True,
1574 "//conditions:default": None,
1575 }),
1576 "keep_symbols_and_debug_frame": select({
1577 "//build/bazel/platforms/arch:arm": True,
1578 "//conditions:default": None,
1579 }),
1580 "keep_symbols_list": select({
1581 "//build/bazel/platforms/os:darwin": [
1582 "foo",
1583 "bar",
1584 ],
1585 "//conditions:default": [],
1586 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001587 }`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001588 }),
1589 },
1590 )
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001591}
Chris Parsons51f8c392021-08-03 21:01:05 -04001592
1593func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1594 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001595 description: "cc_library system_shared_libs empty at root",
1596 moduleTypeUnderTest: "cc_library",
1597 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001598 blueprint: soongCcLibraryPreamble + `
1599cc_library {
1600 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001601 system_shared_libs: [],
1602 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001603}
1604`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001605 expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{
1606 "system_dynamic_deps": `[]`,
1607 }),
1608 },
1609 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001610}
1611
1612func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1613 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001614 description: "cc_library system_shared_libs empty for static variant",
1615 moduleTypeUnderTest: "cc_library",
1616 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001617 blueprint: soongCcLibraryPreamble + `
1618cc_library {
1619 name: "static_empty",
1620 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001621 system_shared_libs: [],
1622 },
1623 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001624}
1625`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001626 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001627 makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{
1628 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001629 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001630 makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001631 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001632 })
1633}
1634
1635func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1636 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001637 description: "cc_library system_shared_libs empty for shared variant",
1638 moduleTypeUnderTest: "cc_library",
1639 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001640 blueprint: soongCcLibraryPreamble + `
1641cc_library {
1642 name: "shared_empty",
1643 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001644 system_shared_libs: [],
1645 },
1646 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001647}
1648`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001649 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001650 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1651 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1652 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001653 }),
1654 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001655 })
1656}
1657
1658func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1659 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001660 description: "cc_library system_shared_libs empty for shared, bionic variant",
1661 moduleTypeUnderTest: "cc_library",
1662 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001663 blueprint: soongCcLibraryPreamble + `
1664cc_library {
1665 name: "shared_empty",
1666 target: {
1667 bionic: {
1668 shared: {
1669 system_shared_libs: [],
1670 }
1671 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001672 },
1673 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001674}
1675`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001676 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001677 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1678 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1679 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001680 }),
1681 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001682 })
1683}
1684
1685func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1686 // Note that this behavior is technically incorrect (it's a simplification).
1687 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1688 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1689 // b/195791252 tracks the fix.
1690 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001691 description: "cc_library system_shared_libs empty for linux_bionic variant",
1692 moduleTypeUnderTest: "cc_library",
1693 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001694 blueprint: soongCcLibraryPreamble + `
1695cc_library {
1696 name: "target_linux_bionic_empty",
1697 target: {
1698 linux_bionic: {
1699 system_shared_libs: [],
1700 },
1701 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001702 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001703}
1704`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001705 expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{
1706 "system_dynamic_deps": `[]`,
1707 }),
1708 },
1709 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001710}
1711
1712func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1713 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001714 description: "cc_library system_shared_libs empty for bionic variant",
1715 moduleTypeUnderTest: "cc_library",
1716 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001717 blueprint: soongCcLibraryPreamble + `
1718cc_library {
1719 name: "target_bionic_empty",
1720 target: {
1721 bionic: {
1722 system_shared_libs: [],
1723 },
1724 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001725 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001726}
1727`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001728 expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{
1729 "system_dynamic_deps": `[]`,
1730 }),
1731 },
1732 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001733}
1734
1735func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1736 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001737 description: "cc_library system_shared_libs set for shared and root",
1738 moduleTypeUnderTest: "cc_library",
1739 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001740 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001741cc_library {
1742 name: "libc",
1743 bazel_module: { bp2build_available: false },
1744}
1745cc_library {
1746 name: "libm",
1747 bazel_module: { bp2build_available: false },
1748}
Chris Parsons51f8c392021-08-03 21:01:05 -04001749
1750cc_library {
1751 name: "foo",
1752 system_shared_libs: ["libc"],
1753 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001754 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001755 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001756 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001757}
1758`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001759 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001760 makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001761 "system_dynamic_deps": `[":libc"]`,
1762 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001763 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1764 "system_dynamic_deps": `[
1765 ":libc",
1766 ":libm",
1767 ]`,
1768 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001769 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001770 })
1771}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001772
1773func TestCcLibraryOsSelects(t *testing.T) {
1774 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001775 description: "cc_library - selects for all os targets",
1776 moduleTypeUnderTest: "cc_library",
1777 moduleTypeUnderTestFactory: cc.LibraryFactory,
1778 filesystem: map[string]string{},
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001779 blueprint: soongCcLibraryPreamble + `
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001780cc_library {
1781 name: "foo-lib",
1782 srcs: ["base.cpp"],
1783 target: {
1784 android: {
1785 srcs: ["android.cpp"],
1786 },
1787 linux: {
1788 srcs: ["linux.cpp"],
1789 },
1790 linux_glibc: {
1791 srcs: ["linux_glibc.cpp"],
1792 },
1793 darwin: {
1794 srcs: ["darwin.cpp"],
1795 },
1796 bionic: {
1797 srcs: ["bionic.cpp"],
1798 },
1799 linux_musl: {
1800 srcs: ["linux_musl.cpp"],
1801 },
1802 windows: {
1803 srcs: ["windows.cpp"],
1804 },
1805 },
1806 include_build_directory: false,
1807}
1808`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001809 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1810 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001811 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001812 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001813 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001814 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001815 ],
1816 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1817 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001818 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001819 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001820 ],
1821 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001822 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001823 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001824 ],
1825 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001826 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001827 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001828 ],
1829 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1830 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001831 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001832 }),
1833 },
1834 )
Jingwen Chen97b85312021-10-08 10:41:31 +00001835}
1836
Yu Liu75be7b92022-02-01 09:54:09 -08001837func TestLibcryptoHashInjection(t *testing.T) {
1838 runCcLibraryTestCase(t, bp2buildTestCase{
1839 description: "cc_library - libcrypto hash injection",
1840 moduleTypeUnderTest: "cc_library",
1841 moduleTypeUnderTestFactory: cc.LibraryFactory,
1842 filesystem: map[string]string{},
1843 blueprint: soongCcLibraryPreamble + `
1844cc_library {
1845 name: "libcrypto",
1846 target: {
1847 android: {
1848 inject_bssl_hash: true,
1849 },
1850 },
1851 include_build_directory: false,
1852}
1853`,
1854 expectedBazelTargets: makeCcLibraryTargets("libcrypto", attrNameToString{
1855 "inject_bssl_hash": `select({
1856 "//build/bazel/platforms/os:android": True,
1857 "//conditions:default": None,
1858 })`,
1859 }),
1860 },
1861 )
1862}
1863
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001864func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001865 type testCase struct {
1866 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001867 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001868 gnu_extensions string
1869 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001870 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001871 }
1872
1873 testCases := []testCase{
1874 // Existing usages of cpp_std in AOSP are:
1875 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1876 //
1877 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1878 // is set in the toolchain.)
1879 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001880 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001881 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1882 // experimental defaults to gnu++2a
1883 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001884 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001885 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1886 // Explicitly setting a c++ std does not use replace gnu++ std even if
1887 // gnu_extensions is true.
1888 // "c++11",
1889 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001890 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001891 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1892 // "c++17",
1893 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001894 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001895 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1896 // "c++2a",
1897 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001898 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001899 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1900 // "c++98",
1901 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001902 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001903 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1904 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1905 // "gnu++11",
1906 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001907 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001908 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1909 // "gnu++17",
1910 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001911 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001912 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001913
1914 // some c_std test cases
1915 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1916 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1917 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1918 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1919 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1920 {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 +00001921 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001922 for i, tc := range testCases {
1923 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001924 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001925 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001926 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001927 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001928 cStdProp := ""
1929 if tc.c_std != "" {
1930 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1931 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001932 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001933 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001934 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001935 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001936 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001937 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001938 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001939 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001940 if tc.bazel_c_std != "" {
1941 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1942 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001943
1944 runCcLibraryTestCase(t, bp2buildTestCase{
1945 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001946 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1947 moduleTypeUnderTest: "cc_library",
1948 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen97b85312021-10-08 10:41:31 +00001949 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1950cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001951 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001952%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001953%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001954%s // gnu_extensions: *bool
1955 include_build_directory: false,
1956}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001957`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001958 expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
Jingwen Chen97b85312021-10-08 10:41:31 +00001959 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001960
1961 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1962 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001963 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1964 moduleTypeUnderTest: "cc_library_static",
1965 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001966 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1967cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001968 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001969%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001970%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001971%s // gnu_extensions: *bool
1972 include_build_directory: false,
1973}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001974`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001975 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001976 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001977 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001978 })
1979
1980 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1981 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001982 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1983 moduleTypeUnderTest: "cc_library_shared",
1984 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001985 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1986cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001987 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001988%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001989%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001990%s // gnu_extensions: *bool
1991 include_build_directory: false,
1992}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001993`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001994 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001995 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001996 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001997 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001998 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001999}
Liz Kammer12615db2021-09-28 09:19:17 -04002000
2001func TestCcLibraryProtoSimple(t *testing.T) {
2002 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002003 moduleTypeUnderTest: "cc_library",
2004 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002005 blueprint: soongCcProtoPreamble + `cc_library {
2006 name: "foo",
2007 srcs: ["foo.proto"],
2008 include_build_directory: false,
2009}`,
2010 expectedBazelTargets: []string{
2011 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002012 "srcs": `["foo.proto"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002013 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2014 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002015 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002016 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002017 "deps": `[":libprotobuf-cpp-lite"]`,
2018 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2019 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002020 }),
2021 },
2022 })
2023}
2024
2025func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) {
2026 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002027 moduleTypeUnderTest: "cc_library",
2028 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002029 blueprint: soongCcProtoPreamble + `cc_library {
2030 name: "foo",
2031 srcs: ["foo.proto"],
2032 proto: { canonical_path_from_root: false},
2033 include_build_directory: false,
2034}`,
2035 expectedBazelTargets: []string{
2036 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002037 "srcs": `["foo.proto"]`,
2038 "strip_import_prefix": `""`,
Liz Kammer12615db2021-09-28 09:19:17 -04002039 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2040 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002041 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002042 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002043 "deps": `[":libprotobuf-cpp-lite"]`,
2044 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2045 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002046 }),
2047 },
2048 })
2049}
2050
2051func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
2052 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002053 moduleTypeUnderTest: "cc_library",
2054 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002055 blueprint: soongCcProtoPreamble + `cc_library {
2056 name: "foo",
2057 srcs: ["foo.proto"],
2058 proto: { canonical_path_from_root: true},
2059 include_build_directory: false,
2060}`,
2061 expectedBazelTargets: []string{
2062 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002063 "srcs": `["foo.proto"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002064 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2065 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002066 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002067 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002068 "deps": `[":libprotobuf-cpp-lite"]`,
2069 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2070 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002071 }),
2072 },
2073 })
2074}
2075
2076func TestCcLibraryProtoFull(t *testing.T) {
2077 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002078 moduleTypeUnderTest: "cc_library",
2079 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002080 blueprint: soongCcProtoPreamble + `cc_library {
2081 name: "foo",
2082 srcs: ["foo.proto"],
2083 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002084 type: "full",
2085 },
2086 include_build_directory: false,
2087}`,
2088 expectedBazelTargets: []string{
2089 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2090 "srcs": `["foo.proto"]`,
2091 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
2092 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002093 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002094 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002095 "deps": `[":libprotobuf-cpp-full"]`,
2096 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2097 "dynamic_deps": `[":libprotobuf-cpp-full"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002098 }),
2099 },
2100 })
2101}
2102
2103func TestCcLibraryProtoLite(t *testing.T) {
2104 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002105 moduleTypeUnderTest: "cc_library",
2106 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002107 blueprint: soongCcProtoPreamble + `cc_library {
2108 name: "foo",
2109 srcs: ["foo.proto"],
2110 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002111 type: "lite",
2112 },
2113 include_build_directory: false,
2114}`,
2115 expectedBazelTargets: []string{
2116 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2117 "srcs": `["foo.proto"]`,
2118 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2119 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002120 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002121 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002122 "deps": `[":libprotobuf-cpp-lite"]`,
2123 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2124 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002125 }),
2126 },
2127 })
2128}
2129
2130func TestCcLibraryProtoExportHeaders(t *testing.T) {
2131 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002132 moduleTypeUnderTest: "cc_library",
2133 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002134 blueprint: soongCcProtoPreamble + `cc_library {
2135 name: "foo",
2136 srcs: ["foo.proto"],
2137 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002138 export_proto_headers: true,
2139 },
2140 include_build_directory: false,
2141}`,
2142 expectedBazelTargets: []string{
2143 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2144 "srcs": `["foo.proto"]`,
2145 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2146 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002147 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2148 "deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002149 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002150 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2151 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2152 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002153 }),
2154 },
2155 })
2156}
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002157
2158func TestCcLibraryProtoFilegroups(t *testing.T) {
2159 runCcLibraryTestCase(t, bp2buildTestCase{
2160 moduleTypeUnderTest: "cc_library",
2161 moduleTypeUnderTestFactory: cc.LibraryFactory,
2162 blueprint: soongCcProtoPreamble +
2163 simpleModuleDoNotConvertBp2build("filegroup", "a_fg_proto") +
2164 simpleModuleDoNotConvertBp2build("filegroup", "b_protos") +
2165 simpleModuleDoNotConvertBp2build("filegroup", "c-proto-srcs") +
2166 simpleModuleDoNotConvertBp2build("filegroup", "proto-srcs-d") + `
2167cc_library {
2168 name: "a",
2169 srcs: [":a_fg_proto"],
2170 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002171 export_proto_headers: true,
2172 },
2173 include_build_directory: false,
2174}
2175
2176cc_library {
2177 name: "b",
2178 srcs: [":b_protos"],
2179 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002180 export_proto_headers: true,
2181 },
2182 include_build_directory: false,
2183}
2184
2185cc_library {
2186 name: "c",
2187 srcs: [":c-proto-srcs"],
2188 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002189 export_proto_headers: true,
2190 },
2191 include_build_directory: false,
2192}
2193
2194cc_library {
2195 name: "d",
2196 srcs: [":proto-srcs-d"],
2197 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002198 export_proto_headers: true,
2199 },
2200 include_build_directory: false,
2201}`,
2202 expectedBazelTargets: []string{
2203 makeBazelTarget("proto_library", "a_proto", attrNameToString{
2204 "srcs": `[":a_fg_proto"]`,
2205 }), makeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", attrNameToString{
2206 "deps": `[":a_proto"]`,
2207 }), makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
2208 "deps": `[":libprotobuf-cpp-lite"]`,
2209 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2210 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2211 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2212 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2213 }), makeBazelTarget("cc_library_shared", "a", attrNameToString{
2214 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2215 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2216 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2217 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2218 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2219 }), makeBazelTarget("proto_library", "b_proto", attrNameToString{
2220 "srcs": `[":b_protos"]`,
2221 }), makeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", attrNameToString{
2222 "deps": `[":b_proto"]`,
2223 }), makeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", attrNameToString{
2224 "deps": `[":libprotobuf-cpp-lite"]`,
2225 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2226 "srcs": `[":b_protos_cpp_srcs"]`,
2227 "srcs_as": `[":b_protos_as_srcs"]`,
2228 "srcs_c": `[":b_protos_c_srcs"]`,
2229 }), makeBazelTarget("cc_library_shared", "b", attrNameToString{
2230 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2231 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2232 "srcs": `[":b_protos_cpp_srcs"]`,
2233 "srcs_as": `[":b_protos_as_srcs"]`,
2234 "srcs_c": `[":b_protos_c_srcs"]`,
2235 }), makeBazelTarget("proto_library", "c_proto", attrNameToString{
2236 "srcs": `[":c-proto-srcs"]`,
2237 }), makeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", attrNameToString{
2238 "deps": `[":c_proto"]`,
2239 }), makeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", attrNameToString{
2240 "deps": `[":libprotobuf-cpp-lite"]`,
2241 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2242 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2243 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2244 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2245 }), makeBazelTarget("cc_library_shared", "c", attrNameToString{
2246 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2247 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2248 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2249 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2250 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2251 }), makeBazelTarget("proto_library", "d_proto", attrNameToString{
2252 "srcs": `[":proto-srcs-d"]`,
2253 }), makeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", attrNameToString{
2254 "deps": `[":d_proto"]`,
2255 }), makeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", attrNameToString{
2256 "deps": `[":libprotobuf-cpp-lite"]`,
2257 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2258 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2259 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2260 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2261 }), makeBazelTarget("cc_library_shared", "d", attrNameToString{
2262 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2263 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2264 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2265 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2266 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2267 }),
2268 },
2269 })
2270}
Chris Parsons58852a02021-12-09 18:10:18 -05002271
2272func TestCcLibraryDisabledArchAndTarget(t *testing.T) {
2273 runCcLibraryTestCase(t, bp2buildTestCase{
2274 moduleTypeUnderTest: "cc_library",
2275 moduleTypeUnderTestFactory: cc.LibraryFactory,
2276 blueprint: soongCcProtoPreamble + `cc_library {
2277 name: "foo",
2278 srcs: ["foo.cpp"],
2279 target: {
2280 darwin: {
2281 enabled: false,
2282 },
2283 windows: {
2284 enabled: false,
2285 },
2286 linux_glibc_x86: {
2287 enabled: false,
2288 },
2289 },
2290 include_build_directory: false,
2291}`,
2292 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2293 "srcs": `["foo.cpp"]`,
2294 "target_compatible_with": `select({
2295 "//build/bazel/platforms/os_arch:darwin_arm64": ["@platforms//:incompatible"],
2296 "//build/bazel/platforms/os_arch:darwin_x86_64": ["@platforms//:incompatible"],
2297 "//build/bazel/platforms/os_arch:linux_glibc_x86": ["@platforms//:incompatible"],
2298 "//build/bazel/platforms/os_arch:windows_x86": ["@platforms//:incompatible"],
2299 "//build/bazel/platforms/os_arch:windows_x86_64": ["@platforms//:incompatible"],
2300 "//conditions:default": [],
2301 })`,
2302 }),
2303 })
2304}
2305
2306func TestCcLibraryDisabledArchAndTargetWithDefault(t *testing.T) {
2307 runCcLibraryTestCase(t, bp2buildTestCase{
2308 moduleTypeUnderTest: "cc_library",
2309 moduleTypeUnderTestFactory: cc.LibraryFactory,
2310 blueprint: soongCcProtoPreamble + `cc_library {
2311 name: "foo",
2312 srcs: ["foo.cpp"],
2313 enabled: false,
2314 target: {
2315 darwin: {
2316 enabled: true,
2317 },
2318 windows: {
2319 enabled: false,
2320 },
2321 linux_glibc_x86: {
2322 enabled: false,
2323 },
2324 },
2325 include_build_directory: false,
2326}`,
2327 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2328 "srcs": `["foo.cpp"]`,
2329 "target_compatible_with": `select({
2330 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2331 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2332 "//conditions:default": ["@platforms//:incompatible"],
2333 })`,
2334 }),
2335 })
2336}
2337
2338func TestCcLibrarySharedDisabled(t *testing.T) {
2339 runCcLibraryTestCase(t, bp2buildTestCase{
2340 moduleTypeUnderTest: "cc_library",
2341 moduleTypeUnderTestFactory: cc.LibraryFactory,
2342 blueprint: soongCcProtoPreamble + `cc_library {
2343 name: "foo",
2344 srcs: ["foo.cpp"],
2345 enabled: false,
2346 shared: {
2347 enabled: true,
2348 },
2349 target: {
2350 android: {
2351 shared: {
2352 enabled: false,
2353 },
2354 }
2355 },
2356 include_build_directory: false,
2357}`,
2358 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2359 "srcs": `["foo.cpp"]`,
2360 "target_compatible_with": `["@platforms//:incompatible"]`,
2361 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2362 "srcs": `["foo.cpp"]`,
2363 "target_compatible_with": `select({
2364 "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
2365 "//conditions:default": [],
2366 })`,
2367 }),
2368 },
2369 })
2370}
2371
2372func TestCcLibraryStaticDisabledForSomeArch(t *testing.T) {
2373 runCcLibraryTestCase(t, bp2buildTestCase{
2374 moduleTypeUnderTest: "cc_library",
2375 moduleTypeUnderTestFactory: cc.LibraryFactory,
2376 blueprint: soongCcProtoPreamble + `cc_library {
2377 name: "foo",
2378 srcs: ["foo.cpp"],
2379 shared: {
2380 enabled: false
2381 },
2382 target: {
2383 darwin: {
2384 enabled: true,
2385 },
2386 windows: {
2387 enabled: false,
2388 },
2389 linux_glibc_x86: {
2390 shared: {
2391 enabled: true,
2392 },
2393 },
2394 },
2395 include_build_directory: false,
2396}`,
2397 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2398 "srcs": `["foo.cpp"]`,
2399 "target_compatible_with": `select({
2400 "//build/bazel/platforms/os:windows": ["@platforms//:incompatible"],
2401 "//conditions:default": [],
2402 })`,
2403 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2404 "srcs": `["foo.cpp"]`,
2405 "target_compatible_with": `select({
2406 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2407 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2408 "//build/bazel/platforms/os_arch:linux_glibc_x86": [],
2409 "//conditions:default": ["@platforms//:incompatible"],
2410 })`,
2411 }),
2412 }})
2413}
Jingwen Chen0ee88a62022-01-07 14:55:29 +00002414
2415func TestCcLibraryStubs(t *testing.T) {
2416 runCcLibraryTestCase(t, bp2buildTestCase{
2417 description: "cc_library stubs",
2418 moduleTypeUnderTest: "cc_library",
2419 moduleTypeUnderTestFactory: cc.LibraryFactory,
2420 dir: "foo/bar",
2421 filesystem: map[string]string{
2422 "foo/bar/Android.bp": `
2423cc_library {
2424 name: "a",
2425 stubs: { symbol_file: "a.map.txt", versions: ["28", "29", "current"] },
2426 bazel_module: { bp2build_available: true },
2427 include_build_directory: false,
2428}
2429`,
2430 },
2431 blueprint: soongCcLibraryPreamble,
2432 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
2433 "stubs_symbol_file": `"a.map.txt"`,
2434 "stubs_versions": `[
2435 "28",
2436 "29",
2437 "current",
2438 ]`,
2439 }),
2440 },
2441 )
2442}
Liz Kammerf38a8372022-02-04 15:39:00 -05002443
2444func TestCcLibraryEscapeLdflags(t *testing.T) {
2445 runCcLibraryTestCase(t, bp2buildTestCase{
2446 moduleTypeUnderTest: "cc_library",
2447 moduleTypeUnderTestFactory: cc.LibraryFactory,
2448 blueprint: soongCcProtoPreamble + `cc_library {
2449 name: "foo",
2450 ldflags: ["-Wl,--rpath,${ORIGIN}"],
2451 include_build_directory: false,
2452}`,
2453 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2454 "linkopts": `["-Wl,--rpath,$${ORIGIN}"]`,
2455 }),
2456 })
2457}