Add CommonOS variant for sdk
Adds a CommonOS variant for sdk that depends on the os specific variants and is used to generate a single sdk for multiple OsTypes, e.g. host linux and android. At the minute the member types only support a single OsType but the basic mechanism for managing the CommonOS variant and collating the variants across all of them is there. The only visible effect of this change is that the location of the generated snapshot is changed, it is no longer os specific and instead is in the same location irrespective of which os it is built for. A lot of tests needed to be changed to specify "common_os" as the variant type instead of the specific os type. As that is the same across all tests it is hard coded in CheckSnapshot method. Test: m nothing Bug: 150451422 Change-Id: If36be39b06d6910453649f7c288c2d34f688b2f4
This commit is contained in:
@@ -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 {
|
||||
|
Reference in New Issue
Block a user