blob: 8c8898e3e55a0f65adb569416bcd9594dd5c5029 [file] [log] [blame]
Jingwen Chen63930982021-03-24 10:04:33 -04001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package bp2build
16
17import (
Jingwen Chen6ada5892021-09-17 11:38:09 +000018 "fmt"
Alex Márquez Pérez Muñíz Díaz Púras Thaureaux1c92aef2021-08-23 16:10:00 +000019 "testing"
20
Jingwen Chen63930982021-03-24 10:04:33 -040021 "android/soong/android"
22 "android/soong/cc"
Jingwen Chen63930982021-03-24 10:04:33 -040023)
24
25const (
26 // See cc/testing.go for more context
27 soongCcLibraryPreamble = `
28cc_defaults {
Liz Kammer8337ea42021-09-10 10:06:32 -040029 name: "linux_bionic_supported",
Jingwen Chen63930982021-03-24 10:04:33 -040030}
31
32toolchain_library {
Liz Kammer8337ea42021-09-10 10:06:32 -040033 name: "libclang_rt.builtins-x86_64-android",
34 defaults: ["linux_bionic_supported"],
35 vendor_available: true,
36 vendor_ramdisk_available: true,
37 product_available: true,
38 recovery_available: true,
39 native_bridge_supported: true,
40 src: "",
Jingwen Chen63930982021-03-24 10:04:33 -040041}`
Liz Kammer12615db2021-09-28 09:19:17 -040042
43 soongCcProtoLibraries = `
44cc_library {
45 name: "libprotobuf-cpp-lite",
46 bazel_module: { bp2build_available: false },
47}
48
49cc_library {
50 name: "libprotobuf-cpp-full",
51 bazel_module: { bp2build_available: false },
52}`
53
54 soongCcProtoPreamble = soongCcLibraryPreamble + soongCcProtoLibraries
Jingwen Chen63930982021-03-24 10:04:33 -040055)
56
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020057func runCcLibraryTestCase(t *testing.T, tc bp2buildTestCase) {
Liz Kammere4982e82021-05-25 10:39:35 -040058 t.Helper()
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020059 runBp2BuildTestCase(t, registerCcLibraryModuleTypes, tc)
60}
61
62func registerCcLibraryModuleTypes(ctx android.RegistrationContext) {
63 cc.RegisterCCBuildComponents(ctx)
Jingwen Chen14a8bda2021-06-02 11:10:02 +000064 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020065 ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
Liz Kammer2d7bbe32021-06-10 18:20:06 -040066 ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020067 ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
68 ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
69}
70
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020071func TestCcLibrarySimple(t *testing.T) {
72 runCcLibraryTestCase(t, bp2buildTestCase{
73 description: "cc_library - simple example",
74 moduleTypeUnderTest: "cc_library",
75 moduleTypeUnderTestFactory: cc.LibraryFactory,
76 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
77 filesystem: map[string]string{
78 "android.cpp": "",
Liz Kammer01a16e82021-07-16 16:33:47 -040079 "bionic.cpp": "",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020080 "darwin.cpp": "",
81 // Refer to cc.headerExts for the supported header extensions in Soong.
82 "header.h": "",
83 "header.hh": "",
84 "header.hpp": "",
85 "header.hxx": "",
86 "header.h++": "",
87 "header.inl": "",
88 "header.inc": "",
89 "header.ipp": "",
90 "header.h.generic": "",
91 "impl.cpp": "",
92 "linux.cpp": "",
93 "x86.cpp": "",
94 "x86_64.cpp": "",
95 "foo-dir/a.h": "",
96 },
Liz Kammer78cfdaa2021-11-08 12:56:31 -050097 blueprint: soongCcLibraryPreamble +
98 simpleModuleDoNotConvertBp2build("cc_library_headers", "some-headers") + `
Jingwen Chen63930982021-03-24 10:04:33 -040099cc_library {
100 name: "foo-lib",
101 srcs: ["impl.cpp"],
102 cflags: ["-Wall"],
103 header_libs: ["some-headers"],
104 export_include_dirs: ["foo-dir"],
105 ldflags: ["-Wl,--exclude-libs=bar.a"],
106 arch: {
107 x86: {
108 ldflags: ["-Wl,--exclude-libs=baz.a"],
109 srcs: ["x86.cpp"],
110 },
111 x86_64: {
112 ldflags: ["-Wl,--exclude-libs=qux.a"],
113 srcs: ["x86_64.cpp"],
114 },
115 },
116 target: {
117 android: {
118 srcs: ["android.cpp"],
119 },
120 linux_glibc: {
121 srcs: ["linux.cpp"],
122 },
123 darwin: {
124 srcs: ["darwin.cpp"],
125 },
Liz Kammer01a16e82021-07-16 16:33:47 -0400126 bionic: {
127 srcs: ["bionic.cpp"]
128 },
Jingwen Chen63930982021-03-24 10:04:33 -0400129 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400130 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400131}
132`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500133 expectedBazelTargets: []string{
134 makeBazelTarget("cc_library", "foo-lib", attrNameToString{
135 "copts": `["-Wall"]`,
136 "export_includes": `["foo-dir"]`,
137 "implementation_deps": `[":some-headers"]`,
138 "linkopts": `["-Wl,--exclude-libs=bar.a"] + select({
Jingwen Chened9c17d2021-04-13 07:14:55 +0000139 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
140 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
141 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500142 })`,
143 "srcs": `["impl.cpp"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000144 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
145 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen63930982021-03-24 10:04:33 -0400146 "//conditions:default": [],
147 }) + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400148 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400149 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -0400150 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400151 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000152 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
153 "//build/bazel/platforms/os:linux": ["linux.cpp"],
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400154 "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"],
Liz Kammer01a16e82021-07-16 16:33:47 -0400155 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500156 })`,
157 }),
158 },
159 })
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200160}
161
162func TestCcLibraryTrimmedLdAndroid(t *testing.T) {
163 runCcLibraryTestCase(t, bp2buildTestCase{
164 description: "cc_library - trimmed example of //bionic/linker:ld-android",
165 moduleTypeUnderTest: "cc_library",
166 moduleTypeUnderTestFactory: cc.LibraryFactory,
167 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
168 filesystem: map[string]string{
169 "ld-android.cpp": "",
170 "linked_list.h": "",
171 "linker.h": "",
172 "linker_block_allocator.h": "",
173 "linker_cfi.h": "",
Jingwen Chen63930982021-03-24 10:04:33 -0400174 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200175 blueprint: soongCcLibraryPreamble + `
Jingwen Chen63930982021-03-24 10:04:33 -0400176cc_library_headers { name: "libc_headers" }
177cc_library {
178 name: "fake-ld-android",
179 srcs: ["ld_android.cpp"],
180 cflags: [
181 "-Wall",
182 "-Wextra",
183 "-Wunused",
184 "-Werror",
185 ],
186 header_libs: ["libc_headers"],
187 ldflags: [
188 "-Wl,--exclude-libs=libgcc.a",
189 "-Wl,--exclude-libs=libgcc_stripped.a",
190 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
191 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
192 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
193 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
194 ],
195 arch: {
196 x86: {
197 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
198 },
199 x86_64: {
200 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
201 },
202 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400203 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400204}
205`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500206 expectedBazelTargets: []string{
207 makeBazelTarget("cc_library", "fake-ld-android", attrNameToString{
208 "srcs": `["ld_android.cpp"]`,
209 "copts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400210 "-Wall",
211 "-Wextra",
212 "-Wunused",
213 "-Werror",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500214 ]`,
215 "implementation_deps": `[":libc_headers"]`,
216 "linkopts": `[
Jingwen Chen63930982021-03-24 10:04:33 -0400217 "-Wl,--exclude-libs=libgcc.a",
218 "-Wl,--exclude-libs=libgcc_stripped.a",
219 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
220 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
221 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
222 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
223 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000224 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=libgcc_eh.a"],
225 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"],
Jingwen Chen63930982021-03-24 10:04:33 -0400226 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500227 })`,
228 }),
229 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200230 })
231}
232
233func TestCcLibraryExcludeSrcs(t *testing.T) {
234 runCcLibraryTestCase(t, bp2buildTestCase{
235 description: "cc_library exclude_srcs - trimmed example of //external/arm-optimized-routines:libarm-optimized-routines-math",
236 moduleTypeUnderTest: "cc_library",
237 moduleTypeUnderTestFactory: cc.LibraryFactory,
238 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
239 dir: "external",
240 filesystem: map[string]string{
241 "external/math/cosf.c": "",
242 "external/math/erf.c": "",
243 "external/math/erf_data.c": "",
244 "external/math/erff.c": "",
245 "external/math/erff_data.c": "",
246 "external/Android.bp": `
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000247cc_library {
248 name: "fake-libarm-optimized-routines-math",
249 exclude_srcs: [
250 // Provided by:
251 // bionic/libm/upstream-freebsd/lib/msun/src/s_erf.c
252 // bionic/libm/upstream-freebsd/lib/msun/src/s_erff.c
253 "math/erf.c",
254 "math/erf_data.c",
255 "math/erff.c",
256 "math/erff_data.c",
257 ],
258 srcs: [
259 "math/*.c",
260 ],
261 // arch-specific settings
262 arch: {
263 arm64: {
264 cflags: [
265 "-DHAVE_FAST_FMA=1",
266 ],
267 },
268 },
269 bazel_module: { bp2build_available: true },
270}
271`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200272 },
273 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500274 expectedBazelTargets: []string{
275 makeBazelTarget("cc_library", "fake-libarm-optimized-routines-math", attrNameToString{
276 "copts": `select({
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000277 "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"],
278 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500279 })`,
280 "local_includes": `["."]`,
281 "srcs_c": `["math/cosf.c"]`,
282 }),
283 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200284 })
285}
286
287func TestCcLibrarySharedStaticProps(t *testing.T) {
288 runCcLibraryTestCase(t, bp2buildTestCase{
289 description: "cc_library shared/static props",
290 moduleTypeUnderTest: "cc_library",
291 moduleTypeUnderTestFactory: cc.LibraryFactory,
292 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200293 filesystem: map[string]string{
Liz Kammer8337ea42021-09-10 10:06:32 -0400294 "both.cpp": "",
295 "sharedonly.cpp": "",
296 "staticonly.cpp": "",
297 },
298 blueprint: soongCcLibraryPreamble + `
Jingwen Chen53681ef2021-04-29 08:15:13 +0000299cc_library {
300 name: "a",
Chris Parsons08648312021-05-06 16:23:19 -0400301 srcs: ["both.cpp"],
302 cflags: ["bothflag"],
303 shared_libs: ["shared_dep_for_both"],
304 static_libs: ["static_dep_for_both"],
305 whole_static_libs: ["whole_static_lib_for_both"],
306 static: {
307 srcs: ["staticonly.cpp"],
308 cflags: ["staticflag"],
309 shared_libs: ["shared_dep_for_static"],
310 static_libs: ["static_dep_for_static"],
311 whole_static_libs: ["whole_static_lib_for_static"],
312 },
313 shared: {
314 srcs: ["sharedonly.cpp"],
315 cflags: ["sharedflag"],
316 shared_libs: ["shared_dep_for_shared"],
317 static_libs: ["static_dep_for_shared"],
318 whole_static_libs: ["whole_static_lib_for_shared"],
319 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400320 include_build_directory: false,
Jingwen Chen53681ef2021-04-29 08:15:13 +0000321}
322
Liz Kammer8337ea42021-09-10 10:06:32 -0400323cc_library_static {
324 name: "static_dep_for_shared",
325 bazel_module: { bp2build_available: false },
326}
Chris Parsons08648312021-05-06 16:23:19 -0400327
Liz Kammer8337ea42021-09-10 10:06:32 -0400328cc_library_static {
329 name: "static_dep_for_static",
330 bazel_module: { bp2build_available: false },
331}
Chris Parsons08648312021-05-06 16:23:19 -0400332
Liz Kammer8337ea42021-09-10 10:06:32 -0400333cc_library_static {
334 name: "static_dep_for_both",
335 bazel_module: { bp2build_available: false },
336}
Chris Parsons08648312021-05-06 16:23:19 -0400337
Liz Kammer8337ea42021-09-10 10:06:32 -0400338cc_library_static {
339 name: "whole_static_lib_for_shared",
340 bazel_module: { bp2build_available: false },
341}
Chris Parsons08648312021-05-06 16:23:19 -0400342
Liz Kammer8337ea42021-09-10 10:06:32 -0400343cc_library_static {
344 name: "whole_static_lib_for_static",
345 bazel_module: { bp2build_available: false },
346}
Chris Parsons08648312021-05-06 16:23:19 -0400347
Liz Kammer8337ea42021-09-10 10:06:32 -0400348cc_library_static {
349 name: "whole_static_lib_for_both",
350 bazel_module: { bp2build_available: false },
351}
Chris Parsons08648312021-05-06 16:23:19 -0400352
Liz Kammer8337ea42021-09-10 10:06:32 -0400353cc_library {
354 name: "shared_dep_for_shared",
355 bazel_module: { bp2build_available: false },
356}
Chris Parsons08648312021-05-06 16:23:19 -0400357
Liz Kammer8337ea42021-09-10 10:06:32 -0400358cc_library {
359 name: "shared_dep_for_static",
360 bazel_module: { bp2build_available: false },
361}
Chris Parsons08648312021-05-06 16:23:19 -0400362
Liz Kammer8337ea42021-09-10 10:06:32 -0400363cc_library {
364 name: "shared_dep_for_both",
365 bazel_module: { bp2build_available: false },
366}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000367`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500368 expectedBazelTargets: []string{
369 makeBazelTarget("cc_library", "a", attrNameToString{
370 "copts": `["bothflag"]`,
371 "implementation_deps": `[":static_dep_for_both"]`,
372 "implementation_dynamic_deps": `[":shared_dep_for_both"]`,
373 "shared": `{
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000374 "copts": ["sharedflag"],
Liz Kammer7a210ac2021-09-22 15:52:58 -0400375 "implementation_deps": [":static_dep_for_shared"],
376 "implementation_dynamic_deps": [":shared_dep_for_shared"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000377 "srcs": ["sharedonly.cpp"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000378 "whole_archive_deps": [":whole_static_lib_for_shared"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500379 }`,
380 "srcs": `["both.cpp"]`,
381 "static": `{
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000382 "copts": ["staticflag"],
Liz Kammer7a210ac2021-09-22 15:52:58 -0400383 "implementation_deps": [":static_dep_for_static"],
384 "implementation_dynamic_deps": [":shared_dep_for_static"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000385 "srcs": ["staticonly.cpp"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000386 "whole_archive_deps": [":whole_static_lib_for_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500387 }`,
388 "whole_archive_deps": `[":whole_static_lib_for_both"]`,
389 }),
390 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200391 })
392}
393
Liz Kammer7a210ac2021-09-22 15:52:58 -0400394func TestCcLibraryDeps(t *testing.T) {
395 runCcLibraryTestCase(t, bp2buildTestCase{
396 description: "cc_library shared/static props",
397 moduleTypeUnderTest: "cc_library",
398 moduleTypeUnderTestFactory: cc.LibraryFactory,
399 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
400 filesystem: map[string]string{
401 "both.cpp": "",
402 "sharedonly.cpp": "",
403 "staticonly.cpp": "",
404 },
405 blueprint: soongCcLibraryPreamble + `
406cc_library {
407 name: "a",
408 srcs: ["both.cpp"],
409 cflags: ["bothflag"],
410 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
411 export_shared_lib_headers: ["shared_dep_for_both"],
412 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
413 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
414 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
415 static: {
416 srcs: ["staticonly.cpp"],
417 cflags: ["staticflag"],
418 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
419 export_shared_lib_headers: ["shared_dep_for_static"],
420 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
421 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
422 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
423 },
424 shared: {
425 srcs: ["sharedonly.cpp"],
426 cflags: ["sharedflag"],
427 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
428 export_shared_lib_headers: ["shared_dep_for_shared"],
429 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
430 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
431 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
432 },
433 include_build_directory: false,
434}
435` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
436 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
437 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
438 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
439 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
440 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
441 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
442 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
443 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
444 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
445 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
446 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
447 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
448 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
449 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
450 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
451 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
452 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500453 expectedBazelTargets: []string{
454 makeBazelTarget("cc_library", "a", attrNameToString{
455 "copts": `["bothflag"]`,
456 "deps": `[":static_dep_for_both"]`,
457 "dynamic_deps": `[":shared_dep_for_both"]`,
458 "implementation_deps": `[":implementation_static_dep_for_both"]`,
459 "implementation_dynamic_deps": `[":implementation_shared_dep_for_both"]`,
460 "shared": `{
Liz Kammer7a210ac2021-09-22 15:52:58 -0400461 "copts": ["sharedflag"],
462 "deps": [":static_dep_for_shared"],
463 "dynamic_deps": [":shared_dep_for_shared"],
464 "implementation_deps": [":implementation_static_dep_for_shared"],
465 "implementation_dynamic_deps": [":implementation_shared_dep_for_shared"],
466 "srcs": ["sharedonly.cpp"],
467 "whole_archive_deps": [
468 ":not_explicitly_exported_whole_static_dep_for_shared",
469 ":whole_static_dep_for_shared",
470 ],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500471 }`,
472 "srcs": `["both.cpp"]`,
473 "static": `{
Liz Kammer7a210ac2021-09-22 15:52:58 -0400474 "copts": ["staticflag"],
475 "deps": [":static_dep_for_static"],
476 "dynamic_deps": [":shared_dep_for_static"],
477 "implementation_deps": [":implementation_static_dep_for_static"],
478 "implementation_dynamic_deps": [":implementation_shared_dep_for_static"],
479 "srcs": ["staticonly.cpp"],
480 "whole_archive_deps": [
481 ":not_explicitly_exported_whole_static_dep_for_static",
482 ":whole_static_dep_for_static",
483 ],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500484 }`,
485 "whole_archive_deps": `[
Liz Kammer7a210ac2021-09-22 15:52:58 -0400486 ":not_explicitly_exported_whole_static_dep_for_both",
487 ":whole_static_dep_for_both",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500488 ]`,
489 }),
490 },
Liz Kammer7a210ac2021-09-22 15:52:58 -0400491 })
492}
493
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400494func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
495 runCcLibraryTestCase(t, bp2buildTestCase{
496 moduleTypeUnderTest: "cc_library",
497 moduleTypeUnderTestFactory: cc.LibraryFactory,
498 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400499 dir: "foo/bar",
500 filesystem: map[string]string{
501 "foo/bar/Android.bp": `
502cc_library {
503 name: "a",
504 whole_static_libs: ["whole_static_lib_for_both"],
505 static: {
506 whole_static_libs: ["whole_static_lib_for_static"],
507 },
508 shared: {
509 whole_static_libs: ["whole_static_lib_for_shared"],
510 },
511 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400512 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400513}
514
515cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
516
517cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
518
519cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
520`,
521 },
522 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500523 expectedBazelTargets: []string{
524 makeBazelTarget("cc_library", "a", attrNameToString{
525 "shared": `{
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000526 "whole_archive_deps": [":whole_static_lib_for_shared_alwayslink"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500527 }`,
528 "static": `{
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000529 "whole_archive_deps": [":whole_static_lib_for_static_alwayslink"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500530 }`,
531 "whole_archive_deps": `[":whole_static_lib_for_both_alwayslink"]`,
532 }),
533 },
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400534 })
535}
536
Jingwen Chenbcf53042021-05-26 04:42:42 +0000537func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
538 runCcLibraryTestCase(t, bp2buildTestCase{
539 description: "cc_library shared/static props in arch",
540 moduleTypeUnderTest: "cc_library",
541 moduleTypeUnderTestFactory: cc.LibraryFactory,
542 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Jingwen Chenbcf53042021-05-26 04:42:42 +0000543 dir: "foo/bar",
544 filesystem: map[string]string{
545 "foo/bar/arm.cpp": "",
546 "foo/bar/x86.cpp": "",
547 "foo/bar/sharedonly.cpp": "",
548 "foo/bar/staticonly.cpp": "",
549 "foo/bar/Android.bp": `
550cc_library {
551 name: "a",
552 arch: {
553 arm: {
554 shared: {
555 srcs: ["arm_shared.cpp"],
556 cflags: ["-DARM_SHARED"],
557 static_libs: ["arm_static_dep_for_shared"],
558 whole_static_libs: ["arm_whole_static_dep_for_shared"],
559 shared_libs: ["arm_shared_dep_for_shared"],
560 },
561 },
562 x86: {
563 static: {
564 srcs: ["x86_static.cpp"],
565 cflags: ["-DX86_STATIC"],
566 static_libs: ["x86_dep_for_static"],
567 },
568 },
569 },
570 target: {
571 android: {
572 shared: {
573 srcs: ["android_shared.cpp"],
574 cflags: ["-DANDROID_SHARED"],
575 static_libs: ["android_dep_for_shared"],
576 },
577 },
578 android_arm: {
579 shared: {
580 cflags: ["-DANDROID_ARM_SHARED"],
581 },
582 },
583 },
584 srcs: ["both.cpp"],
585 cflags: ["bothflag"],
586 static_libs: ["static_dep_for_both"],
587 static: {
588 srcs: ["staticonly.cpp"],
589 cflags: ["staticflag"],
590 static_libs: ["static_dep_for_static"],
591 },
592 shared: {
593 srcs: ["sharedonly.cpp"],
594 cflags: ["sharedflag"],
595 static_libs: ["static_dep_for_shared"],
596 },
597 bazel_module: { bp2build_available: true },
598}
599
600cc_library_static { name: "static_dep_for_shared" }
601cc_library_static { name: "static_dep_for_static" }
602cc_library_static { name: "static_dep_for_both" }
603
604cc_library_static { name: "arm_static_dep_for_shared" }
605cc_library_static { name: "arm_whole_static_dep_for_shared" }
606cc_library_static { name: "arm_shared_dep_for_shared" }
607
608cc_library_static { name: "x86_dep_for_static" }
609
610cc_library_static { name: "android_dep_for_shared" }
611`,
612 },
613 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500614 expectedBazelTargets: []string{
615 makeBazelTarget("cc_library", "a", attrNameToString{
616 "copts": `["bothflag"]`,
617 "implementation_deps": `[":static_dep_for_both"]`,
618 "local_includes": `["."]`,
619 "shared": `{
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000620 "copts": ["sharedflag"] + select({
621 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
622 "//conditions:default": [],
623 }) + select({
624 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
625 "//conditions:default": [],
626 }) + select({
627 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
628 "//conditions:default": [],
629 }),
Liz Kammer7a210ac2021-09-22 15:52:58 -0400630 "implementation_deps": [":static_dep_for_shared"] + select({
631 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
632 "//conditions:default": [],
633 }) + select({
634 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
635 "//conditions:default": [],
636 }),
637 "implementation_dynamic_deps": select({
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000638 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
639 "//conditions:default": [],
640 }),
641 "srcs": ["sharedonly.cpp"] + select({
642 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
643 "//conditions:default": [],
644 }) + select({
645 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
646 "//conditions:default": [],
647 }),
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000648 "whole_archive_deps": select({
649 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
650 "//conditions:default": [],
651 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500652 }`,
653 "srcs": `["both.cpp"]`,
654 "static": `{
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000655 "copts": ["staticflag"] + select({
656 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
657 "//conditions:default": [],
658 }),
Liz Kammer7a210ac2021-09-22 15:52:58 -0400659 "implementation_deps": [":static_dep_for_static"] + select({
660 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000661 "//conditions:default": [],
662 }),
Liz Kammer7a210ac2021-09-22 15:52:58 -0400663 "srcs": ["staticonly.cpp"] + select({
664 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000665 "//conditions:default": [],
666 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500667 }`,
668 }),
669 },
Jingwen Chenbcf53042021-05-26 04:42:42 +0000670 })
671}
672
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000673func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
674 runCcLibraryTestCase(t, bp2buildTestCase{
675 description: "cc_library shared/static props with c/cpp/s mixed sources",
676 moduleTypeUnderTest: "cc_library",
677 moduleTypeUnderTestFactory: cc.LibraryFactory,
678 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000679 dir: "foo/bar",
680 filesystem: map[string]string{
681 "foo/bar/both_source.cpp": "",
682 "foo/bar/both_source.cc": "",
683 "foo/bar/both_source.c": "",
684 "foo/bar/both_source.s": "",
685 "foo/bar/both_source.S": "",
686 "foo/bar/shared_source.cpp": "",
687 "foo/bar/shared_source.cc": "",
688 "foo/bar/shared_source.c": "",
689 "foo/bar/shared_source.s": "",
690 "foo/bar/shared_source.S": "",
691 "foo/bar/static_source.cpp": "",
692 "foo/bar/static_source.cc": "",
693 "foo/bar/static_source.c": "",
694 "foo/bar/static_source.s": "",
695 "foo/bar/static_source.S": "",
696 "foo/bar/Android.bp": `
697cc_library {
698 name: "a",
699 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400700 "both_source.cpp",
701 "both_source.cc",
702 "both_source.c",
703 "both_source.s",
704 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400705 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400706 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000707 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400708 srcs: [
709 "static_source.cpp",
710 "static_source.cc",
711 "static_source.c",
712 "static_source.s",
713 "static_source.S",
714 ":static_filegroup",
715 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000716 },
717 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400718 srcs: [
719 "shared_source.cpp",
720 "shared_source.cc",
721 "shared_source.c",
722 "shared_source.s",
723 "shared_source.S",
724 ":shared_filegroup",
725 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000726 },
727 bazel_module: { bp2build_available: true },
728}
729
730filegroup {
731 name: "both_filegroup",
732 srcs: [
733 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400734 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000735}
736
737filegroup {
738 name: "shared_filegroup",
739 srcs: [
740 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400741 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000742}
743
744filegroup {
745 name: "static_filegroup",
746 srcs: [
747 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400748 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000749}
750`,
751 },
752 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500753 expectedBazelTargets: []string{
754 makeBazelTarget("cc_library", "a", attrNameToString{
755 "local_includes": `["."]`,
756 "shared": `{
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000757 "srcs": [
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000758 "shared_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400759 "shared_source.cc",
760 ":shared_filegroup_cpp_srcs",
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000761 ],
762 "srcs_as": [
763 "shared_source.s",
764 "shared_source.S",
765 ":shared_filegroup_as_srcs",
766 ],
767 "srcs_c": [
768 "shared_source.c",
769 ":shared_filegroup_c_srcs",
770 ],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500771 }`,
772 "srcs": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000773 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400774 "both_source.cc",
775 ":both_filegroup_cpp_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500776 ]`,
777 "srcs_as": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000778 "both_source.s",
779 "both_source.S",
780 ":both_filegroup_as_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500781 ]`,
782 "srcs_c": `[
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000783 "both_source.c",
784 ":both_filegroup_c_srcs",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500785 ]`,
786 "static": `{
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000787 "srcs": [
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000788 "static_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400789 "static_source.cc",
790 ":static_filegroup_cpp_srcs",
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000791 ],
792 "srcs_as": [
793 "static_source.s",
794 "static_source.S",
795 ":static_filegroup_as_srcs",
796 ],
797 "srcs_c": [
798 "static_source.c",
799 ":static_filegroup_c_srcs",
800 ],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500801 }`,
802 }),
803 },
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000804 })
805}
806
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200807func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
808 runCcLibraryTestCase(t, bp2buildTestCase{
809 description: "cc_library non-configured version script",
810 moduleTypeUnderTest: "cc_library",
811 moduleTypeUnderTestFactory: cc.LibraryFactory,
812 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200813 dir: "foo/bar",
814 filesystem: map[string]string{
815 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200816cc_library {
817 name: "a",
818 srcs: ["a.cpp"],
819 version_script: "v.map",
820 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400821 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200822}
823`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200824 },
825 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500826 expectedBazelTargets: []string{
827 makeBazelTarget("cc_library", "a", attrNameToString{
828 "additional_linker_inputs": `["v.map"]`,
829 "linkopts": `["-Wl,--version-script,$(location v.map)"]`,
830 "srcs": `["a.cpp"]`,
831 }),
832 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200833 })
834}
835
836func TestCcLibraryConfiguredVersionScript(t *testing.T) {
837 runCcLibraryTestCase(t, bp2buildTestCase{
838 description: "cc_library configured version script",
839 moduleTypeUnderTest: "cc_library",
840 moduleTypeUnderTestFactory: cc.LibraryFactory,
841 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200842 dir: "foo/bar",
843 filesystem: map[string]string{
844 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400845cc_library {
846 name: "a",
847 srcs: ["a.cpp"],
848 arch: {
849 arm: {
850 version_script: "arm.map",
851 },
852 arm64: {
853 version_script: "arm64.map",
854 },
855 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200856
Liz Kammer8337ea42021-09-10 10:06:32 -0400857 bazel_module: { bp2build_available: true },
858 include_build_directory: false,
859}
Liz Kammerd366c902021-06-03 13:43:01 -0400860 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200861 },
862 blueprint: soongCcLibraryPreamble,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500863 expectedBazelTargets: []string{
864 makeBazelTarget("cc_library", "a", attrNameToString{
865 "additional_linker_inputs": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400866 "//build/bazel/platforms/arch:arm": ["arm.map"],
867 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
868 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500869 })`,
870 "linkopts": `select({
Liz Kammerd2871182021-10-04 13:54:37 -0400871 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
872 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
873 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500874 })`,
875 "srcs": `["a.cpp"]`,
876 }),
877 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200878 })
879}
880
881func TestCcLibrarySharedLibs(t *testing.T) {
882 runCcLibraryTestCase(t, bp2buildTestCase{
883 description: "cc_library shared_libs",
884 moduleTypeUnderTest: "cc_library",
885 moduleTypeUnderTestFactory: cc.LibraryFactory,
886 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400887 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400888cc_library {
889 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400890 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400891}
892
893cc_library {
894 name: "a",
895 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400896 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400897}
898`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500899 expectedBazelTargets: []string{
900 makeBazelTarget("cc_library", "a", attrNameToString{
901 "implementation_dynamic_deps": `[":mylib"]`,
902 }),
903 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200904 })
905}
906
Liz Kammer0eae52e2021-10-06 10:32:26 -0400907func TestCcLibraryFeatures(t *testing.T) {
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200908 runCcLibraryTestCase(t, bp2buildTestCase{
909 description: "cc_library pack_relocations test",
910 moduleTypeUnderTest: "cc_library",
911 moduleTypeUnderTestFactory: cc.LibraryFactory,
912 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400913 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400914cc_library {
915 name: "a",
916 srcs: ["a.cpp"],
917 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400918 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400919 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400920}
921
922cc_library {
923 name: "b",
924 srcs: ["b.cpp"],
925 arch: {
926 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400927 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400928 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400929 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400930 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400931 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400932}
933
934cc_library {
935 name: "c",
936 srcs: ["c.cpp"],
937 target: {
938 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400939 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400940 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400941 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400942 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400943 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400944}`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500945 expectedBazelTargets: []string{
946 makeBazelTarget("cc_library", "a", attrNameToString{
947 "features": `[
Liz Kammer0eae52e2021-10-06 10:32:26 -0400948 "disable_pack_relocations",
949 "-no_undefined_symbols",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500950 ]`,
951 "srcs": `["a.cpp"]`,
952 }), makeBazelTarget("cc_library", "b", attrNameToString{
953 "features": `select({
Liz Kammer0eae52e2021-10-06 10:32:26 -0400954 "//build/bazel/platforms/arch:x86_64": [
955 "disable_pack_relocations",
956 "-no_undefined_symbols",
957 ],
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400958 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500959 })`,
960 "srcs": `["b.cpp"]`,
961 }), makeBazelTarget("cc_library", "c", attrNameToString{
962 "features": `select({
Liz Kammer0eae52e2021-10-06 10:32:26 -0400963 "//build/bazel/platforms/os:darwin": [
964 "disable_pack_relocations",
965 "-no_undefined_symbols",
966 ],
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400967 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500968 })`,
969 "srcs": `["c.cpp"]`,
970 }),
971 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200972 })
973}
974
975func TestCcLibrarySpacesInCopts(t *testing.T) {
976 runCcLibraryTestCase(t, bp2buildTestCase{
977 description: "cc_library spaces in copts",
978 moduleTypeUnderTest: "cc_library",
979 moduleTypeUnderTestFactory: cc.LibraryFactory,
980 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400981 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +0000982cc_library {
983 name: "a",
984 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400985 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +0000986}
987`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500988 expectedBazelTargets: []string{
989 makeBazelTarget("cc_library", "a", attrNameToString{
990 "copts": `[
Jingwen Chen3950cd62021-05-12 04:33:00 +0000991 "-include",
992 "header.h",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500993 ]`,
994 }),
995 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200996 })
997}
998
999func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
1000 runCcLibraryTestCase(t, bp2buildTestCase{
Chris Parsons990c4f42021-05-25 12:10:58 -04001001 description: "cc_library cppflags usage",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001002 moduleTypeUnderTest: "cc_library",
1003 moduleTypeUnderTestFactory: cc.LibraryFactory,
1004 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -04001005 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001006 name: "a",
1007 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001008 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001009 cppflags: [
1010 "-fsigned-char",
1011 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -04001012 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001013 arch: {
1014 arm64: {
1015 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001016 },
Liz Kammerd366c902021-06-03 13:43:01 -04001017 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001018 target: {
1019 android: {
1020 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -04001021 },
Liz Kammerd366c902021-06-03 13:43:01 -04001022 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001023 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001024}
1025`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001026 expectedBazelTargets: []string{
1027 makeBazelTarget("cc_library", "a", attrNameToString{
1028 "copts": `["-Wall"]`,
1029 "cppflags": `[
Chris Parsons990c4f42021-05-25 12:10:58 -04001030 "-fsigned-char",
1031 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001032 ] + select({
1033 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1034 "//conditions:default": [],
1035 }) + select({
1036 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1037 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001038 })`,
1039 "srcs": `["a.cpp"]`,
1040 }),
1041 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001042 })
Jingwen Chen63930982021-03-24 10:04:33 -04001043}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001044
Liz Kammer47535c52021-06-02 16:02:22 -04001045func TestCcLibraryExcludeLibs(t *testing.T) {
1046 runCcLibraryTestCase(t, bp2buildTestCase{
1047 moduleTypeUnderTest: "cc_library",
1048 moduleTypeUnderTestFactory: cc.LibraryFactory,
1049 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer47535c52021-06-02 16:02:22 -04001050 filesystem: map[string]string{},
1051 blueprint: soongCcLibraryStaticPreamble + `
1052cc_library {
1053 name: "foo_static",
1054 srcs: ["common.c"],
1055 whole_static_libs: [
1056 "arm_whole_static_lib_excludes",
1057 "malloc_not_svelte_whole_static_lib_excludes"
1058 ],
1059 static_libs: [
1060 "arm_static_lib_excludes",
1061 "malloc_not_svelte_static_lib_excludes"
1062 ],
1063 shared_libs: [
1064 "arm_shared_lib_excludes",
1065 ],
1066 arch: {
1067 arm: {
1068 exclude_shared_libs: [
1069 "arm_shared_lib_excludes",
1070 ],
1071 exclude_static_libs: [
1072 "arm_static_lib_excludes",
1073 "arm_whole_static_lib_excludes",
1074 ],
1075 },
1076 },
1077 product_variables: {
1078 malloc_not_svelte: {
1079 shared_libs: ["malloc_not_svelte_shared_lib"],
1080 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1081 exclude_static_libs: [
1082 "malloc_not_svelte_static_lib_excludes",
1083 "malloc_not_svelte_whole_static_lib_excludes",
1084 ],
1085 },
1086 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001087 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001088}
1089
1090cc_library {
1091 name: "arm_whole_static_lib_excludes",
1092 bazel_module: { bp2build_available: false },
1093}
1094
1095cc_library {
1096 name: "malloc_not_svelte_whole_static_lib",
1097 bazel_module: { bp2build_available: false },
1098}
1099
1100cc_library {
1101 name: "malloc_not_svelte_whole_static_lib_excludes",
1102 bazel_module: { bp2build_available: false },
1103}
1104
1105cc_library {
1106 name: "arm_static_lib_excludes",
1107 bazel_module: { bp2build_available: false },
1108}
1109
1110cc_library {
1111 name: "malloc_not_svelte_static_lib_excludes",
1112 bazel_module: { bp2build_available: false },
1113}
1114
1115cc_library {
1116 name: "arm_shared_lib_excludes",
1117 bazel_module: { bp2build_available: false },
1118}
1119
1120cc_library {
1121 name: "malloc_not_svelte_shared_lib",
1122 bazel_module: { bp2build_available: false },
1123}
1124`,
1125 expectedBazelTargets: []string{
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001126 makeBazelTarget("cc_library", "foo_static", attrNameToString{
1127 "implementation_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001128 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001129 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001130 }) + select({
1131 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001132 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001133 })`,
1134 "implementation_dynamic_deps": `select({
Liz Kammer7a210ac2021-09-22 15:52:58 -04001135 "//build/bazel/platforms/arch:arm": [],
1136 "//conditions:default": [":arm_shared_lib_excludes"],
1137 }) + select({
1138 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1139 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001140 })`,
1141 "srcs_c": `["common.c"]`,
1142 "whole_archive_deps": `select({
Liz Kammer47535c52021-06-02 16:02:22 -04001143 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001144 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001145 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001146 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1147 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001148 })`,
1149 }),
Liz Kammer47535c52021-06-02 16:02:22 -04001150 },
1151 })
1152}
Liz Kammerd366c902021-06-03 13:43:01 -04001153
1154func TestCCLibraryNoCrtTrue(t *testing.T) {
1155 runCcLibraryTestCase(t, bp2buildTestCase{
Jingwen Chen6ada5892021-09-17 11:38:09 +00001156 description: "cc_library - nocrt: true emits attribute",
1157 moduleTypeUnderTest: "cc_library",
1158 moduleTypeUnderTestFactory: cc.LibraryFactory,
1159 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1160 filesystem: map[string]string{
1161 "impl.cpp": "",
1162 },
1163 blueprint: soongCcLibraryPreamble + `
1164cc_library {
1165 name: "foo-lib",
1166 srcs: ["impl.cpp"],
1167 nocrt: true,
1168 include_build_directory: false,
1169}
1170`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001171 expectedBazelTargets: []string{
1172 makeBazelTarget("cc_library", "foo-lib", attrNameToString{
1173 "link_crt": `False`,
1174 "srcs": `["impl.cpp"]`,
1175 }),
1176 },
1177 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001178}
1179
1180func TestCCLibraryNoCrtFalse(t *testing.T) {
1181 runCcLibraryTestCase(t, bp2buildTestCase{
1182 description: "cc_library - nocrt: false - does not emit attribute",
1183 moduleTypeUnderTest: "cc_library",
1184 moduleTypeUnderTestFactory: cc.LibraryFactory,
1185 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1186 filesystem: map[string]string{
1187 "impl.cpp": "",
1188 },
1189 blueprint: soongCcLibraryPreamble + `
1190cc_library {
1191 name: "foo-lib",
1192 srcs: ["impl.cpp"],
1193 nocrt: false,
1194 include_build_directory: false,
1195}
1196`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001197 expectedBazelTargets: []string{
1198 makeBazelTarget("cc_library", "foo-lib", attrNameToString{
1199 "srcs": `["impl.cpp"]`,
1200 }),
1201 },
1202 })
Jingwen Chen6ada5892021-09-17 11:38:09 +00001203}
1204
1205func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1206 runCcLibraryTestCase(t, bp2buildTestCase{
1207 description: "cc_library - nocrt in select",
1208 moduleTypeUnderTest: "cc_library",
1209 moduleTypeUnderTestFactory: cc.LibraryFactory,
1210 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1211 filesystem: map[string]string{
1212 "impl.cpp": "",
1213 },
1214 blueprint: soongCcLibraryPreamble + `
1215cc_library {
1216 name: "foo-lib",
1217 srcs: ["impl.cpp"],
1218 arch: {
1219 arm: {
1220 nocrt: true,
1221 },
1222 x86: {
1223 nocrt: false,
1224 },
1225 },
1226 include_build_directory: false,
1227}
1228`,
1229 expectedErr: fmt.Errorf("Android.bp:16:1: module \"foo-lib\": nocrt is not supported for arch variants"),
1230 })
1231}
1232
1233func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1234 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerd366c902021-06-03 13:43:01 -04001235 description: "cc_library - simple example",
1236 moduleTypeUnderTest: "cc_library",
1237 moduleTypeUnderTestFactory: cc.LibraryFactory,
1238 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1239 filesystem: map[string]string{
1240 "impl.cpp": "",
1241 },
1242 blueprint: soongCcLibraryPreamble + `
1243cc_library_headers { name: "some-headers" }
1244cc_library {
1245 name: "foo-lib",
1246 srcs: ["impl.cpp"],
1247 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001248 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001249}
1250`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001251 expectedBazelTargets: []string{
1252 makeBazelTarget("cc_library", "foo-lib", attrNameToString{
1253 "srcs": `["impl.cpp"]`,
1254 "use_libcrt": `False`,
1255 }),
1256 }})
Liz Kammerd366c902021-06-03 13:43:01 -04001257}
1258
Jingwen Chen6ada5892021-09-17 11:38:09 +00001259func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001260 runCcLibraryTestCase(t, bp2buildTestCase{
1261 moduleTypeUnderTest: "cc_library",
1262 moduleTypeUnderTestFactory: cc.LibraryFactory,
1263 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1264 filesystem: map[string]string{
1265 "impl.cpp": "",
1266 },
1267 blueprint: soongCcLibraryPreamble + `
1268cc_library_headers { name: "some-headers" }
1269cc_library {
1270 name: "foo-lib",
1271 srcs: ["impl.cpp"],
1272 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001273 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001274}
1275`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001276 expectedBazelTargets: []string{
1277 makeBazelTarget("cc_library", "foo-lib", attrNameToString{
1278 "srcs": `["impl.cpp"]`,
1279 "use_libcrt": `True`,
1280 }),
1281 }})
Liz Kammerd366c902021-06-03 13:43:01 -04001282}
1283
Jingwen Chen6ada5892021-09-17 11:38:09 +00001284func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001285 runCcLibraryTestCase(t, bp2buildTestCase{
1286 moduleTypeUnderTest: "cc_library",
1287 moduleTypeUnderTestFactory: cc.LibraryFactory,
1288 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1289 filesystem: map[string]string{
1290 "impl.cpp": "",
1291 },
1292 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001293cc_library {
1294 name: "foo-lib",
1295 srcs: ["impl.cpp"],
1296 arch: {
1297 arm: {
1298 no_libcrt: true,
1299 },
1300 x86: {
1301 no_libcrt: true,
1302 },
1303 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001304 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001305}
1306`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001307 expectedBazelTargets: []string{
1308 makeBazelTarget("cc_library", "foo-lib", attrNameToString{
1309 "srcs": `["impl.cpp"]`,
1310 "use_libcrt": `select({
Liz Kammerd366c902021-06-03 13:43:01 -04001311 "//build/bazel/platforms/arch:arm": False,
1312 "//build/bazel/platforms/arch:x86": False,
1313 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001314 })`,
1315 }),
1316 }})
Liz Kammerd366c902021-06-03 13:43:01 -04001317}
1318
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001319func TestCcLibraryStrip(t *testing.T) {
1320 runCcLibraryTestCase(t, bp2buildTestCase{
1321 description: "cc_library strip args",
1322 moduleTypeUnderTest: "cc_library",
1323 moduleTypeUnderTestFactory: cc.LibraryFactory,
1324 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -04001325 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001326cc_library {
1327 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001328 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001329}
1330cc_library {
1331 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001332 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001333 keep_symbols: true,
1334 },
1335 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001336}
1337cc_library {
1338 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001339 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001340 keep_symbols_and_debug_frame: true,
1341 },
1342 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001343}
1344cc_library {
1345 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001346 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001347 none: true,
1348 },
1349 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001350}
1351cc_library {
1352 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001353 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001354 keep_symbols_list: ["symbol"],
1355 },
1356 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001357}
1358cc_library {
1359 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001360 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001361 all: true,
1362 },
1363 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001364}
1365`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001366 expectedBazelTargets: []string{
1367 makeBazelTarget("cc_library", "all", attrNameToString{
1368 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001369 "all": True,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001370 }`,
1371 }), makeBazelTarget("cc_library", "keep_symbols", attrNameToString{
1372 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001373 "keep_symbols": True,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001374 }`,
1375 }), makeBazelTarget("cc_library", "keep_symbols_and_debug_frame", attrNameToString{
1376 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001377 "keep_symbols_and_debug_frame": True,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001378 }`,
1379 }), makeBazelTarget("cc_library", "keep_symbols_list", attrNameToString{
1380 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001381 "keep_symbols_list": ["symbol"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001382 }`,
1383 }), makeBazelTarget("cc_library", "none", attrNameToString{
1384 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001385 "none": True,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001386 }`,
1387 }), makeBazelTarget("cc_library", "nothing", attrNameToString{}),
1388 },
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001389 })
1390}
1391
1392func TestCcLibraryStripWithArch(t *testing.T) {
1393 runCcLibraryTestCase(t, bp2buildTestCase{
1394 description: "cc_library strip args",
1395 moduleTypeUnderTest: "cc_library",
1396 moduleTypeUnderTestFactory: cc.LibraryFactory,
1397 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -04001398 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001399cc_library {
1400 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001401 target: {
1402 darwin: {
1403 strip: {
1404 keep_symbols_list: ["foo", "bar"]
1405 }
1406 },
1407 },
1408 arch: {
1409 arm: {
1410 strip: {
1411 keep_symbols_and_debug_frame: true,
1412 },
1413 },
1414 arm64: {
1415 strip: {
1416 keep_symbols: true,
1417 },
1418 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001419 },
1420 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001421}
1422`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001423 expectedBazelTargets: []string{
1424 makeBazelTarget("cc_library", "multi-arch", attrNameToString{
1425 "strip": `{
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001426 "keep_symbols": select({
1427 "//build/bazel/platforms/arch:arm64": True,
1428 "//conditions:default": None,
1429 }),
1430 "keep_symbols_and_debug_frame": select({
1431 "//build/bazel/platforms/arch:arm": True,
1432 "//conditions:default": None,
1433 }),
1434 "keep_symbols_list": select({
1435 "//build/bazel/platforms/os:darwin": [
1436 "foo",
1437 "bar",
1438 ],
1439 "//conditions:default": [],
1440 }),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001441 }`,
1442 }),
1443 },
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001444 })
1445}
Chris Parsons51f8c392021-08-03 21:01:05 -04001446
1447func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1448 runCcLibraryTestCase(t, bp2buildTestCase{
1449 description: "cc_library system_shared_libs empty at root",
1450 moduleTypeUnderTest: "cc_library",
1451 moduleTypeUnderTestFactory: cc.LibraryFactory,
1452 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1453 blueprint: soongCcLibraryPreamble + `
1454cc_library {
1455 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001456 system_shared_libs: [],
1457 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001458}
1459`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001460 expectedBazelTargets: []string{
1461 makeBazelTarget("cc_library", "root_empty", attrNameToString{
1462 "system_dynamic_deps": `[]`,
1463 }),
1464 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001465 })
1466}
1467
1468func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1469 runCcLibraryTestCase(t, bp2buildTestCase{
1470 description: "cc_library system_shared_libs empty for static variant",
1471 moduleTypeUnderTest: "cc_library",
1472 moduleTypeUnderTestFactory: cc.LibraryFactory,
1473 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1474 blueprint: soongCcLibraryPreamble + `
1475cc_library {
1476 name: "static_empty",
1477 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001478 system_shared_libs: [],
1479 },
1480 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001481}
1482`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001483 expectedBazelTargets: []string{
1484 makeBazelTarget("cc_library", "static_empty", attrNameToString{
1485 "static": `{
Chris Parsons51f8c392021-08-03 21:01:05 -04001486 "system_dynamic_deps": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001487 }`,
1488 }),
1489 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001490 })
1491}
1492
1493func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1494 runCcLibraryTestCase(t, bp2buildTestCase{
1495 description: "cc_library system_shared_libs empty for shared variant",
1496 moduleTypeUnderTest: "cc_library",
1497 moduleTypeUnderTestFactory: cc.LibraryFactory,
1498 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1499 blueprint: soongCcLibraryPreamble + `
1500cc_library {
1501 name: "shared_empty",
1502 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001503 system_shared_libs: [],
1504 },
1505 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001506}
1507`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001508 expectedBazelTargets: []string{
1509 makeBazelTarget("cc_library", "shared_empty", attrNameToString{
1510 "shared": `{
Chris Parsons51f8c392021-08-03 21:01:05 -04001511 "system_dynamic_deps": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001512 }`,
1513 }),
1514 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001515 })
1516}
1517
1518func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1519 runCcLibraryTestCase(t, bp2buildTestCase{
1520 description: "cc_library system_shared_libs empty for shared, bionic variant",
1521 moduleTypeUnderTest: "cc_library",
1522 moduleTypeUnderTestFactory: cc.LibraryFactory,
1523 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1524 blueprint: soongCcLibraryPreamble + `
1525cc_library {
1526 name: "shared_empty",
1527 target: {
1528 bionic: {
1529 shared: {
1530 system_shared_libs: [],
1531 }
1532 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001533 },
1534 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001535}
1536`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001537 expectedBazelTargets: []string{
1538 makeBazelTarget("cc_library", "shared_empty", attrNameToString{
1539 "shared": `{
Chris Parsons51f8c392021-08-03 21:01:05 -04001540 "system_dynamic_deps": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001541 }`,
1542 }),
1543 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001544 })
1545}
1546
1547func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1548 // Note that this behavior is technically incorrect (it's a simplification).
1549 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1550 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1551 // b/195791252 tracks the fix.
1552 runCcLibraryTestCase(t, bp2buildTestCase{
1553 description: "cc_library system_shared_libs empty for linux_bionic variant",
1554 moduleTypeUnderTest: "cc_library",
1555 moduleTypeUnderTestFactory: cc.LibraryFactory,
1556 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1557 blueprint: soongCcLibraryPreamble + `
1558cc_library {
1559 name: "target_linux_bionic_empty",
1560 target: {
1561 linux_bionic: {
1562 system_shared_libs: [],
1563 },
1564 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001565 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001566}
1567`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001568 expectedBazelTargets: []string{
1569 makeBazelTarget("cc_library", "target_linux_bionic_empty", attrNameToString{
1570 "system_dynamic_deps": `[]`,
1571 }),
1572 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001573 })
1574}
1575
1576func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1577 runCcLibraryTestCase(t, bp2buildTestCase{
1578 description: "cc_library system_shared_libs empty for bionic variant",
1579 moduleTypeUnderTest: "cc_library",
1580 moduleTypeUnderTestFactory: cc.LibraryFactory,
1581 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1582 blueprint: soongCcLibraryPreamble + `
1583cc_library {
1584 name: "target_bionic_empty",
1585 target: {
1586 bionic: {
1587 system_shared_libs: [],
1588 },
1589 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001590 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001591}
1592`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001593 expectedBazelTargets: []string{
1594 makeBazelTarget("cc_library", "target_bionic_empty", attrNameToString{
1595 "system_dynamic_deps": `[]`,
1596 }),
1597 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001598 })
1599}
1600
1601func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1602 runCcLibraryTestCase(t, bp2buildTestCase{
1603 description: "cc_library system_shared_libs set for shared and root",
1604 moduleTypeUnderTest: "cc_library",
1605 moduleTypeUnderTestFactory: cc.LibraryFactory,
1606 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1607 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001608cc_library {
1609 name: "libc",
1610 bazel_module: { bp2build_available: false },
1611}
1612cc_library {
1613 name: "libm",
1614 bazel_module: { bp2build_available: false },
1615}
Chris Parsons51f8c392021-08-03 21:01:05 -04001616
1617cc_library {
1618 name: "foo",
1619 system_shared_libs: ["libc"],
1620 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001621 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001622 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001623 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001624}
1625`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001626 expectedBazelTargets: []string{
1627 makeBazelTarget("cc_library", "foo", attrNameToString{
1628 "shared": `{
Chris Parsons51f8c392021-08-03 21:01:05 -04001629 "system_dynamic_deps": [":libm"],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001630 }`,
1631 "system_dynamic_deps": `[":libc"]`,
1632 }),
1633 },
Chris Parsons51f8c392021-08-03 21:01:05 -04001634 })
1635}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001636
1637func TestCcLibraryOsSelects(t *testing.T) {
1638 runCcLibraryTestCase(t, bp2buildTestCase{
1639 description: "cc_library - selects for all os targets",
1640 moduleTypeUnderTest: "cc_library",
1641 moduleTypeUnderTestFactory: cc.LibraryFactory,
1642 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1643 filesystem: map[string]string{},
1644 blueprint: soongCcLibraryPreamble + `
1645cc_library_headers { name: "some-headers" }
1646cc_library {
1647 name: "foo-lib",
1648 srcs: ["base.cpp"],
1649 target: {
1650 android: {
1651 srcs: ["android.cpp"],
1652 },
1653 linux: {
1654 srcs: ["linux.cpp"],
1655 },
1656 linux_glibc: {
1657 srcs: ["linux_glibc.cpp"],
1658 },
1659 darwin: {
1660 srcs: ["darwin.cpp"],
1661 },
1662 bionic: {
1663 srcs: ["bionic.cpp"],
1664 },
1665 linux_musl: {
1666 srcs: ["linux_musl.cpp"],
1667 },
1668 windows: {
1669 srcs: ["windows.cpp"],
1670 },
1671 },
1672 include_build_directory: false,
1673}
1674`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001675 expectedBazelTargets: []string{
1676 makeBazelTarget("cc_library", "foo-lib", attrNameToString{
1677 "srcs": `["base.cpp"] + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001678 "//build/bazel/platforms/os:android": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001679 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001680 "bionic.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001681 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001682 ],
1683 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1684 "//build/bazel/platforms/os:linux": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001685 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001686 "linux_glibc.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001687 ],
1688 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001689 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001690 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001691 ],
1692 "//build/bazel/platforms/os:linux_musl": [
Liz Kammer9bad9d62021-10-11 15:40:35 -04001693 "linux.cpp",
Liz Kammerfdd72e62021-10-11 15:41:03 -04001694 "linux_musl.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001695 ],
1696 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1697 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001698 })`,
1699 }),
1700 },
1701 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001702}
1703
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001704func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001705 type testCase struct {
1706 cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001707 c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001708 gnu_extensions string
1709 bazel_cpp_std string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001710 bazel_c_std string
Jingwen Chen97b85312021-10-08 10:41:31 +00001711 }
1712
1713 testCases := []testCase{
1714 // Existing usages of cpp_std in AOSP are:
1715 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1716 //
1717 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1718 // is set in the toolchain.)
1719 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001720 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001721 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1722 // experimental defaults to gnu++2a
1723 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001724 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001725 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1726 // Explicitly setting a c++ std does not use replace gnu++ std even if
1727 // gnu_extensions is true.
1728 // "c++11",
1729 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001730 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001731 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1732 // "c++17",
1733 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001734 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001735 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1736 // "c++2a",
1737 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001738 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001739 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1740 // "c++98",
1741 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001742 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001743 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1744 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1745 // "gnu++11",
1746 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001747 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001748 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1749 // "gnu++17",
1750 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001751 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c99"},
Jingwen Chen97b85312021-10-08 10:41:31 +00001752 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
Chris Parsons79bd2b72021-11-29 17:52:41 -05001753
1754 // some c_std test cases
1755 {c_std: "experimental", gnu_extensions: "", bazel_c_std: "gnu11"},
1756 {c_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1757 {c_std: "experimental", gnu_extensions: "true", bazel_c_std: "gnu11"},
1758 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17", bazel_c_std: "gnu11"},
1759 {c_std: "gnu11", cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17", bazel_c_std: "c11"},
1760 {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 +00001761 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001762 for i, tc := range testCases {
1763 name_prefix := fmt.Sprintf("a_%v", i)
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001764 cppStdProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001765 if tc.cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001766 cppStdProp = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001767 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001768 cStdProp := ""
1769 if tc.c_std != "" {
1770 cStdProp = fmt.Sprintf(" c_std: \"%s\",", tc.c_std)
1771 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001772 gnuExtensionsProp := ""
Jingwen Chen97b85312021-10-08 10:41:31 +00001773 if tc.gnu_extensions != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001774 gnuExtensionsProp = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
Jingwen Chen97b85312021-10-08 10:41:31 +00001775 }
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001776 attrs := attrNameToString{}
Jingwen Chen97b85312021-10-08 10:41:31 +00001777 if tc.bazel_cpp_std != "" {
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001778 attrs["cpp_std"] = fmt.Sprintf(`"%s"`, tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001779 }
Chris Parsons79bd2b72021-11-29 17:52:41 -05001780 if tc.bazel_c_std != "" {
1781 attrs["c_std"] = fmt.Sprintf(`"%s"`, tc.bazel_c_std)
1782 }
Jingwen Chen97b85312021-10-08 10:41:31 +00001783
1784 runCcLibraryTestCase(t, bp2buildTestCase{
1785 description: fmt.Sprintf(
Chris Parsons79bd2b72021-11-29 17:52:41 -05001786 "cc_library with c_std: %s, cpp_std: %s and gnu_extensions: %s", tc.c_std, tc.cpp_std, tc.gnu_extensions),
Jingwen Chen97b85312021-10-08 10:41:31 +00001787 moduleTypeUnderTest: "cc_library",
1788 moduleTypeUnderTestFactory: cc.LibraryFactory,
1789 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1790 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1791cc_library {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001792 name: "%s_full",
Jingwen Chen97b85312021-10-08 10:41:31 +00001793%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001794%s // c_std: *string
Jingwen Chen97b85312021-10-08 10:41:31 +00001795%s // gnu_extensions: *bool
1796 include_build_directory: false,
1797}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001798`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001799 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001800 makeBazelTarget("cc_library", name_prefix+"_full", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001801 },
Jingwen Chen97b85312021-10-08 10:41:31 +00001802 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001803
1804 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1805 description: fmt.Sprintf(
Chris Parsons79bd2b72021-11-29 17:52:41 -05001806 "cc_library_static with c_std: %s, cpp_std: %s and gnu_extensions: %s", tc.c_std, tc.cpp_std, tc.gnu_extensions),
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001807 moduleTypeUnderTest: "cc_library_static",
1808 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
1809 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
1810 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1811cc_library_static {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001812 name: "%s_static",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001813%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001814%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001815%s // gnu_extensions: *bool
1816 include_build_directory: false,
1817}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001818`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001819 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001820 makeBazelTarget("cc_library_static", name_prefix+"_static", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001821 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001822 })
1823
1824 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1825 description: fmt.Sprintf(
Chris Parsons79bd2b72021-11-29 17:52:41 -05001826 "cc_library_shared with c_std: %s, cpp_std: %s and gnu_extensions: %s", tc.c_std, tc.cpp_std, tc.gnu_extensions),
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001827 moduleTypeUnderTest: "cc_library_shared",
1828 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
1829 moduleTypeUnderTestBp2BuildMutator: cc.CcLibrarySharedBp2Build,
1830 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1831cc_library_shared {
Chris Parsons79bd2b72021-11-29 17:52:41 -05001832 name: "%s_shared",
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001833%s // cpp_std: *string
Chris Parsons79bd2b72021-11-29 17:52:41 -05001834%s // c_std: *string
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001835%s // gnu_extensions: *bool
1836 include_build_directory: false,
1837}
Chris Parsons79bd2b72021-11-29 17:52:41 -05001838`, name_prefix, cppStdProp, cStdProp, gnuExtensionsProp),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001839 expectedBazelTargets: []string{
Chris Parsons79bd2b72021-11-29 17:52:41 -05001840 makeBazelTarget("cc_library_shared", name_prefix+"_shared", attrs),
Liz Kammer78cfdaa2021-11-08 12:56:31 -05001841 },
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001842 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001843 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001844}
Liz Kammer12615db2021-09-28 09:19:17 -04001845
1846func TestCcLibraryProtoSimple(t *testing.T) {
1847 runCcLibraryTestCase(t, bp2buildTestCase{
1848 moduleTypeUnderTest: "cc_library",
1849 moduleTypeUnderTestFactory: cc.LibraryFactory,
1850 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1851 blueprint: soongCcProtoPreamble + `cc_library {
1852 name: "foo",
1853 srcs: ["foo.proto"],
1854 include_build_directory: false,
1855}`,
1856 expectedBazelTargets: []string{
1857 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1858 "srcs": `["foo.proto"]`,
1859 "strip_import_prefix": `""`,
1860 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1861 "deps": `[":foo_proto"]`,
1862 }), makeBazelTarget("cc_library", "foo", attrNameToString{
1863 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
1864 "shared": `{
1865 "dynamic_deps": [":libprotobuf-cpp-lite"],
1866 }`,
1867 "static": `{
1868 "deps": [":libprotobuf-cpp-lite"],
1869 }`,
1870 }),
1871 },
1872 })
1873}
1874
1875func TestCcLibraryProtoNoCanonicalPathFromRoot(t *testing.T) {
1876 runCcLibraryTestCase(t, bp2buildTestCase{
1877 moduleTypeUnderTest: "cc_library",
1878 moduleTypeUnderTestFactory: cc.LibraryFactory,
1879 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1880 blueprint: soongCcProtoPreamble + `cc_library {
1881 name: "foo",
1882 srcs: ["foo.proto"],
1883 proto: { canonical_path_from_root: false},
1884 include_build_directory: false,
1885}`,
1886 expectedBazelTargets: []string{
1887 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1888 "srcs": `["foo.proto"]`,
1889 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1890 "deps": `[":foo_proto"]`,
1891 }), makeBazelTarget("cc_library", "foo", attrNameToString{
1892 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
1893 "shared": `{
1894 "dynamic_deps": [":libprotobuf-cpp-lite"],
1895 }`,
1896 "static": `{
1897 "deps": [":libprotobuf-cpp-lite"],
1898 }`,
1899 }),
1900 },
1901 })
1902}
1903
1904func TestCcLibraryProtoExplicitCanonicalPathFromRoot(t *testing.T) {
1905 runCcLibraryTestCase(t, bp2buildTestCase{
1906 moduleTypeUnderTest: "cc_library",
1907 moduleTypeUnderTestFactory: cc.LibraryFactory,
1908 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1909 blueprint: soongCcProtoPreamble + `cc_library {
1910 name: "foo",
1911 srcs: ["foo.proto"],
1912 proto: { canonical_path_from_root: true},
1913 include_build_directory: false,
1914}`,
1915 expectedBazelTargets: []string{
1916 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1917 "srcs": `["foo.proto"]`,
1918 "strip_import_prefix": `""`,
1919 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1920 "deps": `[":foo_proto"]`,
1921 }), makeBazelTarget("cc_library", "foo", attrNameToString{
1922 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
1923 "shared": `{
1924 "dynamic_deps": [":libprotobuf-cpp-lite"],
1925 }`,
1926 "static": `{
1927 "deps": [":libprotobuf-cpp-lite"],
1928 }`,
1929 }),
1930 },
1931 })
1932}
1933
1934func TestCcLibraryProtoFull(t *testing.T) {
1935 runCcLibraryTestCase(t, bp2buildTestCase{
1936 moduleTypeUnderTest: "cc_library",
1937 moduleTypeUnderTestFactory: cc.LibraryFactory,
1938 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1939 blueprint: soongCcProtoPreamble + `cc_library {
1940 name: "foo",
1941 srcs: ["foo.proto"],
1942 proto: {
1943 canonical_path_from_root: false,
1944 type: "full",
1945 },
1946 include_build_directory: false,
1947}`,
1948 expectedBazelTargets: []string{
1949 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1950 "srcs": `["foo.proto"]`,
1951 }), makeBazelTarget("cc_proto_library", "foo_cc_proto", attrNameToString{
1952 "deps": `[":foo_proto"]`,
1953 }), makeBazelTarget("cc_library", "foo", attrNameToString{
1954 "implementation_whole_archive_deps": `[":foo_cc_proto"]`,
1955 "shared": `{
1956 "dynamic_deps": [":libprotobuf-cpp-full"],
1957 }`,
1958 "static": `{
1959 "deps": [":libprotobuf-cpp-full"],
1960 }`,
1961 }),
1962 },
1963 })
1964}
1965
1966func TestCcLibraryProtoLite(t *testing.T) {
1967 runCcLibraryTestCase(t, bp2buildTestCase{
1968 moduleTypeUnderTest: "cc_library",
1969 moduleTypeUnderTestFactory: cc.LibraryFactory,
1970 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1971 blueprint: soongCcProtoPreamble + `cc_library {
1972 name: "foo",
1973 srcs: ["foo.proto"],
1974 proto: {
1975 canonical_path_from_root: false,
1976 type: "lite",
1977 },
1978 include_build_directory: false,
1979}`,
1980 expectedBazelTargets: []string{
1981 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
1982 "srcs": `["foo.proto"]`,
1983 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
1984 "deps": `[":foo_proto"]`,
1985 }), makeBazelTarget("cc_library", "foo", attrNameToString{
1986 "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`,
1987 "shared": `{
1988 "dynamic_deps": [":libprotobuf-cpp-lite"],
1989 }`,
1990 "static": `{
1991 "deps": [":libprotobuf-cpp-lite"],
1992 }`,
1993 }),
1994 },
1995 })
1996}
1997
1998func TestCcLibraryProtoExportHeaders(t *testing.T) {
1999 runCcLibraryTestCase(t, bp2buildTestCase{
2000 moduleTypeUnderTest: "cc_library",
2001 moduleTypeUnderTestFactory: cc.LibraryFactory,
2002 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
2003 blueprint: soongCcProtoPreamble + `cc_library {
2004 name: "foo",
2005 srcs: ["foo.proto"],
2006 proto: {
2007 canonical_path_from_root: false,
2008 export_proto_headers: true,
2009 },
2010 include_build_directory: false,
2011}`,
2012 expectedBazelTargets: []string{
2013 makeBazelTarget("proto_library", "foo_proto", attrNameToString{
2014 "srcs": `["foo.proto"]`,
2015 }), makeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", attrNameToString{
2016 "deps": `[":foo_proto"]`,
2017 }), makeBazelTarget("cc_library", "foo", attrNameToString{
2018 "whole_archive_deps": `[":foo_cc_proto_lite"]`,
2019 "shared": `{
2020 "dynamic_deps": [":libprotobuf-cpp-lite"],
2021 }`,
2022 "static": `{
2023 "deps": [":libprotobuf-cpp-lite"],
2024 }`,
2025 }),
2026 },
2027 })
2028}