blob: 2e33c06c3b347cefc5ac09cb45f5e7435b80d5ab [file] [log] [blame]
Paul Duffin3451e162021-01-20 15:16:56 +00001// Copyright (C) 2021 The Android Open Source Project
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 (
Paul Duffina1d60252021-01-21 18:13:43 +000018 "fmt"
Paul Duffin7c955552021-04-19 13:23:53 +010019 "path/filepath"
Paul Duffinba6afd02019-11-19 19:44:10 +000020 "reflect"
Paul Duffin3451e162021-01-20 15:16:56 +000021 "strings"
22
23 "android/soong/android"
Paul Duffina1d60252021-01-21 18:13:43 +000024 "android/soong/dexpreopt"
Paul Duffinc7ef9892021-03-23 23:21:59 +000025 "github.com/google/blueprint/proptools"
Martin Stjernholmb79c7f12021-03-17 00:26:25 +000026
Paul Duffin3451e162021-01-20 15:16:56 +000027 "github.com/google/blueprint"
28)
29
30func init() {
Paul Duffin7771eba2021-04-23 14:25:28 +010031 registerBootclasspathFragmentBuildComponents(android.InitRegistrationContext)
Paul Duffinf7f65da2021-03-10 15:00:46 +000032
Paul Duffin7771eba2021-04-23 14:25:28 +010033 android.RegisterSdkMemberType(&bootclasspathFragmentMemberType{
Paul Duffin4b64ba02021-03-29 11:02:53 +010034 SdkMemberTypeBase: android.SdkMemberTypeBase{
Paul Duffine95b53a2021-04-23 20:41:23 +010035 PropertyName: "bootclasspath_fragments",
36 SupportsSdk: true,
37 TransitiveSdkMembers: true,
Paul Duffin4b64ba02021-03-29 11:02:53 +010038 },
39 })
Paul Duffin3451e162021-01-20 15:16:56 +000040}
41
Paul Duffin7771eba2021-04-23 14:25:28 +010042func registerBootclasspathFragmentBuildComponents(ctx android.RegistrationContext) {
Paul Duffin7771eba2021-04-23 14:25:28 +010043 ctx.RegisterModuleType("bootclasspath_fragment", bootclasspathFragmentFactory)
44 ctx.RegisterModuleType("prebuilt_bootclasspath_fragment", prebuiltBootclasspathFragmentFactory)
Paul Duffin3451e162021-01-20 15:16:56 +000045}
46
Paul Duffin65898052021-04-20 22:47:03 +010047type bootclasspathFragmentContentDependencyTag struct {
Paul Duffinc7ef9892021-03-23 23:21:59 +000048 blueprint.BaseDependencyTag
49}
50
Paul Duffin7771eba2021-04-23 14:25:28 +010051// Avoid having to make bootclasspath_fragment content visible to the bootclasspath_fragment.
Paul Duffinc7ef9892021-03-23 23:21:59 +000052//
Paul Duffin7771eba2021-04-23 14:25:28 +010053// This is a temporary workaround to make it easier to migrate to bootclasspath_fragment modules
54// with proper dependencies.
Paul Duffinc7ef9892021-03-23 23:21:59 +000055// TODO(b/177892522): Remove this and add needed visibility.
Paul Duffin65898052021-04-20 22:47:03 +010056func (b bootclasspathFragmentContentDependencyTag) ExcludeFromVisibilityEnforcement() {
57}
58
59// The bootclasspath_fragment contents must never depend on prebuilts.
60func (b bootclasspathFragmentContentDependencyTag) ReplaceSourceWithPrebuilt() bool {
61 return false
Paul Duffinc7ef9892021-03-23 23:21:59 +000062}
63
Paul Duffine95b53a2021-04-23 20:41:23 +010064// SdkMemberType causes dependencies added with this tag to be automatically added to the sdk as if
65// they were specified using java_boot_libs.
66func (b bootclasspathFragmentContentDependencyTag) SdkMemberType() android.SdkMemberType {
67 return javaBootLibsSdkMemberType
68}
69
70func (b bootclasspathFragmentContentDependencyTag) ExportMember() bool {
71 return true
72}
73
Paul Duffin7771eba2021-04-23 14:25:28 +010074// The tag used for the dependency between the bootclasspath_fragment module and its contents.
Paul Duffin65898052021-04-20 22:47:03 +010075var bootclasspathFragmentContentDepTag = bootclasspathFragmentContentDependencyTag{}
Paul Duffinc7ef9892021-03-23 23:21:59 +000076
Paul Duffin65898052021-04-20 22:47:03 +010077var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathFragmentContentDepTag
78var _ android.ReplaceSourceWithPrebuilt = bootclasspathFragmentContentDepTag
Paul Duffine95b53a2021-04-23 20:41:23 +010079var _ android.SdkMemberTypeDependencyTag = bootclasspathFragmentContentDepTag
Paul Duffinc7ef9892021-03-23 23:21:59 +000080
Paul Duffin65898052021-04-20 22:47:03 +010081func IsBootclasspathFragmentContentDepTag(tag blueprint.DependencyTag) bool {
82 return tag == bootclasspathFragmentContentDepTag
Paul Duffin4d101b62021-03-24 15:42:20 +000083}
84
Paul Duffinc7d16442021-04-23 13:55:49 +010085// Properties that can be different when coverage is enabled.
86type BootclasspathFragmentCoverageAffectedProperties struct {
87 // The contents of this bootclasspath_fragment, could be either java_library, or java_sdk_library.
88 //
89 // The order of this list matters as it is the order that is used in the bootclasspath.
90 Contents []string
91}
92
Paul Duffin7771eba2021-04-23 14:25:28 +010093type bootclasspathFragmentProperties struct {
Paul Duffin3451e162021-01-20 15:16:56 +000094 // The name of the image this represents.
95 //
Paul Duffin82886d62021-03-24 01:34:57 +000096 // If specified then it must be one of "art" or "boot".
Paul Duffin64be7bb2021-03-23 23:06:38 +000097 Image_name *string
Paul Duffinc7ef9892021-03-23 23:21:59 +000098
Paul Duffinc7d16442021-04-23 13:55:49 +010099 // Properties whose values need to differ with and without coverage.
100 BootclasspathFragmentCoverageAffectedProperties
101 Coverage BootclasspathFragmentCoverageAffectedProperties
Paul Duffin9b381ef2021-04-08 23:01:37 +0100102
103 Hidden_api HiddenAPIFlagFileProperties
Paul Duffin3451e162021-01-20 15:16:56 +0000104}
105
Paul Duffin7771eba2021-04-23 14:25:28 +0100106type BootclasspathFragmentModule struct {
Paul Duffin3451e162021-01-20 15:16:56 +0000107 android.ModuleBase
Paul Duffina1d60252021-01-21 18:13:43 +0000108 android.ApexModuleBase
Paul Duffinf7f65da2021-03-10 15:00:46 +0000109 android.SdkBase
Paul Duffin7771eba2021-04-23 14:25:28 +0100110 properties bootclasspathFragmentProperties
Paul Duffin3451e162021-01-20 15:16:56 +0000111}
112
Paul Duffin7771eba2021-04-23 14:25:28 +0100113func bootclasspathFragmentFactory() android.Module {
114 m := &BootclasspathFragmentModule{}
Paul Duffin3451e162021-01-20 15:16:56 +0000115 m.AddProperties(&m.properties)
Paul Duffina1d60252021-01-21 18:13:43 +0000116 android.InitApexModule(m)
Paul Duffinf7f65da2021-03-10 15:00:46 +0000117 android.InitSdkAwareModule(m)
Martin Stjernholmb79c7f12021-03-17 00:26:25 +0000118 android.InitAndroidArchModule(m, android.HostAndDeviceSupported, android.MultilibCommon)
Paul Duffinc7ef9892021-03-23 23:21:59 +0000119
Paul Duffinc7ef9892021-03-23 23:21:59 +0000120 android.AddLoadHook(m, func(ctx android.LoadHookContext) {
Paul Duffinc7d16442021-04-23 13:55:49 +0100121 // If code coverage has been enabled for the framework then append the properties with
122 // coverage specific properties.
123 if ctx.Config().IsEnvTrue("EMMA_INSTRUMENT_FRAMEWORK") {
124 err := proptools.AppendProperties(&m.properties.BootclasspathFragmentCoverageAffectedProperties, &m.properties.Coverage, nil)
125 if err != nil {
126 ctx.PropertyErrorf("coverage", "error trying to append coverage specific properties: %s", err)
127 return
128 }
129 }
130
131 // Initialize the contents property from the image_name.
Paul Duffin7771eba2021-04-23 14:25:28 +0100132 bootclasspathFragmentInitContentsFromImage(ctx, m)
Paul Duffinc7ef9892021-03-23 23:21:59 +0000133 })
Paul Duffin3451e162021-01-20 15:16:56 +0000134 return m
135}
136
Paul Duffin7771eba2021-04-23 14:25:28 +0100137// bootclasspathFragmentInitContentsFromImage will initialize the contents property from the image_name if
138// necessary.
139func bootclasspathFragmentInitContentsFromImage(ctx android.EarlyModuleContext, m *BootclasspathFragmentModule) {
Paul Duffin82886d62021-03-24 01:34:57 +0000140 contents := m.properties.Contents
141 if m.properties.Image_name == nil && len(contents) == 0 {
142 ctx.ModuleErrorf(`neither of the "image_name" and "contents" properties have been supplied, please supply exactly one`)
143 }
Paul Duffinba6afd02019-11-19 19:44:10 +0000144
145 if len(contents) != 0 {
146 // Nothing to do.
147 return
Paul Duffin82886d62021-03-24 01:34:57 +0000148 }
Paul Duffin023dba02021-04-22 01:45:29 +0100149
Paul Duffinc7ef9892021-03-23 23:21:59 +0000150 imageName := proptools.String(m.properties.Image_name)
151 if imageName == "art" {
Paul Duffin023dba02021-04-22 01:45:29 +0100152 // TODO(b/177892522): Prebuilts (versioned or not) should not use the image_name property.
153 if m.MemberName() != "" {
154 // The module is a versioned prebuilt so ignore it. This is done for a couple of reasons:
155 // 1. There is no way to use this at the moment so ignoring it is safe.
156 // 2. Attempting to initialize the contents property from the configuration will end up having
157 // the versioned prebuilt depending on the unversioned prebuilt. That will cause problems
158 // as the unversioned prebuilt could end up with an APEX variant created for the source
159 // APEX which will prevent it from having an APEX variant for the prebuilt APEX which in
160 // turn will prevent it from accessing the dex implementation jar from that which will
161 // break hidden API processing, amongst others.
162 return
163 }
164
Paul Duffinc7ef9892021-03-23 23:21:59 +0000165 // Get the configuration for the art apex jars. Do not use getImageConfig(ctx) here as this is
166 // too early in the Soong processing for that to work.
167 global := dexpreopt.GetGlobalConfig(ctx)
168 modules := global.ArtApexJars
169
170 // Make sure that the apex specified in the configuration is consistent and is one for which
171 // this boot image is available.
Paul Duffinc7ef9892021-03-23 23:21:59 +0000172 commonApex := ""
173 for i := 0; i < modules.Len(); i++ {
174 apex := modules.Apex(i)
175 jar := modules.Jar(i)
176 if apex == "platform" {
177 ctx.ModuleErrorf("ArtApexJars is invalid as it requests a platform variant of %q", jar)
178 continue
179 }
180 if !m.AvailableFor(apex) {
181 ctx.ModuleErrorf("incompatible with ArtApexJars which expects this to be in apex %q but this is only in apexes %q",
182 apex, m.ApexAvailable())
183 continue
184 }
185 if commonApex == "" {
186 commonApex = apex
187 } else if commonApex != apex {
188 ctx.ModuleErrorf("ArtApexJars configuration is inconsistent, expected all jars to be in the same apex but it specifies apex %q and %q",
189 commonApex, apex)
190 }
Paul Duffinc7ef9892021-03-23 23:21:59 +0000191 }
192
193 // Store the jars in the Contents property so that they can be used to add dependencies.
Paul Duffinba6afd02019-11-19 19:44:10 +0000194 m.properties.Contents = modules.CopyOfJars()
195 }
196}
197
198// bootclasspathImageNameContentsConsistencyCheck checks that the configuration that applies to this
199// module (if any) matches the contents.
200//
201// This should be a noop as if image_name="art" then the contents will be set from the ArtApexJars
202// config by bootclasspathFragmentInitContentsFromImage so it will be guaranteed to match. However,
203// in future this will not be the case.
204func (b *BootclasspathFragmentModule) bootclasspathImageNameContentsConsistencyCheck(ctx android.BaseModuleContext) {
205 imageName := proptools.String(b.properties.Image_name)
206 if imageName == "art" {
207 // TODO(b/177892522): Prebuilts (versioned or not) should not use the image_name property.
208 if b.MemberName() != "" {
209 // The module is a versioned prebuilt so ignore it. This is done for a couple of reasons:
210 // 1. There is no way to use this at the moment so ignoring it is safe.
211 // 2. Attempting to initialize the contents property from the configuration will end up having
212 // the versioned prebuilt depending on the unversioned prebuilt. That will cause problems
213 // as the unversioned prebuilt could end up with an APEX variant created for the source
214 // APEX which will prevent it from having an APEX variant for the prebuilt APEX which in
215 // turn will prevent it from accessing the dex implementation jar from that which will
216 // break hidden API processing, amongst others.
217 return
218 }
219
220 // Get the configuration for the art apex jars.
221 modules := b.getImageConfig(ctx).modules
222 configuredJars := modules.CopyOfJars()
223
224 // Skip the check if the configured jars list is empty as that is a common configuration when
225 // building targets that do not result in a system image.
226 if len(configuredJars) == 0 {
227 return
228 }
229
230 contents := b.properties.Contents
231 if !reflect.DeepEqual(configuredJars, contents) {
232 ctx.ModuleErrorf("inconsistency in specification of contents. ArtApexJars configuration specifies %#v, contents property specifies %#v",
233 configuredJars, contents)
234 }
Paul Duffinc7ef9892021-03-23 23:21:59 +0000235 }
236}
237
Paul Duffine946b322021-04-25 23:04:00 +0100238var BootclasspathFragmentApexContentInfoProvider = blueprint.NewProvider(BootclasspathFragmentApexContentInfo{})
Paul Duffin3451e162021-01-20 15:16:56 +0000239
Paul Duffine946b322021-04-25 23:04:00 +0100240// BootclasspathFragmentApexContentInfo contains the bootclasspath_fragments contributions to the
241// apex contents.
242type BootclasspathFragmentApexContentInfo struct {
Paul Duffin3451e162021-01-20 15:16:56 +0000243 // The image config, internal to this module (and the dex_bootjars singleton).
Paul Duffina1d60252021-01-21 18:13:43 +0000244 //
Paul Duffine946b322021-04-25 23:04:00 +0100245 // Will be nil if the BootclasspathFragmentApexContentInfo has not been provided for a specific module. That can occur
Paul Duffina1d60252021-01-21 18:13:43 +0000246 // when SkipDexpreoptBootJars(ctx) returns true.
Paul Duffin3451e162021-01-20 15:16:56 +0000247 imageConfig *bootImageConfig
248}
249
Paul Duffine946b322021-04-25 23:04:00 +0100250func (i BootclasspathFragmentApexContentInfo) Modules() android.ConfiguredJarList {
Paul Duffin3451e162021-01-20 15:16:56 +0000251 return i.imageConfig.modules
252}
253
Paul Duffina1d60252021-01-21 18:13:43 +0000254// Get a map from ArchType to the associated boot image's contents for Android.
255//
256// Extension boot images only return their own files, not the files of the boot images they extend.
Paul Duffine946b322021-04-25 23:04:00 +0100257func (i BootclasspathFragmentApexContentInfo) AndroidBootImageFilesByArchType() map[android.ArchType]android.OutputPaths {
Paul Duffina1d60252021-01-21 18:13:43 +0000258 files := map[android.ArchType]android.OutputPaths{}
259 if i.imageConfig != nil {
260 for _, variant := range i.imageConfig.variants {
261 // We also generate boot images for host (for testing), but we don't need those in the apex.
262 // TODO(b/177892522) - consider changing this to check Os.OsClass = android.Device
263 if variant.target.Os == android.Android {
264 files[variant.target.Arch.ArchType] = variant.imagesDeps
265 }
266 }
267 }
268 return files
269}
270
Paul Duffin190fdef2021-04-26 10:33:59 +0100271// DexBootJarPathForContentModule returns the path to the dex boot jar for specified module.
272//
273// The dex boot jar is one which has had hidden API encoding performed on it.
274func (i BootclasspathFragmentApexContentInfo) DexBootJarPathForContentModule(module android.Module) android.Path {
275 j := module.(UsesLibraryDependency)
276 dexJar := j.DexJarBuildPath()
277 return dexJar
278}
279
Paul Duffin7771eba2021-04-23 14:25:28 +0100280func (b *BootclasspathFragmentModule) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
Paul Duffina1d60252021-01-21 18:13:43 +0000281 tag := ctx.OtherModuleDependencyTag(dep)
Paul Duffin65898052021-04-20 22:47:03 +0100282 if IsBootclasspathFragmentContentDepTag(tag) {
Paul Duffin4d101b62021-03-24 15:42:20 +0000283 // Boot image contents are automatically added to apex.
284 return true
Paul Duffinc7ef9892021-03-23 23:21:59 +0000285 }
Bob Badour07065cd2021-02-05 19:59:11 -0800286 if android.IsMetaDependencyTag(tag) {
287 // Cross-cutting metadata dependencies are metadata.
288 return false
289 }
Paul Duffina1d60252021-01-21 18:13:43 +0000290 panic(fmt.Errorf("boot_image module %q should not have a dependency on %q via tag %s", b, dep, android.PrettyPrintTag(tag)))
291}
292
Paul Duffin7771eba2021-04-23 14:25:28 +0100293func (b *BootclasspathFragmentModule) ShouldSupportSdkVersion(ctx android.BaseModuleContext, sdkVersion android.ApiLevel) error {
Paul Duffina1d60252021-01-21 18:13:43 +0000294 return nil
295}
296
Paul Duffin65898052021-04-20 22:47:03 +0100297// ComponentDepsMutator adds dependencies onto modules before any prebuilt modules without a
298// corresponding source module are renamed. This means that adding a dependency using a name without
299// a prebuilt_ prefix will always resolve to a source module and when using a name with that prefix
300// it will always resolve to a prebuilt module.
Paul Duffin7771eba2021-04-23 14:25:28 +0100301func (b *BootclasspathFragmentModule) ComponentDepsMutator(ctx android.BottomUpMutatorContext) {
Paul Duffin65898052021-04-20 22:47:03 +0100302 module := ctx.Module()
Paul Duffin7771eba2021-04-23 14:25:28 +0100303 _, isSourceModule := module.(*BootclasspathFragmentModule)
Paul Duffin65898052021-04-20 22:47:03 +0100304
305 for _, name := range b.properties.Contents {
306 // A bootclasspath_fragment must depend only on other source modules, while the
307 // prebuilt_bootclasspath_fragment must only depend on other prebuilt modules.
Paul Duffina9dd6fa2021-04-22 17:25:57 +0100308 //
309 // TODO(b/177892522) - avoid special handling of jacocoagent.
310 if !isSourceModule && name != "jacocoagent" {
Paul Duffin65898052021-04-20 22:47:03 +0100311 name = android.PrebuiltNameFromSource(name)
312 }
313 ctx.AddDependency(module, bootclasspathFragmentContentDepTag, name)
314 }
315
316}
317
Paul Duffin7771eba2021-04-23 14:25:28 +0100318func (b *BootclasspathFragmentModule) DepsMutator(ctx android.BottomUpMutatorContext) {
Paul Duffinc7ef9892021-03-23 23:21:59 +0000319
Paul Duffina1d60252021-01-21 18:13:43 +0000320 if SkipDexpreoptBootJars(ctx) {
321 return
322 }
323
324 // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The
325 // path is retrieved from the dependency by GetGlobalSoongConfig(ctx).
326 dexpreopt.RegisterToolDeps(ctx)
327}
328
Paul Duffin7771eba2021-04-23 14:25:28 +0100329func (b *BootclasspathFragmentModule) GenerateAndroidBuildActions(ctx android.ModuleContext) {
Paul Duffinba6afd02019-11-19 19:44:10 +0000330 // Only perform a consistency check if this module is the active module. That will prevent an
331 // unused prebuilt that was created without instrumentation from breaking an instrumentation
332 // build.
333 if isActiveModule(ctx.Module()) {
334 b.bootclasspathImageNameContentsConsistencyCheck(ctx)
335 }
336
Paul Duffin9b381ef2021-04-08 23:01:37 +0100337 // Perform hidden API processing.
338 b.generateHiddenAPIBuildActions(ctx)
339
Paul Duffin3451e162021-01-20 15:16:56 +0000340 // Nothing to do if skipping the dexpreopt of boot image jars.
341 if SkipDexpreoptBootJars(ctx) {
342 return
343 }
344
Paul Duffina1d60252021-01-21 18:13:43 +0000345 // Force the GlobalSoongConfig to be created and cached for use by the dex_bootjars
346 // GenerateSingletonBuildActions method as it cannot create it for itself.
347 dexpreopt.GetGlobalSoongConfig(ctx)
348
Paul Duffin64be7bb2021-03-23 23:06:38 +0000349 imageConfig := b.getImageConfig(ctx)
Paul Duffin3451e162021-01-20 15:16:56 +0000350 if imageConfig == nil {
Paul Duffin3451e162021-01-20 15:16:56 +0000351 return
352 }
353
354 // Construct the boot image info from the config.
Paul Duffine946b322021-04-25 23:04:00 +0100355 info := BootclasspathFragmentApexContentInfo{imageConfig: imageConfig}
Paul Duffin3451e162021-01-20 15:16:56 +0000356
357 // Make it available for other modules.
Paul Duffine946b322021-04-25 23:04:00 +0100358 ctx.SetProvider(BootclasspathFragmentApexContentInfoProvider, info)
Paul Duffin3451e162021-01-20 15:16:56 +0000359}
Paul Duffinf7f65da2021-03-10 15:00:46 +0000360
Paul Duffin7771eba2021-04-23 14:25:28 +0100361func (b *BootclasspathFragmentModule) getImageConfig(ctx android.EarlyModuleContext) *bootImageConfig {
Paul Duffin64be7bb2021-03-23 23:06:38 +0000362 // Get a map of the image configs that are supported.
363 imageConfigs := genBootImageConfigs(ctx)
364
365 // Retrieve the config for this image.
366 imageNamePtr := b.properties.Image_name
367 if imageNamePtr == nil {
368 return nil
369 }
370
371 imageName := *imageNamePtr
372 imageConfig := imageConfigs[imageName]
373 if imageConfig == nil {
374 ctx.PropertyErrorf("image_name", "Unknown image name %q, expected one of %s", imageName, strings.Join(android.SortedStringKeys(imageConfigs), ", "))
375 return nil
376 }
377 return imageConfig
378}
379
Paul Duffin9b381ef2021-04-08 23:01:37 +0100380// generateHiddenAPIBuildActions generates all the hidden API related build rules.
Paul Duffin7771eba2021-04-23 14:25:28 +0100381func (b *BootclasspathFragmentModule) generateHiddenAPIBuildActions(ctx android.ModuleContext) {
Paul Duffin9b381ef2021-04-08 23:01:37 +0100382 // Resolve the properties to paths.
383 flagFileInfo := b.properties.Hidden_api.hiddenAPIFlagFileInfo(ctx)
384
385 // Store the information for use by platform_bootclasspath.
386 ctx.SetProvider(hiddenAPIFlagFileInfoProvider, flagFileInfo)
387}
388
Paul Duffin7771eba2021-04-23 14:25:28 +0100389type bootclasspathFragmentMemberType struct {
Paul Duffinf7f65da2021-03-10 15:00:46 +0000390 android.SdkMemberTypeBase
391}
392
Paul Duffin7771eba2021-04-23 14:25:28 +0100393func (b *bootclasspathFragmentMemberType) AddDependencies(mctx android.BottomUpMutatorContext, dependencyTag blueprint.DependencyTag, names []string) {
Paul Duffinf7f65da2021-03-10 15:00:46 +0000394 mctx.AddVariationDependencies(nil, dependencyTag, names...)
395}
396
Paul Duffin7771eba2021-04-23 14:25:28 +0100397func (b *bootclasspathFragmentMemberType) IsInstance(module android.Module) bool {
398 _, ok := module.(*BootclasspathFragmentModule)
Paul Duffinf7f65da2021-03-10 15:00:46 +0000399 return ok
400}
401
Paul Duffin7771eba2021-04-23 14:25:28 +0100402func (b *bootclasspathFragmentMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
Paul Duffin4b64ba02021-03-29 11:02:53 +0100403 if b.PropertyName == "boot_images" {
404 return ctx.SnapshotBuilder().AddPrebuiltModule(member, "prebuilt_boot_image")
405 } else {
406 return ctx.SnapshotBuilder().AddPrebuiltModule(member, "prebuilt_bootclasspath_fragment")
407 }
Paul Duffinf7f65da2021-03-10 15:00:46 +0000408}
409
Paul Duffin7771eba2021-04-23 14:25:28 +0100410func (b *bootclasspathFragmentMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
411 return &bootclasspathFragmentSdkMemberProperties{}
Paul Duffinf7f65da2021-03-10 15:00:46 +0000412}
413
Paul Duffin7771eba2021-04-23 14:25:28 +0100414type bootclasspathFragmentSdkMemberProperties struct {
Paul Duffinf7f65da2021-03-10 15:00:46 +0000415 android.SdkMemberPropertiesBase
416
Paul Duffina57835e2021-04-19 13:23:06 +0100417 // The image name
Paul Duffin64be7bb2021-03-23 23:06:38 +0000418 Image_name *string
Paul Duffina57835e2021-04-19 13:23:06 +0100419
420 // Contents of the bootclasspath fragment
421 Contents []string
Paul Duffin7c955552021-04-19 13:23:53 +0100422
423 // Flag files by *hiddenAPIFlagFileCategory
424 Flag_files_by_category map[*hiddenAPIFlagFileCategory]android.Paths
Paul Duffinf7f65da2021-03-10 15:00:46 +0000425}
426
Paul Duffin7771eba2021-04-23 14:25:28 +0100427func (b *bootclasspathFragmentSdkMemberProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
428 module := variant.(*BootclasspathFragmentModule)
Paul Duffinf7f65da2021-03-10 15:00:46 +0000429
430 b.Image_name = module.properties.Image_name
Paul Duffin2dc665b2021-04-23 16:58:51 +0100431 b.Contents = module.properties.Contents
Paul Duffin7c955552021-04-19 13:23:53 +0100432
433 // Get the flag file information from the module.
434 mctx := ctx.SdkModuleContext()
435 flagFileInfo := mctx.OtherModuleProvider(module, hiddenAPIFlagFileInfoProvider).(hiddenAPIFlagFileInfo)
436 b.Flag_files_by_category = flagFileInfo.categoryToPaths
Paul Duffinf7f65da2021-03-10 15:00:46 +0000437}
438
Paul Duffin7771eba2021-04-23 14:25:28 +0100439func (b *bootclasspathFragmentSdkMemberProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
Paul Duffin64be7bb2021-03-23 23:06:38 +0000440 if b.Image_name != nil {
441 propertySet.AddProperty("image_name", *b.Image_name)
Paul Duffinf7f65da2021-03-10 15:00:46 +0000442 }
Paul Duffina57835e2021-04-19 13:23:06 +0100443
444 if len(b.Contents) > 0 {
445 propertySet.AddPropertyWithTag("contents", b.Contents, ctx.SnapshotBuilder().SdkMemberReferencePropertyTag(true))
446 }
Paul Duffin7c955552021-04-19 13:23:53 +0100447
448 builder := ctx.SnapshotBuilder()
449 if b.Flag_files_by_category != nil {
450 hiddenAPISet := propertySet.AddPropertySet("hidden_api")
451 for _, category := range hiddenAPIFlagFileCategories {
452 paths := b.Flag_files_by_category[category]
453 if len(paths) > 0 {
454 dests := []string{}
455 for _, p := range paths {
456 dest := filepath.Join("hiddenapi", p.Base())
457 builder.CopyToSnapshot(p, dest)
458 dests = append(dests, dest)
459 }
460 hiddenAPISet.AddProperty(category.propertyName, dests)
461 }
462 }
463 }
Paul Duffinf7f65da2021-03-10 15:00:46 +0000464}
465
Paul Duffin7771eba2021-04-23 14:25:28 +0100466var _ android.SdkMemberType = (*bootclasspathFragmentMemberType)(nil)
Paul Duffinf7f65da2021-03-10 15:00:46 +0000467
Paul Duffin7771eba2021-04-23 14:25:28 +0100468// A prebuilt version of the bootclasspath_fragment module.
Paul Duffinf7f65da2021-03-10 15:00:46 +0000469//
Paul Duffin7771eba2021-04-23 14:25:28 +0100470// At the moment this is basically just a bootclasspath_fragment module that can be used as a
471// prebuilt. Eventually as more functionality is migrated into the bootclasspath_fragment module
472// type from the various singletons then this will diverge.
473type prebuiltBootclasspathFragmentModule struct {
474 BootclasspathFragmentModule
Paul Duffinf7f65da2021-03-10 15:00:46 +0000475 prebuilt android.Prebuilt
476}
477
Paul Duffin7771eba2021-04-23 14:25:28 +0100478func (module *prebuiltBootclasspathFragmentModule) Prebuilt() *android.Prebuilt {
Paul Duffinf7f65da2021-03-10 15:00:46 +0000479 return &module.prebuilt
480}
481
Paul Duffin7771eba2021-04-23 14:25:28 +0100482func (module *prebuiltBootclasspathFragmentModule) Name() string {
Paul Duffinf7f65da2021-03-10 15:00:46 +0000483 return module.prebuilt.Name(module.ModuleBase.Name())
484}
485
Paul Duffin7771eba2021-04-23 14:25:28 +0100486func prebuiltBootclasspathFragmentFactory() android.Module {
487 m := &prebuiltBootclasspathFragmentModule{}
Paul Duffinf7f65da2021-03-10 15:00:46 +0000488 m.AddProperties(&m.properties)
Paul Duffinf7f65da2021-03-10 15:00:46 +0000489 // This doesn't actually have any prebuilt files of its own so pass a placeholder for the srcs
490 // array.
491 android.InitPrebuiltModule(m, &[]string{"placeholder"})
492 android.InitApexModule(m)
493 android.InitSdkAwareModule(m)
Martin Stjernholmb79c7f12021-03-17 00:26:25 +0000494 android.InitAndroidArchModule(m, android.HostAndDeviceSupported, android.MultilibCommon)
Paul Duffinc7ef9892021-03-23 23:21:59 +0000495
Paul Duffin7771eba2021-04-23 14:25:28 +0100496 // Initialize the contents property from the image_name.
Paul Duffinc7ef9892021-03-23 23:21:59 +0000497 android.AddLoadHook(m, func(ctx android.LoadHookContext) {
Paul Duffin7771eba2021-04-23 14:25:28 +0100498 bootclasspathFragmentInitContentsFromImage(ctx, &m.BootclasspathFragmentModule)
Paul Duffinc7ef9892021-03-23 23:21:59 +0000499 })
Paul Duffinf7f65da2021-03-10 15:00:46 +0000500 return m
501}