From f4ae4f1390c0e0e34c1ad876d7df8abf16f8df1f Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Mon, 13 Jan 2020 20:58:25 +0000 Subject: [PATCH] Add support for transitive sdk members Allow an sdk member type to treat some of its dependencies as being members of the sdk. Needed for the java_system_modules type whose libs property are an implementation detail of the system module and so should not be explicitly listed in the sdk module but still have to be included in the sdk snapshot. Bug: 142940300 Test: m nothing Change-Id: I90f37dae269ef64a6fe9debd0bbaf29a64dd74d8 --- android/sdk.go | 16 ++++++++++++++-- sdk/update.go | 22 ++++++++++++++-------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/android/sdk.go b/android/sdk.go index 27756ce66..cf59eca9a 100644 --- a/android/sdk.go +++ b/android/sdk.go @@ -264,6 +264,13 @@ type SdkMemberType interface { // True if the member type supports the sdk/sdk_snapshot, false otherwise. UsableWithSdkAndSdkSnapshot() bool + // Return true if modules of this type can have dependencies which should be + // treated as if they are sdk members. + // + // Any dependency that is to be treated as a member of the sdk needs to implement + // SdkAware and be added with an SdkMemberTypeDependencyTag tag. + HasTransitiveSdkMembers() bool + // Add dependencies from the SDK module to all the variants the member // contributes to the SDK. The exact set of variants required is determined // by the SDK and its properties. The dependencies must be added with the @@ -291,8 +298,9 @@ type SdkMemberType interface { // Base type for SdkMemberType implementations. type SdkMemberTypeBase struct { - PropertyName string - SupportsSdk bool + PropertyName string + SupportsSdk bool + TransitiveSdkMembers bool } func (b *SdkMemberTypeBase) SdkPropertyName() string { @@ -303,6 +311,10 @@ func (b *SdkMemberTypeBase) UsableWithSdkAndSdkSnapshot() bool { return b.SupportsSdk } +func (b *SdkMemberTypeBase) HasTransitiveSdkMembers() bool { + return b.TransitiveSdkMembers +} + // Encapsulates the information about registered SdkMemberTypes. type SdkMemberTypesRegistry struct { // The list of types sorted by property name. diff --git a/sdk/update.go b/sdk/update.go index 97bafa1ba..7fc7b9a31 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -105,23 +105,23 @@ func (gf *generatedFile) build(pctx android.PackageContext, ctx android.BuilderC // Collect all the members. // // The members are first grouped by type and then grouped by name. The order of -// the types is the order they are referenced in android.SdkMemberTypes. The -// names are in order in which the dependencies were added. +// the types is the order they are referenced in android.SdkMemberTypesRegistry. +// The names are in the order in which the dependencies were added. func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember { byType := make(map[android.SdkMemberType][]*sdkMember) byName := make(map[string]*sdkMember) - ctx.VisitDirectDeps(func(m android.Module) { - tag := ctx.OtherModuleDependencyTag(m) + ctx.WalkDeps(func(child android.Module, parent android.Module) bool { + tag := ctx.OtherModuleDependencyTag(child) if memberTag, ok := tag.(android.SdkMemberTypeDependencyTag); ok { memberType := memberTag.SdkMemberType() // Make sure that the resolved module is allowed in the member list property. - if !memberType.IsInstance(m) { - ctx.ModuleErrorf("module %q is not valid in property %s", ctx.OtherModuleName(m), memberType.SdkPropertyName()) + if !memberType.IsInstance(child) { + ctx.ModuleErrorf("module %q is not valid in property %s", ctx.OtherModuleName(child), memberType.SdkPropertyName()) } - name := ctx.OtherModuleName(m) + name := ctx.OtherModuleName(child) member := byName[name] if member == nil { @@ -130,8 +130,14 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) []*sdkMember { byType[memberType] = append(byType[memberType], member) } - member.variants = append(member.variants, m.(android.SdkAware)) + member.variants = append(member.variants, child.(android.SdkAware)) + + // If the member type supports transitive sdk members then recurse down into + // its dependencies, otherwise exit traversal. + return memberType.HasTransitiveSdkMembers() } + + return false }) var members []*sdkMember