blob: b69135b6ea386bb9f7cbbbbe20fca72f233936f9 [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",
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000211 asflags = ["-DPLATFORM_SDK_VERSION={Platform_sdk_version}"],
212 copts = ["-fno-addrsig"],
Liz Kammera060c452021-03-24 10:14:47 -0400213)`,
Liz Kammera060c452021-03-24 10:14:47 -0400214 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200215 })
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500216}
Jingwen Chen5d864492021-02-24 07:20:12 -0500217
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200218func TestCcObjectCflagsOneArch(t *testing.T) {
219 runCcObjectTestCase(t, bp2buildTestCase{
220 description: "cc_object setting cflags for one arch",
221 moduleTypeUnderTest: "cc_object",
222 moduleTypeUnderTestFactory: cc.ObjectFactory,
223 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
224 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500225 name: "foo",
Jingwen Chen07027912021-03-15 06:02:43 -0400226 srcs: ["a.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500227 arch: {
228 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400229 cflags: ["-fPIC"], // string list
230 },
231 arm: {
232 srcs: ["arch/arm/file.S"], // label list
Jingwen Chen5d864492021-02-24 07:20:12 -0500233 },
234 },
Jingwen Chen5d864492021-02-24 07:20:12 -0500235}
236`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200237 expectedBazelTargets: []string{
238 `cc_object(
Jingwen Chen5d864492021-02-24 07:20:12 -0500239 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000240 copts = [
241 "-fno-addrsig",
242 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400243 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000244 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000245 "//build/bazel/platforms/arch:x86": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400246 "//conditions:default": [],
Jingwen Chen5d864492021-02-24 07:20:12 -0500247 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000248 srcs = ["a.cpp"] + select({
249 "//build/bazel/platforms/arch:arm": ["arch/arm/file.S"],
Jingwen Chen07027912021-03-15 06:02:43 -0400250 "//conditions:default": [],
251 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500252)`,
Jingwen Chen5d864492021-02-24 07:20:12 -0500253 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200254 })
255}
256
257func TestCcObjectCflagsFourArch(t *testing.T) {
258 runCcObjectTestCase(t, bp2buildTestCase{
259 description: "cc_object setting cflags for 4 architectures",
260 moduleTypeUnderTest: "cc_object",
261 moduleTypeUnderTestFactory: cc.ObjectFactory,
262 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
263 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500264 name: "foo",
Jingwen Chen07027912021-03-15 06:02:43 -0400265 srcs: ["base.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500266 arch: {
267 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400268 srcs: ["x86.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500269 cflags: ["-fPIC"],
270 },
271 x86_64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400272 srcs: ["x86_64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500273 cflags: ["-fPIC"],
274 },
275 arm: {
Jingwen Chen07027912021-03-15 06:02:43 -0400276 srcs: ["arm.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500277 cflags: ["-Wall"],
278 },
279 arm64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400280 srcs: ["arm64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500281 cflags: ["-Wall"],
282 },
283 },
Jingwen Chen5d864492021-02-24 07:20:12 -0500284}
285`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200286 expectedBazelTargets: []string{
287 `cc_object(
Jingwen Chen5d864492021-02-24 07:20:12 -0500288 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000289 copts = [
290 "-fno-addrsig",
291 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400292 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000293 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000294 "//build/bazel/platforms/arch:arm": ["-Wall"],
295 "//build/bazel/platforms/arch:arm64": ["-Wall"],
296 "//build/bazel/platforms/arch:x86": ["-fPIC"],
297 "//build/bazel/platforms/arch:x86_64": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400298 "//conditions:default": [],
Jingwen Chen5d864492021-02-24 07:20:12 -0500299 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000300 srcs = ["base.cpp"] + select({
301 "//build/bazel/platforms/arch:arm": ["arm.cpp"],
302 "//build/bazel/platforms/arch:arm64": ["arm64.cpp"],
303 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
304 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen07027912021-03-15 06:02:43 -0400305 "//conditions:default": [],
306 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500307)`,
Jingwen Chen5d864492021-02-24 07:20:12 -0500308 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200309 })
310}
311
312func TestCcObjectCflagsMultiOs(t *testing.T) {
313 runCcObjectTestCase(t, bp2buildTestCase{
314 description: "cc_object setting cflags for multiple OSes",
315 moduleTypeUnderTest: "cc_object",
316 moduleTypeUnderTestFactory: cc.ObjectFactory,
317 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
318 blueprint: `cc_object {
Jingwen Chenc1c26502021-04-05 10:35:13 +0000319 name: "foo",
320 srcs: ["base.cpp"],
321 target: {
322 android: {
323 cflags: ["-fPIC"],
324 },
325 windows: {
326 cflags: ["-fPIC"],
327 },
328 darwin: {
329 cflags: ["-Wall"],
330 },
331 },
Jingwen Chenc1c26502021-04-05 10:35:13 +0000332}
333`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200334 expectedBazelTargets: []string{
335 `cc_object(
Jingwen Chenc1c26502021-04-05 10:35:13 +0000336 name = "foo",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000337 copts = [
338 "-fno-addrsig",
339 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400340 "-I$(BINDIR)/.",
Jingwen Chened9c17d2021-04-13 07:14:55 +0000341 ] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000342 "//build/bazel/platforms/os:android": ["-fPIC"],
343 "//build/bazel/platforms/os:darwin": ["-Wall"],
344 "//build/bazel/platforms/os:windows": ["-fPIC"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000345 "//conditions:default": [],
346 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000347 srcs = ["base.cpp"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000348)`,
Jingwen Chenc1c26502021-04-05 10:35:13 +0000349 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200350 })
Jingwen Chen5d864492021-02-24 07:20:12 -0500351}