blob: c30fbc4d6fb9263d5fb853928cbd9b9a98fbdf62 [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}`
42)
43
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020044func runCcLibraryTestCase(t *testing.T, tc bp2buildTestCase) {
Liz Kammere4982e82021-05-25 10:39:35 -040045 t.Helper()
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020046 runBp2BuildTestCase(t, registerCcLibraryModuleTypes, tc)
47}
48
49func registerCcLibraryModuleTypes(ctx android.RegistrationContext) {
50 cc.RegisterCCBuildComponents(ctx)
Jingwen Chen14a8bda2021-06-02 11:10:02 +000051 ctx.RegisterModuleType("filegroup", android.FileGroupFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020052 ctx.RegisterModuleType("cc_library_static", cc.LibraryStaticFactory)
Liz Kammer2d7bbe32021-06-10 18:20:06 -040053 ctx.RegisterModuleType("cc_prebuilt_library_static", cc.PrebuiltStaticLibraryFactory)
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020054 ctx.RegisterModuleType("toolchain_library", cc.ToolchainLibraryFactory)
55 ctx.RegisterModuleType("cc_library_headers", cc.LibraryHeaderFactory)
56}
57
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020058func TestCcLibrarySimple(t *testing.T) {
59 runCcLibraryTestCase(t, bp2buildTestCase{
60 description: "cc_library - simple example",
61 moduleTypeUnderTest: "cc_library",
62 moduleTypeUnderTestFactory: cc.LibraryFactory,
63 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
64 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 },
84 blueprint: soongCcLibraryPreamble + `
Jingwen Chen63930982021-03-24 10:04:33 -040085cc_library_headers { name: "some-headers" }
86cc_library {
87 name: "foo-lib",
88 srcs: ["impl.cpp"],
89 cflags: ["-Wall"],
90 header_libs: ["some-headers"],
91 export_include_dirs: ["foo-dir"],
92 ldflags: ["-Wl,--exclude-libs=bar.a"],
93 arch: {
94 x86: {
95 ldflags: ["-Wl,--exclude-libs=baz.a"],
96 srcs: ["x86.cpp"],
97 },
98 x86_64: {
99 ldflags: ["-Wl,--exclude-libs=qux.a"],
100 srcs: ["x86_64.cpp"],
101 },
102 },
103 target: {
104 android: {
105 srcs: ["android.cpp"],
106 },
107 linux_glibc: {
108 srcs: ["linux.cpp"],
109 },
110 darwin: {
111 srcs: ["darwin.cpp"],
112 },
Liz Kammer01a16e82021-07-16 16:33:47 -0400113 bionic: {
114 srcs: ["bionic.cpp"]
115 },
Jingwen Chen63930982021-03-24 10:04:33 -0400116 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400117 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400118}
119`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200120 expectedBazelTargets: []string{`cc_library(
Jingwen Chen63930982021-03-24 10:04:33 -0400121 name = "foo-lib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400122 copts = ["-Wall"],
Liz Kammer5fad5012021-09-09 14:08:21 -0400123 export_includes = ["foo-dir"],
Chris Parsonsd6358772021-05-18 18:35:24 -0400124 implementation_deps = [":some-headers"],
Jingwen Chened9c17d2021-04-13 07:14:55 +0000125 linkopts = ["-Wl,--exclude-libs=bar.a"] + select({
126 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=baz.a"],
127 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=qux.a"],
128 "//conditions:default": [],
129 }),
Jingwen Chen882bcc12021-04-27 05:54:20 +0000130 srcs = ["impl.cpp"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000131 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
132 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen63930982021-03-24 10:04:33 -0400133 "//conditions:default": [],
134 }) + select({
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400135 "//build/bazel/platforms/os:android": [
136 "android.cpp",
137 "bionic.cpp",
138 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000139 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
140 "//build/bazel/platforms/os:linux": ["linux.cpp"],
Chris Parsons2dde0cb2021-10-01 14:45:30 -0400141 "//build/bazel/platforms/os:linux_bionic": ["bionic.cpp"],
Liz Kammer01a16e82021-07-16 16:33:47 -0400142 "//conditions:default": [],
Jingwen Chen63930982021-03-24 10:04:33 -0400143 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200144)`}})
145}
146
147func TestCcLibraryTrimmedLdAndroid(t *testing.T) {
148 runCcLibraryTestCase(t, bp2buildTestCase{
149 description: "cc_library - trimmed example of //bionic/linker:ld-android",
150 moduleTypeUnderTest: "cc_library",
151 moduleTypeUnderTestFactory: cc.LibraryFactory,
152 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
153 filesystem: map[string]string{
154 "ld-android.cpp": "",
155 "linked_list.h": "",
156 "linker.h": "",
157 "linker_block_allocator.h": "",
158 "linker_cfi.h": "",
Jingwen Chen63930982021-03-24 10:04:33 -0400159 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200160 blueprint: soongCcLibraryPreamble + `
Jingwen Chen63930982021-03-24 10:04:33 -0400161cc_library_headers { name: "libc_headers" }
162cc_library {
163 name: "fake-ld-android",
164 srcs: ["ld_android.cpp"],
165 cflags: [
166 "-Wall",
167 "-Wextra",
168 "-Wunused",
169 "-Werror",
170 ],
171 header_libs: ["libc_headers"],
172 ldflags: [
173 "-Wl,--exclude-libs=libgcc.a",
174 "-Wl,--exclude-libs=libgcc_stripped.a",
175 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
176 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
177 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
178 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
179 ],
180 arch: {
181 x86: {
182 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
183 },
184 x86_64: {
185 ldflags: ["-Wl,--exclude-libs=libgcc_eh.a"],
186 },
187 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400188 include_build_directory: false,
Jingwen Chen63930982021-03-24 10:04:33 -0400189}
190`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200191 expectedBazelTargets: []string{`cc_library(
Jingwen Chen63930982021-03-24 10:04:33 -0400192 name = "fake-ld-android",
193 copts = [
194 "-Wall",
195 "-Wextra",
196 "-Wunused",
197 "-Werror",
198 ],
Chris Parsonsd6358772021-05-18 18:35:24 -0400199 implementation_deps = [":libc_headers"],
Jingwen Chen63930982021-03-24 10:04:33 -0400200 linkopts = [
201 "-Wl,--exclude-libs=libgcc.a",
202 "-Wl,--exclude-libs=libgcc_stripped.a",
203 "-Wl,--exclude-libs=libclang_rt.builtins-arm-android.a",
204 "-Wl,--exclude-libs=libclang_rt.builtins-aarch64-android.a",
205 "-Wl,--exclude-libs=libclang_rt.builtins-i686-android.a",
206 "-Wl,--exclude-libs=libclang_rt.builtins-x86_64-android.a",
207 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000208 "//build/bazel/platforms/arch:x86": ["-Wl,--exclude-libs=libgcc_eh.a"],
209 "//build/bazel/platforms/arch:x86_64": ["-Wl,--exclude-libs=libgcc_eh.a"],
Jingwen Chen63930982021-03-24 10:04:33 -0400210 "//conditions:default": [],
211 }),
Jingwen Chen882bcc12021-04-27 05:54:20 +0000212 srcs = ["ld_android.cpp"],
Jingwen Chen63930982021-03-24 10:04:33 -0400213)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200214 })
215}
216
217func TestCcLibraryExcludeSrcs(t *testing.T) {
218 runCcLibraryTestCase(t, bp2buildTestCase{
219 description: "cc_library exclude_srcs - trimmed example of //external/arm-optimized-routines:libarm-optimized-routines-math",
220 moduleTypeUnderTest: "cc_library",
221 moduleTypeUnderTestFactory: cc.LibraryFactory,
222 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
223 dir: "external",
224 filesystem: map[string]string{
225 "external/math/cosf.c": "",
226 "external/math/erf.c": "",
227 "external/math/erf_data.c": "",
228 "external/math/erff.c": "",
229 "external/math/erff_data.c": "",
230 "external/Android.bp": `
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000231cc_library {
232 name: "fake-libarm-optimized-routines-math",
233 exclude_srcs: [
234 // Provided by:
235 // bionic/libm/upstream-freebsd/lib/msun/src/s_erf.c
236 // bionic/libm/upstream-freebsd/lib/msun/src/s_erff.c
237 "math/erf.c",
238 "math/erf_data.c",
239 "math/erff.c",
240 "math/erff_data.c",
241 ],
242 srcs: [
243 "math/*.c",
244 ],
245 // arch-specific settings
246 arch: {
247 arm64: {
248 cflags: [
249 "-DHAVE_FAST_FMA=1",
250 ],
251 },
252 },
253 bazel_module: { bp2build_available: true },
254}
255`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200256 },
257 blueprint: soongCcLibraryPreamble,
258 expectedBazelTargets: []string{`cc_library(
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000259 name = "fake-libarm-optimized-routines-math",
Liz Kammer35687bc2021-09-10 10:07:07 -0400260 copts = select({
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000261 "//build/bazel/platforms/arch:arm64": ["-DHAVE_FAST_FMA=1"],
262 "//conditions:default": [],
263 }),
Liz Kammer35687bc2021-09-10 10:07:07 -0400264 local_includes = ["."],
Chris Parsons990c4f42021-05-25 12:10:58 -0400265 srcs_c = ["math/cosf.c"],
Jingwen Chen4ecc67d2021-04-27 09:47:02 +0000266)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200267 })
268}
269
270func TestCcLibrarySharedStaticProps(t *testing.T) {
271 runCcLibraryTestCase(t, bp2buildTestCase{
272 description: "cc_library shared/static props",
273 moduleTypeUnderTest: "cc_library",
274 moduleTypeUnderTestFactory: cc.LibraryFactory,
275 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200276 filesystem: map[string]string{
Liz Kammer8337ea42021-09-10 10:06:32 -0400277 "both.cpp": "",
278 "sharedonly.cpp": "",
279 "staticonly.cpp": "",
280 },
281 blueprint: soongCcLibraryPreamble + `
Jingwen Chen53681ef2021-04-29 08:15:13 +0000282cc_library {
283 name: "a",
Chris Parsons08648312021-05-06 16:23:19 -0400284 srcs: ["both.cpp"],
285 cflags: ["bothflag"],
286 shared_libs: ["shared_dep_for_both"],
287 static_libs: ["static_dep_for_both"],
288 whole_static_libs: ["whole_static_lib_for_both"],
289 static: {
290 srcs: ["staticonly.cpp"],
291 cflags: ["staticflag"],
292 shared_libs: ["shared_dep_for_static"],
293 static_libs: ["static_dep_for_static"],
294 whole_static_libs: ["whole_static_lib_for_static"],
295 },
296 shared: {
297 srcs: ["sharedonly.cpp"],
298 cflags: ["sharedflag"],
299 shared_libs: ["shared_dep_for_shared"],
300 static_libs: ["static_dep_for_shared"],
301 whole_static_libs: ["whole_static_lib_for_shared"],
302 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400303 include_build_directory: false,
Jingwen Chen53681ef2021-04-29 08:15:13 +0000304}
305
Liz Kammer8337ea42021-09-10 10:06:32 -0400306cc_library_static {
307 name: "static_dep_for_shared",
308 bazel_module: { bp2build_available: false },
309}
Chris Parsons08648312021-05-06 16:23:19 -0400310
Liz Kammer8337ea42021-09-10 10:06:32 -0400311cc_library_static {
312 name: "static_dep_for_static",
313 bazel_module: { bp2build_available: false },
314}
Chris Parsons08648312021-05-06 16:23:19 -0400315
Liz Kammer8337ea42021-09-10 10:06:32 -0400316cc_library_static {
317 name: "static_dep_for_both",
318 bazel_module: { bp2build_available: false },
319}
Chris Parsons08648312021-05-06 16:23:19 -0400320
Liz Kammer8337ea42021-09-10 10:06:32 -0400321cc_library_static {
322 name: "whole_static_lib_for_shared",
323 bazel_module: { bp2build_available: false },
324}
Chris Parsons08648312021-05-06 16:23:19 -0400325
Liz Kammer8337ea42021-09-10 10:06:32 -0400326cc_library_static {
327 name: "whole_static_lib_for_static",
328 bazel_module: { bp2build_available: false },
329}
Chris Parsons08648312021-05-06 16:23:19 -0400330
Liz Kammer8337ea42021-09-10 10:06:32 -0400331cc_library_static {
332 name: "whole_static_lib_for_both",
333 bazel_module: { bp2build_available: false },
334}
Chris Parsons08648312021-05-06 16:23:19 -0400335
Liz Kammer8337ea42021-09-10 10:06:32 -0400336cc_library {
337 name: "shared_dep_for_shared",
338 bazel_module: { bp2build_available: false },
339}
Chris Parsons08648312021-05-06 16:23:19 -0400340
Liz Kammer8337ea42021-09-10 10:06:32 -0400341cc_library {
342 name: "shared_dep_for_static",
343 bazel_module: { bp2build_available: false },
344}
Chris Parsons08648312021-05-06 16:23:19 -0400345
Liz Kammer8337ea42021-09-10 10:06:32 -0400346cc_library {
347 name: "shared_dep_for_both",
348 bazel_module: { bp2build_available: false },
349}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000350`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200351 expectedBazelTargets: []string{`cc_library(
Jingwen Chen53681ef2021-04-29 08:15:13 +0000352 name = "a",
Liz Kammer8337ea42021-09-10 10:06:32 -0400353 copts = ["bothflag"],
Chris Parsonsd6358772021-05-18 18:35:24 -0400354 implementation_deps = [":static_dep_for_both"],
Liz Kammer7a210ac2021-09-22 15:52:58 -0400355 implementation_dynamic_deps = [":shared_dep_for_both"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000356 shared = {
357 "copts": ["sharedflag"],
Liz Kammer7a210ac2021-09-22 15:52:58 -0400358 "implementation_deps": [":static_dep_for_shared"],
359 "implementation_dynamic_deps": [":shared_dep_for_shared"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000360 "srcs": ["sharedonly.cpp"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000361 "whole_archive_deps": [":whole_static_lib_for_shared"],
362 },
Chris Parsons08648312021-05-06 16:23:19 -0400363 srcs = ["both.cpp"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000364 static = {
365 "copts": ["staticflag"],
Liz Kammer7a210ac2021-09-22 15:52:58 -0400366 "implementation_deps": [":static_dep_for_static"],
367 "implementation_dynamic_deps": [":shared_dep_for_static"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000368 "srcs": ["staticonly.cpp"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000369 "whole_archive_deps": [":whole_static_lib_for_static"],
370 },
Chris Parsons08648312021-05-06 16:23:19 -0400371 whole_archive_deps = [":whole_static_lib_for_both"],
Jingwen Chen53681ef2021-04-29 08:15:13 +0000372)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200373 })
374}
375
Liz Kammer7a210ac2021-09-22 15:52:58 -0400376func TestCcLibraryDeps(t *testing.T) {
377 runCcLibraryTestCase(t, bp2buildTestCase{
378 description: "cc_library shared/static props",
379 moduleTypeUnderTest: "cc_library",
380 moduleTypeUnderTestFactory: cc.LibraryFactory,
381 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
382 filesystem: map[string]string{
383 "both.cpp": "",
384 "sharedonly.cpp": "",
385 "staticonly.cpp": "",
386 },
387 blueprint: soongCcLibraryPreamble + `
388cc_library {
389 name: "a",
390 srcs: ["both.cpp"],
391 cflags: ["bothflag"],
392 shared_libs: ["implementation_shared_dep_for_both", "shared_dep_for_both"],
393 export_shared_lib_headers: ["shared_dep_for_both"],
394 static_libs: ["implementation_static_dep_for_both", "static_dep_for_both"],
395 export_static_lib_headers: ["static_dep_for_both", "whole_static_dep_for_both"],
396 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_both", "whole_static_dep_for_both"],
397 static: {
398 srcs: ["staticonly.cpp"],
399 cflags: ["staticflag"],
400 shared_libs: ["implementation_shared_dep_for_static", "shared_dep_for_static"],
401 export_shared_lib_headers: ["shared_dep_for_static"],
402 static_libs: ["implementation_static_dep_for_static", "static_dep_for_static"],
403 export_static_lib_headers: ["static_dep_for_static", "whole_static_dep_for_static"],
404 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_static", "whole_static_dep_for_static"],
405 },
406 shared: {
407 srcs: ["sharedonly.cpp"],
408 cflags: ["sharedflag"],
409 shared_libs: ["implementation_shared_dep_for_shared", "shared_dep_for_shared"],
410 export_shared_lib_headers: ["shared_dep_for_shared"],
411 static_libs: ["implementation_static_dep_for_shared", "static_dep_for_shared"],
412 export_static_lib_headers: ["static_dep_for_shared", "whole_static_dep_for_shared"],
413 whole_static_libs: ["not_explicitly_exported_whole_static_dep_for_shared", "whole_static_dep_for_shared"],
414 },
415 include_build_directory: false,
416}
417` + simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_shared") +
418 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_shared") +
419 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_static") +
420 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_static") +
421 simpleModuleDoNotConvertBp2build("cc_library_static", "static_dep_for_both") +
422 simpleModuleDoNotConvertBp2build("cc_library_static", "implementation_static_dep_for_both") +
423 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_shared") +
424 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_shared") +
425 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_static") +
426 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_static") +
427 simpleModuleDoNotConvertBp2build("cc_library_static", "whole_static_dep_for_both") +
428 simpleModuleDoNotConvertBp2build("cc_library_static", "not_explicitly_exported_whole_static_dep_for_both") +
429 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_shared") +
430 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_shared") +
431 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_static") +
432 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_static") +
433 simpleModuleDoNotConvertBp2build("cc_library", "shared_dep_for_both") +
434 simpleModuleDoNotConvertBp2build("cc_library", "implementation_shared_dep_for_both"),
435 expectedBazelTargets: []string{`cc_library(
436 name = "a",
437 copts = ["bothflag"],
438 deps = [":static_dep_for_both"],
439 dynamic_deps = [":shared_dep_for_both"],
440 implementation_deps = [":implementation_static_dep_for_both"],
441 implementation_dynamic_deps = [":implementation_shared_dep_for_both"],
442 shared = {
443 "copts": ["sharedflag"],
444 "deps": [":static_dep_for_shared"],
445 "dynamic_deps": [":shared_dep_for_shared"],
446 "implementation_deps": [":implementation_static_dep_for_shared"],
447 "implementation_dynamic_deps": [":implementation_shared_dep_for_shared"],
448 "srcs": ["sharedonly.cpp"],
449 "whole_archive_deps": [
450 ":not_explicitly_exported_whole_static_dep_for_shared",
451 ":whole_static_dep_for_shared",
452 ],
453 },
454 srcs = ["both.cpp"],
455 static = {
456 "copts": ["staticflag"],
457 "deps": [":static_dep_for_static"],
458 "dynamic_deps": [":shared_dep_for_static"],
459 "implementation_deps": [":implementation_static_dep_for_static"],
460 "implementation_dynamic_deps": [":implementation_shared_dep_for_static"],
461 "srcs": ["staticonly.cpp"],
462 "whole_archive_deps": [
463 ":not_explicitly_exported_whole_static_dep_for_static",
464 ":whole_static_dep_for_static",
465 ],
466 },
467 whole_archive_deps = [
468 ":not_explicitly_exported_whole_static_dep_for_both",
469 ":whole_static_dep_for_both",
470 ],
471)`},
472 })
473}
474
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400475func TestCcLibraryWholeStaticLibsAlwaysLink(t *testing.T) {
476 runCcLibraryTestCase(t, bp2buildTestCase{
477 moduleTypeUnderTest: "cc_library",
478 moduleTypeUnderTestFactory: cc.LibraryFactory,
479 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400480 dir: "foo/bar",
481 filesystem: map[string]string{
482 "foo/bar/Android.bp": `
483cc_library {
484 name: "a",
485 whole_static_libs: ["whole_static_lib_for_both"],
486 static: {
487 whole_static_libs: ["whole_static_lib_for_static"],
488 },
489 shared: {
490 whole_static_libs: ["whole_static_lib_for_shared"],
491 },
492 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400493 include_build_directory: false,
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400494}
495
496cc_prebuilt_library_static { name: "whole_static_lib_for_shared" }
497
498cc_prebuilt_library_static { name: "whole_static_lib_for_static" }
499
500cc_prebuilt_library_static { name: "whole_static_lib_for_both" }
501`,
502 },
503 blueprint: soongCcLibraryPreamble,
504 expectedBazelTargets: []string{`cc_library(
505 name = "a",
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000506 shared = {
507 "whole_archive_deps": [":whole_static_lib_for_shared_alwayslink"],
508 },
509 static = {
510 "whole_archive_deps": [":whole_static_lib_for_static_alwayslink"],
511 },
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400512 whole_archive_deps = [":whole_static_lib_for_both_alwayslink"],
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400513)`},
514 })
515}
516
Jingwen Chenbcf53042021-05-26 04:42:42 +0000517func TestCcLibrarySharedStaticPropsInArch(t *testing.T) {
518 runCcLibraryTestCase(t, bp2buildTestCase{
519 description: "cc_library shared/static props in arch",
520 moduleTypeUnderTest: "cc_library",
521 moduleTypeUnderTestFactory: cc.LibraryFactory,
522 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Jingwen Chenbcf53042021-05-26 04:42:42 +0000523 dir: "foo/bar",
524 filesystem: map[string]string{
525 "foo/bar/arm.cpp": "",
526 "foo/bar/x86.cpp": "",
527 "foo/bar/sharedonly.cpp": "",
528 "foo/bar/staticonly.cpp": "",
529 "foo/bar/Android.bp": `
530cc_library {
531 name: "a",
532 arch: {
533 arm: {
534 shared: {
535 srcs: ["arm_shared.cpp"],
536 cflags: ["-DARM_SHARED"],
537 static_libs: ["arm_static_dep_for_shared"],
538 whole_static_libs: ["arm_whole_static_dep_for_shared"],
539 shared_libs: ["arm_shared_dep_for_shared"],
540 },
541 },
542 x86: {
543 static: {
544 srcs: ["x86_static.cpp"],
545 cflags: ["-DX86_STATIC"],
546 static_libs: ["x86_dep_for_static"],
547 },
548 },
549 },
550 target: {
551 android: {
552 shared: {
553 srcs: ["android_shared.cpp"],
554 cflags: ["-DANDROID_SHARED"],
555 static_libs: ["android_dep_for_shared"],
556 },
557 },
558 android_arm: {
559 shared: {
560 cflags: ["-DANDROID_ARM_SHARED"],
561 },
562 },
563 },
564 srcs: ["both.cpp"],
565 cflags: ["bothflag"],
566 static_libs: ["static_dep_for_both"],
567 static: {
568 srcs: ["staticonly.cpp"],
569 cflags: ["staticflag"],
570 static_libs: ["static_dep_for_static"],
571 },
572 shared: {
573 srcs: ["sharedonly.cpp"],
574 cflags: ["sharedflag"],
575 static_libs: ["static_dep_for_shared"],
576 },
577 bazel_module: { bp2build_available: true },
578}
579
580cc_library_static { name: "static_dep_for_shared" }
581cc_library_static { name: "static_dep_for_static" }
582cc_library_static { name: "static_dep_for_both" }
583
584cc_library_static { name: "arm_static_dep_for_shared" }
585cc_library_static { name: "arm_whole_static_dep_for_shared" }
586cc_library_static { name: "arm_shared_dep_for_shared" }
587
588cc_library_static { name: "x86_dep_for_static" }
589
590cc_library_static { name: "android_dep_for_shared" }
591`,
592 },
593 blueprint: soongCcLibraryPreamble,
594 expectedBazelTargets: []string{`cc_library(
595 name = "a",
Liz Kammer35687bc2021-09-10 10:07:07 -0400596 copts = ["bothflag"],
Jingwen Chenbcf53042021-05-26 04:42:42 +0000597 implementation_deps = [":static_dep_for_both"],
Liz Kammer35687bc2021-09-10 10:07:07 -0400598 local_includes = ["."],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000599 shared = {
600 "copts": ["sharedflag"] + select({
601 "//build/bazel/platforms/arch:arm": ["-DARM_SHARED"],
602 "//conditions:default": [],
603 }) + select({
604 "//build/bazel/platforms/os:android": ["-DANDROID_SHARED"],
605 "//conditions:default": [],
606 }) + select({
607 "//build/bazel/platforms/os_arch:android_arm": ["-DANDROID_ARM_SHARED"],
608 "//conditions:default": [],
609 }),
Liz Kammer7a210ac2021-09-22 15:52:58 -0400610 "implementation_deps": [":static_dep_for_shared"] + select({
611 "//build/bazel/platforms/arch:arm": [":arm_static_dep_for_shared"],
612 "//conditions:default": [],
613 }) + select({
614 "//build/bazel/platforms/os:android": [":android_dep_for_shared"],
615 "//conditions:default": [],
616 }),
617 "implementation_dynamic_deps": select({
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000618 "//build/bazel/platforms/arch:arm": [":arm_shared_dep_for_shared"],
619 "//conditions:default": [],
620 }),
621 "srcs": ["sharedonly.cpp"] + select({
622 "//build/bazel/platforms/arch:arm": ["arm_shared.cpp"],
623 "//conditions:default": [],
624 }) + select({
625 "//build/bazel/platforms/os:android": ["android_shared.cpp"],
626 "//conditions:default": [],
627 }),
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000628 "whole_archive_deps": select({
629 "//build/bazel/platforms/arch:arm": [":arm_whole_static_dep_for_shared"],
630 "//conditions:default": [],
631 }),
632 },
Jingwen Chenbcf53042021-05-26 04:42:42 +0000633 srcs = ["both.cpp"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000634 static = {
635 "copts": ["staticflag"] + select({
636 "//build/bazel/platforms/arch:x86": ["-DX86_STATIC"],
637 "//conditions:default": [],
638 }),
Liz Kammer7a210ac2021-09-22 15:52:58 -0400639 "implementation_deps": [":static_dep_for_static"] + select({
640 "//build/bazel/platforms/arch:x86": [":x86_dep_for_static"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000641 "//conditions:default": [],
642 }),
Liz Kammer7a210ac2021-09-22 15:52:58 -0400643 "srcs": ["staticonly.cpp"] + select({
644 "//build/bazel/platforms/arch:x86": ["x86_static.cpp"],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000645 "//conditions:default": [],
646 }),
647 },
Jingwen Chenbcf53042021-05-26 04:42:42 +0000648)`},
649 })
650}
651
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000652func TestCcLibrarySharedStaticPropsWithMixedSources(t *testing.T) {
653 runCcLibraryTestCase(t, bp2buildTestCase{
654 description: "cc_library shared/static props with c/cpp/s mixed sources",
655 moduleTypeUnderTest: "cc_library",
656 moduleTypeUnderTestFactory: cc.LibraryFactory,
657 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000658 dir: "foo/bar",
659 filesystem: map[string]string{
660 "foo/bar/both_source.cpp": "",
661 "foo/bar/both_source.cc": "",
662 "foo/bar/both_source.c": "",
663 "foo/bar/both_source.s": "",
664 "foo/bar/both_source.S": "",
665 "foo/bar/shared_source.cpp": "",
666 "foo/bar/shared_source.cc": "",
667 "foo/bar/shared_source.c": "",
668 "foo/bar/shared_source.s": "",
669 "foo/bar/shared_source.S": "",
670 "foo/bar/static_source.cpp": "",
671 "foo/bar/static_source.cc": "",
672 "foo/bar/static_source.c": "",
673 "foo/bar/static_source.s": "",
674 "foo/bar/static_source.S": "",
675 "foo/bar/Android.bp": `
676cc_library {
677 name: "a",
678 srcs: [
Liz Kammerd366c902021-06-03 13:43:01 -0400679 "both_source.cpp",
680 "both_source.cc",
681 "both_source.c",
682 "both_source.s",
683 "both_source.S",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400684 ":both_filegroup",
Liz Kammerd366c902021-06-03 13:43:01 -0400685 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000686 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400687 srcs: [
688 "static_source.cpp",
689 "static_source.cc",
690 "static_source.c",
691 "static_source.s",
692 "static_source.S",
693 ":static_filegroup",
694 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000695 },
696 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400697 srcs: [
698 "shared_source.cpp",
699 "shared_source.cc",
700 "shared_source.c",
701 "shared_source.s",
702 "shared_source.S",
703 ":shared_filegroup",
704 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000705 },
706 bazel_module: { bp2build_available: true },
707}
708
709filegroup {
710 name: "both_filegroup",
711 srcs: [
712 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400713 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000714}
715
716filegroup {
717 name: "shared_filegroup",
718 srcs: [
719 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400720 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000721}
722
723filegroup {
724 name: "static_filegroup",
725 srcs: [
726 // Not relevant, handled by filegroup macro
Liz Kammerd366c902021-06-03 13:43:01 -0400727 ],
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000728}
729`,
730 },
731 blueprint: soongCcLibraryPreamble,
732 expectedBazelTargets: []string{`cc_library(
733 name = "a",
Liz Kammer35687bc2021-09-10 10:07:07 -0400734 local_includes = ["."],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000735 shared = {
736 "srcs": [
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000737 "shared_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400738 "shared_source.cc",
739 ":shared_filegroup_cpp_srcs",
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000740 ],
741 "srcs_as": [
742 "shared_source.s",
743 "shared_source.S",
744 ":shared_filegroup_as_srcs",
745 ],
746 "srcs_c": [
747 "shared_source.c",
748 ":shared_filegroup_c_srcs",
749 ],
750 },
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000751 srcs = [
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000752 "both_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400753 "both_source.cc",
754 ":both_filegroup_cpp_srcs",
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000755 ],
756 srcs_as = [
757 "both_source.s",
758 "both_source.S",
759 ":both_filegroup_as_srcs",
760 ],
761 srcs_c = [
762 "both_source.c",
763 ":both_filegroup_c_srcs",
764 ],
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000765 static = {
766 "srcs": [
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000767 "static_source.cpp",
Liz Kammer57e2e7a2021-09-20 12:55:02 -0400768 "static_source.cc",
769 ":static_filegroup_cpp_srcs",
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000770 ],
771 "srcs_as": [
772 "static_source.s",
773 "static_source.S",
774 ":static_filegroup_as_srcs",
775 ],
776 "srcs_c": [
777 "static_source.c",
778 ":static_filegroup_c_srcs",
779 ],
780 },
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000781)`},
782 })
783}
784
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200785func TestCcLibraryNonConfiguredVersionScript(t *testing.T) {
786 runCcLibraryTestCase(t, bp2buildTestCase{
787 description: "cc_library non-configured version script",
788 moduleTypeUnderTest: "cc_library",
789 moduleTypeUnderTestFactory: cc.LibraryFactory,
790 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200791 dir: "foo/bar",
792 filesystem: map[string]string{
793 "foo/bar/Android.bp": `
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200794cc_library {
795 name: "a",
796 srcs: ["a.cpp"],
797 version_script: "v.map",
798 bazel_module: { bp2build_available: true },
Liz Kammer8337ea42021-09-10 10:06:32 -0400799 include_build_directory: false,
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200800}
801`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200802 },
803 blueprint: soongCcLibraryPreamble,
804 expectedBazelTargets: []string{`cc_library(
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200805 name = "a",
Liz Kammerd2871182021-10-04 13:54:37 -0400806 additional_linker_inputs = ["v.map"],
807 linkopts = ["-Wl,--version-script,$(location v.map)"],
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200808 srcs = ["a.cpp"],
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200809)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200810 })
811}
812
813func TestCcLibraryConfiguredVersionScript(t *testing.T) {
814 runCcLibraryTestCase(t, bp2buildTestCase{
815 description: "cc_library configured version script",
816 moduleTypeUnderTest: "cc_library",
817 moduleTypeUnderTestFactory: cc.LibraryFactory,
818 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200819 dir: "foo/bar",
820 filesystem: map[string]string{
821 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400822cc_library {
823 name: "a",
824 srcs: ["a.cpp"],
825 arch: {
826 arm: {
827 version_script: "arm.map",
828 },
829 arm64: {
830 version_script: "arm64.map",
831 },
832 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200833
Liz Kammer8337ea42021-09-10 10:06:32 -0400834 bazel_module: { bp2build_available: true },
835 include_build_directory: false,
836}
Liz Kammerd366c902021-06-03 13:43:01 -0400837 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200838 },
839 blueprint: soongCcLibraryPreamble,
840 expectedBazelTargets: []string{`cc_library(
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200841 name = "a",
Liz Kammerd2871182021-10-04 13:54:37 -0400842 additional_linker_inputs = select({
843 "//build/bazel/platforms/arch:arm": ["arm.map"],
844 "//build/bazel/platforms/arch:arm64": ["arm64.map"],
845 "//conditions:default": [],
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200846 }),
Liz Kammerd2871182021-10-04 13:54:37 -0400847 linkopts = select({
848 "//build/bazel/platforms/arch:arm": ["-Wl,--version-script,$(location arm.map)"],
849 "//build/bazel/platforms/arch:arm64": ["-Wl,--version-script,$(location arm64.map)"],
850 "//conditions:default": [],
851 }),
852 srcs = ["a.cpp"],
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200853)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200854 })
855}
856
857func TestCcLibrarySharedLibs(t *testing.T) {
858 runCcLibraryTestCase(t, bp2buildTestCase{
859 description: "cc_library shared_libs",
860 moduleTypeUnderTest: "cc_library",
861 moduleTypeUnderTestFactory: cc.LibraryFactory,
862 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400863 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400864cc_library {
865 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400866 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400867}
868
869cc_library {
870 name: "a",
871 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400872 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400873}
874`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200875 expectedBazelTargets: []string{`cc_library(
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400876 name = "a",
Liz Kammer7a210ac2021-09-22 15:52:58 -0400877 implementation_dynamic_deps = [":mylib"],
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400878)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200879 })
880}
881
Liz Kammer0eae52e2021-10-06 10:32:26 -0400882func TestCcLibraryFeatures(t *testing.T) {
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200883 runCcLibraryTestCase(t, bp2buildTestCase{
884 description: "cc_library pack_relocations test",
885 moduleTypeUnderTest: "cc_library",
886 moduleTypeUnderTestFactory: cc.LibraryFactory,
887 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400888 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400889cc_library {
890 name: "a",
891 srcs: ["a.cpp"],
892 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400893 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400894 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400895}
896
897cc_library {
898 name: "b",
899 srcs: ["b.cpp"],
900 arch: {
901 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400902 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400903 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400904 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400905 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400906 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400907}
908
909cc_library {
910 name: "c",
911 srcs: ["c.cpp"],
912 target: {
913 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400914 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400915 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400916 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400917 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400918 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400919}`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200920 expectedBazelTargets: []string{`cc_library(
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400921 name = "a",
Liz Kammer0eae52e2021-10-06 10:32:26 -0400922 features = [
923 "disable_pack_relocations",
924 "-no_undefined_symbols",
925 ],
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400926 srcs = ["a.cpp"],
927)`, `cc_library(
928 name = "b",
Liz Kammer0eae52e2021-10-06 10:32:26 -0400929 features = select({
930 "//build/bazel/platforms/arch:x86_64": [
931 "disable_pack_relocations",
932 "-no_undefined_symbols",
933 ],
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400934 "//conditions:default": [],
935 }),
936 srcs = ["b.cpp"],
937)`, `cc_library(
938 name = "c",
Liz Kammer0eae52e2021-10-06 10:32:26 -0400939 features = select({
940 "//build/bazel/platforms/os:darwin": [
941 "disable_pack_relocations",
942 "-no_undefined_symbols",
943 ],
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400944 "//conditions:default": [],
945 }),
946 srcs = ["c.cpp"],
947)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200948 })
949}
950
951func TestCcLibrarySpacesInCopts(t *testing.T) {
952 runCcLibraryTestCase(t, bp2buildTestCase{
953 description: "cc_library spaces in copts",
954 moduleTypeUnderTest: "cc_library",
955 moduleTypeUnderTestFactory: cc.LibraryFactory,
956 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400957 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +0000958cc_library {
959 name: "a",
960 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400961 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +0000962}
963`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200964 expectedBazelTargets: []string{`cc_library(
Jingwen Chen3950cd62021-05-12 04:33:00 +0000965 name = "a",
966 copts = [
967 "-include",
968 "header.h",
Jingwen Chen3950cd62021-05-12 04:33:00 +0000969 ],
970)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200971 })
972}
973
974func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
975 runCcLibraryTestCase(t, bp2buildTestCase{
Chris Parsons990c4f42021-05-25 12:10:58 -0400976 description: "cc_library cppflags usage",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200977 moduleTypeUnderTest: "cc_library",
978 moduleTypeUnderTestFactory: cc.LibraryFactory,
979 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400980 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000981 name: "a",
982 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400983 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000984 cppflags: [
985 "-fsigned-char",
986 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -0400987 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000988 arch: {
989 arm64: {
990 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400991 },
Liz Kammerd366c902021-06-03 13:43:01 -0400992 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000993 target: {
994 android: {
995 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400996 },
Liz Kammerd366c902021-06-03 13:43:01 -0400997 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400998 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000999}
1000`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001001 expectedBazelTargets: []string{`cc_library(
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001002 name = "a",
Liz Kammer8337ea42021-09-10 10:06:32 -04001003 copts = ["-Wall"],
Chris Parsons990c4f42021-05-25 12:10:58 -04001004 cppflags = [
1005 "-fsigned-char",
1006 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001007 ] + select({
1008 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1009 "//conditions:default": [],
1010 }) + select({
1011 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1012 "//conditions:default": [],
1013 }),
1014 srcs = ["a.cpp"],
1015)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001016 })
Jingwen Chen63930982021-03-24 10:04:33 -04001017}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001018
Liz Kammer47535c52021-06-02 16:02:22 -04001019func TestCcLibraryExcludeLibs(t *testing.T) {
1020 runCcLibraryTestCase(t, bp2buildTestCase{
1021 moduleTypeUnderTest: "cc_library",
1022 moduleTypeUnderTestFactory: cc.LibraryFactory,
1023 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer47535c52021-06-02 16:02:22 -04001024 filesystem: map[string]string{},
1025 blueprint: soongCcLibraryStaticPreamble + `
1026cc_library {
1027 name: "foo_static",
1028 srcs: ["common.c"],
1029 whole_static_libs: [
1030 "arm_whole_static_lib_excludes",
1031 "malloc_not_svelte_whole_static_lib_excludes"
1032 ],
1033 static_libs: [
1034 "arm_static_lib_excludes",
1035 "malloc_not_svelte_static_lib_excludes"
1036 ],
1037 shared_libs: [
1038 "arm_shared_lib_excludes",
1039 ],
1040 arch: {
1041 arm: {
1042 exclude_shared_libs: [
1043 "arm_shared_lib_excludes",
1044 ],
1045 exclude_static_libs: [
1046 "arm_static_lib_excludes",
1047 "arm_whole_static_lib_excludes",
1048 ],
1049 },
1050 },
1051 product_variables: {
1052 malloc_not_svelte: {
1053 shared_libs: ["malloc_not_svelte_shared_lib"],
1054 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1055 exclude_static_libs: [
1056 "malloc_not_svelte_static_lib_excludes",
1057 "malloc_not_svelte_whole_static_lib_excludes",
1058 ],
1059 },
1060 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001061 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001062}
1063
1064cc_library {
1065 name: "arm_whole_static_lib_excludes",
1066 bazel_module: { bp2build_available: false },
1067}
1068
1069cc_library {
1070 name: "malloc_not_svelte_whole_static_lib",
1071 bazel_module: { bp2build_available: false },
1072}
1073
1074cc_library {
1075 name: "malloc_not_svelte_whole_static_lib_excludes",
1076 bazel_module: { bp2build_available: false },
1077}
1078
1079cc_library {
1080 name: "arm_static_lib_excludes",
1081 bazel_module: { bp2build_available: false },
1082}
1083
1084cc_library {
1085 name: "malloc_not_svelte_static_lib_excludes",
1086 bazel_module: { bp2build_available: false },
1087}
1088
1089cc_library {
1090 name: "arm_shared_lib_excludes",
1091 bazel_module: { bp2build_available: false },
1092}
1093
1094cc_library {
1095 name: "malloc_not_svelte_shared_lib",
1096 bazel_module: { bp2build_available: false },
1097}
1098`,
1099 expectedBazelTargets: []string{
1100 `cc_library(
1101 name = "foo_static",
Liz Kammer47535c52021-06-02 16:02:22 -04001102 implementation_deps = select({
1103 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001104 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001105 }) + select({
1106 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001107 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001108 }),
Liz Kammer7a210ac2021-09-22 15:52:58 -04001109 implementation_dynamic_deps = select({
1110 "//build/bazel/platforms/arch:arm": [],
1111 "//conditions:default": [":arm_shared_lib_excludes"],
1112 }) + select({
1113 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1114 "//conditions:default": [],
1115 }),
Liz Kammer47535c52021-06-02 16:02:22 -04001116 srcs_c = ["common.c"],
1117 whole_archive_deps = select({
1118 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001119 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001120 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001121 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1122 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001123 }),
1124)`,
1125 },
1126 })
1127}
Liz Kammerd366c902021-06-03 13:43:01 -04001128
1129func TestCCLibraryNoCrtTrue(t *testing.T) {
1130 runCcLibraryTestCase(t, bp2buildTestCase{
Jingwen Chen6ada5892021-09-17 11:38:09 +00001131 description: "cc_library - nocrt: true emits attribute",
1132 moduleTypeUnderTest: "cc_library",
1133 moduleTypeUnderTestFactory: cc.LibraryFactory,
1134 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1135 filesystem: map[string]string{
1136 "impl.cpp": "",
1137 },
1138 blueprint: soongCcLibraryPreamble + `
1139cc_library {
1140 name: "foo-lib",
1141 srcs: ["impl.cpp"],
1142 nocrt: true,
1143 include_build_directory: false,
1144}
1145`,
1146 expectedBazelTargets: []string{`cc_library(
1147 name = "foo-lib",
1148 link_crt = False,
1149 srcs = ["impl.cpp"],
1150)`}})
1151}
1152
1153func TestCCLibraryNoCrtFalse(t *testing.T) {
1154 runCcLibraryTestCase(t, bp2buildTestCase{
1155 description: "cc_library - nocrt: false - does not emit attribute",
1156 moduleTypeUnderTest: "cc_library",
1157 moduleTypeUnderTestFactory: cc.LibraryFactory,
1158 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1159 filesystem: map[string]string{
1160 "impl.cpp": "",
1161 },
1162 blueprint: soongCcLibraryPreamble + `
1163cc_library {
1164 name: "foo-lib",
1165 srcs: ["impl.cpp"],
1166 nocrt: false,
1167 include_build_directory: false,
1168}
1169`,
1170 expectedBazelTargets: []string{`cc_library(
1171 name = "foo-lib",
1172 srcs = ["impl.cpp"],
1173)`}})
1174}
1175
1176func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1177 runCcLibraryTestCase(t, bp2buildTestCase{
1178 description: "cc_library - nocrt in select",
1179 moduleTypeUnderTest: "cc_library",
1180 moduleTypeUnderTestFactory: cc.LibraryFactory,
1181 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1182 filesystem: map[string]string{
1183 "impl.cpp": "",
1184 },
1185 blueprint: soongCcLibraryPreamble + `
1186cc_library {
1187 name: "foo-lib",
1188 srcs: ["impl.cpp"],
1189 arch: {
1190 arm: {
1191 nocrt: true,
1192 },
1193 x86: {
1194 nocrt: false,
1195 },
1196 },
1197 include_build_directory: false,
1198}
1199`,
1200 expectedErr: fmt.Errorf("Android.bp:16:1: module \"foo-lib\": nocrt is not supported for arch variants"),
1201 })
1202}
1203
1204func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1205 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerd366c902021-06-03 13:43:01 -04001206 description: "cc_library - simple example",
1207 moduleTypeUnderTest: "cc_library",
1208 moduleTypeUnderTestFactory: cc.LibraryFactory,
1209 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1210 filesystem: map[string]string{
1211 "impl.cpp": "",
1212 },
1213 blueprint: soongCcLibraryPreamble + `
1214cc_library_headers { name: "some-headers" }
1215cc_library {
1216 name: "foo-lib",
1217 srcs: ["impl.cpp"],
1218 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001219 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001220}
1221`,
1222 expectedBazelTargets: []string{`cc_library(
1223 name = "foo-lib",
Liz Kammerd366c902021-06-03 13:43:01 -04001224 srcs = ["impl.cpp"],
1225 use_libcrt = False,
1226)`}})
1227}
1228
Jingwen Chen6ada5892021-09-17 11:38:09 +00001229func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001230 runCcLibraryTestCase(t, bp2buildTestCase{
1231 moduleTypeUnderTest: "cc_library",
1232 moduleTypeUnderTestFactory: cc.LibraryFactory,
1233 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1234 filesystem: map[string]string{
1235 "impl.cpp": "",
1236 },
1237 blueprint: soongCcLibraryPreamble + `
1238cc_library_headers { name: "some-headers" }
1239cc_library {
1240 name: "foo-lib",
1241 srcs: ["impl.cpp"],
1242 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001243 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001244}
1245`,
1246 expectedBazelTargets: []string{`cc_library(
1247 name = "foo-lib",
Liz Kammerd366c902021-06-03 13:43:01 -04001248 srcs = ["impl.cpp"],
1249 use_libcrt = True,
1250)`}})
1251}
1252
Jingwen Chen6ada5892021-09-17 11:38:09 +00001253func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001254 runCcLibraryTestCase(t, bp2buildTestCase{
1255 moduleTypeUnderTest: "cc_library",
1256 moduleTypeUnderTestFactory: cc.LibraryFactory,
1257 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1258 filesystem: map[string]string{
1259 "impl.cpp": "",
1260 },
1261 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001262cc_library {
1263 name: "foo-lib",
1264 srcs: ["impl.cpp"],
1265 arch: {
1266 arm: {
1267 no_libcrt: true,
1268 },
1269 x86: {
1270 no_libcrt: true,
1271 },
1272 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001273 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001274}
1275`,
1276 expectedBazelTargets: []string{`cc_library(
1277 name = "foo-lib",
Liz Kammerd366c902021-06-03 13:43:01 -04001278 srcs = ["impl.cpp"],
1279 use_libcrt = select({
1280 "//build/bazel/platforms/arch:arm": False,
1281 "//build/bazel/platforms/arch:x86": False,
1282 "//conditions:default": None,
1283 }),
1284)`}})
1285}
1286
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001287func TestCcLibraryStrip(t *testing.T) {
1288 runCcLibraryTestCase(t, bp2buildTestCase{
1289 description: "cc_library strip args",
1290 moduleTypeUnderTest: "cc_library",
1291 moduleTypeUnderTestFactory: cc.LibraryFactory,
1292 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -04001293 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001294cc_library {
1295 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001296 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001297}
1298cc_library {
1299 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001300 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001301 keep_symbols: true,
1302 },
1303 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001304}
1305cc_library {
1306 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001307 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001308 keep_symbols_and_debug_frame: true,
1309 },
1310 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001311}
1312cc_library {
1313 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001314 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001315 none: true,
1316 },
1317 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001318}
1319cc_library {
1320 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001321 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001322 keep_symbols_list: ["symbol"],
1323 },
1324 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001325}
1326cc_library {
1327 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001328 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001329 all: true,
1330 },
1331 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001332}
1333`,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001334 expectedBazelTargets: []string{`cc_library(
1335 name = "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001336 strip = {
1337 "all": True,
1338 },
1339)`, `cc_library(
1340 name = "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001341 strip = {
1342 "keep_symbols": True,
1343 },
1344)`, `cc_library(
1345 name = "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001346 strip = {
1347 "keep_symbols_and_debug_frame": True,
1348 },
1349)`, `cc_library(
1350 name = "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001351 strip = {
1352 "keep_symbols_list": ["symbol"],
1353 },
1354)`, `cc_library(
1355 name = "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001356 strip = {
1357 "none": True,
1358 },
1359)`, `cc_library(
1360 name = "nothing",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001361)`},
1362 })
1363}
1364
1365func TestCcLibraryStripWithArch(t *testing.T) {
1366 runCcLibraryTestCase(t, bp2buildTestCase{
1367 description: "cc_library strip args",
1368 moduleTypeUnderTest: "cc_library",
1369 moduleTypeUnderTestFactory: cc.LibraryFactory,
1370 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -04001371 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001372cc_library {
1373 name: "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001374 target: {
1375 darwin: {
1376 strip: {
1377 keep_symbols_list: ["foo", "bar"]
1378 }
1379 },
1380 },
1381 arch: {
1382 arm: {
1383 strip: {
1384 keep_symbols_and_debug_frame: true,
1385 },
1386 },
1387 arm64: {
1388 strip: {
1389 keep_symbols: true,
1390 },
1391 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001392 },
1393 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001394}
1395`,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001396 expectedBazelTargets: []string{`cc_library(
1397 name = "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001398 strip = {
1399 "keep_symbols": select({
1400 "//build/bazel/platforms/arch:arm64": True,
1401 "//conditions:default": None,
1402 }),
1403 "keep_symbols_and_debug_frame": select({
1404 "//build/bazel/platforms/arch:arm": True,
1405 "//conditions:default": None,
1406 }),
1407 "keep_symbols_list": select({
1408 "//build/bazel/platforms/os:darwin": [
1409 "foo",
1410 "bar",
1411 ],
1412 "//conditions:default": [],
1413 }),
1414 },
1415)`},
1416 })
1417}
Chris Parsons51f8c392021-08-03 21:01:05 -04001418
1419func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1420 runCcLibraryTestCase(t, bp2buildTestCase{
1421 description: "cc_library system_shared_libs empty at root",
1422 moduleTypeUnderTest: "cc_library",
1423 moduleTypeUnderTestFactory: cc.LibraryFactory,
1424 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1425 blueprint: soongCcLibraryPreamble + `
1426cc_library {
1427 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001428 system_shared_libs: [],
1429 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001430}
1431`,
1432 expectedBazelTargets: []string{`cc_library(
1433 name = "root_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001434 system_dynamic_deps = [],
1435)`},
1436 })
1437}
1438
1439func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1440 runCcLibraryTestCase(t, bp2buildTestCase{
1441 description: "cc_library system_shared_libs empty for static variant",
1442 moduleTypeUnderTest: "cc_library",
1443 moduleTypeUnderTestFactory: cc.LibraryFactory,
1444 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1445 blueprint: soongCcLibraryPreamble + `
1446cc_library {
1447 name: "static_empty",
1448 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001449 system_shared_libs: [],
1450 },
1451 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001452}
1453`,
1454 expectedBazelTargets: []string{`cc_library(
1455 name = "static_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001456 static = {
1457 "system_dynamic_deps": [],
1458 },
1459)`},
1460 })
1461}
1462
1463func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1464 runCcLibraryTestCase(t, bp2buildTestCase{
1465 description: "cc_library system_shared_libs empty for shared variant",
1466 moduleTypeUnderTest: "cc_library",
1467 moduleTypeUnderTestFactory: cc.LibraryFactory,
1468 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1469 blueprint: soongCcLibraryPreamble + `
1470cc_library {
1471 name: "shared_empty",
1472 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001473 system_shared_libs: [],
1474 },
1475 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001476}
1477`,
1478 expectedBazelTargets: []string{`cc_library(
1479 name = "shared_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001480 shared = {
1481 "system_dynamic_deps": [],
1482 },
1483)`},
1484 })
1485}
1486
1487func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1488 runCcLibraryTestCase(t, bp2buildTestCase{
1489 description: "cc_library system_shared_libs empty for shared, bionic variant",
1490 moduleTypeUnderTest: "cc_library",
1491 moduleTypeUnderTestFactory: cc.LibraryFactory,
1492 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1493 blueprint: soongCcLibraryPreamble + `
1494cc_library {
1495 name: "shared_empty",
1496 target: {
1497 bionic: {
1498 shared: {
1499 system_shared_libs: [],
1500 }
1501 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001502 },
1503 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001504}
1505`,
1506 expectedBazelTargets: []string{`cc_library(
1507 name = "shared_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001508 shared = {
1509 "system_dynamic_deps": [],
1510 },
1511)`},
1512 })
1513}
1514
1515func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1516 // Note that this behavior is technically incorrect (it's a simplification).
1517 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1518 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1519 // b/195791252 tracks the fix.
1520 runCcLibraryTestCase(t, bp2buildTestCase{
1521 description: "cc_library system_shared_libs empty for linux_bionic variant",
1522 moduleTypeUnderTest: "cc_library",
1523 moduleTypeUnderTestFactory: cc.LibraryFactory,
1524 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1525 blueprint: soongCcLibraryPreamble + `
1526cc_library {
1527 name: "target_linux_bionic_empty",
1528 target: {
1529 linux_bionic: {
1530 system_shared_libs: [],
1531 },
1532 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001533 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001534}
1535`,
1536 expectedBazelTargets: []string{`cc_library(
1537 name = "target_linux_bionic_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001538 system_dynamic_deps = [],
1539)`},
1540 })
1541}
1542
1543func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1544 runCcLibraryTestCase(t, bp2buildTestCase{
1545 description: "cc_library system_shared_libs empty for bionic variant",
1546 moduleTypeUnderTest: "cc_library",
1547 moduleTypeUnderTestFactory: cc.LibraryFactory,
1548 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1549 blueprint: soongCcLibraryPreamble + `
1550cc_library {
1551 name: "target_bionic_empty",
1552 target: {
1553 bionic: {
1554 system_shared_libs: [],
1555 },
1556 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001557 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001558}
1559`,
1560 expectedBazelTargets: []string{`cc_library(
1561 name = "target_bionic_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001562 system_dynamic_deps = [],
1563)`},
1564 })
1565}
1566
1567func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1568 runCcLibraryTestCase(t, bp2buildTestCase{
1569 description: "cc_library system_shared_libs set for shared and root",
1570 moduleTypeUnderTest: "cc_library",
1571 moduleTypeUnderTestFactory: cc.LibraryFactory,
1572 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1573 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001574cc_library {
1575 name: "libc",
1576 bazel_module: { bp2build_available: false },
1577}
1578cc_library {
1579 name: "libm",
1580 bazel_module: { bp2build_available: false },
1581}
Chris Parsons51f8c392021-08-03 21:01:05 -04001582
1583cc_library {
1584 name: "foo",
1585 system_shared_libs: ["libc"],
1586 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001587 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001588 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001589 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001590}
1591`,
1592 expectedBazelTargets: []string{`cc_library(
1593 name = "foo",
Chris Parsons51f8c392021-08-03 21:01:05 -04001594 shared = {
1595 "system_dynamic_deps": [":libm"],
1596 },
1597 system_dynamic_deps = [":libc"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001598)`},
1599 })
1600}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001601
1602func TestCcLibraryOsSelects(t *testing.T) {
1603 runCcLibraryTestCase(t, bp2buildTestCase{
1604 description: "cc_library - selects for all os targets",
1605 moduleTypeUnderTest: "cc_library",
1606 moduleTypeUnderTestFactory: cc.LibraryFactory,
1607 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1608 filesystem: map[string]string{},
1609 blueprint: soongCcLibraryPreamble + `
1610cc_library_headers { name: "some-headers" }
1611cc_library {
1612 name: "foo-lib",
1613 srcs: ["base.cpp"],
1614 target: {
1615 android: {
1616 srcs: ["android.cpp"],
1617 },
1618 linux: {
1619 srcs: ["linux.cpp"],
1620 },
1621 linux_glibc: {
1622 srcs: ["linux_glibc.cpp"],
1623 },
1624 darwin: {
1625 srcs: ["darwin.cpp"],
1626 },
1627 bionic: {
1628 srcs: ["bionic.cpp"],
1629 },
1630 linux_musl: {
1631 srcs: ["linux_musl.cpp"],
1632 },
1633 windows: {
1634 srcs: ["windows.cpp"],
1635 },
1636 },
1637 include_build_directory: false,
1638}
1639`,
1640 expectedBazelTargets: []string{`cc_library(
1641 name = "foo-lib",
1642 srcs = ["base.cpp"] + select({
1643 "//build/bazel/platforms/os:android": [
1644 "android.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001645 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001646 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001647 ],
1648 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1649 "//build/bazel/platforms/os:linux": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001650 "linux_glibc.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001651 "linux.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001652 ],
1653 "//build/bazel/platforms/os:linux_bionic": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001654 "linux.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001655 "bionic.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001656 ],
1657 "//build/bazel/platforms/os:linux_musl": [
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001658 "linux_musl.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -04001659 "linux.cpp",
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001660 ],
1661 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1662 "//conditions:default": [],
1663 }),
1664)`}})
Jingwen Chen97b85312021-10-08 10:41:31 +00001665
1666}
1667
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001668func TestCcLibraryCppStdWithGnuExtensions_ConvertsToFeatureAttr(t *testing.T) {
Jingwen Chen97b85312021-10-08 10:41:31 +00001669 type testCase struct {
1670 cpp_std string
1671 gnu_extensions string
1672 bazel_cpp_std string
1673 }
1674
1675 testCases := []testCase{
1676 // Existing usages of cpp_std in AOSP are:
1677 // experimental, c++11, c++17, c++2a, c++98, gnu++11, gnu++17
1678 //
1679 // not set, only emit if gnu_extensions is disabled. the default (gnu+17
1680 // is set in the toolchain.)
1681 {cpp_std: "", gnu_extensions: "", bazel_cpp_std: ""},
1682 {cpp_std: "", gnu_extensions: "false", bazel_cpp_std: "c++17"},
1683 {cpp_std: "", gnu_extensions: "true", bazel_cpp_std: ""},
1684 // experimental defaults to gnu++2a
1685 {cpp_std: "experimental", gnu_extensions: "", bazel_cpp_std: "gnu++2a"},
1686 {cpp_std: "experimental", gnu_extensions: "false", bazel_cpp_std: "c++2a"},
1687 {cpp_std: "experimental", gnu_extensions: "true", bazel_cpp_std: "gnu++2a"},
1688 // Explicitly setting a c++ std does not use replace gnu++ std even if
1689 // gnu_extensions is true.
1690 // "c++11",
1691 {cpp_std: "c++11", gnu_extensions: "", bazel_cpp_std: "c++11"},
1692 {cpp_std: "c++11", gnu_extensions: "false", bazel_cpp_std: "c++11"},
1693 {cpp_std: "c++11", gnu_extensions: "true", bazel_cpp_std: "c++11"},
1694 // "c++17",
1695 {cpp_std: "c++17", gnu_extensions: "", bazel_cpp_std: "c++17"},
1696 {cpp_std: "c++17", gnu_extensions: "false", bazel_cpp_std: "c++17"},
1697 {cpp_std: "c++17", gnu_extensions: "true", bazel_cpp_std: "c++17"},
1698 // "c++2a",
1699 {cpp_std: "c++2a", gnu_extensions: "", bazel_cpp_std: "c++2a"},
1700 {cpp_std: "c++2a", gnu_extensions: "false", bazel_cpp_std: "c++2a"},
1701 {cpp_std: "c++2a", gnu_extensions: "true", bazel_cpp_std: "c++2a"},
1702 // "c++98",
1703 {cpp_std: "c++98", gnu_extensions: "", bazel_cpp_std: "c++98"},
1704 {cpp_std: "c++98", gnu_extensions: "false", bazel_cpp_std: "c++98"},
1705 {cpp_std: "c++98", gnu_extensions: "true", bazel_cpp_std: "c++98"},
1706 // gnu++ is replaced with c++ if gnu_extensions is explicitly false.
1707 // "gnu++11",
1708 {cpp_std: "gnu++11", gnu_extensions: "", bazel_cpp_std: "gnu++11"},
1709 {cpp_std: "gnu++11", gnu_extensions: "false", bazel_cpp_std: "c++11"},
1710 {cpp_std: "gnu++11", gnu_extensions: "true", bazel_cpp_std: "gnu++11"},
1711 // "gnu++17",
1712 {cpp_std: "gnu++17", gnu_extensions: "", bazel_cpp_std: "gnu++17"},
1713 {cpp_std: "gnu++17", gnu_extensions: "false", bazel_cpp_std: "c++17"},
1714 {cpp_std: "gnu++17", gnu_extensions: "true", bazel_cpp_std: "gnu++17"},
1715 }
1716 for _, tc := range testCases {
1717 cppStdAttr := ""
1718 if tc.cpp_std != "" {
1719 cppStdAttr = fmt.Sprintf(" cpp_std: \"%s\",", tc.cpp_std)
1720 }
1721 gnuExtensionsAttr := ""
1722 if tc.gnu_extensions != "" {
1723 gnuExtensionsAttr = fmt.Sprintf(" gnu_extensions: %s,", tc.gnu_extensions)
1724 }
1725 bazelCppStdAttr := ""
1726 if tc.bazel_cpp_std != "" {
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001727 bazelCppStdAttr = fmt.Sprintf("\n cpp_std = \"%s\",", tc.bazel_cpp_std)
Jingwen Chen97b85312021-10-08 10:41:31 +00001728 }
1729
1730 runCcLibraryTestCase(t, bp2buildTestCase{
1731 description: fmt.Sprintf(
1732 "cc_library with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1733 moduleTypeUnderTest: "cc_library",
1734 moduleTypeUnderTestFactory: cc.LibraryFactory,
1735 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1736 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1737cc_library {
1738 name: "a",
1739%s // cpp_std: *string
1740%s // gnu_extensions: *bool
1741 include_build_directory: false,
1742}
1743`, cppStdAttr, gnuExtensionsAttr),
1744 expectedBazelTargets: []string{fmt.Sprintf(`cc_library(
1745 name = "a",%s
1746)`, bazelCppStdAttr)},
1747 })
Jingwen Chen5b11ab12021-10-11 17:44:33 +00001748
1749 runCcLibraryStaticTestCase(t, bp2buildTestCase{
1750 description: fmt.Sprintf(
1751 "cc_library_static with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1752 moduleTypeUnderTest: "cc_library_static",
1753 moduleTypeUnderTestFactory: cc.LibraryStaticFactory,
1754 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryStaticBp2Build,
1755 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1756cc_library_static {
1757 name: "a",
1758%s // cpp_std: *string
1759%s // gnu_extensions: *bool
1760 include_build_directory: false,
1761}
1762`, cppStdAttr, gnuExtensionsAttr),
1763 expectedBazelTargets: []string{fmt.Sprintf(`cc_library_static(
1764 name = "a",%s
1765)`, bazelCppStdAttr)},
1766 })
1767
1768 runCcLibrarySharedTestCase(t, bp2buildTestCase{
1769 description: fmt.Sprintf(
1770 "cc_library_shared with cpp_std: %s and gnu_extensions: %s", tc.cpp_std, tc.gnu_extensions),
1771 moduleTypeUnderTest: "cc_library_shared",
1772 moduleTypeUnderTestFactory: cc.LibrarySharedFactory,
1773 moduleTypeUnderTestBp2BuildMutator: cc.CcLibrarySharedBp2Build,
1774 blueprint: soongCcLibraryPreamble + fmt.Sprintf(`
1775cc_library_shared {
1776 name: "a",
1777%s // cpp_std: *string
1778%s // gnu_extensions: *bool
1779 include_build_directory: false,
1780}
1781`, cppStdAttr, gnuExtensionsAttr),
1782 expectedBazelTargets: []string{fmt.Sprintf(`cc_library_shared(
1783 name = "a",%s
1784)`, bazelCppStdAttr)},
1785 })
Jingwen Chen97b85312021-10-08 10:41:31 +00001786 }
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001787}