blob: 8c2fe7bae111c8ff4432c5460fe3c31d82c2d215 [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",
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200806 srcs = ["a.cpp"],
807 version_script = "v.map",
808)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200809 })
810}
811
812func TestCcLibraryConfiguredVersionScript(t *testing.T) {
813 runCcLibraryTestCase(t, bp2buildTestCase{
814 description: "cc_library configured version script",
815 moduleTypeUnderTest: "cc_library",
816 moduleTypeUnderTestFactory: cc.LibraryFactory,
817 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200818 dir: "foo/bar",
819 filesystem: map[string]string{
820 "foo/bar/Android.bp": `
Liz Kammer8337ea42021-09-10 10:06:32 -0400821cc_library {
822 name: "a",
823 srcs: ["a.cpp"],
824 arch: {
825 arm: {
826 version_script: "arm.map",
827 },
828 arm64: {
829 version_script: "arm64.map",
830 },
831 },
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200832
Liz Kammer8337ea42021-09-10 10:06:32 -0400833 bazel_module: { bp2build_available: true },
834 include_build_directory: false,
835}
Liz Kammerd366c902021-06-03 13:43:01 -0400836 `,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200837 },
838 blueprint: soongCcLibraryPreamble,
839 expectedBazelTargets: []string{`cc_library(
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200840 name = "a",
Lukacs T. Berki56bb0832021-05-12 12:36:45 +0200841 srcs = ["a.cpp"],
842 version_script = select({
843 "//build/bazel/platforms/arch:arm": "arm.map",
844 "//build/bazel/platforms/arch:arm64": "arm64.map",
845 "//conditions:default": None,
846 }),
847)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200848 })
849}
850
851func TestCcLibrarySharedLibs(t *testing.T) {
852 runCcLibraryTestCase(t, bp2buildTestCase{
853 description: "cc_library shared_libs",
854 moduleTypeUnderTest: "cc_library",
855 moduleTypeUnderTestFactory: cc.LibraryFactory,
856 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400857 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400858cc_library {
859 name: "mylib",
Liz Kammer8337ea42021-09-10 10:06:32 -0400860 bazel_module: { bp2build_available: false },
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400861}
862
863cc_library {
864 name: "a",
865 shared_libs: ["mylib",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400866 include_build_directory: false,
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400867}
868`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200869 expectedBazelTargets: []string{`cc_library(
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400870 name = "a",
Liz Kammer7a210ac2021-09-22 15:52:58 -0400871 implementation_dynamic_deps = [":mylib"],
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400872)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200873 })
874}
875
Liz Kammer0eae52e2021-10-06 10:32:26 -0400876func TestCcLibraryFeatures(t *testing.T) {
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200877 runCcLibraryTestCase(t, bp2buildTestCase{
878 description: "cc_library pack_relocations test",
879 moduleTypeUnderTest: "cc_library",
880 moduleTypeUnderTestFactory: cc.LibraryFactory,
881 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400882 blueprint: soongCcLibraryPreamble + `
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400883cc_library {
884 name: "a",
885 srcs: ["a.cpp"],
886 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400887 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400888 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400889}
890
891cc_library {
892 name: "b",
893 srcs: ["b.cpp"],
894 arch: {
895 x86_64: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400896 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400897 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400898 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400899 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400900 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400901}
902
903cc_library {
904 name: "c",
905 srcs: ["c.cpp"],
906 target: {
907 darwin: {
Liz Kammer8337ea42021-09-10 10:06:32 -0400908 pack_relocations: false,
Liz Kammer0eae52e2021-10-06 10:32:26 -0400909 allow_undefined_symbols: true,
Liz Kammer8337ea42021-09-10 10:06:32 -0400910 },
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400911 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400912 include_build_directory: false,
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400913}`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200914 expectedBazelTargets: []string{`cc_library(
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400915 name = "a",
Liz Kammer0eae52e2021-10-06 10:32:26 -0400916 features = [
917 "disable_pack_relocations",
918 "-no_undefined_symbols",
919 ],
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400920 srcs = ["a.cpp"],
921)`, `cc_library(
922 name = "b",
Liz Kammer0eae52e2021-10-06 10:32:26 -0400923 features = select({
924 "//build/bazel/platforms/arch:x86_64": [
925 "disable_pack_relocations",
926 "-no_undefined_symbols",
927 ],
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400928 "//conditions:default": [],
929 }),
930 srcs = ["b.cpp"],
931)`, `cc_library(
932 name = "c",
Liz Kammer0eae52e2021-10-06 10:32:26 -0400933 features = select({
934 "//build/bazel/platforms/os:darwin": [
935 "disable_pack_relocations",
936 "-no_undefined_symbols",
937 ],
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400938 "//conditions:default": [],
939 }),
940 srcs = ["c.cpp"],
941)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200942 })
943}
944
945func TestCcLibrarySpacesInCopts(t *testing.T) {
946 runCcLibraryTestCase(t, bp2buildTestCase{
947 description: "cc_library spaces in copts",
948 moduleTypeUnderTest: "cc_library",
949 moduleTypeUnderTestFactory: cc.LibraryFactory,
950 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400951 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3950cd62021-05-12 04:33:00 +0000952cc_library {
953 name: "a",
954 cflags: ["-include header.h",],
Liz Kammer8337ea42021-09-10 10:06:32 -0400955 include_build_directory: false,
Jingwen Chen3950cd62021-05-12 04:33:00 +0000956}
957`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200958 expectedBazelTargets: []string{`cc_library(
Jingwen Chen3950cd62021-05-12 04:33:00 +0000959 name = "a",
960 copts = [
961 "-include",
962 "header.h",
Jingwen Chen3950cd62021-05-12 04:33:00 +0000963 ],
964)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200965 })
966}
967
968func TestCcLibraryCppFlagsGoesIntoCopts(t *testing.T) {
969 runCcLibraryTestCase(t, bp2buildTestCase{
Chris Parsons990c4f42021-05-25 12:10:58 -0400970 description: "cc_library cppflags usage",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200971 moduleTypeUnderTest: "cc_library",
972 moduleTypeUnderTestFactory: cc.LibraryFactory,
973 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -0400974 blueprint: soongCcLibraryPreamble + `cc_library {
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000975 name: "a",
976 srcs: ["a.cpp"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400977 cflags: ["-Wall"],
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000978 cppflags: [
979 "-fsigned-char",
980 "-pedantic",
Liz Kammer8337ea42021-09-10 10:06:32 -0400981 ],
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000982 arch: {
983 arm64: {
984 cppflags: ["-DARM64=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400985 },
Liz Kammerd366c902021-06-03 13:43:01 -0400986 },
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000987 target: {
988 android: {
989 cppflags: ["-DANDROID=1"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400990 },
Liz Kammerd366c902021-06-03 13:43:01 -0400991 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400992 include_build_directory: false,
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000993}
994`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200995 expectedBazelTargets: []string{`cc_library(
Jingwen Chen75be1ca2021-05-12 05:04:58 +0000996 name = "a",
Liz Kammer8337ea42021-09-10 10:06:32 -0400997 copts = ["-Wall"],
Chris Parsons990c4f42021-05-25 12:10:58 -0400998 cppflags = [
999 "-fsigned-char",
1000 "-pedantic",
Jingwen Chen75be1ca2021-05-12 05:04:58 +00001001 ] + select({
1002 "//build/bazel/platforms/arch:arm64": ["-DARM64=1"],
1003 "//conditions:default": [],
1004 }) + select({
1005 "//build/bazel/platforms/os:android": ["-DANDROID=1"],
1006 "//conditions:default": [],
1007 }),
1008 srcs = ["a.cpp"],
1009)`},
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +02001010 })
Jingwen Chen63930982021-03-24 10:04:33 -04001011}
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001012
1013func TestCcLibraryLabelAttributeGetTargetProperties(t *testing.T) {
1014 runCcLibraryTestCase(t, bp2buildTestCase{
1015 description: "cc_library GetTargetProperties on a LabelAttribute",
1016 moduleTypeUnderTest: "cc_library",
1017 moduleTypeUnderTestFactory: cc.LibraryFactory,
1018 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -04001019 blueprint: soongCcLibraryPreamble + `
1020cc_library {
1021 name: "a",
1022 srcs: ["a.cpp"],
1023 target: {
1024 android_arm: {
1025 version_script: "android_arm.map",
1026 },
1027 linux_bionic_arm64: {
1028 version_script: "linux_bionic_arm64.map",
1029 },
1030 },
1031 include_build_directory: false,
1032}
Liz Kammerd366c902021-06-03 13:43:01 -04001033 `,
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001034 expectedBazelTargets: []string{`cc_library(
1035 name = "a",
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001036 srcs = ["a.cpp"],
1037 version_script = select({
Rupert Shuttleworthffd45822021-05-14 03:02:34 -04001038 "//build/bazel/platforms/os_arch:android_arm": "android_arm.map",
1039 "//build/bazel/platforms/os_arch:linux_bionic_arm64": "linux_bionic_arm64.map",
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -04001040 "//conditions:default": None,
1041 }),
1042)`},
1043 })
1044}
Liz Kammer47535c52021-06-02 16:02:22 -04001045
1046func TestCcLibraryExcludeLibs(t *testing.T) {
1047 runCcLibraryTestCase(t, bp2buildTestCase{
1048 moduleTypeUnderTest: "cc_library",
1049 moduleTypeUnderTestFactory: cc.LibraryFactory,
1050 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer47535c52021-06-02 16:02:22 -04001051 filesystem: map[string]string{},
1052 blueprint: soongCcLibraryStaticPreamble + `
1053cc_library {
1054 name: "foo_static",
1055 srcs: ["common.c"],
1056 whole_static_libs: [
1057 "arm_whole_static_lib_excludes",
1058 "malloc_not_svelte_whole_static_lib_excludes"
1059 ],
1060 static_libs: [
1061 "arm_static_lib_excludes",
1062 "malloc_not_svelte_static_lib_excludes"
1063 ],
1064 shared_libs: [
1065 "arm_shared_lib_excludes",
1066 ],
1067 arch: {
1068 arm: {
1069 exclude_shared_libs: [
1070 "arm_shared_lib_excludes",
1071 ],
1072 exclude_static_libs: [
1073 "arm_static_lib_excludes",
1074 "arm_whole_static_lib_excludes",
1075 ],
1076 },
1077 },
1078 product_variables: {
1079 malloc_not_svelte: {
1080 shared_libs: ["malloc_not_svelte_shared_lib"],
1081 whole_static_libs: ["malloc_not_svelte_whole_static_lib"],
1082 exclude_static_libs: [
1083 "malloc_not_svelte_static_lib_excludes",
1084 "malloc_not_svelte_whole_static_lib_excludes",
1085 ],
1086 },
1087 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001088 include_build_directory: false,
Liz Kammer47535c52021-06-02 16:02:22 -04001089}
1090
1091cc_library {
1092 name: "arm_whole_static_lib_excludes",
1093 bazel_module: { bp2build_available: false },
1094}
1095
1096cc_library {
1097 name: "malloc_not_svelte_whole_static_lib",
1098 bazel_module: { bp2build_available: false },
1099}
1100
1101cc_library {
1102 name: "malloc_not_svelte_whole_static_lib_excludes",
1103 bazel_module: { bp2build_available: false },
1104}
1105
1106cc_library {
1107 name: "arm_static_lib_excludes",
1108 bazel_module: { bp2build_available: false },
1109}
1110
1111cc_library {
1112 name: "malloc_not_svelte_static_lib_excludes",
1113 bazel_module: { bp2build_available: false },
1114}
1115
1116cc_library {
1117 name: "arm_shared_lib_excludes",
1118 bazel_module: { bp2build_available: false },
1119}
1120
1121cc_library {
1122 name: "malloc_not_svelte_shared_lib",
1123 bazel_module: { bp2build_available: false },
1124}
1125`,
1126 expectedBazelTargets: []string{
1127 `cc_library(
1128 name = "foo_static",
Liz Kammer47535c52021-06-02 16:02:22 -04001129 implementation_deps = select({
1130 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001131 "//conditions:default": [":arm_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001132 }) + select({
1133 "//build/bazel/product_variables:malloc_not_svelte": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001134 "//conditions:default": [":malloc_not_svelte_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001135 }),
Liz Kammer7a210ac2021-09-22 15:52:58 -04001136 implementation_dynamic_deps = select({
1137 "//build/bazel/platforms/arch:arm": [],
1138 "//conditions:default": [":arm_shared_lib_excludes"],
1139 }) + select({
1140 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_shared_lib"],
1141 "//conditions:default": [],
1142 }),
Liz Kammer47535c52021-06-02 16:02:22 -04001143 srcs_c = ["common.c"],
1144 whole_archive_deps = select({
1145 "//build/bazel/platforms/arch:arm": [],
Chris Parsons953b3562021-09-20 15:14:39 -04001146 "//conditions:default": [":arm_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001147 }) + select({
Chris Parsons953b3562021-09-20 15:14:39 -04001148 "//build/bazel/product_variables:malloc_not_svelte": [":malloc_not_svelte_whole_static_lib_bp2build_cc_library_static"],
1149 "//conditions:default": [":malloc_not_svelte_whole_static_lib_excludes_bp2build_cc_library_static"],
Liz Kammer47535c52021-06-02 16:02:22 -04001150 }),
1151)`,
1152 },
1153 })
1154}
Liz Kammerd366c902021-06-03 13:43:01 -04001155
1156func TestCCLibraryNoCrtTrue(t *testing.T) {
1157 runCcLibraryTestCase(t, bp2buildTestCase{
Jingwen Chen6ada5892021-09-17 11:38:09 +00001158 description: "cc_library - nocrt: true emits attribute",
1159 moduleTypeUnderTest: "cc_library",
1160 moduleTypeUnderTestFactory: cc.LibraryFactory,
1161 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1162 filesystem: map[string]string{
1163 "impl.cpp": "",
1164 },
1165 blueprint: soongCcLibraryPreamble + `
1166cc_library {
1167 name: "foo-lib",
1168 srcs: ["impl.cpp"],
1169 nocrt: true,
1170 include_build_directory: false,
1171}
1172`,
1173 expectedBazelTargets: []string{`cc_library(
1174 name = "foo-lib",
1175 link_crt = False,
1176 srcs = ["impl.cpp"],
1177)`}})
1178}
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`,
1197 expectedBazelTargets: []string{`cc_library(
1198 name = "foo-lib",
1199 srcs = ["impl.cpp"],
1200)`}})
1201}
1202
1203func TestCCLibraryNoCrtArchVariant(t *testing.T) {
1204 runCcLibraryTestCase(t, bp2buildTestCase{
1205 description: "cc_library - nocrt in select",
1206 moduleTypeUnderTest: "cc_library",
1207 moduleTypeUnderTestFactory: cc.LibraryFactory,
1208 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1209 filesystem: map[string]string{
1210 "impl.cpp": "",
1211 },
1212 blueprint: soongCcLibraryPreamble + `
1213cc_library {
1214 name: "foo-lib",
1215 srcs: ["impl.cpp"],
1216 arch: {
1217 arm: {
1218 nocrt: true,
1219 },
1220 x86: {
1221 nocrt: false,
1222 },
1223 },
1224 include_build_directory: false,
1225}
1226`,
1227 expectedErr: fmt.Errorf("Android.bp:16:1: module \"foo-lib\": nocrt is not supported for arch variants"),
1228 })
1229}
1230
1231func TestCCLibraryNoLibCrtTrue(t *testing.T) {
1232 runCcLibraryTestCase(t, bp2buildTestCase{
Liz Kammerd366c902021-06-03 13:43:01 -04001233 description: "cc_library - simple example",
1234 moduleTypeUnderTest: "cc_library",
1235 moduleTypeUnderTestFactory: cc.LibraryFactory,
1236 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1237 filesystem: map[string]string{
1238 "impl.cpp": "",
1239 },
1240 blueprint: soongCcLibraryPreamble + `
1241cc_library_headers { name: "some-headers" }
1242cc_library {
1243 name: "foo-lib",
1244 srcs: ["impl.cpp"],
1245 no_libcrt: true,
Liz Kammer8337ea42021-09-10 10:06:32 -04001246 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001247}
1248`,
1249 expectedBazelTargets: []string{`cc_library(
1250 name = "foo-lib",
Liz Kammerd366c902021-06-03 13:43:01 -04001251 srcs = ["impl.cpp"],
1252 use_libcrt = False,
1253)`}})
1254}
1255
Jingwen Chen6ada5892021-09-17 11:38:09 +00001256func TestCCLibraryNoLibCrtFalse(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001257 runCcLibraryTestCase(t, bp2buildTestCase{
1258 moduleTypeUnderTest: "cc_library",
1259 moduleTypeUnderTestFactory: cc.LibraryFactory,
1260 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1261 filesystem: map[string]string{
1262 "impl.cpp": "",
1263 },
1264 blueprint: soongCcLibraryPreamble + `
1265cc_library_headers { name: "some-headers" }
1266cc_library {
1267 name: "foo-lib",
1268 srcs: ["impl.cpp"],
1269 no_libcrt: false,
Liz Kammer8337ea42021-09-10 10:06:32 -04001270 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001271}
1272`,
1273 expectedBazelTargets: []string{`cc_library(
1274 name = "foo-lib",
Liz Kammerd366c902021-06-03 13:43:01 -04001275 srcs = ["impl.cpp"],
1276 use_libcrt = True,
1277)`}})
1278}
1279
Jingwen Chen6ada5892021-09-17 11:38:09 +00001280func TestCCLibraryNoLibCrtArchVariant(t *testing.T) {
Liz Kammerd366c902021-06-03 13:43:01 -04001281 runCcLibraryTestCase(t, bp2buildTestCase{
1282 moduleTypeUnderTest: "cc_library",
1283 moduleTypeUnderTestFactory: cc.LibraryFactory,
1284 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1285 filesystem: map[string]string{
1286 "impl.cpp": "",
1287 },
1288 blueprint: soongCcLibraryPreamble + `
Liz Kammerd366c902021-06-03 13:43:01 -04001289cc_library {
1290 name: "foo-lib",
1291 srcs: ["impl.cpp"],
1292 arch: {
1293 arm: {
1294 no_libcrt: true,
1295 },
1296 x86: {
1297 no_libcrt: true,
1298 },
1299 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001300 include_build_directory: false,
Liz Kammerd366c902021-06-03 13:43:01 -04001301}
1302`,
1303 expectedBazelTargets: []string{`cc_library(
1304 name = "foo-lib",
Liz Kammerd366c902021-06-03 13:43:01 -04001305 srcs = ["impl.cpp"],
1306 use_libcrt = select({
1307 "//build/bazel/platforms/arch:arm": False,
1308 "//build/bazel/platforms/arch:x86": False,
1309 "//conditions:default": None,
1310 }),
1311)`}})
1312}
1313
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001314func TestCcLibraryStrip(t *testing.T) {
1315 runCcLibraryTestCase(t, bp2buildTestCase{
1316 description: "cc_library strip args",
1317 moduleTypeUnderTest: "cc_library",
1318 moduleTypeUnderTestFactory: cc.LibraryFactory,
1319 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
Liz Kammer8337ea42021-09-10 10:06:32 -04001320 blueprint: soongCcLibraryPreamble + `
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001321cc_library {
1322 name: "nothing",
Liz Kammer8337ea42021-09-10 10:06:32 -04001323 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001324}
1325cc_library {
1326 name: "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001327 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001328 keep_symbols: true,
1329 },
1330 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001331}
1332cc_library {
1333 name: "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001334 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001335 keep_symbols_and_debug_frame: true,
1336 },
1337 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001338}
1339cc_library {
1340 name: "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001341 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001342 none: true,
1343 },
1344 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001345}
1346cc_library {
1347 name: "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001348 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001349 keep_symbols_list: ["symbol"],
1350 },
1351 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001352}
1353cc_library {
1354 name: "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001355 strip: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001356 all: true,
1357 },
1358 include_build_directory: false,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001359}
1360`,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001361 expectedBazelTargets: []string{`cc_library(
1362 name = "all",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001363 strip = {
1364 "all": True,
1365 },
1366)`, `cc_library(
1367 name = "keep_symbols",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001368 strip = {
1369 "keep_symbols": True,
1370 },
1371)`, `cc_library(
1372 name = "keep_symbols_and_debug_frame",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001373 strip = {
1374 "keep_symbols_and_debug_frame": True,
1375 },
1376)`, `cc_library(
1377 name = "keep_symbols_list",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001378 strip = {
1379 "keep_symbols_list": ["symbol"],
1380 },
1381)`, `cc_library(
1382 name = "none",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001383 strip = {
1384 "none": True,
1385 },
1386)`, `cc_library(
1387 name = "nothing",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001388)`},
1389 })
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`,
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001423 expectedBazelTargets: []string{`cc_library(
1424 name = "multi-arch",
Jingwen Chen3d383bb2021-06-09 07:18:37 +00001425 strip = {
1426 "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 }),
1441 },
1442)`},
1443 })
1444}
Chris Parsons51f8c392021-08-03 21:01:05 -04001445
1446func TestCcLibrary_SystemSharedLibsRootEmpty(t *testing.T) {
1447 runCcLibraryTestCase(t, bp2buildTestCase{
1448 description: "cc_library system_shared_libs empty at root",
1449 moduleTypeUnderTest: "cc_library",
1450 moduleTypeUnderTestFactory: cc.LibraryFactory,
1451 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1452 blueprint: soongCcLibraryPreamble + `
1453cc_library {
1454 name: "root_empty",
Liz Kammer8337ea42021-09-10 10:06:32 -04001455 system_shared_libs: [],
1456 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001457}
1458`,
1459 expectedBazelTargets: []string{`cc_library(
1460 name = "root_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001461 system_dynamic_deps = [],
1462)`},
1463 })
1464}
1465
1466func TestCcLibrary_SystemSharedLibsStaticEmpty(t *testing.T) {
1467 runCcLibraryTestCase(t, bp2buildTestCase{
1468 description: "cc_library system_shared_libs empty for static variant",
1469 moduleTypeUnderTest: "cc_library",
1470 moduleTypeUnderTestFactory: cc.LibraryFactory,
1471 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1472 blueprint: soongCcLibraryPreamble + `
1473cc_library {
1474 name: "static_empty",
1475 static: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001476 system_shared_libs: [],
1477 },
1478 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001479}
1480`,
1481 expectedBazelTargets: []string{`cc_library(
1482 name = "static_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001483 static = {
1484 "system_dynamic_deps": [],
1485 },
1486)`},
1487 })
1488}
1489
1490func TestCcLibrary_SystemSharedLibsSharedEmpty(t *testing.T) {
1491 runCcLibraryTestCase(t, bp2buildTestCase{
1492 description: "cc_library system_shared_libs empty for shared variant",
1493 moduleTypeUnderTest: "cc_library",
1494 moduleTypeUnderTestFactory: cc.LibraryFactory,
1495 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1496 blueprint: soongCcLibraryPreamble + `
1497cc_library {
1498 name: "shared_empty",
1499 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001500 system_shared_libs: [],
1501 },
1502 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001503}
1504`,
1505 expectedBazelTargets: []string{`cc_library(
1506 name = "shared_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001507 shared = {
1508 "system_dynamic_deps": [],
1509 },
1510)`},
1511 })
1512}
1513
1514func TestCcLibrary_SystemSharedLibsSharedBionicEmpty(t *testing.T) {
1515 runCcLibraryTestCase(t, bp2buildTestCase{
1516 description: "cc_library system_shared_libs empty for shared, bionic variant",
1517 moduleTypeUnderTest: "cc_library",
1518 moduleTypeUnderTestFactory: cc.LibraryFactory,
1519 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1520 blueprint: soongCcLibraryPreamble + `
1521cc_library {
1522 name: "shared_empty",
1523 target: {
1524 bionic: {
1525 shared: {
1526 system_shared_libs: [],
1527 }
1528 }
Liz Kammer8337ea42021-09-10 10:06:32 -04001529 },
1530 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001531}
1532`,
1533 expectedBazelTargets: []string{`cc_library(
1534 name = "shared_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001535 shared = {
1536 "system_dynamic_deps": [],
1537 },
1538)`},
1539 })
1540}
1541
1542func TestCcLibrary_SystemSharedLibsLinuxBionicEmpty(t *testing.T) {
1543 // Note that this behavior is technically incorrect (it's a simplification).
1544 // The correct behavior would be if bp2build wrote `system_dynamic_deps = []`
1545 // only for linux_bionic, but `android` had `["libc", "libdl", "libm"].
1546 // b/195791252 tracks the fix.
1547 runCcLibraryTestCase(t, bp2buildTestCase{
1548 description: "cc_library system_shared_libs empty for linux_bionic variant",
1549 moduleTypeUnderTest: "cc_library",
1550 moduleTypeUnderTestFactory: cc.LibraryFactory,
1551 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1552 blueprint: soongCcLibraryPreamble + `
1553cc_library {
1554 name: "target_linux_bionic_empty",
1555 target: {
1556 linux_bionic: {
1557 system_shared_libs: [],
1558 },
1559 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001560 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001561}
1562`,
1563 expectedBazelTargets: []string{`cc_library(
1564 name = "target_linux_bionic_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001565 system_dynamic_deps = [],
1566)`},
1567 })
1568}
1569
1570func TestCcLibrary_SystemSharedLibsBionicEmpty(t *testing.T) {
1571 runCcLibraryTestCase(t, bp2buildTestCase{
1572 description: "cc_library system_shared_libs empty for bionic variant",
1573 moduleTypeUnderTest: "cc_library",
1574 moduleTypeUnderTestFactory: cc.LibraryFactory,
1575 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1576 blueprint: soongCcLibraryPreamble + `
1577cc_library {
1578 name: "target_bionic_empty",
1579 target: {
1580 bionic: {
1581 system_shared_libs: [],
1582 },
1583 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001584 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001585}
1586`,
1587 expectedBazelTargets: []string{`cc_library(
1588 name = "target_bionic_empty",
Chris Parsons51f8c392021-08-03 21:01:05 -04001589 system_dynamic_deps = [],
1590)`},
1591 })
1592}
1593
1594func TestCcLibrary_SystemSharedLibsSharedAndRoot(t *testing.T) {
1595 runCcLibraryTestCase(t, bp2buildTestCase{
1596 description: "cc_library system_shared_libs set for shared and root",
1597 moduleTypeUnderTest: "cc_library",
1598 moduleTypeUnderTestFactory: cc.LibraryFactory,
1599 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1600 blueprint: soongCcLibraryPreamble + `
Liz Kammer8337ea42021-09-10 10:06:32 -04001601cc_library {
1602 name: "libc",
1603 bazel_module: { bp2build_available: false },
1604}
1605cc_library {
1606 name: "libm",
1607 bazel_module: { bp2build_available: false },
1608}
Chris Parsons51f8c392021-08-03 21:01:05 -04001609
1610cc_library {
1611 name: "foo",
1612 system_shared_libs: ["libc"],
1613 shared: {
Liz Kammer8337ea42021-09-10 10:06:32 -04001614 system_shared_libs: ["libm"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001615 },
Liz Kammer8337ea42021-09-10 10:06:32 -04001616 include_build_directory: false,
Chris Parsons51f8c392021-08-03 21:01:05 -04001617}
1618`,
1619 expectedBazelTargets: []string{`cc_library(
1620 name = "foo",
Chris Parsons51f8c392021-08-03 21:01:05 -04001621 shared = {
1622 "system_dynamic_deps": [":libm"],
1623 },
1624 system_dynamic_deps = [":libc"],
Chris Parsons51f8c392021-08-03 21:01:05 -04001625)`},
1626 })
1627}
Chris Parsons2dde0cb2021-10-01 14:45:30 -04001628
1629func TestCcLibraryOsSelects(t *testing.T) {
1630 runCcLibraryTestCase(t, bp2buildTestCase{
1631 description: "cc_library - selects for all os targets",
1632 moduleTypeUnderTest: "cc_library",
1633 moduleTypeUnderTestFactory: cc.LibraryFactory,
1634 moduleTypeUnderTestBp2BuildMutator: cc.CcLibraryBp2Build,
1635 filesystem: map[string]string{},
1636 blueprint: soongCcLibraryPreamble + `
1637cc_library_headers { name: "some-headers" }
1638cc_library {
1639 name: "foo-lib",
1640 srcs: ["base.cpp"],
1641 target: {
1642 android: {
1643 srcs: ["android.cpp"],
1644 },
1645 linux: {
1646 srcs: ["linux.cpp"],
1647 },
1648 linux_glibc: {
1649 srcs: ["linux_glibc.cpp"],
1650 },
1651 darwin: {
1652 srcs: ["darwin.cpp"],
1653 },
1654 bionic: {
1655 srcs: ["bionic.cpp"],
1656 },
1657 linux_musl: {
1658 srcs: ["linux_musl.cpp"],
1659 },
1660 windows: {
1661 srcs: ["windows.cpp"],
1662 },
1663 },
1664 include_build_directory: false,
1665}
1666`,
1667 expectedBazelTargets: []string{`cc_library(
1668 name = "foo-lib",
1669 srcs = ["base.cpp"] + select({
1670 "//build/bazel/platforms/os:android": [
1671 "android.cpp",
1672 "bionic.cpp",
1673 "linux.cpp",
1674 ],
1675 "//build/bazel/platforms/os:darwin": ["darwin.cpp"],
1676 "//build/bazel/platforms/os:linux": [
1677 "linux.cpp",
1678 "linux_glibc.cpp",
1679 ],
1680 "//build/bazel/platforms/os:linux_bionic": [
1681 "bionic.cpp",
1682 "linux.cpp",
1683 ],
1684 "//build/bazel/platforms/os:linux_musl": [
1685 "linux.cpp",
1686 "linux_musl.cpp",
1687 ],
1688 "//build/bazel/platforms/os:windows": ["windows.cpp"],
1689 "//conditions:default": [],
1690 }),
1691)`}})
1692}