blob: f7e94c28c9b2ea4ee8f17874c0c23c9c5dd9edb0 [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) {
Liz Kammere4982e82021-05-25 10:39:35 -040030 t.Helper()
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020031 runBp2BuildTestCase(t, registerCcObjectModuleTypes, tc)
32}
33
34func TestCcObjectSimple(t *testing.T) {
35 runCcObjectTestCase(t, bp2buildTestCase{
36 description: "simple cc_object generates cc_object with include header dep",
37 moduleTypeUnderTest: "cc_object",
38 moduleTypeUnderTestFactory: cc.ObjectFactory,
39 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
40 filesystem: map[string]string{
41 "a/b/foo.h": "",
42 "a/b/bar.h": "",
43 "a/b/exclude.c": "",
44 "a/b/c.c": "",
45 },
46 blueprint: `cc_object {
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050047 name: "foo",
48 local_include_dirs: ["include"],
49 cflags: [
50 "-Wno-gcc-compat",
51 "-Wall",
52 "-Werror",
53 ],
54 srcs: [
Jingwen Chendb120242021-02-23 00:46:47 -050055 "a/b/*.c"
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050056 ],
Jingwen Chendb120242021-02-23 00:46:47 -050057 exclude_srcs: ["a/b/exclude.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050058}
59`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020060 expectedBazelTargets: []string{`cc_object(
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050061 name = "foo",
62 copts = [
63 "-fno-addrsig",
64 "-Wno-gcc-compat",
65 "-Wall",
66 "-Werror",
Jingwen Chened9c17d2021-04-13 07:14:55 +000067 "-Iinclude",
Chris Parsons484e50a2021-05-13 15:13:04 -040068 "-I$(BINDIR)/include",
Jingwen Chened9c17d2021-04-13 07:14:55 +000069 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -040070 "-I$(BINDIR)/.",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050071 ],
Jingwen Chen882bcc12021-04-27 05:54:20 +000072 srcs = ["a/b/c.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050073)`,
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050074 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020075 })
76}
77
78func TestCcObjectDefaults(t *testing.T) {
79 runCcObjectTestCase(t, bp2buildTestCase{
80 description: "simple cc_object with defaults",
81 moduleTypeUnderTest: "cc_object",
82 moduleTypeUnderTestFactory: cc.ObjectFactory,
83 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
84 blueprint: `cc_object {
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050085 name: "foo",
86 local_include_dirs: ["include"],
87 srcs: [
88 "a/b/*.h",
89 "a/b/c.c"
90 ],
91
92 defaults: ["foo_defaults"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050093}
94
95cc_defaults {
96 name: "foo_defaults",
97 defaults: ["foo_bar_defaults"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050098}
99
100cc_defaults {
101 name: "foo_bar_defaults",
102 cflags: [
103 "-Wno-gcc-compat",
104 "-Wall",
105 "-Werror",
106 ],
107}
108`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200109 expectedBazelTargets: []string{`cc_object(
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500110 name = "foo",
111 copts = [
112 "-Wno-gcc-compat",
113 "-Wall",
114 "-Werror",
115 "-fno-addrsig",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000116 "-Iinclude",
Chris Parsons484e50a2021-05-13 15:13:04 -0400117 "-I$(BINDIR)/include",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000118 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400119 "-I$(BINDIR)/.",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500120 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000121 srcs = ["a/b/c.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500122)`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200123 }})
124}
125
126func TestCcObjectCcObjetDepsInObjs(t *testing.T) {
127 runCcObjectTestCase(t, bp2buildTestCase{
128 description: "cc_object with cc_object deps in objs props",
129 moduleTypeUnderTest: "cc_object",
130 moduleTypeUnderTestFactory: cc.ObjectFactory,
131 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
132 filesystem: map[string]string{
133 "a/b/c.c": "",
134 "x/y/z.c": "",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500135 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200136 blueprint: `cc_object {
Jingwen Chendb120242021-02-23 00:46:47 -0500137 name: "foo",
138 srcs: ["a/b/c.c"],
139 objs: ["bar"],
Jingwen Chendb120242021-02-23 00:46:47 -0500140}
141
142cc_object {
143 name: "bar",
144 srcs: ["x/y/z.c"],
Jingwen Chendb120242021-02-23 00:46:47 -0500145}
146`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200147 expectedBazelTargets: []string{`cc_object(
Jingwen Chendb120242021-02-23 00:46:47 -0500148 name = "bar",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000149 copts = [
150 "-fno-addrsig",
151 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400152 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000153 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000154 srcs = ["x/y/z.c"],
Jingwen Chendb120242021-02-23 00:46:47 -0500155)`, `cc_object(
156 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000157 copts = [
158 "-fno-addrsig",
159 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400160 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000161 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000162 deps = [":bar"],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000163 srcs = ["a/b/c.c"],
Liz Kammera4aa4302021-03-18 16:56:36 -0400164)`,
Liz Kammera4aa4302021-03-18 16:56:36 -0400165 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200166 })
167}
168
169func TestCcObjectIncludeBuildDirFalse(t *testing.T) {
170 runCcObjectTestCase(t, bp2buildTestCase{
171 description: "cc_object with include_build_dir: false",
172 moduleTypeUnderTest: "cc_object",
173 moduleTypeUnderTestFactory: cc.ObjectFactory,
174 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
175 filesystem: map[string]string{
176 "a/b/c.c": "",
177 "x/y/z.c": "",
178 },
179 blueprint: `cc_object {
Liz Kammera4aa4302021-03-18 16:56:36 -0400180 name: "foo",
181 srcs: ["a/b/c.c"],
182 include_build_directory: false,
Liz Kammera4aa4302021-03-18 16:56:36 -0400183}
184`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200185 expectedBazelTargets: []string{`cc_object(
Liz Kammera4aa4302021-03-18 16:56:36 -0400186 name = "foo",
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000187 copts = ["-fno-addrsig"],
188 srcs = ["a/b/c.c"],
Jingwen Chendb120242021-02-23 00:46:47 -0500189)`,
Jingwen Chendb120242021-02-23 00:46:47 -0500190 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200191 })
192}
193
194func TestCcObjectProductVariable(t *testing.T) {
195 runCcObjectTestCase(t, bp2buildTestCase{
196 description: "cc_object with product variable",
197 moduleTypeUnderTest: "cc_object",
198 moduleTypeUnderTestFactory: cc.ObjectFactory,
199 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
200 blueprint: `cc_object {
Liz Kammera060c452021-03-24 10:14:47 -0400201 name: "foo",
202 include_build_directory: false,
203 product_variables: {
204 platform_sdk_version: {
205 asflags: ["-DPLATFORM_SDK_VERSION=%d"],
206 },
207 },
Liz Kammera060c452021-03-24 10:14:47 -0400208}
209`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200210 expectedBazelTargets: []string{`cc_object(
Liz Kammera060c452021-03-24 10:14:47 -0400211 name = "foo",
Liz Kammer6fd7b3f2021-05-06 13:54:29 -0400212 asflags = select({
213 "//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION={Platform_sdk_version}"],
214 "//conditions:default": [],
215 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000216 copts = ["-fno-addrsig"],
Liz Kammera060c452021-03-24 10:14:47 -0400217)`,
Liz Kammera060c452021-03-24 10:14:47 -0400218 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200219 })
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500220}
Jingwen Chen5d864492021-02-24 07:20:12 -0500221
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200222func TestCcObjectCflagsOneArch(t *testing.T) {
223 runCcObjectTestCase(t, bp2buildTestCase{
224 description: "cc_object setting cflags for one arch",
225 moduleTypeUnderTest: "cc_object",
226 moduleTypeUnderTestFactory: cc.ObjectFactory,
227 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
228 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500229 name: "foo",
Jingwen Chen07027912021-03-15 06:02:43 -0400230 srcs: ["a.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500231 arch: {
232 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400233 cflags: ["-fPIC"], // string list
234 },
235 arm: {
236 srcs: ["arch/arm/file.S"], // label list
Jingwen Chen5d864492021-02-24 07:20:12 -0500237 },
238 },
Jingwen Chen5d864492021-02-24 07:20:12 -0500239}
240`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200241 expectedBazelTargets: []string{
242 `cc_object(
Jingwen Chen5d864492021-02-24 07:20:12 -0500243 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000244 copts = [
245 "-fno-addrsig",
246 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400247 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000248 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000249 "//build/bazel/platforms/arch:x86": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400250 "//conditions:default": [],
Jingwen Chen5d864492021-02-24 07:20:12 -0500251 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000252 srcs = ["a.cpp"] + select({
253 "//build/bazel/platforms/arch:arm": ["arch/arm/file.S"],
Jingwen Chen07027912021-03-15 06:02:43 -0400254 "//conditions:default": [],
255 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500256)`,
Jingwen Chen5d864492021-02-24 07:20:12 -0500257 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200258 })
259}
260
261func TestCcObjectCflagsFourArch(t *testing.T) {
262 runCcObjectTestCase(t, bp2buildTestCase{
263 description: "cc_object setting cflags for 4 architectures",
264 moduleTypeUnderTest: "cc_object",
265 moduleTypeUnderTestFactory: cc.ObjectFactory,
266 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
267 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500268 name: "foo",
Jingwen Chen07027912021-03-15 06:02:43 -0400269 srcs: ["base.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500270 arch: {
271 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400272 srcs: ["x86.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500273 cflags: ["-fPIC"],
274 },
275 x86_64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400276 srcs: ["x86_64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500277 cflags: ["-fPIC"],
278 },
279 arm: {
Jingwen Chen07027912021-03-15 06:02:43 -0400280 srcs: ["arm.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500281 cflags: ["-Wall"],
282 },
283 arm64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400284 srcs: ["arm64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500285 cflags: ["-Wall"],
286 },
287 },
Jingwen Chen5d864492021-02-24 07:20:12 -0500288}
289`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200290 expectedBazelTargets: []string{
291 `cc_object(
Jingwen Chen5d864492021-02-24 07:20:12 -0500292 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000293 copts = [
294 "-fno-addrsig",
295 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400296 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000297 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000298 "//build/bazel/platforms/arch:arm": ["-Wall"],
299 "//build/bazel/platforms/arch:arm64": ["-Wall"],
300 "//build/bazel/platforms/arch:x86": ["-fPIC"],
301 "//build/bazel/platforms/arch:x86_64": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400302 "//conditions:default": [],
Jingwen Chen5d864492021-02-24 07:20:12 -0500303 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000304 srcs = ["base.cpp"] + select({
305 "//build/bazel/platforms/arch:arm": ["arm.cpp"],
306 "//build/bazel/platforms/arch:arm64": ["arm64.cpp"],
307 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
308 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen07027912021-03-15 06:02:43 -0400309 "//conditions:default": [],
310 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500311)`,
Jingwen Chen5d864492021-02-24 07:20:12 -0500312 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200313 })
314}
315
316func TestCcObjectCflagsMultiOs(t *testing.T) {
317 runCcObjectTestCase(t, bp2buildTestCase{
318 description: "cc_object setting cflags for multiple OSes",
319 moduleTypeUnderTest: "cc_object",
320 moduleTypeUnderTestFactory: cc.ObjectFactory,
321 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
322 blueprint: `cc_object {
Jingwen Chenc1c26502021-04-05 10:35:13 +0000323 name: "foo",
324 srcs: ["base.cpp"],
325 target: {
326 android: {
327 cflags: ["-fPIC"],
328 },
329 windows: {
330 cflags: ["-fPIC"],
331 },
332 darwin: {
333 cflags: ["-Wall"],
334 },
335 },
Jingwen Chenc1c26502021-04-05 10:35:13 +0000336}
337`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200338 expectedBazelTargets: []string{
339 `cc_object(
Jingwen Chenc1c26502021-04-05 10:35:13 +0000340 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000341 copts = [
342 "-fno-addrsig",
343 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400344 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000345 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000346 "//build/bazel/platforms/os:android": ["-fPIC"],
347 "//build/bazel/platforms/os:darwin": ["-Wall"],
348 "//build/bazel/platforms/os:windows": ["-fPIC"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000349 "//conditions:default": [],
350 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000351 srcs = ["base.cpp"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000352)`,
Jingwen Chenc1c26502021-04-05 10:35:13 +0000353 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200354 })
Jingwen Chen5d864492021-02-24 07:20:12 -0500355}