blob: d4eeb7cbad2b3b49d4f3dbfa3930d027e6776169 [file] [log] [blame]
Jingwen Chen8c1b97e2021-02-18 03:21:34 -05001// 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 (
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020018 "testing"
19
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050020 "android/soong/android"
21 "android/soong/cc"
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050022)
23
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020024func registerCcObjectModuleTypes(ctx android.RegistrationContext) {
25 // Always register cc_defaults module factory
26 ctx.RegisterModuleType("cc_defaults", func() android.Module { return cc.DefaultsFactory() })
27}
28
29func runCcObjectTestCase(t *testing.T, tc bp2buildTestCase) {
30 runBp2BuildTestCase(t, registerCcObjectModuleTypes, tc)
31}
32
33func TestCcObjectSimple(t *testing.T) {
34 runCcObjectTestCase(t, bp2buildTestCase{
35 description: "simple cc_object generates cc_object with include header dep",
36 moduleTypeUnderTest: "cc_object",
37 moduleTypeUnderTestFactory: cc.ObjectFactory,
38 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
39 filesystem: map[string]string{
40 "a/b/foo.h": "",
41 "a/b/bar.h": "",
42 "a/b/exclude.c": "",
43 "a/b/c.c": "",
44 },
45 blueprint: `cc_object {
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050046 name: "foo",
47 local_include_dirs: ["include"],
48 cflags: [
49 "-Wno-gcc-compat",
50 "-Wall",
51 "-Werror",
52 ],
53 srcs: [
Jingwen Chendb120242021-02-23 00:46:47 -050054 "a/b/*.c"
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050055 ],
Jingwen Chendb120242021-02-23 00:46:47 -050056 exclude_srcs: ["a/b/exclude.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050057}
58`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020059 expectedBazelTargets: []string{`cc_object(
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050060 name = "foo",
61 copts = [
62 "-fno-addrsig",
63 "-Wno-gcc-compat",
64 "-Wall",
65 "-Werror",
Jingwen Chened9c17d2021-04-13 07:14:55 +000066 "-Iinclude",
Chris Parsons484e50a2021-05-13 15:13:04 -040067 "-I$(BINDIR)/include",
Jingwen Chened9c17d2021-04-13 07:14:55 +000068 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -040069 "-I$(BINDIR)/.",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050070 ],
Jingwen Chen882bcc12021-04-27 05:54:20 +000071 srcs = ["a/b/c.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050072)`,
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050073 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020074 })
75}
76
77func TestCcObjectDefaults(t *testing.T) {
78 runCcObjectTestCase(t, bp2buildTestCase{
79 description: "simple cc_object with defaults",
80 moduleTypeUnderTest: "cc_object",
81 moduleTypeUnderTestFactory: cc.ObjectFactory,
82 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
83 blueprint: `cc_object {
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050084 name: "foo",
85 local_include_dirs: ["include"],
86 srcs: [
87 "a/b/*.h",
88 "a/b/c.c"
89 ],
90
91 defaults: ["foo_defaults"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050092}
93
94cc_defaults {
95 name: "foo_defaults",
96 defaults: ["foo_bar_defaults"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050097}
98
99cc_defaults {
100 name: "foo_bar_defaults",
101 cflags: [
102 "-Wno-gcc-compat",
103 "-Wall",
104 "-Werror",
105 ],
106}
107`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200108 expectedBazelTargets: []string{`cc_object(
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500109 name = "foo",
110 copts = [
111 "-Wno-gcc-compat",
112 "-Wall",
113 "-Werror",
114 "-fno-addrsig",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000115 "-Iinclude",
Chris Parsons484e50a2021-05-13 15:13:04 -0400116 "-I$(BINDIR)/include",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000117 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400118 "-I$(BINDIR)/.",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500119 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000120 srcs = ["a/b/c.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500121)`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200122 }})
123}
124
125func TestCcObjectCcObjetDepsInObjs(t *testing.T) {
126 runCcObjectTestCase(t, bp2buildTestCase{
127 description: "cc_object with cc_object deps in objs props",
128 moduleTypeUnderTest: "cc_object",
129 moduleTypeUnderTestFactory: cc.ObjectFactory,
130 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
131 filesystem: map[string]string{
132 "a/b/c.c": "",
133 "x/y/z.c": "",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500134 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200135 blueprint: `cc_object {
Jingwen Chendb120242021-02-23 00:46:47 -0500136 name: "foo",
137 srcs: ["a/b/c.c"],
138 objs: ["bar"],
Jingwen Chendb120242021-02-23 00:46:47 -0500139}
140
141cc_object {
142 name: "bar",
143 srcs: ["x/y/z.c"],
Jingwen Chendb120242021-02-23 00:46:47 -0500144}
145`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200146 expectedBazelTargets: []string{`cc_object(
Jingwen Chendb120242021-02-23 00:46:47 -0500147 name = "bar",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000148 copts = [
149 "-fno-addrsig",
150 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400151 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000152 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000153 srcs = ["x/y/z.c"],
Jingwen Chendb120242021-02-23 00:46:47 -0500154)`, `cc_object(
155 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000156 copts = [
157 "-fno-addrsig",
158 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400159 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000160 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000161 deps = [":bar"],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000162 srcs = ["a/b/c.c"],
Liz Kammera4aa4302021-03-18 16:56:36 -0400163)`,
Liz Kammera4aa4302021-03-18 16:56:36 -0400164 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200165 })
166}
167
168func TestCcObjectIncludeBuildDirFalse(t *testing.T) {
169 runCcObjectTestCase(t, bp2buildTestCase{
170 description: "cc_object with include_build_dir: false",
171 moduleTypeUnderTest: "cc_object",
172 moduleTypeUnderTestFactory: cc.ObjectFactory,
173 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
174 filesystem: map[string]string{
175 "a/b/c.c": "",
176 "x/y/z.c": "",
177 },
178 blueprint: `cc_object {
Liz Kammera4aa4302021-03-18 16:56:36 -0400179 name: "foo",
180 srcs: ["a/b/c.c"],
181 include_build_directory: false,
Liz Kammera4aa4302021-03-18 16:56:36 -0400182}
183`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200184 expectedBazelTargets: []string{`cc_object(
Liz Kammera4aa4302021-03-18 16:56:36 -0400185 name = "foo",
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000186 copts = ["-fno-addrsig"],
187 srcs = ["a/b/c.c"],
Jingwen Chendb120242021-02-23 00:46:47 -0500188)`,
Jingwen Chendb120242021-02-23 00:46:47 -0500189 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200190 })
191}
192
193func TestCcObjectProductVariable(t *testing.T) {
194 runCcObjectTestCase(t, bp2buildTestCase{
195 description: "cc_object with product variable",
196 moduleTypeUnderTest: "cc_object",
197 moduleTypeUnderTestFactory: cc.ObjectFactory,
198 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
199 blueprint: `cc_object {
Liz Kammera060c452021-03-24 10:14:47 -0400200 name: "foo",
201 include_build_directory: false,
202 product_variables: {
203 platform_sdk_version: {
204 asflags: ["-DPLATFORM_SDK_VERSION=%d"],
205 },
206 },
Liz Kammera060c452021-03-24 10:14:47 -0400207}
208`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200209 expectedBazelTargets: []string{`cc_object(
Liz Kammera060c452021-03-24 10:14:47 -0400210 name = "foo",
Liz Kammer6fd7b3f2021-05-06 13:54:29 -0400211 asflags = select({
212 "//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION={Platform_sdk_version}"],
213 "//conditions:default": [],
214 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000215 copts = ["-fno-addrsig"],
Liz Kammera060c452021-03-24 10:14:47 -0400216)`,
Liz Kammera060c452021-03-24 10:14:47 -0400217 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200218 })
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500219}
Jingwen Chen5d864492021-02-24 07:20:12 -0500220
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200221func TestCcObjectCflagsOneArch(t *testing.T) {
222 runCcObjectTestCase(t, bp2buildTestCase{
223 description: "cc_object setting cflags for one arch",
224 moduleTypeUnderTest: "cc_object",
225 moduleTypeUnderTestFactory: cc.ObjectFactory,
226 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
227 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500228 name: "foo",
Jingwen Chen07027912021-03-15 06:02:43 -0400229 srcs: ["a.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500230 arch: {
231 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400232 cflags: ["-fPIC"], // string list
233 },
234 arm: {
235 srcs: ["arch/arm/file.S"], // label list
Jingwen Chen5d864492021-02-24 07:20:12 -0500236 },
237 },
Jingwen Chen5d864492021-02-24 07:20:12 -0500238}
239`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200240 expectedBazelTargets: []string{
241 `cc_object(
Jingwen Chen5d864492021-02-24 07:20:12 -0500242 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000243 copts = [
244 "-fno-addrsig",
245 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400246 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000247 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000248 "//build/bazel/platforms/arch:x86": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400249 "//conditions:default": [],
Jingwen Chen5d864492021-02-24 07:20:12 -0500250 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000251 srcs = ["a.cpp"] + select({
252 "//build/bazel/platforms/arch:arm": ["arch/arm/file.S"],
Jingwen Chen07027912021-03-15 06:02:43 -0400253 "//conditions:default": [],
254 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500255)`,
Jingwen Chen5d864492021-02-24 07:20:12 -0500256 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200257 })
258}
259
260func TestCcObjectCflagsFourArch(t *testing.T) {
261 runCcObjectTestCase(t, bp2buildTestCase{
262 description: "cc_object setting cflags for 4 architectures",
263 moduleTypeUnderTest: "cc_object",
264 moduleTypeUnderTestFactory: cc.ObjectFactory,
265 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
266 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500267 name: "foo",
Jingwen Chen07027912021-03-15 06:02:43 -0400268 srcs: ["base.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500269 arch: {
270 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400271 srcs: ["x86.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500272 cflags: ["-fPIC"],
273 },
274 x86_64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400275 srcs: ["x86_64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500276 cflags: ["-fPIC"],
277 },
278 arm: {
Jingwen Chen07027912021-03-15 06:02:43 -0400279 srcs: ["arm.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500280 cflags: ["-Wall"],
281 },
282 arm64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400283 srcs: ["arm64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500284 cflags: ["-Wall"],
285 },
286 },
Jingwen Chen5d864492021-02-24 07:20:12 -0500287}
288`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200289 expectedBazelTargets: []string{
290 `cc_object(
Jingwen Chen5d864492021-02-24 07:20:12 -0500291 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000292 copts = [
293 "-fno-addrsig",
294 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400295 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000296 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000297 "//build/bazel/platforms/arch:arm": ["-Wall"],
298 "//build/bazel/platforms/arch:arm64": ["-Wall"],
299 "//build/bazel/platforms/arch:x86": ["-fPIC"],
300 "//build/bazel/platforms/arch:x86_64": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400301 "//conditions:default": [],
Jingwen Chen5d864492021-02-24 07:20:12 -0500302 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000303 srcs = ["base.cpp"] + select({
304 "//build/bazel/platforms/arch:arm": ["arm.cpp"],
305 "//build/bazel/platforms/arch:arm64": ["arm64.cpp"],
306 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
307 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen07027912021-03-15 06:02:43 -0400308 "//conditions:default": [],
309 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500310)`,
Jingwen Chen5d864492021-02-24 07:20:12 -0500311 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200312 })
313}
314
315func TestCcObjectCflagsMultiOs(t *testing.T) {
316 runCcObjectTestCase(t, bp2buildTestCase{
317 description: "cc_object setting cflags for multiple OSes",
318 moduleTypeUnderTest: "cc_object",
319 moduleTypeUnderTestFactory: cc.ObjectFactory,
320 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
321 blueprint: `cc_object {
Jingwen Chenc1c26502021-04-05 10:35:13 +0000322 name: "foo",
323 srcs: ["base.cpp"],
324 target: {
325 android: {
326 cflags: ["-fPIC"],
327 },
328 windows: {
329 cflags: ["-fPIC"],
330 },
331 darwin: {
332 cflags: ["-Wall"],
333 },
334 },
Jingwen Chenc1c26502021-04-05 10:35:13 +0000335}
336`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200337 expectedBazelTargets: []string{
338 `cc_object(
Jingwen Chenc1c26502021-04-05 10:35:13 +0000339 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000340 copts = [
341 "-fno-addrsig",
342 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400343 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000344 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000345 "//build/bazel/platforms/os:android": ["-fPIC"],
346 "//build/bazel/platforms/os:darwin": ["-Wall"],
347 "//build/bazel/platforms/os:windows": ["-fPIC"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000348 "//conditions:default": [],
349 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000350 srcs = ["base.cpp"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000351)`,
Jingwen Chenc1c26502021-04-05 10:35:13 +0000352 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200353 })
Jingwen Chen5d864492021-02-24 07:20:12 -0500354}