diff options
Diffstat (limited to 'sdk/update.go')
-rw-r--r-- | sdk/update.go | 90 |
1 files changed, 58 insertions, 32 deletions
diff --git a/sdk/update.go b/sdk/update.go index d211e80d7..087b8bc64 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -104,18 +104,9 @@ 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.SdkMemberTypesRegistry. -// The names are in the order in which the dependencies were added. -// -// Returns the members as well as the multilib setting to use. -func (s *sdk) collectMembers(ctx android.ModuleContext) ([]*sdkMember, string) { - byType := make(map[android.SdkMemberType][]*sdkMember) - byName := make(map[string]*sdkMember) - - lib32 := false // True if any of the members have 32 bit version. - lib64 := false // True if any of the members have 64 bit version. - +// Returns a list containing type (extracted from the dependency tag) and the variant. +func (s *sdk) collectMembers(ctx android.ModuleContext) []sdkMemberRef { + var memberRefs []sdkMemberRef ctx.WalkDeps(func(child android.Module, parent android.Module) bool { tag := ctx.OtherModuleDependencyTag(child) if memberTag, ok := tag.(android.SdkMemberTypeDependencyTag); ok { @@ -126,24 +117,7 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) ([]*sdkMember, string) { ctx.ModuleErrorf("module %q is not valid in property %s", ctx.OtherModuleName(child), memberType.SdkPropertyName()) } - name := ctx.OtherModuleName(child) - member := byName[name] - if member == nil { - member = &sdkMember{memberType: memberType, name: name} - byName[name] = member - byType[memberType] = append(byType[memberType], member) - } - - multilib := child.Target().Arch.ArchType.Multilib - if multilib == "lib32" { - lib32 = true - } else if multilib == "lib64" { - lib64 = true - } - - // Only append new variants to the list. This is needed because a member can be both - // exported by the sdk and also be a transitive sdk member. - member.variants = appendUniqueVariants(member.variants, child.(android.SdkAware)) + memberRefs = append(memberRefs, sdkMemberRef{memberType, child.(android.SdkAware)}) // If the member type supports transitive sdk members then recurse down into // its dependencies, otherwise exit traversal. @@ -153,6 +127,47 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) ([]*sdkMember, string) { return false }) + return memberRefs +} + +// Organize 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.SdkMemberTypesRegistry. +// The names are in the order in which the dependencies were added. +// +// Returns the members as well as the multilib setting to use. +func (s *sdk) organizeMembers(ctx android.ModuleContext, memberRefs []sdkMemberRef) ([]*sdkMember, string) { + byType := make(map[android.SdkMemberType][]*sdkMember) + byName := make(map[string]*sdkMember) + + lib32 := false // True if any of the members have 32 bit version. + lib64 := false // True if any of the members have 64 bit version. + + for _, memberRef := range memberRefs { + memberType := memberRef.memberType + variant := memberRef.variant + + name := ctx.OtherModuleName(variant) + member := byName[name] + if member == nil { + member = &sdkMember{memberType: memberType, name: name} + byName[name] = member + byType[memberType] = append(byType[memberType], member) + } + + multilib := variant.Target().Arch.ArchType.Multilib + if multilib == "lib32" { + lib32 = true + } else if multilib == "lib64" { + lib64 = true + } + + // Only append new variants to the list. This is needed because a member can be both + // exported by the sdk and also be a transitive sdk member. + member.variants = appendUniqueVariants(member.variants, variant) + } + var members []*sdkMember for _, memberListProperty := range s.memberListProperties() { membersOfType := byType[memberListProperty.memberType] @@ -207,7 +222,13 @@ func versionedSdkMemberName(ctx android.ModuleContext, memberName string, versio // buildSnapshot is the main function in this source file. It creates rules to copy // the contents (header files, stub libraries, etc) into the zip file. -func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath { +func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) android.OutputPath { + + var memberRefs []sdkMemberRef + for _, sdkVariant := range sdkVariants { + memberRefs = append(memberRefs, sdkVariant.memberRefs...) + } + snapshotDir := android.PathForModuleOut(ctx, "snapshot") bp := newGeneratedFile(ctx, "snapshot", "Android.bp") @@ -228,7 +249,7 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath { } s.builderForTests = builder - members, multilib := s.collectMembers(ctx) + members, multilib := s.organizeMembers(ctx, memberRefs) for _, member := range members { member.memberType.BuildSnapshot(ctx, builder, member) } @@ -592,6 +613,11 @@ func (s *snapshotBuilder) unversionedSdkMemberNames(members []string) []string { return references } +type sdkMemberRef struct { + memberType android.SdkMemberType + variant android.SdkAware +} + var _ android.SdkMember = (*sdkMember)(nil) type sdkMember struct { |