blob: 5eba6ab9605ff2060309748ee3d90dc6ffedd054 [file] [log] [blame]
Paul Duffin1c6c1c72020-02-21 10:28:43 +00001// Copyright 2020 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 cc
16
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000017import (
Spandan Das4238c652022-09-09 01:38:47 +000018 "github.com/google/blueprint/proptools"
19
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000020 "android/soong/android"
21 "android/soong/bazel"
Chris Parsonsf874e462022-05-10 13:50:12 -040022 "android/soong/bazel/cquery"
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000023)
Paul Duffin1c6c1c72020-02-21 10:28:43 +000024
25func init() {
26 RegisterLibraryHeadersBuildComponents(android.InitRegistrationContext)
Paul Duffin91756d22020-02-21 16:29:57 +000027
28 // Register sdk member types.
29 android.RegisterSdkMemberType(headersLibrarySdkMemberType)
Rupert Shuttleworth54e78412021-02-15 11:04:32 +000030
Paul Duffin91756d22020-02-21 16:29:57 +000031}
32
33var headersLibrarySdkMemberType = &librarySdkMemberType{
34 SdkMemberTypeBase: android.SdkMemberTypeBase{
Martin Stjernholmcaa47d72020-07-11 04:52:24 +010035 PropertyName: "native_header_libs",
36 SupportsSdk: true,
37 HostOsDependent: true,
Paul Duffin93b750e2019-11-19 19:44:10 +000038 Traits: []android.SdkMemberTrait{
39 nativeBridgeSdkTrait,
Paul Duffin12a0a312021-09-15 17:25:10 +010040 ramdiskImageRequiredSdkTrait,
Paul Duffin63696222021-09-06 10:28:34 +010041 recoveryImageRequiredSdkTrait,
Paul Duffin93b750e2019-11-19 19:44:10 +000042 },
Paul Duffin91756d22020-02-21 16:29:57 +000043 },
44 prebuiltModuleType: "cc_prebuilt_library_headers",
Martin Stjernholmcd07bce2020-03-10 22:37:59 +000045 noOutputFiles: true,
Paul Duffin1c6c1c72020-02-21 10:28:43 +000046}
47
48func RegisterLibraryHeadersBuildComponents(ctx android.RegistrationContext) {
49 ctx.RegisterModuleType("cc_library_headers", LibraryHeaderFactory)
Paul Duffinf5ea9e12020-02-21 10:57:00 +000050 ctx.RegisterModuleType("cc_prebuilt_library_headers", prebuiltLibraryHeaderFactory)
Paul Duffin1c6c1c72020-02-21 10:28:43 +000051}
52
Chris Parsonsf874e462022-05-10 13:50:12 -040053type libraryHeaderBazelHandler struct {
Liz Kammerb6a55bf2021-04-12 15:42:51 -040054 module *Module
55 library *libraryDecorator
56}
57
Chris Parsons6ce2cf92022-05-20 10:54:17 -040058var _ BazelHandler = (*libraryHeaderBazelHandler)(nil)
59
Chris Parsonsf874e462022-05-10 13:50:12 -040060func (handler *libraryHeaderBazelHandler) QueueBazelCall(ctx android.BaseModuleContext, label string) {
Liz Kammerb6a55bf2021-04-12 15:42:51 -040061 bazelCtx := ctx.Config().BazelContext
Yu Liue4312402023-01-18 09:15:31 -080062 bazelCtx.QueueBazelRequest(label, cquery.GetCcInfo, android.GetConfigKeyApexVariant(ctx, GetApexConfigKey(ctx)))
Chris Parsonsf874e462022-05-10 13:50:12 -040063}
64
65func (h *libraryHeaderBazelHandler) ProcessBazelQueryResponse(ctx android.ModuleContext, label string) {
66 bazelCtx := ctx.Config().BazelContext
Yu Liue4312402023-01-18 09:15:31 -080067 ccInfo, err := bazelCtx.GetCcInfo(label, android.GetConfigKeyApexVariant(ctx, GetApexConfigKey(ctx)))
Liz Kammerb6a55bf2021-04-12 15:42:51 -040068 if err != nil {
Chris Parsonsf874e462022-05-10 13:50:12 -040069 ctx.ModuleErrorf(err.Error())
70 return
Liz Kammerb6a55bf2021-04-12 15:42:51 -040071 }
72
73 outputPaths := ccInfo.OutputFiles
74 if len(outputPaths) != 1 {
75 ctx.ModuleErrorf("expected exactly one output file for %q, but got %q", label, outputPaths)
Chris Parsonsf874e462022-05-10 13:50:12 -040076 return
Liz Kammerb6a55bf2021-04-12 15:42:51 -040077 }
78
Sam Delmerico4ed95e22023-02-03 18:12:15 -050079 var outputPath android.Path = android.PathForBazelOut(ctx, outputPaths[0])
80 if len(ccInfo.TidyFiles) > 0 {
81 h.module.tidyFiles = android.PathsForBazelOut(ctx, ccInfo.TidyFiles)
82 outputPath = android.AttachValidationActions(ctx, outputPath, h.module.tidyFiles)
83 }
Liz Kammerb6a55bf2021-04-12 15:42:51 -040084 h.module.outputFile = android.OptionalPathForPath(outputPath)
85
86 // HeaderLibraryInfo is an empty struct to indicate to dependencies that this is a header library
87 ctx.SetProvider(HeaderLibraryInfoProvider, HeaderLibraryInfo{})
88
Chris Parsons94a0bba2021-06-04 15:03:47 -040089 h.library.setFlagExporterInfoFromCcInfo(ctx, ccInfo)
Liz Kammerb6a55bf2021-04-12 15:42:51 -040090
91 // Dependencies on this library will expect collectedSnapshotHeaders to be set, otherwise
92 // validation will fail. For now, set this to an empty list.
93 // TODO(cparsons): More closely mirror the collectHeadersForSnapshot implementation.
94 h.library.collectedSnapshotHeaders = android.Paths{}
Sam Delmerico5fb794a2023-01-27 16:01:37 -050095
96 h.module.setAndroidMkVariablesFromCquery(ccInfo.CcAndroidMkInfo)
Liz Kammerb6a55bf2021-04-12 15:42:51 -040097}
98
Paul Duffin1c6c1c72020-02-21 10:28:43 +000099// cc_library_headers contains a set of c/c++ headers which are imported by
100// other soong cc modules using the header_libs property. For best practices,
101// use export_include_dirs property or LOCAL_EXPORT_C_INCLUDE_DIRS for
102// Make.
103func LibraryHeaderFactory() android.Module {
104 module, library := NewLibrary(android.HostAndDeviceSupported)
105 library.HeaderOnly()
Paul Duffin91756d22020-02-21 16:29:57 +0000106 module.sdkMemberTypes = []android.SdkMemberType{headersLibrarySdkMemberType}
Liz Kammerbe46fcc2021-11-01 15:32:43 -0400107 module.bazelable = true
Chris Parsonsf874e462022-05-10 13:50:12 -0400108 module.bazelHandler = &libraryHeaderBazelHandler{module: module, library: library}
Paul Duffin1c6c1c72020-02-21 10:28:43 +0000109 return module.Init()
110}
Paul Duffinf5ea9e12020-02-21 10:57:00 +0000111
112// cc_prebuilt_library_headers is a prebuilt version of cc_library_headers
113func prebuiltLibraryHeaderFactory() android.Module {
Martin Stjernholme65c3ae2021-11-23 01:24:06 +0000114 module, library := NewPrebuiltLibrary(android.HostAndDeviceSupported, "")
Paul Duffinf5ea9e12020-02-21 10:57:00 +0000115 library.HeaderOnly()
Liz Kammer3d3b35c2022-01-11 16:02:50 +0000116 module.bazelable = true
117 module.bazelHandler = &ccLibraryBazelHandler{module: module}
Paul Duffinf5ea9e12020-02-21 10:57:00 +0000118 return module.Init()
119}
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000120
121type bazelCcLibraryHeadersAttributes struct {
Liz Kammer1263d9b2021-12-10 14:28:20 -0500122 Hdrs bazel.LabelListAttribute
123 Export_includes bazel.StringListAttribute
124 Export_absolute_includes bazel.StringListAttribute
125 Export_system_includes bazel.StringListAttribute
126 Deps bazel.LabelListAttribute
127 Implementation_deps bazel.LabelListAttribute
128 System_dynamic_deps bazel.LabelListAttribute
Yu Liufc603162022-03-01 15:44:08 -0800129 sdkAttributes
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000130}
131
Chris Parsons637458d2023-09-19 20:09:00 +0000132func libraryHeadersBp2Build(ctx android.Bp2buildMutatorContext, module *Module) {
Liz Kammere6583482021-10-19 13:56:10 -0400133 baseAttributes := bp2BuildParseBaseProps(ctx, module)
Liz Kammer54549442022-05-11 13:55:06 -0400134 exportedIncludes := bp2BuildParseExportedIncludes(ctx, module, &baseAttributes.includes)
Liz Kammere6583482021-10-19 13:56:10 -0400135 linkerAttrs := baseAttributes.linkerAttributes
Trevor Radcliffe2be7f542022-06-22 20:30:55 +0000136 (&linkerAttrs.deps).Append(linkerAttrs.dynamicDeps)
Trevor Radcliffe7f897fc2022-08-18 15:53:00 +0000137 (&linkerAttrs.deps).Append(linkerAttrs.wholeArchiveDeps)
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000138
139 attrs := &bazelCcLibraryHeadersAttributes{
Liz Kammer1263d9b2021-12-10 14:28:20 -0500140 Export_includes: exportedIncludes.Includes,
141 Export_absolute_includes: exportedIncludes.AbsoluteIncludes,
142 Export_system_includes: exportedIncludes.SystemIncludes,
Liz Kammer1263d9b2021-12-10 14:28:20 -0500143 Deps: linkerAttrs.deps,
144 System_dynamic_deps: linkerAttrs.systemDynamicDeps,
145 Hdrs: baseAttributes.hdrs,
Yu Liufc603162022-03-01 15:44:08 -0800146 sdkAttributes: bp2BuildParseSdkAttributes(module),
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000147 }
148
Liz Kammerfc46bc12021-02-19 11:06:17 -0500149 props := bazel.BazelTargetModuleProperties{
150 Rule_class: "cc_library_headers",
Liz Kammer2b376bc2022-01-12 12:00:49 -0500151 Bzl_load_location: "//build/bazel/rules/cc:cc_library_headers.bzl",
Liz Kammerfc46bc12021-02-19 11:06:17 -0500152 }
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000153
Spandan Das39b6cc52023-04-12 19:05:49 +0000154 tags := android.ApexAvailableTagsWithoutTestApexes(ctx, module)
Sam Delmericoeddd3c02022-12-02 17:31:58 -0500155
Liz Kammer86a407f2023-09-18 09:23:38 -0400156 name := module.Name()
157 if module.IsPrebuilt() {
158 name = android.RemoveOptionalPrebuiltPrefix(name)
159 }
160
Sam Delmericoeddd3c02022-12-02 17:31:58 -0500161 ctx.CreateBazelTargetModule(props, android.CommonAttributes{
Liz Kammer86a407f2023-09-18 09:23:38 -0400162 Name: name,
Sam Delmericoeddd3c02022-12-02 17:31:58 -0500163 Tags: tags,
164 }, attrs)
Rupert Shuttleworth54e78412021-02-15 11:04:32 +0000165}
Spandan Das4238c652022-09-09 01:38:47 +0000166
167// Append .contribution suffix to input labels
168func apiBazelTargets(ll bazel.LabelList) bazel.LabelList {
169 labels := make([]bazel.Label, 0)
170 for _, l := range ll.Includes {
171 labels = append(labels, bazel.Label{
172 Label: android.ApiContributionTargetName(l.Label),
173 })
174 }
175 return bazel.MakeLabelList(labels)
176}
177
178func apiLibraryHeadersBp2Build(ctx android.TopDownMutatorContext, module *Module) {
179 // cc_api_library_headers have a 1:1 mapping to arch/no-arch
180 // For API export, create a top-level arch-agnostic target and list the arch-specific targets as its deps
181
182 // arch-agnostic includes
Spandan Das627fc3e2023-01-26 23:02:00 +0000183 apiIncludes := getModuleLibApiIncludes(ctx, module)
Spandan Das4238c652022-09-09 01:38:47 +0000184 // arch and os specific includes
185 archApiIncludes, androidOsIncludes := archOsSpecificApiIncludes(ctx, module)
186 for _, arch := range allArches { // sorted iteration
187 archApiInclude := archApiIncludes[arch]
188 if !archApiInclude.isEmpty() {
189 createApiHeaderTarget(ctx, archApiInclude)
190 apiIncludes.addDep(archApiInclude.name)
191 }
192 }
193 // os==android includes
194 if !androidOsIncludes.isEmpty() {
195 createApiHeaderTarget(ctx, androidOsIncludes)
196 apiIncludes.addDep(androidOsIncludes.name)
197 }
198
199 if !apiIncludes.isEmpty() {
Spandan Das627fc3e2023-01-26 23:02:00 +0000200 // override the name from <mod>.module-libapi.headers --> <mod>.contribution
Spandan Das4238c652022-09-09 01:38:47 +0000201 apiIncludes.name = android.ApiContributionTargetName(module.Name())
202 createApiHeaderTarget(ctx, apiIncludes)
203 }
204}
205
206func createApiHeaderTarget(ctx android.TopDownMutatorContext, includes apiIncludes) {
207 props := bazel.BazelTargetModuleProperties{
208 Rule_class: "cc_api_library_headers",
209 Bzl_load_location: "//build/bazel/rules/apis:cc_api_contribution.bzl",
210 }
211 ctx.CreateBazelTargetModule(
212 props,
213 android.CommonAttributes{
214 Name: includes.name,
215 SkipData: proptools.BoolPtr(true),
216 },
217 &includes.attrs,
218 )
219}
220
221var (
222 allArches = []string{"arm", "arm64", "x86", "x86_64"}
223)
224
225type archApiIncludes map[string]apiIncludes
226
227func archOsSpecificApiIncludes(ctx android.TopDownMutatorContext, module *Module) (archApiIncludes, apiIncludes) {
228 baseProps := bp2BuildParseBaseProps(ctx, module)
229 i := bp2BuildParseExportedIncludes(ctx, module, &baseProps.includes)
230 archRet := archApiIncludes{}
231 for _, arch := range allArches {
232 includes := i.Includes.SelectValue(
233 bazel.ArchConfigurationAxis,
234 arch)
235 systemIncludes := i.SystemIncludes.SelectValue(
236 bazel.ArchConfigurationAxis,
237 arch)
238 deps := baseProps.deps.SelectValue(
239 bazel.ArchConfigurationAxis,
240 arch)
241 attrs := bazelCcLibraryHeadersAttributes{
242 Export_includes: bazel.MakeStringListAttribute(includes),
243 Export_system_includes: bazel.MakeStringListAttribute(systemIncludes),
244 }
245 apiDeps := apiBazelTargets(deps)
246 if !apiDeps.IsEmpty() {
247 attrs.Deps = bazel.MakeLabelListAttribute(apiDeps)
248 }
249 apiIncludes := apiIncludes{
250 name: android.ApiContributionTargetName(module.Name()) + "." + arch,
251 attrs: bazelCcApiLibraryHeadersAttributes{
252 bazelCcLibraryHeadersAttributes: attrs,
253 Arch: proptools.StringPtr(arch),
254 },
255 }
256 archRet[arch] = apiIncludes
257 }
258
259 // apiIncludes for os == Android
260 androidOsDeps := baseProps.deps.SelectValue(bazel.OsConfigurationAxis, bazel.OsAndroid)
261 androidOsAttrs := bazelCcLibraryHeadersAttributes{
262 Export_includes: bazel.MakeStringListAttribute(
263 i.Includes.SelectValue(bazel.OsConfigurationAxis, bazel.OsAndroid),
264 ),
265 Export_system_includes: bazel.MakeStringListAttribute(
266 i.SystemIncludes.SelectValue(bazel.OsConfigurationAxis, bazel.OsAndroid),
267 ),
268 }
269 androidOsApiDeps := apiBazelTargets(androidOsDeps)
270 if !androidOsApiDeps.IsEmpty() {
271 androidOsAttrs.Deps = bazel.MakeLabelListAttribute(androidOsApiDeps)
272 }
273 osRet := apiIncludes{
274 name: android.ApiContributionTargetName(module.Name()) + ".androidos",
275 attrs: bazelCcApiLibraryHeadersAttributes{
276 bazelCcLibraryHeadersAttributes: androidOsAttrs,
277 },
278 }
279 return archRet, osRet
280}