blob: d84e15650a21adb3d2180702dff53baf811f525e [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"],
286 static_libs: ["static_dep_for_both"],
287 whole_static_libs: ["whole_static_lib_for_both"],
288 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 Kammer8337ea42021-09-10 10:06:32 -0400335cc_library {
336 name: "shared_dep_for_shared",
337 bazel_module: { bp2build_available: false },
338}
Chris Parsons08648312021-05-06 16:23:19 -0400339
Liz Kammer8337ea42021-09-10 10:06:32 -0400340cc_library {
341 name: "shared_dep_for_static",
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_both",
347 bazel_module: { bp2build_available: false },
348}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000349`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500350 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500351 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
352 "copts": `[
353 "bothflag",
354 "staticflag",
355 ]`,
356 "implementation_deps": `[
357 ":static_dep_for_both",
358 ":static_dep_for_static",
359 ]`,
360 "implementation_dynamic_deps": `[
361 ":shared_dep_for_both",
362 ":shared_dep_for_static",
363 ]`,
364 "srcs": `[
365 "both.cpp",
366 "staticonly.cpp",
367 ]`,
368 "whole_archive_deps": `[
369 ":whole_static_lib_for_both",
370 ":whole_static_lib_for_static",
371 ]`}),
372 makeBazelTarget("cc_library_shared", "a", attrNameToString{
373 "copts": `[
374 "bothflag",
375 "sharedflag",
376 ]`,
377 "implementation_deps": `[
378 ":static_dep_for_both",
379 ":static_dep_for_shared",
380 ]`,
381 "implementation_dynamic_deps": `[
382 ":shared_dep_for_both",
383 ":shared_dep_for_shared",
384 ]`,
385 "srcs": `[
386 "both.cpp",
387 "sharedonly.cpp",
388 ]`,
389 "whole_archive_deps": `[
390 ":whole_static_lib_for_both",
391 ":whole_static_lib_for_shared",
392 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500393 }),
394 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200395 })
396}
397
Liz Kammer7a210ac2021-09-22 15:52:58 -0400398func TestCcLibraryDeps(t *testing.T) {
399 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400400 description: "cc_library shared/static props",
401 moduleTypeUnderTest: "cc_library",
402 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer7a210ac2021-09-22 15:52:58 -0400403 filesystem: map[string]string{
404 "both.cpp": "",
405 "sharedonly.cpp": "",
406 "staticonly.cpp": "",
407 },
408 blueprint: soongCcLibraryPreamble + `
409cc_library {
410 name: "a",
411 srcs: ["both.cpp"],
412 cflags: ["bothflag"],
413 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
414 export_shared_lib_headers: ["shared_dep_for_both"],
415 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
416 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
417 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
418 static: {
419 srcs: ["staticonly.cpp"],
420 cflags: ["staticflag"],
421 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
422 export_shared_lib_headers: ["shared_dep_for_static"],
423 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
424 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
425 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
426 },
427 shared: {
428 srcs: ["sharedonly.cpp"],
429 cflags: ["sharedflag"],
430 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
431 export_shared_lib_headers: ["shared_dep_for_shared"],
432 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
433 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
434 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
435 },
436 include_build_directory: false,
437}
438` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
439 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
440 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
441 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
442 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
443 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
444 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
445 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
446 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
447 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
448 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
449 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
450 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
451 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
452 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
453 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
454 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
455 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500456 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500457 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
458 "copts": `[
459 "bothflag",
460 "staticflag",
461 ]`,
462 "deps": `[
463 ":static_dep_for_both",
464 ":static_dep_for_static",
465 ]`,
466 "dynamic_deps": `[
467 ":shared_dep_for_both",
468 ":shared_dep_for_static",
469 ]`,
470 "implementation_deps": `[
471 ":implementation_static_dep_for_both",
472 ":implementation_static_dep_for_static",
473 ]`,
474 "implementation_dynamic_deps": `[
475 ":implementation_shared_dep_for_both",
476 ":implementation_shared_dep_for_static",
477 ]`,
478 "srcs": `[
479 "both.cpp",
480 "staticonly.cpp",
481 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500482 "whole_archive_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400483 ":not_explicitly_exported_whole_static_dep_for_both",
484 ":whole_static_dep_for_both",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500485 ":not_explicitly_exported_whole_static_dep_for_static",
486 ":whole_static_dep_for_static",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500487 ]`,
488 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500489 makeBazelTarget("cc_library_shared", "a", attrNameToString{
490 "copts": `[
491 "bothflag",
492 "sharedflag",
493 ]`,
494 "deps": `[
495 ":static_dep_for_both",
496 ":static_dep_for_shared",
497 ]`,
498 "dynamic_deps": `[
499 ":shared_dep_for_both",
500 ":shared_dep_for_shared",
501 ]`,
502 "implementation_deps": `[
503 ":implementation_static_dep_for_both",
504 ":implementation_static_dep_for_shared",
505 ]`,
506 "implementation_dynamic_deps": `[
507 ":implementation_shared_dep_for_both",
508 ":implementation_shared_dep_for_shared",
509 ]`,
510 "srcs": `[
511 "both.cpp",
512 "sharedonly.cpp",
513 ]`,
514 "whole_archive_deps": `[
515 ":not_explicitly_exported_whole_static_dep_for_both",
516 ":whole_static_dep_for_both",
517 ":not_explicitly_exported_whole_static_dep_for_shared",
518 ":whole_static_dep_for_shared",
519 ]`,
520 })},
521 },
522 )
Liz Kammer7a210ac2021-09-22 15:52:58 -0400523}
524
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400525func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
526 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400527 moduleTypeUnderTest: "cc_library",
528 moduleTypeUnderTestFactory: cc.LibraryFactory,
529 dir: "foo/bar",
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400530 filesystem: map[string]string{
531 "foo/bar/Android.bp": `
532cc_library {
533 name: "a",
534 whole_static_libs: ["whole_static_lib_for_both"],
535 static: {
536 whole_static_libs: ["whole_static_lib_for_static"],
537 },
538 shared: {
539 whole_static_libs: ["whole_static_lib_for_shared"],
540 },
541 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400542 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400543}
544
545cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
546
547cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
548
549cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
550`,
551 },
552 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500553 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500554 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
555 "whole_archive_deps": `[
556 ":whole_static_lib_for_both_alwayslink",
557 ":whole_static_lib_for_static_alwayslink",
558 ]`,
559 }),
560 makeBazelTarget("cc_library_shared", "a", attrNameToString{
561 "whole_archive_deps": `[
562 ":whole_static_lib_for_both_alwayslink",
563 ":whole_static_lib_for_shared_alwayslink",
564 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500565 }),
566 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500567 },
568 )
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400569}
570
Jingwen Chenbcf53042021-05-26 04:42:42 +0000571func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
572 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400573 description: "cc_library shared/static props in arch",
574 moduleTypeUnderTest: "cc_library",
575 moduleTypeUnderTestFactory: cc.LibraryFactory,
576 dir: "foo/bar",
Jingwen Chenbcf53042021-05-26 04:42:42 +0000577 filesystem: map[string]string{
578 "foo/bar/arm.cpp": "",
579 "foo/bar/x86.cpp": "",
580 "foo/bar/sharedonly.cpp": "",
581 "foo/bar/staticonly.cpp": "",
582 "foo/bar/Android.bp": `
583cc_library {
584 name: "a",
585 arch: {
586 arm: {
587 shared: {
588 srcs: ["arm_shared.cpp"],
589 cflags: ["-DARM_SHARED"],
590 static_libs: ["arm_static_dep_for_shared"],
591 whole_static_libs: ["arm_whole_static_dep_for_shared"],
592 shared_libs: ["arm_shared_dep_for_shared"],
593 },
594 },
595 x86: {
596 static: {
597 srcs: ["x86_static.cpp"],
598 cflags: ["-DX86_STATIC"],
599 static_libs: ["x86_dep_for_static"],
600 },
601 },
602 },
603 target: {
604 android: {
605 shared: {
606 srcs: ["android_shared.cpp"],
607 cflags: ["-DANDROID_SHARED"],
608 static_libs: ["android_dep_for_shared"],
609 },
610 },
611 android_arm: {
612 shared: {
613 cflags: ["-DANDROID_ARM_SHARED"],
614 },
615 },
616 },
617 srcs: ["both.cpp"],
618 cflags: ["bothflag"],
619 static_libs: ["static_dep_for_both"],
620 static: {
621 srcs: ["staticonly.cpp"],
622 cflags: ["staticflag"],
623 static_libs: ["static_dep_for_static"],
624 },
625 shared: {
626 srcs: ["sharedonly.cpp"],
627 cflags: ["sharedflag"],
628 static_libs: ["static_dep_for_shared"],
629 },
630 bazel_module: { bp2build_available: true },
631}
632
633cc_library_static { name: "static_dep_for_shared" }
634cc_library_static { name: "static_dep_for_static" }
635cc_library_static { name: "static_dep_for_both" }
636
637cc_library_static { name: "arm_static_dep_for_shared" }
638cc_library_static { name: "arm_whole_static_dep_for_shared" }
639cc_library_static { name: "arm_shared_dep_for_shared" }
640
641cc_library_static { name: "x86_dep_for_static" }
642
643cc_library_static { name: "android_dep_for_shared" }
644`,
645 },
646 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500647 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500648 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
649 "copts": `[
650 "bothflag",
651 "staticflag",
652 ] + select({
653 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
654 "//conditions:default": [],
655 })`,
656 "implementation_deps": `[
657 ":static_dep_for_both",
658 ":static_dep_for_static",
659 ] + select({
660 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
661 "//conditions:default": [],
662 })`,
663 "local_includes": `["."]`,
664 "srcs": `[
665 "both.cpp",
666 "staticonly.cpp",
667 ] + select({
668 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
669 "//conditions:default": [],
670 })`,
671 }),
672 makeBazelTarget("cc_library_shared", "a", attrNameToString{
673 "copts": `[
674 "bothflag",
675 "sharedflag",
676 ] + select({
677 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
678 "//conditions:default": [],
679 }) + select({
680 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
681 "//conditions:default": [],
682 }) + select({
683 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
684 "//conditions:default": [],
685 })`,
686 "implementation_deps": `[
687 ":static_dep_for_both",
688 ":static_dep_for_shared",
689 ] + select({
690 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
691 "//conditions:default": [],
692 }) + select({
693 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
694 "//conditions:default": [],
695 })`,
696 "implementation_dynamic_deps": `select({
697 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
698 "//conditions:default": [],
699 })`,
700 "local_includes": `["."]`,
701 "srcs": `[
702 "both.cpp",
703 "sharedonly.cpp",
704 ] + select({
705 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
706 "//conditions:default": [],
707 }) + select({
708 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
709 "//conditions:default": [],
710 })`,
711 "whole_archive_deps": `select({
712 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
713 "//conditions:default": [],
714 })`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500715 }),
716 },
Chris Parsons77acf2e2021-12-03 17:27:16 -0500717 },
718 )
Jingwen Chenbcf53042021-05-26 04:42:42 +0000719}
720
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000721func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
722 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400723 description: "cc_library shared/static props with c/cpp/s mixed sources",
724 moduleTypeUnderTest: "cc_library",
725 moduleTypeUnderTestFactory: cc.LibraryFactory,
726 dir: "foo/bar",
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000727 filesystem: map[string]string{
728 "foo/bar/both_source.cpp": "",
729 "foo/bar/both_source.cc": "",
730 "foo/bar/both_source.c": "",
731 "foo/bar/both_source.s": "",
732 "foo/bar/both_source.S": "",
733 "foo/bar/shared_source.cpp": "",
734 "foo/bar/shared_source.cc": "",
735 "foo/bar/shared_source.c": "",
736 "foo/bar/shared_source.s": "",
737 "foo/bar/shared_source.S": "",
738 "foo/bar/static_source.cpp": "",
739 "foo/bar/static_source.cc": "",
740 "foo/bar/static_source.c": "",
741 "foo/bar/static_source.s": "",
742 "foo/bar/static_source.S": "",
743 "foo/bar/Android.bp": `
744cc_library {
745 name: "a",
746 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400747 "both_source.cpp",
748 "both_source.cc",
749 "both_source.c",
750 "both_source.s",
751 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400752 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400753 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000754 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400755 srcs: [
756 "static_source.cpp",
757 "static_source.cc",
758 "static_source.c",
759 "static_source.s",
760 "static_source.S",
761 ":static_filegroup",
762 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000763 },
764 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400765 srcs: [
766 "shared_source.cpp",
767 "shared_source.cc",
768 "shared_source.c",
769 "shared_source.s",
770 "shared_source.S",
771 ":shared_filegroup",
772 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000773 },
774 bazel_module: { bp2build_available: true },
775}
776
777filegroup {
778 name: "both_filegroup",
779 srcs: [
780 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400781 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000782}
783
784filegroup {
785 name: "shared_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: "static_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`,
798 },
799 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500800 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -0500801 makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500802 "local_includes": `["."]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500803 "srcs": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000804 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400805 "both_source.cc",
806 ":both_filegroup_cpp_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500807 "static_source.cpp",
808 "static_source.cc",
809 ":static_filegroup_cpp_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500810 ]`,
811 "srcs_as": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000812 "both_source.s",
813 "both_source.S",
814 ":both_filegroup_as_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500815 "static_source.s",
816 "static_source.S",
817 ":static_filegroup_as_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500818 ]`,
819 "srcs_c": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000820 "both_source.c",
821 ":both_filegroup_c_srcs",
Chris Parsons77acf2e2021-12-03 17:27:16 -0500822 "static_source.c",
823 ":static_filegroup_c_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500824 ]`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500825 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -0500826 makeBazelTarget("cc_library_shared", "a", attrNameToString{
827 "local_includes": `["."]`,
828 "srcs": `[
829 "both_source.cpp",
830 "both_source.cc",
831 ":both_filegroup_cpp_srcs",
832 "shared_source.cpp",
833 "shared_source.cc",
834 ":shared_filegroup_cpp_srcs",
835 ]`,
836 "srcs_as": `[
837 "both_source.s",
838 "both_source.S",
839 ":both_filegroup_as_srcs",
840 "shared_source.s",
841 "shared_source.S",
842 ":shared_filegroup_as_srcs",
843 ]`,
844 "srcs_c": `[
845 "both_source.c",
846 ":both_filegroup_c_srcs",
847 "shared_source.c",
848 ":shared_filegroup_c_srcs",
849 ]`,
850 })}})
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000851}
852
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200853func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
854 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400855 description: "cc_library non-configured version script",
856 moduleTypeUnderTest: "cc_library",
857 moduleTypeUnderTestFactory: cc.LibraryFactory,
858 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200859 filesystem: map[string]string{
860 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200861cc_library {
862 name: "a",
863 srcs: ["a.cpp"],
864 version_script: "v.map",
865 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400866 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200867}
868`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200869 },
870 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500871 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
872 "additional_linker_inputs": `["v.map"]`,
873 "linkopts": `["-Wl,--version-script,$(location v.map)"]`,
874 "srcs": `["a.cpp"]`,
875 }),
876 },
877 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200878}
879
880func TestCcLibraryConfiguredVersionScript(t *testing.T) {
881 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400882 description: "cc_library configured version script",
883 moduleTypeUnderTest: "cc_library",
884 moduleTypeUnderTestFactory: cc.LibraryFactory,
885 dir: "foo/bar",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200886 filesystem: map[string]string{
887 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400888cc_library {
889 name: "a",
890 srcs: ["a.cpp"],
891 arch: {
892 arm: {
893 version_script: "arm.map",
894 },
895 arm64: {
896 version_script: "arm64.map",
897 },
898 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200899
Liz Kammer8337ea42021-09-10 10:06:32 -0400900 bazel_module: { bp2build_available: true },
901 include_build_directory: false,
902}
Liz Kammerd366c902021-06-03 13:43:01 -0400903 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200904 },
905 blueprint: soongCcLibraryPreamble,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500906 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
907 "additional_linker_inputs": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400908 "//build/bazel/platforms/arch:arm": ["arm.map"],
909 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
910 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500911 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500912 "linkopts": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400913 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
914 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
915 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500916 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500917 "srcs": `["a.cpp"]`,
918 }),
919 },
920 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200921}
922
923func TestCcLibrarySharedLibs(t *testing.T) {
924 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400925 description: "cc_library shared_libs",
926 moduleTypeUnderTest: "cc_library",
927 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400928 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400929cc_library {
930 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400931 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400932}
933
934cc_library {
935 name: "a",
936 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400937 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400938}
939`,
Chris Parsons77acf2e2021-12-03 17:27:16 -0500940 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
941 "implementation_dynamic_deps": `[":mylib"]`,
942 }),
943 },
944 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200945}
946
Liz Kammer0eae52e2021-10-06 10:32:26 -0400947func TestCcLibraryFeatures(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -0500948 expected_targets := []string{}
949 expected_targets = append(expected_targets, makeCcLibraryTargets("a", attrNameToString{
950 "features": `[
951 "disable_pack_relocations",
952 "-no_undefined_symbols",
953 ]`,
954 "srcs": `["a.cpp"]`,
955 })...)
956 expected_targets = append(expected_targets, makeCcLibraryTargets("b", attrNameToString{
957 "features": `select({
958 "//build/bazel/platforms/arch:x86_64": [
959 "disable_pack_relocations",
960 "-no_undefined_symbols",
961 ],
962 "//conditions:default": [],
963 })`,
964 "srcs": `["b.cpp"]`,
965 })...)
966 expected_targets = append(expected_targets, makeCcLibraryTargets("c", attrNameToString{
967 "features": `select({
968 "//build/bazel/platforms/os:darwin": [
969 "disable_pack_relocations",
970 "-no_undefined_symbols",
971 ],
972 "//conditions:default": [],
973 })`,
974 "srcs": `["c.cpp"]`,
975 })...)
976
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200977 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400978 description: "cc_library pack_relocations test",
979 moduleTypeUnderTest: "cc_library",
980 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -0400981 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400982cc_library {
983 name: "a",
984 srcs: ["a.cpp"],
985 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400986 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400987 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400988}
989
990cc_library {
991 name: "b",
992 srcs: ["b.cpp"],
993 arch: {
994 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400995 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400996 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400997 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400998 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400999 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001000}
1001
1002cc_library {
1003 name: "c",
1004 srcs: ["c.cpp"],
1005 target: {
1006 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001007 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -04001008 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001009 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001010 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001011 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -04001012}`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001013 expectedBazelTargets: expected_targets,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001014 })
1015}
1016
1017func TestCcLibrarySpacesInCopts(t *testing.T) {
1018 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001019 description: "cc_library spaces in copts",
1020 moduleTypeUnderTest: "cc_library",
1021 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001022 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +00001023cc_library {
1024 name: "a",
1025 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -04001026 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +00001027}
1028`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001029 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1030 "copts": `[
Jingwen Chen3950cd62021-05-12 04:33:00 +00001031 "-include",
1032 "header.h",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001033 ]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001034 }),
1035 },
1036 )
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001037}
1038
1039func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
1040 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001041 description: "cc_library cppflags usage",
1042 moduleTypeUnderTest: "cc_library",
1043 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001044 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001045 name: "a",
1046 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001047 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001048 cppflags: [
1049 "-fsigned-char",
1050 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -04001051 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001052 arch: {
1053 arm64: {
1054 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001055 },
Liz Kammerd366c902021-06-03 13:43:01 -04001056 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001057 target: {
1058 android: {
1059 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001060 },
Liz Kammerd366c902021-06-03 13:43:01 -04001061 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001062 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001063}
1064`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001065 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
1066 "copts": `["-Wall"]`,
1067 "cppflags": `[
Chris Parsons990c4f42021-05-25 12:10:58 -04001068 "-fsigned-char",
1069 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001070 ] + select({
1071 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1072 "//conditions:default": [],
1073 }) + select({
1074 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1075 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001076 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001077 "srcs": `["a.cpp"]`,
1078 }),
1079 },
1080 )
Jingwen Chen63930982021-03-24 10:04:33 -04001081}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001082
Liz Kammer47535c52021-06-02 16:02:22 -04001083func TestCcLibraryExcludeLibs(t *testing.T) {
1084 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001085 moduleTypeUnderTest: "cc_library",
1086 moduleTypeUnderTestFactory: cc.LibraryFactory,
1087 filesystem: map[string]string{},
Liz Kammer47535c52021-06-02 16:02:22 -04001088 blueprint: soongCcLibraryStaticPreamble + `
1089cc_library {
1090 name: "foo_static",
1091 srcs: ["common.c"],
1092 whole_static_libs: [
1093 "arm_whole_static_lib_excludes",
1094 "malloc_not_svelte_whole_static_lib_excludes"
1095 ],
1096 static_libs: [
1097 "arm_static_lib_excludes",
1098 "malloc_not_svelte_static_lib_excludes"
1099 ],
1100 shared_libs: [
1101 "arm_shared_lib_excludes",
1102 ],
1103 arch: {
1104 arm: {
1105 exclude_shared_libs: [
1106 "arm_shared_lib_excludes",
1107 ],
1108 exclude_static_libs: [
1109 "arm_static_lib_excludes",
1110 "arm_whole_static_lib_excludes",
1111 ],
1112 },
1113 },
1114 product_variables: {
1115 malloc_not_svelte: {
1116 shared_libs: ["malloc_not_svelte_shared_lib"],
1117 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1118 exclude_static_libs: [
1119 "malloc_not_svelte_static_lib_excludes",
1120 "malloc_not_svelte_whole_static_lib_excludes",
1121 ],
1122 },
1123 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001124 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001125}
1126
1127cc_library {
1128 name: "arm_whole_static_lib_excludes",
1129 bazel_module: { bp2build_available: false },
1130}
1131
1132cc_library {
1133 name: "malloc_not_svelte_whole_static_lib",
1134 bazel_module: { bp2build_available: false },
1135}
1136
1137cc_library {
1138 name: "malloc_not_svelte_whole_static_lib_excludes",
1139 bazel_module: { bp2build_available: false },
1140}
1141
1142cc_library {
1143 name: "arm_static_lib_excludes",
1144 bazel_module: { bp2build_available: false },
1145}
1146
1147cc_library {
1148 name: "malloc_not_svelte_static_lib_excludes",
1149 bazel_module: { bp2build_available: false },
1150}
1151
1152cc_library {
1153 name: "arm_shared_lib_excludes",
1154 bazel_module: { bp2build_available: false },
1155}
1156
1157cc_library {
1158 name: "malloc_not_svelte_shared_lib",
1159 bazel_module: { bp2build_available: false },
1160}
1161`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001162 expectedBazelTargets: makeCcLibraryTargets("foo_static", attrNameToString{
1163 "implementation_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001164 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001165 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001166 }) + select({
1167 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001168 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001169 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001170 "implementation_dynamic_deps": `select({
Liz Kammer7a210ac2021-09-22 15:52:58 -04001171 "//build/bazel/platforms/arch:arm": [],
1172 "//conditions:default": [":arm_shared_lib_excludes"],
1173 }) + select({
1174 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1175 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001176 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001177 "srcs_c": `["common.c"]`,
1178 "whole_archive_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001179 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001180 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001181 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001182 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1183 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001184 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001185 }),
1186 },
1187 )
Liz Kammer47535c52021-06-02 16:02:22 -04001188}
Liz Kammerd366c902021-06-03 13:43:01 -04001189
1190func TestCCLibraryNoCrtTrue(t *testing.T) {
1191 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001192 description: "cc_library - nocrt: true emits attribute",
1193 moduleTypeUnderTest: "cc_library",
1194 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001195 filesystem: map[string]string{
1196 "impl.cpp": "",
1197 },
1198 blueprint: soongCcLibraryPreamble + `
1199cc_library {
1200 name: "foo-lib",
1201 srcs: ["impl.cpp"],
1202 nocrt: true,
1203 include_build_directory: false,
1204}
1205`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001206 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1207 "link_crt": `False`,
1208 "srcs": `["impl.cpp"]`,
1209 }),
1210 },
1211 )
Jingwen Chen6ada5892021-09-17 11:38:09 +00001212}
1213
1214func TestCCLibraryNoCrtFalse(t *testing.T) {
1215 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001216 description: "cc_library - nocrt: false - does not emit attribute",
1217 moduleTypeUnderTest: "cc_library",
1218 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001219 filesystem: map[string]string{
1220 "impl.cpp": "",
1221 },
1222 blueprint: soongCcLibraryPreamble + `
1223cc_library {
1224 name: "foo-lib",
1225 srcs: ["impl.cpp"],
1226 nocrt: false,
1227 include_build_directory: false,
1228}
1229`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001230 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1231 "srcs": `["impl.cpp"]`,
1232 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001233 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001234}
1235
1236func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1237 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001238 description: "cc_library - nocrt in select",
1239 moduleTypeUnderTest: "cc_library",
1240 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen6ada5892021-09-17 11:38:09 +00001241 filesystem: map[string]string{
1242 "impl.cpp": "",
1243 },
1244 blueprint: soongCcLibraryPreamble + `
1245cc_library {
1246 name: "foo-lib",
1247 srcs: ["impl.cpp"],
1248 arch: {
1249 arm: {
1250 nocrt: true,
1251 },
1252 x86: {
1253 nocrt: false,
1254 },
1255 },
1256 include_build_directory: false,
1257}
1258`,
Liz Kammer718eb272022-01-07 10:53:37 -05001259 expectedErr: fmt.Errorf("module \"foo-lib\": nocrt is not supported for arch variants"),
Jingwen Chen6ada5892021-09-17 11:38:09 +00001260 })
1261}
1262
1263func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1264 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001265 moduleTypeUnderTest: "cc_library",
1266 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001267 filesystem: map[string]string{
1268 "impl.cpp": "",
1269 },
1270 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001271cc_library {
1272 name: "foo-lib",
1273 srcs: ["impl.cpp"],
1274 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001275 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001276}
1277`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001278 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1279 "srcs": `["impl.cpp"]`,
1280 "use_libcrt": `False`,
1281 }),
1282 })
1283}
1284
1285func makeCcLibraryTargets(name string, attrs attrNameToString) []string {
1286 STATIC_ONLY_ATTRS := map[string]bool{}
1287 SHARED_ONLY_ATTRS := map[string]bool{
1288 "link_crt": true,
1289 "additional_linker_inputs": true,
1290 "linkopts": true,
1291 "strip": true,
Jingwen Chen0ee88a62022-01-07 14:55:29 +00001292 "stubs_symbol_file": true,
1293 "stubs_versions": true,
Yu Liu75be7b92022-02-01 09:54:09 -08001294 "inject_bssl_hash": true,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001295 }
1296 sharedAttrs := attrNameToString{}
1297 staticAttrs := attrNameToString{}
1298 for key, val := range attrs {
1299 if _, staticOnly := STATIC_ONLY_ATTRS[key]; !staticOnly {
1300 sharedAttrs[key] = val
1301 }
1302 if _, sharedOnly := SHARED_ONLY_ATTRS[key]; !sharedOnly {
1303 staticAttrs[key] = val
1304 }
1305 }
1306 sharedTarget := makeBazelTarget("cc_library_shared", name, sharedAttrs)
1307 staticTarget := makeBazelTarget("cc_library_static", name+"_bp2build_cc_library_static", staticAttrs)
1308
1309 return []string{staticTarget, sharedTarget}
Liz Kammerd366c902021-06-03 13:43:01 -04001310}
1311
Jingwen Chen6ada5892021-09-17 11:38:09 +00001312func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001313 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001314 moduleTypeUnderTest: "cc_library",
1315 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001316 filesystem: map[string]string{
1317 "impl.cpp": "",
1318 },
1319 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001320cc_library {
1321 name: "foo-lib",
1322 srcs: ["impl.cpp"],
1323 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001324 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001325}
1326`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001327 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1328 "srcs": `["impl.cpp"]`,
1329 "use_libcrt": `True`,
1330 }),
1331 })
Liz Kammerd366c902021-06-03 13:43:01 -04001332}
1333
Jingwen Chen6ada5892021-09-17 11:38:09 +00001334func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001335 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001336 moduleTypeUnderTest: "cc_library",
1337 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammerd366c902021-06-03 13:43:01 -04001338 filesystem: map[string]string{
1339 "impl.cpp": "",
1340 },
1341 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001342cc_library {
1343 name: "foo-lib",
1344 srcs: ["impl.cpp"],
1345 arch: {
1346 arm: {
1347 no_libcrt: true,
1348 },
1349 x86: {
1350 no_libcrt: true,
1351 },
1352 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001353 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001354}
1355`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001356 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1357 "srcs": `["impl.cpp"]`,
1358 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001359 "//build/bazel/platforms/arch:arm": False,
1360 "//build/bazel/platforms/arch:x86": False,
1361 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001362 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001363 }),
1364 })
Liz Kammerd366c902021-06-03 13:43:01 -04001365}
1366
Chris Parsons58852a02021-12-09 18:10:18 -05001367func TestCCLibraryNoLibCrtArchAndTargetVariant(t *testing.T) {
1368 runCcLibraryTestCase(t, bp2buildTestCase{
1369 moduleTypeUnderTest: "cc_library",
1370 moduleTypeUnderTestFactory: cc.LibraryFactory,
1371 filesystem: map[string]string{
1372 "impl.cpp": "",
1373 },
1374 blueprint: soongCcLibraryPreamble + `
1375cc_library {
1376 name: "foo-lib",
1377 srcs: ["impl.cpp"],
1378 arch: {
1379 arm: {
1380 no_libcrt: true,
1381 },
1382 x86: {
1383 no_libcrt: true,
1384 },
1385 },
1386 target: {
1387 darwin: {
1388 no_libcrt: true,
1389 }
1390 },
1391 include_build_directory: false,
1392}
1393`,
1394 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1395 "srcs": `["impl.cpp"]`,
1396 "use_libcrt": `select({
1397 "//build/bazel/platforms/os_arch:android_arm": False,
1398 "//build/bazel/platforms/os_arch:android_x86": False,
1399 "//build/bazel/platforms/os_arch:darwin_arm64": False,
1400 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1401 "//build/bazel/platforms/os_arch:linux_glibc_x86": False,
1402 "//build/bazel/platforms/os_arch:linux_musl_x86": False,
1403 "//build/bazel/platforms/os_arch:windows_x86": False,
1404 "//conditions:default": None,
1405 })`,
1406 }),
1407 })
1408}
1409
1410func TestCCLibraryNoLibCrtArchAndTargetVariantConflict(t *testing.T) {
1411 runCcLibraryTestCase(t, bp2buildTestCase{
1412 moduleTypeUnderTest: "cc_library",
1413 moduleTypeUnderTestFactory: cc.LibraryFactory,
1414 filesystem: map[string]string{
1415 "impl.cpp": "",
1416 },
1417 blueprint: soongCcLibraryPreamble + `
1418cc_library {
1419 name: "foo-lib",
1420 srcs: ["impl.cpp"],
1421 arch: {
1422 arm: {
1423 no_libcrt: true,
1424 },
1425 // This is expected to override the value for darwin_x86_64.
1426 x86_64: {
1427 no_libcrt: true,
1428 },
1429 },
1430 target: {
1431 darwin: {
1432 no_libcrt: false,
1433 }
1434 },
1435 include_build_directory: false,
1436}
1437`,
1438 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1439 "srcs": `["impl.cpp"]`,
1440 "use_libcrt": `select({
1441 "//build/bazel/platforms/os_arch:android_arm": False,
1442 "//build/bazel/platforms/os_arch:android_x86_64": False,
1443 "//build/bazel/platforms/os_arch:darwin_arm64": True,
1444 "//build/bazel/platforms/os_arch:darwin_x86_64": False,
1445 "//build/bazel/platforms/os_arch:linux_bionic_x86_64": False,
1446 "//build/bazel/platforms/os_arch:linux_glibc_x86_64": False,
1447 "//build/bazel/platforms/os_arch:linux_musl_x86_64": False,
1448 "//build/bazel/platforms/os_arch:windows_x86_64": False,
1449 "//conditions:default": None,
1450 })`,
1451 }),
1452 })
1453}
1454
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001455func TestCcLibraryStrip(t *testing.T) {
Chris Parsons77acf2e2021-12-03 17:27:16 -05001456 expectedTargets := []string{}
1457 expectedTargets = append(expectedTargets, makeCcLibraryTargets("all", attrNameToString{
1458 "strip": `{
1459 "all": True,
1460 }`,
1461 })...)
1462 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols", attrNameToString{
1463 "strip": `{
1464 "keep_symbols": True,
1465 }`,
1466 })...)
1467 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_and_debug_frame", attrNameToString{
1468 "strip": `{
1469 "keep_symbols_and_debug_frame": True,
1470 }`,
1471 })...)
1472 expectedTargets = append(expectedTargets, makeCcLibraryTargets("keep_symbols_list", attrNameToString{
1473 "strip": `{
1474 "keep_symbols_list": ["symbol"],
1475 }`,
1476 })...)
1477 expectedTargets = append(expectedTargets, makeCcLibraryTargets("none", attrNameToString{
1478 "strip": `{
1479 "none": True,
1480 }`,
1481 })...)
1482 expectedTargets = append(expectedTargets, makeCcLibraryTargets("nothing", attrNameToString{})...)
1483
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001484 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001485 description: "cc_library strip args",
1486 moduleTypeUnderTest: "cc_library",
1487 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001488 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001489cc_library {
1490 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001491 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001492}
1493cc_library {
1494 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001495 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001496 keep_symbols: true,
1497 },
1498 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001499}
1500cc_library {
1501 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001502 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001503 keep_symbols_and_debug_frame: true,
1504 },
1505 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001506}
1507cc_library {
1508 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001509 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001510 none: true,
1511 },
1512 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001513}
1514cc_library {
1515 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001516 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001517 keep_symbols_list: ["symbol"],
1518 },
1519 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001520}
1521cc_library {
1522 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001523 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001524 all: true,
1525 },
1526 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001527}
1528`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001529 expectedBazelTargets: expectedTargets,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001530 })
1531}
1532
1533func TestCcLibraryStripWithArch(t *testing.T) {
1534 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001535 description: "cc_library strip args",
1536 moduleTypeUnderTest: "cc_library",
1537 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer8337ea42021-09-10 10:06:32 -04001538 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001539cc_library {
1540 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001541 target: {
1542 darwin: {
1543 strip: {
1544 keep_symbols_list: ["foo", "bar"]
1545 }
1546 },
1547 },
1548 arch: {
1549 arm: {
1550 strip: {
1551 keep_symbols_and_debug_frame: true,
1552 },
1553 },
1554 arm64: {
1555 strip: {
1556 keep_symbols: true,
1557 },
1558 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001559 },
1560 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001561}
1562`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001563 expectedBazelTargets: makeCcLibraryTargets("multi-arch", attrNameToString{
1564 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001565 "keep_symbols": select({
1566 "//build/bazel/platforms/arch:arm64": True,
1567 "//conditions:default": None,
1568 }),
1569 "keep_symbols_and_debug_frame": select({
1570 "//build/bazel/platforms/arch:arm": True,
1571 "//conditions:default": None,
1572 }),
1573 "keep_symbols_list": select({
1574 "//build/bazel/platforms/os:darwin": [
1575 "foo",
1576 "bar",
1577 ],
1578 "//conditions:default": [],
1579 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001580 }`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001581 }),
1582 },
1583 )
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001584}
Chris Parsons51f8c392021-08-03 21:01:05 -04001585
1586func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1587 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001588 description: "cc_library system_shared_libs empty at root",
1589 moduleTypeUnderTest: "cc_library",
1590 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001591 blueprint: soongCcLibraryPreamble + `
1592cc_library {
1593 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001594 system_shared_libs: [],
1595 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001596}
1597`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001598 expectedBazelTargets: makeCcLibraryTargets("root_empty", attrNameToString{
1599 "system_dynamic_deps": `[]`,
1600 }),
1601 },
1602 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001603}
1604
1605func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1606 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001607 description: "cc_library system_shared_libs empty for static variant",
1608 moduleTypeUnderTest: "cc_library",
1609 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001610 blueprint: soongCcLibraryPreamble + `
1611cc_library {
1612 name: "static_empty",
1613 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001614 system_shared_libs: [],
1615 },
1616 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001617}
1618`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001619 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001620 makeBazelTarget("cc_library_static", "static_empty_bp2build_cc_library_static", attrNameToString{
1621 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001622 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001623 makeBazelTarget("cc_library_shared", "static_empty", attrNameToString{}),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001624 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001625 })
1626}
1627
1628func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1629 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001630 description: "cc_library system_shared_libs empty for shared variant",
1631 moduleTypeUnderTest: "cc_library",
1632 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001633 blueprint: soongCcLibraryPreamble + `
1634cc_library {
1635 name: "shared_empty",
1636 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001637 system_shared_libs: [],
1638 },
1639 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001640}
1641`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001642 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001643 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1644 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1645 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001646 }),
1647 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001648 })
1649}
1650
1651func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1652 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001653 description: "cc_library system_shared_libs empty for shared, bionic variant",
1654 moduleTypeUnderTest: "cc_library",
1655 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001656 blueprint: soongCcLibraryPreamble + `
1657cc_library {
1658 name: "shared_empty",
1659 target: {
1660 bionic: {
1661 shared: {
1662 system_shared_libs: [],
1663 }
1664 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001665 },
1666 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001667}
1668`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001669 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001670 makeBazelTarget("cc_library_static", "shared_empty_bp2build_cc_library_static", attrNameToString{}),
1671 makeBazelTarget("cc_library_shared", "shared_empty", attrNameToString{
1672 "system_dynamic_deps": "[]",
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001673 }),
1674 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001675 })
1676}
1677
1678func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1679 // Note that this behavior is technically incorrect (it's a simplification).
1680 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1681 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1682 // b/195791252 tracks the fix.
1683 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001684 description: "cc_library system_shared_libs empty for linux_bionic variant",
1685 moduleTypeUnderTest: "cc_library",
1686 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001687 blueprint: soongCcLibraryPreamble + `
1688cc_library {
1689 name: "target_linux_bionic_empty",
1690 target: {
1691 linux_bionic: {
1692 system_shared_libs: [],
1693 },
1694 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001695 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001696}
1697`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001698 expectedBazelTargets: makeCcLibraryTargets("target_linux_bionic_empty", attrNameToString{
1699 "system_dynamic_deps": `[]`,
1700 }),
1701 },
1702 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001703}
1704
1705func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1706 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001707 description: "cc_library system_shared_libs empty for bionic variant",
1708 moduleTypeUnderTest: "cc_library",
1709 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001710 blueprint: soongCcLibraryPreamble + `
1711cc_library {
1712 name: "target_bionic_empty",
1713 target: {
1714 bionic: {
1715 system_shared_libs: [],
1716 },
1717 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001718 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001719}
1720`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001721 expectedBazelTargets: makeCcLibraryTargets("target_bionic_empty", attrNameToString{
1722 "system_dynamic_deps": `[]`,
1723 }),
1724 },
1725 )
Chris Parsons51f8c392021-08-03 21:01:05 -04001726}
1727
1728func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1729 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001730 description: "cc_library system_shared_libs set for shared and root",
1731 moduleTypeUnderTest: "cc_library",
1732 moduleTypeUnderTestFactory: cc.LibraryFactory,
Chris Parsons51f8c392021-08-03 21:01:05 -04001733 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001734cc_library {
1735 name: "libc",
1736 bazel_module: { bp2build_available: false },
1737}
1738cc_library {
1739 name: "libm",
1740 bazel_module: { bp2build_available: false },
1741}
Chris Parsons51f8c392021-08-03 21:01:05 -04001742
1743cc_library {
1744 name: "foo",
1745 system_shared_libs: ["libc"],
1746 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001747 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001748 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001749 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001750}
1751`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001752 expectedBazelTargets: []string{
Chris Parsons77acf2e2021-12-03 17:27:16 -05001753 makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001754 "system_dynamic_deps": `[":libc"]`,
1755 }),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001756 makeBazelTarget("cc_library_shared", "foo", attrNameToString{
1757 "system_dynamic_deps": `[
1758 ":libc",
1759 ":libm",
1760 ]`,
1761 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001762 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001763 })
1764}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001765
1766func TestCcLibraryOsSelects(t *testing.T) {
1767 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001768 description: "cc_library - selects for all os targets",
1769 moduleTypeUnderTest: "cc_library",
1770 moduleTypeUnderTestFactory: cc.LibraryFactory,
1771 filesystem: map[string]string{},
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001772 blueprint: soongCcLibraryPreamble + `
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001773cc_library {
1774 name: "foo-lib",
1775 srcs: ["base.cpp"],
1776 target: {
1777 android: {
1778 srcs: ["android.cpp"],
1779 },
1780 linux: {
1781 srcs: ["linux.cpp"],
1782 },
1783 linux_glibc: {
1784 srcs: ["linux_glibc.cpp"],
1785 },
1786 darwin: {
1787 srcs: ["darwin.cpp"],
1788 },
1789 bionic: {
1790 srcs: ["bionic.cpp"],
1791 },
1792 linux_musl: {
1793 srcs: ["linux_musl.cpp"],
1794 },
1795 windows: {
1796 srcs: ["windows.cpp"],
1797 },
1798 },
1799 include_build_directory: false,
1800}
1801`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001802 expectedBazelTargets: makeCcLibraryTargets("foo-lib", attrNameToString{
1803 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001804 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001805 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001806 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001807 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001808 ],
1809 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1810 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001811 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001812 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001813 ],
1814 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001815 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001816 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001817 ],
1818 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001819 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001820 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001821 ],
1822 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1823 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001824 })`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05001825 }),
1826 },
1827 )
Jingwen Chen97b85312021-10-08 10:41:31 +00001828}
1829
Yu Liu75be7b92022-02-01 09:54:09 -08001830func TestLibcryptoHashInjection(t *testing.T) {
1831 runCcLibraryTestCase(t, bp2buildTestCase{
1832 description: "cc_library - libcrypto hash injection",
1833 moduleTypeUnderTest: "cc_library",
1834 moduleTypeUnderTestFactory: cc.LibraryFactory,
1835 filesystem: map[string]string{},
1836 blueprint: soongCcLibraryPreamble + `
1837cc_library {
1838 name: "libcrypto",
1839 target: {
1840 android: {
1841 inject_bssl_hash: true,
1842 },
1843 },
1844 include_build_directory: false,
1845}
1846`,
1847 expectedBazelTargets: makeCcLibraryTargets("libcrypto", attrNameToString{
1848 "inject_bssl_hash": `select({
1849 "//build/bazel/platforms/os:android": True,
1850 "//conditions:default": None,
1851 })`,
1852 }),
1853 },
1854 )
1855}
1856
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001857func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001858 type testCase struct {
1859 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001860 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001861 gnu_extensions string
1862 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001863 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001864 }
1865
1866 testCases := []testCase{
1867 // Existing usages of cpp_std in AOSP are:
1868 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1869 //
1870 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1871 // is set in the toolchain.)
1872 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001873 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001874 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1875 // experimental defaults to gnu++2a
1876 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001877 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001878 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1879 // Explicitly setting a c++ std does not use replace gnu++ std even if
1880 // gnu_extensions is true.
1881 // "c++11",
1882 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001883 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001884 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1885 // "c++17",
1886 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001887 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001888 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1889 // "c++2a",
1890 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001891 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001892 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1893 // "c++98",
1894 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001895 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001896 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1897 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1898 // "gnu++11",
1899 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001900 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001901 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1902 // "gnu++17",
1903 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001904 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001905 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001906
1907 // some c_std test cases
1908 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1909 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1910 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1911 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1912 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1913 {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 +00001914 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001915 for i, tc := range testCases {
1916 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001917 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001918 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001919 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001920 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001921 cStdProp := ""
1922 if tc.c_std != "" {
1923 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1924 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001925 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001926 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001927 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001928 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001929 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001930 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001931 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001932 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001933 if tc.bazel_c_std != "" {
1934 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1935 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001936
1937 runCcLibraryTestCase(t, bp2buildTestCase{
1938 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001939 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1940 moduleTypeUnderTest: "cc_library",
1941 moduleTypeUnderTestFactory: cc.LibraryFactory,
Jingwen Chen97b85312021-10-08 10:41:31 +00001942 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1943cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001944 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001945%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001946%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001947%s // gnu_extensions: *bool
1948 include_build_directory: false,
1949}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001950`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Chris Parsons77acf2e2021-12-03 17:27:16 -05001951 expectedBazelTargets: makeCcLibraryTargets(name_prefix+"_full", attrs),
Jingwen Chen97b85312021-10-08 10:41:31 +00001952 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001953
1954 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1955 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001956 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1957 moduleTypeUnderTest: "cc_library_static",
1958 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001959 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1960cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001961 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001962%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001963%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001964%s // gnu_extensions: *bool
1965 include_build_directory: false,
1966}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001967`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001968 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001969 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001970 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001971 })
1972
1973 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1974 description: fmt.Sprintf(
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001975 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1976 moduleTypeUnderTest: "cc_library_shared",
1977 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001978 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1979cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001980 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001981%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001982%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001983%s // gnu_extensions: *bool
1984 include_build_directory: false,
1985}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001986`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001987 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001988 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001989 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001990 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001991 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001992}
Liz Kammer12615db2021-09-28 09:19:17 -04001993
1994func TestCcLibraryProtoSimple(t *testing.T) {
1995 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04001996 moduleTypeUnderTest: "cc_library",
1997 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04001998 blueprint: soongCcProtoPreamble + `cc_library {
1999 name: "foo",
2000 srcs: ["foo.proto"],
2001 include_build_directory: false,
2002}`,
2003 expectedBazelTargets: []string{
2004 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002005 "srcs": `["foo.proto"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002006 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2007 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002008 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002009 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002010 "deps": `[":libprotobuf-cpp-lite"]`,
2011 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2012 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002013 }),
2014 },
2015 })
2016}
2017
2018func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) {
2019 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002020 moduleTypeUnderTest: "cc_library",
2021 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002022 blueprint: soongCcProtoPreamble + `cc_library {
2023 name: "foo",
2024 srcs: ["foo.proto"],
2025 proto: { canonical_path_from_root: false},
2026 include_build_directory: false,
2027}`,
2028 expectedBazelTargets: []string{
2029 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002030 "srcs": `["foo.proto"]`,
2031 "strip_import_prefix": `""`,
Liz Kammer12615db2021-09-28 09:19:17 -04002032 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2033 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002034 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002035 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002036 "deps": `[":libprotobuf-cpp-lite"]`,
2037 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2038 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002039 }),
2040 },
2041 })
2042}
2043
2044func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
2045 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002046 moduleTypeUnderTest: "cc_library",
2047 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002048 blueprint: soongCcProtoPreamble + `cc_library {
2049 name: "foo",
2050 srcs: ["foo.proto"],
2051 proto: { canonical_path_from_root: true},
2052 include_build_directory: false,
2053}`,
2054 expectedBazelTargets: []string{
2055 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
Liz Kammer7756c8f2022-02-14 20:49:15 -05002056 "srcs": `["foo.proto"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002057 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2058 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002059 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002060 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002061 "deps": `[":libprotobuf-cpp-lite"]`,
2062 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2063 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002064 }),
2065 },
2066 })
2067}
2068
2069func TestCcLibraryProtoFull(t *testing.T) {
2070 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002071 moduleTypeUnderTest: "cc_library",
2072 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002073 blueprint: soongCcProtoPreamble + `cc_library {
2074 name: "foo",
2075 srcs: ["foo.proto"],
2076 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002077 type: "full",
2078 },
2079 include_build_directory: false,
2080}`,
2081 expectedBazelTargets: []string{
2082 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2083 "srcs": `["foo.proto"]`,
2084 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
2085 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002086 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002087 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002088 "deps": `[":libprotobuf-cpp-full"]`,
2089 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2090 "dynamic_deps": `[":libprotobuf-cpp-full"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002091 }),
2092 },
2093 })
2094}
2095
2096func TestCcLibraryProtoLite(t *testing.T) {
2097 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002098 moduleTypeUnderTest: "cc_library",
2099 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002100 blueprint: soongCcProtoPreamble + `cc_library {
2101 name: "foo",
2102 srcs: ["foo.proto"],
2103 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002104 type: "lite",
2105 },
2106 include_build_directory: false,
2107}`,
2108 expectedBazelTargets: []string{
2109 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2110 "srcs": `["foo.proto"]`,
2111 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2112 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002113 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
Liz Kammer12615db2021-09-28 09:19:17 -04002114 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002115 "deps": `[":libprotobuf-cpp-lite"]`,
2116 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2117 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002118 }),
2119 },
2120 })
2121}
2122
2123func TestCcLibraryProtoExportHeaders(t *testing.T) {
2124 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerbe46fcc2021-11-01 15:32:43 -04002125 moduleTypeUnderTest: "cc_library",
2126 moduleTypeUnderTestFactory: cc.LibraryFactory,
Liz Kammer12615db2021-09-28 09:19:17 -04002127 blueprint: soongCcProtoPreamble + `cc_library {
2128 name: "foo",
2129 srcs: ["foo.proto"],
2130 proto: {
Liz Kammer12615db2021-09-28 09:19:17 -04002131 export_proto_headers: true,
2132 },
2133 include_build_directory: false,
2134}`,
2135 expectedBazelTargets: []string{
2136 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2137 "srcs": `["foo.proto"]`,
2138 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2139 "deps": `[":foo_proto"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002140 }), makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2141 "deps": `[":libprotobuf-cpp-lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002142 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Chris Parsons77acf2e2021-12-03 17:27:16 -05002143 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2144 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2145 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
Liz Kammer12615db2021-09-28 09:19:17 -04002146 }),
2147 },
2148 })
2149}
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002150
2151func TestCcLibraryProtoFilegroups(t *testing.T) {
2152 runCcLibraryTestCase(t, bp2buildTestCase{
2153 moduleTypeUnderTest: "cc_library",
2154 moduleTypeUnderTestFactory: cc.LibraryFactory,
2155 blueprint: soongCcProtoPreamble +
2156 simpleModuleDoNotConvertBp2build("filegroup", "a_fg_proto") +
2157 simpleModuleDoNotConvertBp2build("filegroup", "b_protos") +
2158 simpleModuleDoNotConvertBp2build("filegroup", "c-proto-srcs") +
2159 simpleModuleDoNotConvertBp2build("filegroup", "proto-srcs-d") + `
2160cc_library {
2161 name: "a",
2162 srcs: [":a_fg_proto"],
2163 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002164 export_proto_headers: true,
2165 },
2166 include_build_directory: false,
2167}
2168
2169cc_library {
2170 name: "b",
2171 srcs: [":b_protos"],
2172 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002173 export_proto_headers: true,
2174 },
2175 include_build_directory: false,
2176}
2177
2178cc_library {
2179 name: "c",
2180 srcs: [":c-proto-srcs"],
2181 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002182 export_proto_headers: true,
2183 },
2184 include_build_directory: false,
2185}
2186
2187cc_library {
2188 name: "d",
2189 srcs: [":proto-srcs-d"],
2190 proto: {
Liz Kammeraabfb5d2021-12-08 15:25:06 -05002191 export_proto_headers: true,
2192 },
2193 include_build_directory: false,
2194}`,
2195 expectedBazelTargets: []string{
2196 makeBazelTarget("proto_library", "a_proto", attrNameToString{
2197 "srcs": `[":a_fg_proto"]`,
2198 }), makeBazelTarget("cc_lite_proto_library", "a_cc_proto_lite", attrNameToString{
2199 "deps": `[":a_proto"]`,
2200 }), makeBazelTarget("cc_library_static", "a_bp2build_cc_library_static", attrNameToString{
2201 "deps": `[":libprotobuf-cpp-lite"]`,
2202 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2203 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2204 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2205 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2206 }), makeBazelTarget("cc_library_shared", "a", attrNameToString{
2207 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2208 "whole_archive_deps": `[":a_cc_proto_lite"]`,
2209 "srcs": `[":a_fg_proto_cpp_srcs"]`,
2210 "srcs_as": `[":a_fg_proto_as_srcs"]`,
2211 "srcs_c": `[":a_fg_proto_c_srcs"]`,
2212 }), makeBazelTarget("proto_library", "b_proto", attrNameToString{
2213 "srcs": `[":b_protos"]`,
2214 }), makeBazelTarget("cc_lite_proto_library", "b_cc_proto_lite", attrNameToString{
2215 "deps": `[":b_proto"]`,
2216 }), makeBazelTarget("cc_library_static", "b_bp2build_cc_library_static", attrNameToString{
2217 "deps": `[":libprotobuf-cpp-lite"]`,
2218 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2219 "srcs": `[":b_protos_cpp_srcs"]`,
2220 "srcs_as": `[":b_protos_as_srcs"]`,
2221 "srcs_c": `[":b_protos_c_srcs"]`,
2222 }), makeBazelTarget("cc_library_shared", "b", attrNameToString{
2223 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2224 "whole_archive_deps": `[":b_cc_proto_lite"]`,
2225 "srcs": `[":b_protos_cpp_srcs"]`,
2226 "srcs_as": `[":b_protos_as_srcs"]`,
2227 "srcs_c": `[":b_protos_c_srcs"]`,
2228 }), makeBazelTarget("proto_library", "c_proto", attrNameToString{
2229 "srcs": `[":c-proto-srcs"]`,
2230 }), makeBazelTarget("cc_lite_proto_library", "c_cc_proto_lite", attrNameToString{
2231 "deps": `[":c_proto"]`,
2232 }), makeBazelTarget("cc_library_static", "c_bp2build_cc_library_static", attrNameToString{
2233 "deps": `[":libprotobuf-cpp-lite"]`,
2234 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2235 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2236 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2237 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2238 }), makeBazelTarget("cc_library_shared", "c", attrNameToString{
2239 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2240 "whole_archive_deps": `[":c_cc_proto_lite"]`,
2241 "srcs": `[":c-proto-srcs_cpp_srcs"]`,
2242 "srcs_as": `[":c-proto-srcs_as_srcs"]`,
2243 "srcs_c": `[":c-proto-srcs_c_srcs"]`,
2244 }), makeBazelTarget("proto_library", "d_proto", attrNameToString{
2245 "srcs": `[":proto-srcs-d"]`,
2246 }), makeBazelTarget("cc_lite_proto_library", "d_cc_proto_lite", attrNameToString{
2247 "deps": `[":d_proto"]`,
2248 }), makeBazelTarget("cc_library_static", "d_bp2build_cc_library_static", attrNameToString{
2249 "deps": `[":libprotobuf-cpp-lite"]`,
2250 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2251 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2252 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2253 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2254 }), makeBazelTarget("cc_library_shared", "d", attrNameToString{
2255 "dynamic_deps": `[":libprotobuf-cpp-lite"]`,
2256 "whole_archive_deps": `[":d_cc_proto_lite"]`,
2257 "srcs": `[":proto-srcs-d_cpp_srcs"]`,
2258 "srcs_as": `[":proto-srcs-d_as_srcs"]`,
2259 "srcs_c": `[":proto-srcs-d_c_srcs"]`,
2260 }),
2261 },
2262 })
2263}
Chris Parsons58852a02021-12-09 18:10:18 -05002264
2265func TestCcLibraryDisabledArchAndTarget(t *testing.T) {
2266 runCcLibraryTestCase(t, bp2buildTestCase{
2267 moduleTypeUnderTest: "cc_library",
2268 moduleTypeUnderTestFactory: cc.LibraryFactory,
2269 blueprint: soongCcProtoPreamble + `cc_library {
2270 name: "foo",
2271 srcs: ["foo.cpp"],
2272 target: {
2273 darwin: {
2274 enabled: false,
2275 },
2276 windows: {
2277 enabled: false,
2278 },
2279 linux_glibc_x86: {
2280 enabled: false,
2281 },
2282 },
2283 include_build_directory: false,
2284}`,
2285 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2286 "srcs": `["foo.cpp"]`,
2287 "target_compatible_with": `select({
2288 "//build/bazel/platforms/os_arch:darwin_arm64": ["@platforms//:incompatible"],
2289 "//build/bazel/platforms/os_arch:darwin_x86_64": ["@platforms//:incompatible"],
2290 "//build/bazel/platforms/os_arch:linux_glibc_x86": ["@platforms//:incompatible"],
2291 "//build/bazel/platforms/os_arch:windows_x86": ["@platforms//:incompatible"],
2292 "//build/bazel/platforms/os_arch:windows_x86_64": ["@platforms//:incompatible"],
2293 "//conditions:default": [],
2294 })`,
2295 }),
2296 })
2297}
2298
2299func TestCcLibraryDisabledArchAndTargetWithDefault(t *testing.T) {
2300 runCcLibraryTestCase(t, bp2buildTestCase{
2301 moduleTypeUnderTest: "cc_library",
2302 moduleTypeUnderTestFactory: cc.LibraryFactory,
2303 blueprint: soongCcProtoPreamble + `cc_library {
2304 name: "foo",
2305 srcs: ["foo.cpp"],
2306 enabled: false,
2307 target: {
2308 darwin: {
2309 enabled: true,
2310 },
2311 windows: {
2312 enabled: false,
2313 },
2314 linux_glibc_x86: {
2315 enabled: false,
2316 },
2317 },
2318 include_build_directory: false,
2319}`,
2320 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2321 "srcs": `["foo.cpp"]`,
2322 "target_compatible_with": `select({
2323 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2324 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2325 "//conditions:default": ["@platforms//:incompatible"],
2326 })`,
2327 }),
2328 })
2329}
2330
2331func TestCcLibrarySharedDisabled(t *testing.T) {
2332 runCcLibraryTestCase(t, bp2buildTestCase{
2333 moduleTypeUnderTest: "cc_library",
2334 moduleTypeUnderTestFactory: cc.LibraryFactory,
2335 blueprint: soongCcProtoPreamble + `cc_library {
2336 name: "foo",
2337 srcs: ["foo.cpp"],
2338 enabled: false,
2339 shared: {
2340 enabled: true,
2341 },
2342 target: {
2343 android: {
2344 shared: {
2345 enabled: false,
2346 },
2347 }
2348 },
2349 include_build_directory: false,
2350}`,
2351 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2352 "srcs": `["foo.cpp"]`,
2353 "target_compatible_with": `["@platforms//:incompatible"]`,
2354 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2355 "srcs": `["foo.cpp"]`,
2356 "target_compatible_with": `select({
2357 "//build/bazel/platforms/os:android": ["@platforms//:incompatible"],
2358 "//conditions:default": [],
2359 })`,
2360 }),
2361 },
2362 })
2363}
2364
2365func TestCcLibraryStaticDisabledForSomeArch(t *testing.T) {
2366 runCcLibraryTestCase(t, bp2buildTestCase{
2367 moduleTypeUnderTest: "cc_library",
2368 moduleTypeUnderTestFactory: cc.LibraryFactory,
2369 blueprint: soongCcProtoPreamble + `cc_library {
2370 name: "foo",
2371 srcs: ["foo.cpp"],
2372 shared: {
2373 enabled: false
2374 },
2375 target: {
2376 darwin: {
2377 enabled: true,
2378 },
2379 windows: {
2380 enabled: false,
2381 },
2382 linux_glibc_x86: {
2383 shared: {
2384 enabled: true,
2385 },
2386 },
2387 },
2388 include_build_directory: false,
2389}`,
2390 expectedBazelTargets: []string{makeBazelTarget("cc_library_static", "foo_bp2build_cc_library_static", attrNameToString{
2391 "srcs": `["foo.cpp"]`,
2392 "target_compatible_with": `select({
2393 "//build/bazel/platforms/os:windows": ["@platforms//:incompatible"],
2394 "//conditions:default": [],
2395 })`,
2396 }), makeBazelTarget("cc_library_shared", "foo", attrNameToString{
2397 "srcs": `["foo.cpp"]`,
2398 "target_compatible_with": `select({
2399 "//build/bazel/platforms/os_arch:darwin_arm64": [],
2400 "//build/bazel/platforms/os_arch:darwin_x86_64": [],
2401 "//build/bazel/platforms/os_arch:linux_glibc_x86": [],
2402 "//conditions:default": ["@platforms//:incompatible"],
2403 })`,
2404 }),
2405 }})
2406}
Jingwen Chen0ee88a62022-01-07 14:55:29 +00002407
2408func TestCcLibraryStubs(t *testing.T) {
2409 runCcLibraryTestCase(t, bp2buildTestCase{
2410 description: "cc_library stubs",
2411 moduleTypeUnderTest: "cc_library",
2412 moduleTypeUnderTestFactory: cc.LibraryFactory,
2413 dir: "foo/bar",
2414 filesystem: map[string]string{
2415 "foo/bar/Android.bp": `
2416cc_library {
2417 name: "a",
2418 stubs: { symbol_file: "a.map.txt", versions: ["28", "29", "current"] },
2419 bazel_module: { bp2build_available: true },
2420 include_build_directory: false,
2421}
2422`,
2423 },
2424 blueprint: soongCcLibraryPreamble,
2425 expectedBazelTargets: makeCcLibraryTargets("a", attrNameToString{
2426 "stubs_symbol_file": `"a.map.txt"`,
2427 "stubs_versions": `[
2428 "28",
2429 "29",
2430 "current",
2431 ]`,
2432 }),
2433 },
2434 )
2435}
Liz Kammerf38a8372022-02-04 15:39:00 -05002436
2437func TestCcLibraryEscapeLdflags(t *testing.T) {
2438 runCcLibraryTestCase(t, bp2buildTestCase{
2439 moduleTypeUnderTest: "cc_library",
2440 moduleTypeUnderTestFactory: cc.LibraryFactory,
2441 blueprint: soongCcProtoPreamble + `cc_library {
2442 name: "foo",
2443 ldflags: ["-Wl,--rpath,${ORIGIN}"],
2444 include_build_directory: false,
2445}`,
2446 expectedBazelTargets: makeCcLibraryTargets("foo", attrNameToString{
2447 "linkopts": `["-Wl,--rpath,$${ORIGIN}"]`,
2448 }),
2449 })
2450}