| // Copyright 2022 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package android |
| |
| import ( |
| "github.com/google/blueprint" |
| |
| "android/soong/bazel" |
| ) |
| |
| func init() { |
| RegisterApiDomainBuildComponents(InitRegistrationContext) |
| } |
| |
| func RegisterApiDomainBuildComponents(ctx RegistrationContext) { |
| ctx.RegisterModuleType("api_domain", ApiDomainFactory) |
| } |
| |
| type ApiSurface int |
| |
| // TODO(b/246656800): Reconcile with android.SdkKind |
| const ( |
| // API surface provided by platform and mainline modules to other mainline modules |
| ModuleLibApi ApiSurface = iota |
| PublicApi // Aka NDK |
| VendorApi // Aka LLNDK |
| ) |
| |
| func (a ApiSurface) String() string { |
| switch a { |
| case ModuleLibApi: |
| return "module-libapi" |
| case PublicApi: |
| return "publicapi" |
| case VendorApi: |
| return "vendorapi" |
| default: |
| return "invalid" |
| } |
| } |
| |
| type apiDomain struct { |
| ModuleBase |
| BazelModuleBase |
| |
| properties apiDomainProperties |
| } |
| |
| type apiDomainProperties struct { |
| // cc library contributions (.h files/.map.txt) of this API domain |
| // This dependency is a no-op in Soong, but the corresponding Bazel target in the api_bp2build workspace |
| // will provide a `CcApiContributionInfo` provider |
| Cc_api_contributions []string |
| |
| // java library contributions (as .txt) of this API domain |
| // This dependency is a no-op in Soong, but the corresponding Bazel target in the api_bp2build workspace |
| // will provide a `JavaApiContributionInfo` provider |
| Java_api_contributions []string |
| } |
| |
| func ApiDomainFactory() Module { |
| m := &apiDomain{} |
| m.AddProperties(&m.properties) |
| InitAndroidArchModule(m, DeviceSupported, MultilibBoth) |
| return m |
| } |
| |
| // Do not create any dependency edges in Soong for now to skip visibility checks for some systemapi libraries. |
| // Currently, all api_domain modules reside in build/orchestrator/apis/Android.bp |
| // However, cc libraries like libsigchain (com.android.art) restrict their visibility to art/* |
| // When the api_domain module types are collocated with their contributions, this dependency edge can be restored |
| func (a *apiDomain) DepsMutator(ctx BottomUpMutatorContext) { |
| } |
| |
| // API domain does not have any builld actions yet |
| func (a *apiDomain) GenerateAndroidBuildActions(ctx ModuleContext) { |
| } |
| |
| const ( |
| apiContributionSuffix = ".contribution" |
| ) |
| |
| // ApiContributionTargetName returns the name of the bp2build target (e.g. cc_api_contribution) of contribution modules (e.g. ndk_library) |
| // A suffix is necessary to prevent a name collision with the base target in the same bp2build bazel package |
| func ApiContributionTargetName(moduleName string) string { |
| return moduleName + apiContributionSuffix |
| } |
| |
| // For each contributing cc_library, format the name to its corresponding contribution bazel target in the bp2build workspace |
| func contributionBazelAttributes(ctx TopDownMutatorContext, contributions []string) bazel.LabelListAttribute { |
| addSuffix := func(ctx BazelConversionPathContext, module blueprint.Module) string { |
| baseLabel := BazelModuleLabel(ctx, module) |
| return ApiContributionTargetName(baseLabel) |
| } |
| bazelLabels := BazelLabelForModuleDepsWithFn(ctx, contributions, addSuffix) |
| return bazel.MakeLabelListAttribute(bazelLabels) |
| } |
| |
| type bazelApiDomainAttributes struct { |
| Cc_api_contributions bazel.LabelListAttribute |
| Java_api_contributions bazel.LabelListAttribute |
| } |
| |
| var _ ApiProvider = (*apiDomain)(nil) |
| |
| func (a *apiDomain) ConvertWithApiBp2build(ctx TopDownMutatorContext) { |
| props := bazel.BazelTargetModuleProperties{ |
| Rule_class: "api_domain", |
| Bzl_load_location: "//build/bazel/rules/apis:api_domain.bzl", |
| } |
| attrs := &bazelApiDomainAttributes{ |
| Cc_api_contributions: contributionBazelAttributes(ctx, a.properties.Cc_api_contributions), |
| Java_api_contributions: contributionBazelAttributes(ctx, a.properties.Java_api_contributions), |
| } |
| ctx.CreateBazelTargetModule(props, CommonAttributes{ |
| Name: ctx.ModuleName(), |
| }, attrs) |
| } |