blob: 5500926e81c656fb7540774e6db40a9269d6ec36 [file] [log] [blame]
Paul Duffinb67d8782021-04-22 11:49:41 +01001// 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 java
16
17import (
Colin Crossd6495802025-01-14 15:50:48 -080018 "fmt"
19
Paul Duffinb67d8782021-04-22 11:49:41 +010020 "android/soong/android"
Paul Duffin81667c82021-04-26 13:55:36 +010021
Paul Duffinb67d8782021-04-22 11:49:41 +010022 "github.com/google/blueprint"
23 "github.com/google/blueprint/proptools"
24)
25
26// Contains code that is common to both platform_bootclasspath and bootclasspath_fragment.
27
Paul Duffinb67d8782021-04-22 11:49:41 +010028// addDependencyOntoApexVariants adds dependencies onto the appropriate apex specific variants of
29// the module as specified in the ApexVariantReference list.
Colin Crossd8d8b852024-12-20 16:32:37 -080030func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyName string, refs []ApexVariantReference, tagType bootclasspathDependencyTagType) {
Paul Duffinb67d8782021-04-22 11:49:41 +010031 for i, ref := range refs {
32 apex := proptools.StringDefault(ref.Apex, "platform")
33
34 if ref.Module == nil {
35 ctx.PropertyErrorf(propertyName, "missing module name at position %d", i)
36 continue
37 }
38 name := proptools.String(ref.Module)
39
Colin Crossd8d8b852024-12-20 16:32:37 -080040 addDependencyOntoApexModulePair(ctx, apex, name, tagType)
Paul Duffinb67d8782021-04-22 11:49:41 +010041 }
42}
43
44// addDependencyOntoApexModulePair adds a dependency onto the specified APEX specific variant or the
45// specified module.
46//
Paul Duffin110b0ad2021-04-27 14:36:08 +010047// If apex="platform" or "system_ext" then this adds a dependency onto the platform variant of the
48// module. This adds dependencies onto the prebuilt and source modules with the specified name,
49// depending on which ones are available. Visiting must use isActiveModule to select the preferred
50// module when both source and prebuilt modules are available.
Paul Duffin9bacf562021-04-28 21:16:02 +010051//
52// Use gatherApexModulePairDepsWithTag to retrieve the dependencies.
Colin Crossd8d8b852024-12-20 16:32:37 -080053func addDependencyOntoApexModulePair(ctx android.BottomUpMutatorContext, apex string, name string, tagType bootclasspathDependencyTagType) {
54 tag := bootclasspathDependencyTag{
55 typ: tagType,
56 }
Colin Crossd6495802025-01-14 15:50:48 -080057 target := ctx.Module().Target()
58 if android.IsConfiguredJarForPlatform(apex) {
59 // Platform variant, add a direct dependency.
60 ctx.AddFarVariationDependencies(target.Variations(), tag, name)
61 } else {
62 // A module in an apex. Dependencies can't be added directly onto an apex variation, as that would
63 // require constructing a full ApexInfo configuration, which can't be predicted here. Add a dependency
64 // on the apex instead, and annotate the dependency tag with the desired module in the apex.
65 tag.moduleInApex = name
66 ctx.AddFarVariationDependencies(target.Variations(), tag, apex)
Paul Duffinb67d8782021-04-22 11:49:41 +010067 }
68
Paul Duffinb67d8782021-04-22 11:49:41 +010069}
70
Paul Duffin9bacf562021-04-28 21:16:02 +010071// gatherApexModulePairDepsWithTag returns the list of dependencies with the supplied tag that was
72// added by addDependencyOntoApexModulePair.
Colin Crossd8d8b852024-12-20 16:32:37 -080073func gatherApexModulePairDepsWithTag(ctx android.BaseModuleContext, tagType bootclasspathDependencyTagType) []android.Module {
Paul Duffin9bacf562021-04-28 21:16:02 +010074 var modules []android.Module
Colin Crossd6495802025-01-14 15:50:48 -080075
76 type moduleInApex struct {
77 module string
78 apex string
79 }
80
81 var modulesInApexes []moduleInApex
82
Colin Crossd8d8b852024-12-20 16:32:37 -080083 ctx.VisitDirectDeps(func(module android.Module) {
Paul Duffin9bacf562021-04-28 21:16:02 +010084 t := ctx.OtherModuleDependencyTag(module)
Colin Crossd8d8b852024-12-20 16:32:37 -080085 if bcpTag, ok := t.(bootclasspathDependencyTag); ok && bcpTag.typ == tagType {
Colin Crossd6495802025-01-14 15:50:48 -080086 if bcpTag.moduleInApex != "" {
87 modulesInApexes = append(modulesInApexes, moduleInApex{bcpTag.moduleInApex, ctx.OtherModuleName(module)})
88 } else {
89 modules = append(modules, module)
90 }
Paul Duffin9bacf562021-04-28 21:16:02 +010091 }
92 })
Colin Crossd6495802025-01-14 15:50:48 -080093
94 for _, moduleInApex := range modulesInApexes {
95 var found android.Module
96 ctx.WalkDeps(func(child, parent android.Module) bool {
97 t := ctx.OtherModuleDependencyTag(child)
98 if parent == ctx.Module() {
99 if bcpTag, ok := t.(bootclasspathDependencyTag); ok && bcpTag.typ == tagType && ctx.OtherModuleName(child) == moduleInApex.apex {
100 // recurse into the apex
101 return true
102 }
103 } else if tagType != fragment && android.IsFragmentInApexTag(t) {
104 return true
105 } else if android.IsDontReplaceSourceWithPrebuiltTag(t) {
106 return false
107 } else if t == android.PrebuiltDepTag {
108 return false
109 } else if IsBootclasspathFragmentContentDepTag(t) {
110 return false
111 } else if android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(child)) == moduleInApex.module {
112 if found != nil && child != found {
113 panic(fmt.Errorf("found two conflicting modules %q in apex %q: %s and %s",
114 moduleInApex.module, moduleInApex.apex, found, child))
115 }
116 found = child
117 }
118 return false
119 })
120 if found != nil {
121 modules = append(modules, found)
122 } else if !ctx.Config().AllowMissingDependencies() {
123 ctx.ModuleErrorf("failed to find module %q in apex %q\n",
124 moduleInApex.module, moduleInApex.apex)
125 }
126 }
Paul Duffin9bacf562021-04-28 21:16:02 +0100127 return modules
128}
129
Paul Duffinb67d8782021-04-22 11:49:41 +0100130// ApexVariantReference specifies a particular apex variant of a module.
131type ApexVariantReference struct {
Paul Duffin51227d82021-05-18 12:54:27 +0100132 android.BpPrintableBase
133
Paul Duffinb67d8782021-04-22 11:49:41 +0100134 // The name of the module apex variant, i.e. the apex containing the module variant.
135 //
136 // If this is not specified then it defaults to "platform" which will cause a dependency to be
137 // added to the module's platform variant.
Paul Duffin110b0ad2021-04-27 14:36:08 +0100138 //
139 // A value of system_ext should be used for any module that will be part of the system_ext
140 // partition.
Paul Duffinb67d8782021-04-22 11:49:41 +0100141 Apex *string
142
143 // The name of the module.
144 Module *string
145}
146
147// BootclasspathFragmentsDepsProperties contains properties related to dependencies onto fragments.
148type BootclasspathFragmentsDepsProperties struct {
149 // The names of the bootclasspath_fragment modules that form part of this module.
150 Fragments []ApexVariantReference
151}
152
153// addDependenciesOntoFragments adds dependencies to the fragments specified in this properties
154// structure.
155func (p *BootclasspathFragmentsDepsProperties) addDependenciesOntoFragments(ctx android.BottomUpMutatorContext) {
Colin Crossd8d8b852024-12-20 16:32:37 -0800156 addDependencyOntoApexVariants(ctx, "fragments", p.Fragments, fragment)
Paul Duffinb67d8782021-04-22 11:49:41 +0100157}
158
159// bootclasspathDependencyTag defines dependencies from/to bootclasspath_fragment,
160// prebuilt_bootclasspath_fragment and platform_bootclasspath onto either source or prebuilt
161// modules.
162type bootclasspathDependencyTag struct {
163 blueprint.BaseDependencyTag
164
Colin Crossd8d8b852024-12-20 16:32:37 -0800165 typ bootclasspathDependencyTagType
166
Colin Crossd6495802025-01-14 15:50:48 -0800167 // moduleInApex is set to the name of the desired module when this dependency points
168 // to the apex that the modules is contained in.
169 moduleInApex string
Paul Duffinb67d8782021-04-22 11:49:41 +0100170}
171
Colin Crossd8d8b852024-12-20 16:32:37 -0800172type bootclasspathDependencyTagType int
173
174const (
175 // The tag used for dependencies onto bootclasspath_fragments.
176 fragment bootclasspathDependencyTagType = iota
177 // The tag used for dependencies onto platform_bootclasspath.
178 platform
179 dexpreoptBootJar
180 artBootJar
181 platformBootJar
182 apexBootJar
183)
184
Paul Duffinb67d8782021-04-22 11:49:41 +0100185func (t bootclasspathDependencyTag) ExcludeFromVisibilityEnforcement() {
186}
187
Colin Crossd6495802025-01-14 15:50:48 -0800188func (t bootclasspathDependencyTag) LicenseAnnotations() []android.LicenseAnnotation {
189 return []android.LicenseAnnotation{android.LicenseAnnotationSharedDependency}
Colin Crossd8d8b852024-12-20 16:32:37 -0800190}
191
Paul Duffinb67d8782021-04-22 11:49:41 +0100192// Dependencies that use the bootclasspathDependencyTag instances are only added after all the
193// visibility checking has been done so this has no functional effect. However, it does make it
194// clear that visibility is not being enforced on these tags.
195var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathDependencyTag{}
196
Paul Duffin10931582021-04-25 10:13:54 +0100197// BootclasspathNestedAPIProperties defines properties related to the API provided by parts of the
198// bootclasspath that are nested within the main BootclasspathAPIProperties.
199type BootclasspathNestedAPIProperties struct {
200 // java_library or preferably, java_sdk_library modules providing stub classes that define the
201 // APIs provided by this bootclasspath_fragment.
Cole Faustaaff7822024-07-30 12:59:44 -0700202 Stub_libs proptools.Configurable[[]string]
Paul Duffin10931582021-04-25 10:13:54 +0100203}
204
205// BootclasspathAPIProperties defines properties for defining the API provided by parts of the
206// bootclasspath.
207type BootclasspathAPIProperties struct {
208 // Api properties provide information about the APIs provided by the bootclasspath_fragment.
209 // Properties in this section apply to public, system and test api scopes. They DO NOT apply to
210 // core_platform as that is a special, ART specific scope, that does not follow the pattern and so
211 // has its own section. It is in the process of being deprecated and replaced by the system scope
212 // but this will remain for the foreseeable future to maintain backwards compatibility.
213 //
214 // Every bootclasspath_fragment must specify at least one stubs_lib in this section and must
215 // specify stubs for all the APIs provided by its contents. Failure to do so will lead to those
216 // methods being inaccessible to other parts of Android, including but not limited to
217 // applications.
218 Api BootclasspathNestedAPIProperties
219
220 // Properties related to the core platform API surface.
221 //
222 // This must only be used by the following modules:
223 // * ART
224 // * Conscrypt
225 // * I18N
226 //
227 // The bootclasspath_fragments for each of the above modules must specify at least one stubs_lib
228 // and must specify stubs for all the APIs provided by its contents. Failure to do so will lead to
229 // those methods being inaccessible to the other modules in the list.
230 Core_platform_api BootclasspathNestedAPIProperties
231}
232
Paul Duffin31fad802021-06-18 18:14:25 +0100233// apiScopeToStubLibs calculates the stub library modules for each relevant *HiddenAPIScope from the
Paul Duffin10931582021-04-25 10:13:54 +0100234// Stub_libs properties.
Cole Faustaaff7822024-07-30 12:59:44 -0700235func (p BootclasspathAPIProperties) apiScopeToStubLibs(ctx android.BaseModuleContext) map[*HiddenAPIScope][]string {
Paul Duffin31fad802021-06-18 18:14:25 +0100236 m := map[*HiddenAPIScope][]string{}
237 for _, apiScope := range hiddenAPISdkLibrarySupportedScopes {
Cole Faustaaff7822024-07-30 12:59:44 -0700238 m[apiScope] = p.Api.Stub_libs.GetOrDefault(ctx, nil)
Paul Duffin10931582021-04-25 10:13:54 +0100239 }
Cole Faustaaff7822024-07-30 12:59:44 -0700240 m[CorePlatformHiddenAPIScope] = p.Core_platform_api.Stub_libs.GetOrDefault(ctx, nil)
Paul Duffin10931582021-04-25 10:13:54 +0100241 return m
242}