blob: 67ea70e2c787b6d4a761ccbf0a702e01d8618de7 [file] [log] [blame]
Jingwen Chen91220d72021-03-24 02:18: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.
14package cc
15
16import (
Jingwen Chen14a8bda2021-06-02 11:10:02 +000017 "fmt"
Jingwen Chened9c17d2021-04-13 07:14:55 +000018 "path/filepath"
Jingwen Chen3950cd62021-05-12 04:33:00 +000019 "strings"
Chris Parsons484e50a2021-05-13 15:13:04 -040020
21 "android/soong/android"
22 "android/soong/bazel"
Liz Kammerba7a9c52021-05-26 08:45:30 -040023
24 "github.com/google/blueprint/proptools"
Jingwen Chen91220d72021-03-24 02:18:33 -040025)
26
Liz Kammer2222c6b2021-05-24 15:41:47 -040027// staticOrSharedAttributes are the Bazel-ified versions of StaticOrSharedProperties --
Jingwen Chenbcf53042021-05-26 04:42:42 +000028// properties which apply to either the shared or static version of a cc_library module.
Liz Kammer2222c6b2021-05-24 15:41:47 -040029type staticOrSharedAttributes struct {
Jingwen Chenc4dc9b42021-06-11 12:51:48 +000030 Srcs bazel.LabelListAttribute
31 Srcs_c bazel.LabelListAttribute
32 Srcs_as bazel.LabelListAttribute
33 Copts bazel.StringListAttribute
Jingwen Chen14a8bda2021-06-02 11:10:02 +000034
Jingwen Chenc4dc9b42021-06-11 12:51:48 +000035 Static_deps bazel.LabelListAttribute
36 Dynamic_deps bazel.LabelListAttribute
37 Whole_archive_deps bazel.LabelListAttribute
Chris Parsons51f8c392021-08-03 21:01:05 -040038
39 System_dynamic_deps bazel.LabelListAttribute
Jingwen Chen53681ef2021-04-29 08:15:13 +000040}
41
Jingwen Chen14a8bda2021-06-02 11:10:02 +000042func groupSrcsByExtension(ctx android.TopDownMutatorContext, srcs bazel.LabelListAttribute) (cppSrcs, cSrcs, asSrcs bazel.LabelListAttribute) {
43 // Branch srcs into three language-specific groups.
44 // C++ is the "catch-all" group, and comprises generated sources because we don't
45 // know the language of these sources until the genrule is executed.
46 // TODO(b/190006308): Handle language detection of sources in a Bazel rule.
47 isCSrcOrFilegroup := func(s string) bool {
48 return strings.HasSuffix(s, ".c") || strings.HasSuffix(s, "_c_srcs")
49 }
50
51 isAsmSrcOrFilegroup := func(s string) bool {
52 return strings.HasSuffix(s, ".S") || strings.HasSuffix(s, ".s") || strings.HasSuffix(s, "_as_srcs")
53 }
54
55 // Check that a module is a filegroup type named <label>.
56 isFilegroupNamed := func(m android.Module, fullLabel string) bool {
57 if ctx.OtherModuleType(m) != "filegroup" {
58 return false
59 }
60 labelParts := strings.Split(fullLabel, ":")
61 if len(labelParts) > 2 {
62 // There should not be more than one colon in a label.
63 panic(fmt.Errorf("%s is not a valid Bazel label for a filegroup", fullLabel))
64 } else {
65 return m.Name() == labelParts[len(labelParts)-1]
66 }
67 }
68
69 // Convert the filegroup dependencies into the extension-specific filegroups
70 // filtered in the filegroup.bzl macro.
71 cppFilegroup := func(label string) string {
Chris Parsons5a34ffb2021-07-21 14:34:58 -040072 m, exists := ctx.ModuleFromName(label)
73 if exists {
74 aModule, _ := m.(android.Module)
75 if isFilegroupNamed(aModule, label) {
Jingwen Chen14a8bda2021-06-02 11:10:02 +000076 label = label + "_cpp_srcs"
Jingwen Chen14a8bda2021-06-02 11:10:02 +000077 }
Chris Parsons5a34ffb2021-07-21 14:34:58 -040078 }
Jingwen Chen14a8bda2021-06-02 11:10:02 +000079 return label
80 }
81 cFilegroup := func(label string) string {
Chris Parsons5a34ffb2021-07-21 14:34:58 -040082 m, exists := ctx.ModuleFromName(label)
83 if exists {
84 aModule, _ := m.(android.Module)
85 if isFilegroupNamed(aModule, label) {
Jingwen Chen14a8bda2021-06-02 11:10:02 +000086 label = label + "_c_srcs"
Jingwen Chen14a8bda2021-06-02 11:10:02 +000087 }
Chris Parsons5a34ffb2021-07-21 14:34:58 -040088 }
Jingwen Chen14a8bda2021-06-02 11:10:02 +000089 return label
90 }
91 asFilegroup := func(label string) string {
Chris Parsons5a34ffb2021-07-21 14:34:58 -040092 m, exists := ctx.ModuleFromName(label)
93 if exists {
94 aModule, _ := m.(android.Module)
95 if isFilegroupNamed(aModule, label) {
Jingwen Chen14a8bda2021-06-02 11:10:02 +000096 label = label + "_as_srcs"
Jingwen Chen14a8bda2021-06-02 11:10:02 +000097 }
Chris Parsons5a34ffb2021-07-21 14:34:58 -040098 }
Jingwen Chen14a8bda2021-06-02 11:10:02 +000099 return label
100 }
101
102 cSrcs = bazel.MapLabelListAttribute(srcs, cFilegroup)
103 cSrcs = bazel.FilterLabelListAttribute(cSrcs, isCSrcOrFilegroup)
104
105 asSrcs = bazel.MapLabelListAttribute(srcs, asFilegroup)
106 asSrcs = bazel.FilterLabelListAttribute(asSrcs, isAsmSrcOrFilegroup)
107
108 cppSrcs = bazel.MapLabelListAttribute(srcs, cppFilegroup)
109 cppSrcs = bazel.SubtractBazelLabelListAttribute(cppSrcs, cSrcs)
110 cppSrcs = bazel.SubtractBazelLabelListAttribute(cppSrcs, asSrcs)
111 return
112}
113
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000114// bp2BuildParseLibProps returns the attributes for a variant of a cc_library.
115func bp2BuildParseLibProps(ctx android.TopDownMutatorContext, module *Module, isStatic bool) staticOrSharedAttributes {
Jingwen Chen53681ef2021-04-29 08:15:13 +0000116 lib, ok := module.compiler.(*libraryDecorator)
117 if !ok {
Liz Kammer2222c6b2021-05-24 15:41:47 -0400118 return staticOrSharedAttributes{}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000119 }
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000120 return bp2buildParseStaticOrSharedProps(ctx, module, lib, isStatic)
121}
Jingwen Chen53681ef2021-04-29 08:15:13 +0000122
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000123// bp2buildParseSharedProps returns the attributes for the shared variant of a cc_library.
124func bp2BuildParseSharedProps(ctx android.TopDownMutatorContext, module *Module) staticOrSharedAttributes {
125 return bp2BuildParseLibProps(ctx, module, false)
Jingwen Chen53681ef2021-04-29 08:15:13 +0000126}
127
128// bp2buildParseStaticProps returns the attributes for the static variant of a cc_library.
Liz Kammer2222c6b2021-05-24 15:41:47 -0400129func bp2BuildParseStaticProps(ctx android.TopDownMutatorContext, module *Module) staticOrSharedAttributes {
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000130 return bp2BuildParseLibProps(ctx, module, true)
Liz Kammer2222c6b2021-05-24 15:41:47 -0400131}
132
Jingwen Chenbcf53042021-05-26 04:42:42 +0000133func bp2buildParseStaticOrSharedProps(ctx android.TopDownMutatorContext, module *Module, lib *libraryDecorator, isStatic bool) staticOrSharedAttributes {
Liz Kammer135bf552021-08-11 10:46:06 -0400134 attrs := staticOrSharedAttributes{}
Jingwen Chenbcf53042021-05-26 04:42:42 +0000135
Liz Kammer9abd62d2021-05-21 08:37:59 -0400136 setAttrs := func(axis bazel.ConfigurationAxis, config string, props StaticOrSharedProperties) {
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000137 attrs.Copts.SetSelectValue(axis, config, props.Cflags)
138 attrs.Srcs.SetSelectValue(axis, config, android.BazelLabelForModuleSrc(ctx, props.Srcs))
139 attrs.Static_deps.SetSelectValue(axis, config, android.BazelLabelForModuleDeps(ctx, props.Static_libs))
140 attrs.Dynamic_deps.SetSelectValue(axis, config, android.BazelLabelForModuleDeps(ctx, props.Shared_libs))
141 attrs.Whole_archive_deps.SetSelectValue(axis, config, android.BazelLabelForModuleWholeDeps(ctx, props.Whole_static_libs))
Chris Parsons51f8c392021-08-03 21:01:05 -0400142 attrs.System_dynamic_deps.SetSelectValue(axis, config, android.BazelLabelForModuleDeps(ctx, props.System_shared_libs))
Jingwen Chenbcf53042021-05-26 04:42:42 +0000143 }
Liz Kammer135bf552021-08-11 10:46:06 -0400144 // system_dynamic_deps distinguishes between nil/empty list behavior:
145 // nil -> use default values
146 // empty list -> no values specified
147 attrs.System_dynamic_deps.ForceSpecifyEmptyList = true
Jingwen Chenbcf53042021-05-26 04:42:42 +0000148
149 if isStatic {
Liz Kammer9abd62d2021-05-21 08:37:59 -0400150 for axis, configToProps := range module.GetArchVariantProperties(ctx, &StaticProperties{}) {
151 for config, props := range configToProps {
152 if staticOrSharedProps, ok := props.(*StaticProperties); ok {
153 setAttrs(axis, config, staticOrSharedProps.Static)
Jingwen Chenbcf53042021-05-26 04:42:42 +0000154 }
155 }
156 }
157 } else {
Liz Kammer9abd62d2021-05-21 08:37:59 -0400158 for axis, configToProps := range module.GetArchVariantProperties(ctx, &SharedProperties{}) {
159 for config, props := range configToProps {
160 if staticOrSharedProps, ok := props.(*SharedProperties); ok {
161 setAttrs(axis, config, staticOrSharedProps.Shared)
Jingwen Chenbcf53042021-05-26 04:42:42 +0000162 }
163 }
164 }
165 }
166
Jingwen Chenc4dc9b42021-06-11 12:51:48 +0000167 cppSrcs, cSrcs, asSrcs := groupSrcsByExtension(ctx, attrs.Srcs)
168 attrs.Srcs = cppSrcs
169 attrs.Srcs_c = cSrcs
170 attrs.Srcs_as = asSrcs
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000171
Jingwen Chenbcf53042021-05-26 04:42:42 +0000172 return attrs
Jingwen Chen53681ef2021-04-29 08:15:13 +0000173}
174
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400175// Convenience struct to hold all attributes parsed from prebuilt properties.
176type prebuiltAttributes struct {
177 Src bazel.LabelAttribute
178}
179
Alex Márquez Pérez Muñíz Díaz Púras Thaureauxac5097f2021-09-01 21:22:09 +0000180// NOTE: Used outside of Soong repo project, in the clangprebuilts.go bootstrap_go_package
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400181func Bp2BuildParsePrebuiltLibraryProps(ctx android.TopDownMutatorContext, module *Module) prebuiltAttributes {
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400182 var srcLabelAttribute bazel.LabelAttribute
183
Liz Kammer9abd62d2021-05-21 08:37:59 -0400184 for axis, configToProps := range module.GetArchVariantProperties(ctx, &prebuiltLinkerProperties{}) {
185 for config, props := range configToProps {
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400186 if prebuiltLinkerProperties, ok := props.(*prebuiltLinkerProperties); ok {
187 if len(prebuiltLinkerProperties.Srcs) > 1 {
Liz Kammer9abd62d2021-05-21 08:37:59 -0400188 ctx.ModuleErrorf("Bp2BuildParsePrebuiltLibraryProps: Expected at most once source file for %s %s\n", axis, config)
189 continue
190 } else if len(prebuiltLinkerProperties.Srcs) == 0 {
191 continue
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400192 }
Liz Kammer9abd62d2021-05-21 08:37:59 -0400193 src := android.BazelLabelForModuleSrcSingle(ctx, prebuiltLinkerProperties.Srcs[0])
194 srcLabelAttribute.SetSelectValue(axis, config, src)
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400195 }
196 }
197 }
198
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400199 return prebuiltAttributes{
200 Src: srcLabelAttribute,
201 }
202}
203
Jingwen Chen107c0de2021-04-09 10:43:12 +0000204// Convenience struct to hold all attributes parsed from compiler properties.
205type compilerAttributes struct {
Chris Parsons990c4f42021-05-25 12:10:58 -0400206 // Options for all languages
207 copts bazel.StringListAttribute
208 // Assembly options and sources
209 asFlags bazel.StringListAttribute
210 asSrcs bazel.LabelListAttribute
211 // C options and sources
212 conlyFlags bazel.StringListAttribute
213 cSrcs bazel.LabelListAttribute
214 // C++ options and sources
215 cppFlags bazel.StringListAttribute
Jingwen Chened9c17d2021-04-13 07:14:55 +0000216 srcs bazel.LabelListAttribute
Chris Parsons2c788392021-08-10 11:58:07 -0400217
218 rtti bazel.BoolAttribute
Liz Kammer35687bc2021-09-10 10:07:07 -0400219
220 localIncludes bazel.StringListAttribute
221 absoluteIncludes bazel.StringListAttribute
Jingwen Chen107c0de2021-04-09 10:43:12 +0000222}
223
Jingwen Chen63930982021-03-24 10:04:33 -0400224// bp2BuildParseCompilerProps returns copts, srcs and hdrs and other attributes.
Jingwen Chen107c0de2021-04-09 10:43:12 +0000225func bp2BuildParseCompilerProps(ctx android.TopDownMutatorContext, module *Module) compilerAttributes {
Jingwen Chen882bcc12021-04-27 05:54:20 +0000226 var srcs bazel.LabelListAttribute
Jingwen Chen107c0de2021-04-09 10:43:12 +0000227 var copts bazel.StringListAttribute
Chris Parsons990c4f42021-05-25 12:10:58 -0400228 var asFlags bazel.StringListAttribute
229 var conlyFlags bazel.StringListAttribute
230 var cppFlags bazel.StringListAttribute
Chris Parsons2c788392021-08-10 11:58:07 -0400231 var rtti bazel.BoolAttribute
Liz Kammer35687bc2021-09-10 10:07:07 -0400232 var localIncludes bazel.StringListAttribute
233 var absoluteIncludes bazel.StringListAttribute
Jingwen Chened9c17d2021-04-13 07:14:55 +0000234
Chris Parsons990c4f42021-05-25 12:10:58 -0400235 parseCommandLineFlags := func(soongFlags []string) []string {
236 var result []string
237 for _, flag := range soongFlags {
Colin Cross52aa4e12021-05-25 15:20:39 +0000238 // Soong's cflags can contain spaces, like `-include header.h`. For
239 // Bazel's copts, split them up to be compatible with the
240 // no_copts_tokenization feature.
Chris Parsons990c4f42021-05-25 12:10:58 -0400241 result = append(result, strings.Split(flag, " ")...)
Colin Cross52aa4e12021-05-25 15:20:39 +0000242 }
Chris Parsons990c4f42021-05-25 12:10:58 -0400243 return result
244 }
245
Liz Kammer74deed42021-06-02 13:02:03 -0400246 // Parse srcs from an arch or OS's props value.
Jingwen Chene32e9e02021-04-23 09:17:24 +0000247 parseSrcs := func(baseCompilerProps *BaseCompilerProperties) bazel.LabelList {
Chris Parsons484e50a2021-05-13 15:13:04 -0400248 // Add srcs-like dependencies such as generated files.
249 // First create a LabelList containing these dependencies, then merge the values with srcs.
250 generatedHdrsAndSrcs := baseCompilerProps.Generated_headers
251 generatedHdrsAndSrcs = append(generatedHdrsAndSrcs, baseCompilerProps.Generated_sources...)
Chris Parsons484e50a2021-05-13 15:13:04 -0400252 generatedHdrsAndSrcsLabelList := android.BazelLabelForModuleDeps(ctx, generatedHdrsAndSrcs)
253
Liz Kammer74deed42021-06-02 13:02:03 -0400254 allSrcsLabelList := android.BazelLabelForModuleSrcExcludes(ctx, baseCompilerProps.Srcs, baseCompilerProps.Exclude_srcs)
Chris Parsons484e50a2021-05-13 15:13:04 -0400255 return bazel.AppendBazelLabelLists(allSrcsLabelList, generatedHdrsAndSrcsLabelList)
Jingwen Chene32e9e02021-04-23 09:17:24 +0000256 }
257
Liz Kammer9abd62d2021-05-21 08:37:59 -0400258 archVariantCompilerProps := module.GetArchVariantProperties(ctx, &BaseCompilerProperties{})
Liz Kammer9abd62d2021-05-21 08:37:59 -0400259 for axis, configToProps := range archVariantCompilerProps {
260 for config, props := range configToProps {
261 if baseCompilerProps, ok := props.(*BaseCompilerProperties); ok {
262 // If there's arch specific srcs or exclude_srcs, generate a select entry for it.
263 // TODO(b/186153868): do this for OS specific srcs and exclude_srcs too.
264 if len(baseCompilerProps.Srcs) > 0 || len(baseCompilerProps.Exclude_srcs) > 0 {
265 srcsList := parseSrcs(baseCompilerProps)
266 srcs.SetSelectValue(axis, config, srcsList)
Liz Kammer9abd62d2021-05-21 08:37:59 -0400267 }
268
Chris Parsons69fa9f92021-07-13 11:47:44 -0400269 archVariantCopts := parseCommandLineFlags(baseCompilerProps.Cflags)
270 archVariantAsflags := parseCommandLineFlags(baseCompilerProps.Asflags)
Liz Kammer35687bc2021-09-10 10:07:07 -0400271
272 localIncludeDirs := baseCompilerProps.Local_include_dirs
273 if axis == bazel.NoConfigAxis && includeBuildDirectory(baseCompilerProps.Include_build_directory) {
274 localIncludeDirs = append(localIncludeDirs, ".")
Chris Parsons69fa9f92021-07-13 11:47:44 -0400275 }
276
Liz Kammer35687bc2021-09-10 10:07:07 -0400277 absoluteIncludes.SetSelectValue(axis, config, baseCompilerProps.Include_dirs)
278 localIncludes.SetSelectValue(axis, config, localIncludeDirs)
Liz Kammer135bf552021-08-11 10:46:06 -0400279
Chris Parsons69fa9f92021-07-13 11:47:44 -0400280 copts.SetSelectValue(axis, config, archVariantCopts)
281 asFlags.SetSelectValue(axis, config, archVariantAsflags)
Liz Kammer9abd62d2021-05-21 08:37:59 -0400282 conlyFlags.SetSelectValue(axis, config, parseCommandLineFlags(baseCompilerProps.Conlyflags))
283 cppFlags.SetSelectValue(axis, config, parseCommandLineFlags(baseCompilerProps.Cppflags))
Chris Parsons2c788392021-08-10 11:58:07 -0400284 rtti.SetSelectValue(axis, config, baseCompilerProps.Rtti)
Liz Kammer9abd62d2021-05-21 08:37:59 -0400285 }
Jingwen Chenc1c26502021-04-05 10:35:13 +0000286 }
287 }
288
Liz Kammer74deed42021-06-02 13:02:03 -0400289 srcs.ResolveExcludes()
Liz Kammer35687bc2021-09-10 10:07:07 -0400290 absoluteIncludes.DeduplicateAxesFromBase()
291 localIncludes.DeduplicateAxesFromBase()
Jingwen Chenc1c26502021-04-05 10:35:13 +0000292
Liz Kammerba7a9c52021-05-26 08:45:30 -0400293 productVarPropNameToAttribute := map[string]*bazel.StringListAttribute{
294 "Cflags": &copts,
295 "Asflags": &asFlags,
296 "CppFlags": &cppFlags,
297 }
Liz Kammer6fd7b3f2021-05-06 13:54:29 -0400298 productVariableProps := android.ProductVariableProperties(ctx)
Liz Kammerba7a9c52021-05-26 08:45:30 -0400299 for propName, attr := range productVarPropNameToAttribute {
300 if props, exists := productVariableProps[propName]; exists {
301 for _, prop := range props {
302 flags, ok := prop.Property.([]string)
303 if !ok {
304 ctx.ModuleErrorf("Could not convert product variable %s property", proptools.PropertyNameForField(propName))
305 }
306 newFlags, _ := bazel.TryVariableSubstitutions(flags, prop.ProductConfigVariable)
Liz Kammer47535c52021-06-02 16:02:22 -0400307 attr.SetSelectValue(bazel.ProductVariableConfigurationAxis(prop.FullConfig), prop.FullConfig, newFlags)
Liz Kammer6fd7b3f2021-05-06 13:54:29 -0400308 }
Liz Kammer6fd7b3f2021-05-06 13:54:29 -0400309 }
310 }
311
Jingwen Chen14a8bda2021-06-02 11:10:02 +0000312 srcs, cSrcs, asSrcs := groupSrcsByExtension(ctx, srcs)
313
Jingwen Chen107c0de2021-04-09 10:43:12 +0000314 return compilerAttributes{
Liz Kammer35687bc2021-09-10 10:07:07 -0400315 copts: copts,
316 srcs: srcs,
317 asFlags: asFlags,
318 asSrcs: asSrcs,
319 cSrcs: cSrcs,
320 conlyFlags: conlyFlags,
321 cppFlags: cppFlags,
322 rtti: rtti,
323 localIncludes: localIncludes,
324 absoluteIncludes: absoluteIncludes,
Jingwen Chen107c0de2021-04-09 10:43:12 +0000325 }
326}
327
328// Convenience struct to hold all attributes parsed from linker properties.
329type linkerAttributes struct {
Jingwen Chen3d383bb2021-06-09 07:18:37 +0000330 deps bazel.LabelListAttribute
331 dynamicDeps bazel.LabelListAttribute
Chris Parsons51f8c392021-08-03 21:01:05 -0400332 systemDynamicDeps bazel.LabelListAttribute
Jingwen Chen3d383bb2021-06-09 07:18:37 +0000333 wholeArchiveDeps bazel.LabelListAttribute
334 exportedDeps bazel.LabelListAttribute
335 useLibcrt bazel.BoolAttribute
336 linkopts bazel.StringListAttribute
337 versionScript bazel.LabelAttribute
338 stripKeepSymbols bazel.BoolAttribute
339 stripKeepSymbolsAndDebugFrame bazel.BoolAttribute
340 stripKeepSymbolsList bazel.StringListAttribute
341 stripAll bazel.BoolAttribute
342 stripNone bazel.BoolAttribute
Jingwen Chenc1c26502021-04-05 10:35:13 +0000343}
344
Rupert Shuttleworth143be942021-05-09 23:55:51 -0400345// FIXME(b/187655838): Use the existing linkerFlags() function instead of duplicating logic here
346func getBp2BuildLinkerFlags(linkerProperties *BaseLinkerProperties) []string {
347 flags := linkerProperties.Ldflags
348 if !BoolDefault(linkerProperties.Pack_relocations, true) {
349 flags = append(flags, "-Wl,--pack-dyn-relocs=none")
350 }
351 return flags
352}
353
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200354// bp2BuildParseLinkerProps parses the linker properties of a module, including
Jingwen Chen91220d72021-03-24 02:18:33 -0400355// configurable attribute values.
Jingwen Chen107c0de2021-04-09 10:43:12 +0000356func bp2BuildParseLinkerProps(ctx android.TopDownMutatorContext, module *Module) linkerAttributes {
Liz Kammer47535c52021-06-02 16:02:22 -0400357 var headerDeps bazel.LabelListAttribute
358 var staticDeps bazel.LabelListAttribute
Chris Parsonsd6358772021-05-18 18:35:24 -0400359 var exportedDeps bazel.LabelListAttribute
Rupert Shuttleworthc50fa8d2021-05-06 02:40:33 -0400360 var dynamicDeps bazel.LabelListAttribute
Chris Parsons08648312021-05-06 16:23:19 -0400361 var wholeArchiveDeps bazel.LabelListAttribute
Liz Kammer135bf552021-08-11 10:46:06 -0400362 systemSharedDeps := bazel.LabelListAttribute{ForceSpecifyEmptyList: true}
Jingwen Chen63930982021-03-24 10:04:33 -0400363 var linkopts bazel.StringListAttribute
Lukacs T. Berki1353e592021-04-30 15:35:09 +0200364 var versionScript bazel.LabelAttribute
Liz Kammerd366c902021-06-03 13:43:01 -0400365 var useLibcrt bazel.BoolAttribute
Jingwen Chen63930982021-03-24 10:04:33 -0400366
Jingwen Chen3d383bb2021-06-09 07:18:37 +0000367 var stripKeepSymbols bazel.BoolAttribute
368 var stripKeepSymbolsAndDebugFrame bazel.BoolAttribute
369 var stripKeepSymbolsList bazel.StringListAttribute
370 var stripAll bazel.BoolAttribute
371 var stripNone bazel.BoolAttribute
372
Jingwen Chen3d383bb2021-06-09 07:18:37 +0000373 for axis, configToProps := range module.GetArchVariantProperties(ctx, &StripProperties{}) {
374 for config, props := range configToProps {
375 if stripProperties, ok := props.(*StripProperties); ok {
376 stripKeepSymbols.SetSelectValue(axis, config, stripProperties.Strip.Keep_symbols)
377 stripKeepSymbolsList.SetSelectValue(axis, config, stripProperties.Strip.Keep_symbols_list)
378 stripKeepSymbolsAndDebugFrame.SetSelectValue(axis, config, stripProperties.Strip.Keep_symbols_and_debug_frame)
379 stripAll.SetSelectValue(axis, config, stripProperties.Strip.All)
380 stripNone.SetSelectValue(axis, config, stripProperties.Strip.None)
381 }
382 }
383 }
384
Liz Kammer9abd62d2021-05-21 08:37:59 -0400385 for axis, configToProps := range module.GetArchVariantProperties(ctx, &BaseLinkerProperties{}) {
386 for config, props := range configToProps {
387 if baseLinkerProps, ok := props.(*BaseLinkerProperties); ok {
Liz Kammer135bf552021-08-11 10:46:06 -0400388 // Excludes to parallel Soong:
389 // https://cs.android.com/android/platform/superproject/+/master:build/soong/cc/linker.go;l=247-249;drc=088b53577dde6e40085ffd737a1ae96ad82fc4b0
Liz Kammer47535c52021-06-02 16:02:22 -0400390 staticLibs := android.FirstUniqueStrings(baseLinkerProps.Static_libs)
391 staticDeps.SetSelectValue(axis, config, android.BazelLabelForModuleDepsExcludes(ctx, staticLibs, baseLinkerProps.Exclude_static_libs))
392 wholeArchiveLibs := android.FirstUniqueStrings(baseLinkerProps.Whole_static_libs)
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400393 wholeArchiveDeps.SetSelectValue(axis, config, android.BazelLabelForModuleWholeDepsExcludes(ctx, wholeArchiveLibs, baseLinkerProps.Exclude_static_libs))
Chris Parsons51f8c392021-08-03 21:01:05 -0400394
Liz Kammer135bf552021-08-11 10:46:06 -0400395 systemSharedLibs := baseLinkerProps.System_shared_libs
396 // systemSharedLibs distinguishes between nil/empty list behavior:
397 // nil -> use default values
398 // empty list -> no values specified
399 if len(systemSharedLibs) > 0 {
400 systemSharedLibs = android.FirstUniqueStrings(systemSharedLibs)
Chris Parsons51f8c392021-08-03 21:01:05 -0400401 }
402 systemSharedDeps.SetSelectValue(axis, config, android.BazelLabelForModuleDeps(ctx, systemSharedLibs))
403
404 sharedLibs := android.FirstUniqueStrings(baseLinkerProps.Shared_libs)
Liz Kammer47535c52021-06-02 16:02:22 -0400405 dynamicDeps.SetSelectValue(axis, config, android.BazelLabelForModuleDepsExcludes(ctx, sharedLibs, baseLinkerProps.Exclude_shared_libs))
Rupert Shuttleworthc194ffb2021-05-19 06:49:02 -0400406
Liz Kammer47535c52021-06-02 16:02:22 -0400407 headerLibs := android.FirstUniqueStrings(baseLinkerProps.Header_libs)
408 headerDeps.SetSelectValue(axis, config, android.BazelLabelForModuleDeps(ctx, headerLibs))
409 exportedLibs := android.FirstUniqueStrings(baseLinkerProps.Export_header_lib_headers)
410 exportedDeps.SetSelectValue(axis, config, android.BazelLabelForModuleDeps(ctx, exportedLibs))
411
412 linkopts.SetSelectValue(axis, config, getBp2BuildLinkerFlags(baseLinkerProps))
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -0400413 if baseLinkerProps.Version_script != nil {
Liz Kammer9abd62d2021-05-21 08:37:59 -0400414 versionScript.SetSelectValue(axis, config, android.BazelLabelForModuleSrcSingle(ctx, *baseLinkerProps.Version_script))
Rupert Shuttleworth22cd2eb2021-05-27 02:15:54 -0400415 }
Liz Kammerd366c902021-06-03 13:43:01 -0400416 useLibcrt.SetSelectValue(axis, config, baseLinkerProps.libCrt())
Rupert Shuttleworthc194ffb2021-05-19 06:49:02 -0400417 }
Jingwen Chen91220d72021-03-24 02:18:33 -0400418 }
419 }
420
Liz Kammer47535c52021-06-02 16:02:22 -0400421 type productVarDep struct {
422 // the name of the corresponding excludes field, if one exists
423 excludesField string
424 // reference to the bazel attribute that should be set for the given product variable config
425 attribute *bazel.LabelListAttribute
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400426
427 depResolutionFunc func(ctx android.BazelConversionPathContext, modules, excludes []string) bazel.LabelList
Liz Kammer47535c52021-06-02 16:02:22 -0400428 }
429
430 productVarToDepFields := map[string]productVarDep{
431 // product variables do not support exclude_shared_libs
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400432 "Shared_libs": productVarDep{attribute: &dynamicDeps, depResolutionFunc: android.BazelLabelForModuleDepsExcludes},
433 "Static_libs": productVarDep{"Exclude_static_libs", &staticDeps, android.BazelLabelForModuleDepsExcludes},
434 "Whole_static_libs": productVarDep{"Exclude_static_libs", &wholeArchiveDeps, android.BazelLabelForModuleWholeDepsExcludes},
Liz Kammer47535c52021-06-02 16:02:22 -0400435 }
436
437 productVariableProps := android.ProductVariableProperties(ctx)
438 for name, dep := range productVarToDepFields {
439 props, exists := productVariableProps[name]
440 excludeProps, excludesExists := productVariableProps[dep.excludesField]
441 // if neither an include or excludes property exists, then skip it
442 if !exists && !excludesExists {
443 continue
444 }
445 // collect all the configurations that an include or exclude property exists for.
446 // we want to iterate all configurations rather than either the include or exclude because for a
447 // particular configuration we may have only and include or only an exclude to handle
448 configs := make(map[string]bool, len(props)+len(excludeProps))
449 for config := range props {
450 configs[config] = true
451 }
452 for config := range excludeProps {
453 configs[config] = true
454 }
455
456 for config := range configs {
457 prop, includesExists := props[config]
458 excludesProp, excludesExists := excludeProps[config]
459 var includes, excludes []string
460 var ok bool
461 // if there was no includes/excludes property, casting fails and that's expected
462 if includes, ok = prop.Property.([]string); includesExists && !ok {
463 ctx.ModuleErrorf("Could not convert product variable %s property", name)
464 }
465 if excludes, ok = excludesProp.Property.([]string); excludesExists && !ok {
466 ctx.ModuleErrorf("Could not convert product variable %s property", dep.excludesField)
467 }
Liz Kammer2d7bbe32021-06-10 18:20:06 -0400468
469 dep.attribute.SetSelectValue(bazel.ProductVariableConfigurationAxis(config), config, dep.depResolutionFunc(ctx, android.FirstUniqueStrings(includes), excludes))
Liz Kammer47535c52021-06-02 16:02:22 -0400470 }
471 }
472
473 staticDeps.ResolveExcludes()
474 dynamicDeps.ResolveExcludes()
475 wholeArchiveDeps.ResolveExcludes()
476
477 headerDeps.Append(staticDeps)
478
Jingwen Chen107c0de2021-04-09 10:43:12 +0000479 return linkerAttributes{
Chris Parsons51f8c392021-08-03 21:01:05 -0400480 deps: headerDeps,
481 exportedDeps: exportedDeps,
482 dynamicDeps: dynamicDeps,
483 systemDynamicDeps: systemSharedDeps,
484 wholeArchiveDeps: wholeArchiveDeps,
485 linkopts: linkopts,
486 useLibcrt: useLibcrt,
487 versionScript: versionScript,
Jingwen Chen3d383bb2021-06-09 07:18:37 +0000488
489 // Strip properties
490 stripKeepSymbols: stripKeepSymbols,
491 stripKeepSymbolsAndDebugFrame: stripKeepSymbolsAndDebugFrame,
492 stripKeepSymbolsList: stripKeepSymbolsList,
493 stripAll: stripAll,
494 stripNone: stripNone,
Jingwen Chen107c0de2021-04-09 10:43:12 +0000495 }
Jingwen Chen91220d72021-03-24 02:18:33 -0400496}
497
Jingwen Chened9c17d2021-04-13 07:14:55 +0000498// Relativize a list of root-relative paths with respect to the module's
499// directory.
500//
501// include_dirs Soong prop are root-relative (b/183742505), but
502// local_include_dirs, export_include_dirs and export_system_include_dirs are
503// module dir relative. This function makes a list of paths entirely module dir
504// relative.
505//
506// For the `include` attribute, Bazel wants the paths to be relative to the
507// module.
508func bp2BuildMakePathsRelativeToModule(ctx android.BazelConversionPathContext, paths []string) []string {
Rupert Shuttleworthb8151682021-04-06 20:06:21 +0000509 var relativePaths []string
510 for _, path := range paths {
Jingwen Chened9c17d2021-04-13 07:14:55 +0000511 // Semantics of filepath.Rel: join(ModuleDir, rel(ModuleDir, path)) == path
512 relativePath, err := filepath.Rel(ctx.ModuleDir(), path)
513 if err != nil {
514 panic(err)
515 }
Rupert Shuttleworthb8151682021-04-06 20:06:21 +0000516 relativePaths = append(relativePaths, relativePath)
517 }
518 return relativePaths
519}
520
Liz Kammer5fad5012021-09-09 14:08:21 -0400521// BazelIncludes contains information about -I and -isystem paths from a module converted to Bazel
522// attributes.
523type BazelIncludes struct {
524 Includes bazel.StringListAttribute
525 SystemIncludes bazel.StringListAttribute
526}
527
528func bp2BuildParseExportedIncludes(ctx android.TopDownMutatorContext, module *Module) BazelIncludes {
Jingwen Chen91220d72021-03-24 02:18:33 -0400529 libraryDecorator := module.linker.(*libraryDecorator)
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400530 return bp2BuildParseExportedIncludesHelper(ctx, module, libraryDecorator)
531}
Jingwen Chen91220d72021-03-24 02:18:33 -0400532
Liz Kammer5fad5012021-09-09 14:08:21 -0400533// Bp2buildParseExportedIncludesForPrebuiltLibrary returns a BazelIncludes with Bazel-ified values
534// to export includes from the underlying module's properties.
535func Bp2BuildParseExportedIncludesForPrebuiltLibrary(ctx android.TopDownMutatorContext, module *Module) BazelIncludes {
Rupert Shuttleworthffd45822021-05-14 03:02:34 -0400536 prebuiltLibraryLinker := module.linker.(*prebuiltLibraryLinker)
537 libraryDecorator := prebuiltLibraryLinker.libraryDecorator
538 return bp2BuildParseExportedIncludesHelper(ctx, module, libraryDecorator)
539}
540
541// bp2BuildParseExportedIncludes creates a string list attribute contains the
542// exported included directories of a module.
Liz Kammer5fad5012021-09-09 14:08:21 -0400543func bp2BuildParseExportedIncludesHelper(ctx android.TopDownMutatorContext, module *Module, libraryDecorator *libraryDecorator) BazelIncludes {
544 exported := BazelIncludes{}
Liz Kammer9abd62d2021-05-21 08:37:59 -0400545 for axis, configToProps := range module.GetArchVariantProperties(ctx, &FlagExporterProperties{}) {
546 for config, props := range configToProps {
547 if flagExporterProperties, ok := props.(*FlagExporterProperties); ok {
Liz Kammer5fad5012021-09-09 14:08:21 -0400548 if len(flagExporterProperties.Export_include_dirs) > 0 {
549 exported.Includes.SetSelectValue(axis, config, flagExporterProperties.Export_include_dirs)
550 }
551 if len(flagExporterProperties.Export_system_include_dirs) > 0 {
552 exported.SystemIncludes.SetSelectValue(axis, config, flagExporterProperties.Export_system_include_dirs)
Rupert Shuttleworthc194ffb2021-05-19 06:49:02 -0400553 }
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400554 }
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400555 }
556 }
Liz Kammer5fad5012021-09-09 14:08:21 -0400557 exported.Includes.DeduplicateAxesFromBase()
558 exported.SystemIncludes.DeduplicateAxesFromBase()
Rupert Shuttleworth375451e2021-04-26 07:49:08 -0400559
Liz Kammer5fad5012021-09-09 14:08:21 -0400560 return exported
Jingwen Chen91220d72021-03-24 02:18:33 -0400561}