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