1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
// 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)
}
|