blob: 4bda539fba268bfe7fbd8e1e155d96df3cac6895 [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"],
Colin Cross6b8f4252021-07-22 11:39:44 -070049 system_shared_libs: [],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050050 cflags: [
51 "-Wno-gcc-compat",
52 "-Wall",
53 "-Werror",
54 ],
55 srcs: [
Jingwen Chendb120242021-02-23 00:46:47 -050056 "a/b/*.c"
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050057 ],
Jingwen Chendb120242021-02-23 00:46:47 -050058 exclude_srcs: ["a/b/exclude.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050059}
60`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020061 expectedBazelTargets: []string{`cc_object(
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050062 name = "foo",
63 copts = [
64 "-fno-addrsig",
65 "-Wno-gcc-compat",
66 "-Wall",
67 "-Werror",
Jingwen Chened9c17d2021-04-13 07:14:55 +000068 "-Iinclude",
Chris Parsons484e50a2021-05-13 15:13:04 -040069 "-I$(BINDIR)/include",
Jingwen Chened9c17d2021-04-13 07:14:55 +000070 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -040071 "-I$(BINDIR)/.",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050072 ],
Jingwen Chen882bcc12021-04-27 05:54:20 +000073 srcs = ["a/b/c.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050074)`,
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050075 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020076 })
77}
78
79func TestCcObjectDefaults(t *testing.T) {
80 runCcObjectTestCase(t, bp2buildTestCase{
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020081 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",
Colin Cross6b8f4252021-07-22 11:39:44 -070086 system_shared_libs: [],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050087 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 "-I.",
Chris Parsons484e50a2021-05-13 15:13:04 -0400117 "-I$(BINDIR)/.",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500118 ],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000119 srcs = ["a/b/c.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500120)`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200121 }})
122}
123
124func TestCcObjectCcObjetDepsInObjs(t *testing.T) {
125 runCcObjectTestCase(t, bp2buildTestCase{
126 description: "cc_object with cc_object deps in objs props",
127 moduleTypeUnderTest: "cc_object",
128 moduleTypeUnderTestFactory: cc.ObjectFactory,
129 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
130 filesystem: map[string]string{
131 "a/b/c.c": "",
132 "x/y/z.c": "",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500133 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200134 blueprint: `cc_object {
Jingwen Chendb120242021-02-23 00:46:47 -0500135 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700136 system_shared_libs: [],
Jingwen Chendb120242021-02-23 00:46:47 -0500137 srcs: ["a/b/c.c"],
138 objs: ["bar"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400139 include_build_directory: false,
Jingwen Chendb120242021-02-23 00:46:47 -0500140}
141
142cc_object {
143 name: "bar",
Colin Cross6b8f4252021-07-22 11:39:44 -0700144 system_shared_libs: [],
Jingwen Chendb120242021-02-23 00:46:47 -0500145 srcs: ["x/y/z.c"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400146 include_build_directory: false,
Jingwen Chendb120242021-02-23 00:46:47 -0500147}
148`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200149 expectedBazelTargets: []string{`cc_object(
Jingwen Chendb120242021-02-23 00:46:47 -0500150 name = "bar",
Liz Kammer8337ea42021-09-10 10:06:32 -0400151 copts = ["-fno-addrsig"],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000152 srcs = ["x/y/z.c"],
Jingwen Chendb120242021-02-23 00:46:47 -0500153)`, `cc_object(
154 name = "foo",
Liz Kammer8337ea42021-09-10 10:06:32 -0400155 copts = ["-fno-addrsig"],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000156 deps = [":bar"],
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000157 srcs = ["a/b/c.c"],
Liz Kammera4aa4302021-03-18 16:56:36 -0400158)`,
Liz Kammera4aa4302021-03-18 16:56:36 -0400159 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200160 })
161}
162
163func TestCcObjectIncludeBuildDirFalse(t *testing.T) {
164 runCcObjectTestCase(t, bp2buildTestCase{
165 description: "cc_object with include_build_dir: false",
166 moduleTypeUnderTest: "cc_object",
167 moduleTypeUnderTestFactory: cc.ObjectFactory,
168 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
169 filesystem: map[string]string{
170 "a/b/c.c": "",
171 "x/y/z.c": "",
172 },
173 blueprint: `cc_object {
Liz Kammera4aa4302021-03-18 16:56:36 -0400174 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700175 system_shared_libs: [],
Liz Kammera4aa4302021-03-18 16:56:36 -0400176 srcs: ["a/b/c.c"],
177 include_build_directory: false,
Liz Kammera4aa4302021-03-18 16:56:36 -0400178}
179`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200180 expectedBazelTargets: []string{`cc_object(
Liz Kammera4aa4302021-03-18 16:56:36 -0400181 name = "foo",
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000182 copts = ["-fno-addrsig"],
183 srcs = ["a/b/c.c"],
Jingwen Chendb120242021-02-23 00:46:47 -0500184)`,
Jingwen Chendb120242021-02-23 00:46:47 -0500185 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200186 })
187}
188
189func TestCcObjectProductVariable(t *testing.T) {
190 runCcObjectTestCase(t, bp2buildTestCase{
191 description: "cc_object with product variable",
192 moduleTypeUnderTest: "cc_object",
193 moduleTypeUnderTestFactory: cc.ObjectFactory,
194 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
195 blueprint: `cc_object {
Liz Kammera060c452021-03-24 10:14:47 -0400196 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700197 system_shared_libs: [],
Liz Kammera060c452021-03-24 10:14:47 -0400198 include_build_directory: false,
199 product_variables: {
200 platform_sdk_version: {
201 asflags: ["-DPLATFORM_SDK_VERSION=%d"],
202 },
203 },
Chris Parsons69fa9f92021-07-13 11:47:44 -0400204 srcs: ["src.S"],
Liz Kammera060c452021-03-24 10:14:47 -0400205}
206`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200207 expectedBazelTargets: []string{`cc_object(
Liz Kammera060c452021-03-24 10:14:47 -0400208 name = "foo",
Liz Kammer6fd7b3f2021-05-06 13:54:29 -0400209 asflags = select({
Liz Kammerba7a9c52021-05-26 08:45:30 -0400210 "//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION=$(Platform_sdk_version)"],
Liz Kammer6fd7b3f2021-05-06 13:54:29 -0400211 "//conditions:default": [],
212 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000213 copts = ["-fno-addrsig"],
Chris Parsons69fa9f92021-07-13 11:47:44 -0400214 srcs_as = ["src.S"],
Liz Kammera060c452021-03-24 10:14:47 -0400215)`,
Liz Kammera060c452021-03-24 10:14:47 -0400216 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200217 })
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500218}
Jingwen Chen5d864492021-02-24 07:20:12 -0500219
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200220func TestCcObjectCflagsOneArch(t *testing.T) {
221 runCcObjectTestCase(t, bp2buildTestCase{
222 description: "cc_object setting cflags for one arch",
223 moduleTypeUnderTest: "cc_object",
224 moduleTypeUnderTestFactory: cc.ObjectFactory,
225 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
226 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500227 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700228 system_shared_libs: [],
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: {
Chris Parsons69fa9f92021-07-13 11:47:44 -0400235 srcs: ["arch/arm/file.cpp"], // label list
Jingwen Chen5d864492021-02-24 07:20:12 -0500236 },
237 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400238 include_build_directory: false,
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",
Liz Kammer8337ea42021-09-10 10:06:32 -0400244 copts = ["-fno-addrsig"] + 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({
Chris Parsons69fa9f92021-07-13 11:47:44 -0400249 "//build/bazel/platforms/arch:arm": ["arch/arm/file.cpp"],
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",
Colin Cross6b8f4252021-07-22 11:39:44 -0700265 system_shared_libs: [],
Jingwen Chen07027912021-03-15 06:02:43 -0400266 srcs: ["base.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500267 arch: {
268 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400269 srcs: ["x86.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500270 cflags: ["-fPIC"],
271 },
272 x86_64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400273 srcs: ["x86_64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500274 cflags: ["-fPIC"],
275 },
276 arm: {
Jingwen Chen07027912021-03-15 06:02:43 -0400277 srcs: ["arm.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500278 cflags: ["-Wall"],
279 },
280 arm64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400281 srcs: ["arm64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500282 cflags: ["-Wall"],
283 },
284 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400285 include_build_directory: false,
Jingwen Chen5d864492021-02-24 07:20:12 -0500286}
287`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200288 expectedBazelTargets: []string{
289 `cc_object(
Jingwen Chen5d864492021-02-24 07:20:12 -0500290 name = "foo",
Liz Kammer8337ea42021-09-10 10:06:32 -0400291 copts = ["-fno-addrsig"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000292 "//build/bazel/platforms/arch:arm": ["-Wall"],
293 "//build/bazel/platforms/arch:arm64": ["-Wall"],
294 "//build/bazel/platforms/arch:x86": ["-fPIC"],
295 "//build/bazel/platforms/arch:x86_64": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400296 "//conditions:default": [],
Jingwen Chen5d864492021-02-24 07:20:12 -0500297 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000298 srcs = ["base.cpp"] + select({
299 "//build/bazel/platforms/arch:arm": ["arm.cpp"],
300 "//build/bazel/platforms/arch:arm64": ["arm64.cpp"],
301 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
302 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen07027912021-03-15 06:02:43 -0400303 "//conditions:default": [],
304 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500305)`,
Jingwen Chen5d864492021-02-24 07:20:12 -0500306 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200307 })
308}
309
310func TestCcObjectCflagsMultiOs(t *testing.T) {
311 runCcObjectTestCase(t, bp2buildTestCase{
312 description: "cc_object setting cflags for multiple OSes",
313 moduleTypeUnderTest: "cc_object",
314 moduleTypeUnderTestFactory: cc.ObjectFactory,
315 moduleTypeUnderTestBp2BuildMutator: cc.ObjectBp2Build,
316 blueprint: `cc_object {
Jingwen Chenc1c26502021-04-05 10:35:13 +0000317 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700318 system_shared_libs: [],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000319 srcs: ["base.cpp"],
320 target: {
321 android: {
322 cflags: ["-fPIC"],
323 },
324 windows: {
325 cflags: ["-fPIC"],
326 },
327 darwin: {
328 cflags: ["-Wall"],
329 },
330 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400331 include_build_directory: false,
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",
Liz Kammer8337ea42021-09-10 10:06:32 -0400337 copts = ["-fno-addrsig"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000338 "//build/bazel/platforms/os:android": ["-fPIC"],
339 "//build/bazel/platforms/os:darwin": ["-Wall"],
340 "//build/bazel/platforms/os:windows": ["-fPIC"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000341 "//conditions:default": [],
342 }),
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000343 srcs = ["base.cpp"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000344)`,
Jingwen Chenc1c26502021-04-05 10:35:13 +0000345 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200346 })
Jingwen Chen5d864492021-02-24 07:20:12 -0500347}