Merge "Add abstraction for tracking compile multilib usages"

This commit is contained in:
Paul Duffin
2020-03-21 17:49:57 +00:00
committed by Gerrit Code Review

View File

@@ -144,8 +144,7 @@ func (s *sdk) organizeMembers(ctx android.ModuleContext, memberRefs []sdkMemberR
byType := make(map[android.SdkMemberType][]*sdkMember) byType := make(map[android.SdkMemberType][]*sdkMember)
byName := make(map[string]*sdkMember) byName := make(map[string]*sdkMember)
lib32 := false // True if any of the members have 32 bit version. multilib := multilibNone
lib64 := false // True if any of the members have 64 bit version.
for _, memberRef := range memberRefs { for _, memberRef := range memberRefs {
memberType := memberRef.memberType memberType := memberRef.memberType
@@ -159,12 +158,7 @@ func (s *sdk) organizeMembers(ctx android.ModuleContext, memberRefs []sdkMemberR
byType[memberType] = append(byType[memberType], member) byType[memberType] = append(byType[memberType], member)
} }
multilib := variant.Target().Arch.ArchType.Multilib multilib = multilib.addArchType(variant.Target().Arch.ArchType)
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 // 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. // exported by the sdk and also be a transitive sdk member.
@@ -177,17 +171,7 @@ func (s *sdk) organizeMembers(ctx android.ModuleContext, memberRefs []sdkMemberR
members = append(members, membersOfType...) members = append(members, membersOfType...)
} }
// Compute the setting of multilib. return members, multilib.String()
var multilib string
if lib32 && lib64 {
multilib = "both"
} else if lib32 {
multilib = "32"
} else if lib64 {
multilib = "64"
}
return members, multilib
} }
func appendUniqueVariants(variants []android.SdkAware, newVariant android.SdkAware) []android.SdkAware { func appendUniqueVariants(variants []android.SdkAware, newVariant android.SdkAware) []android.SdkAware {
@@ -787,6 +771,47 @@ func (m *sdkMember) Variants() []android.SdkAware {
return m.variants return m.variants
} }
// Track usages of multilib variants.
type multilibUsage int
const (
multilibNone multilibUsage = 0
multilib32 multilibUsage = 1
multilib64 multilibUsage = 2
multilibBoth = multilib32 | multilib64
)
// Add the multilib that is used in the arch type.
func (m multilibUsage) addArchType(archType android.ArchType) multilibUsage {
multilib := archType.Multilib
switch multilib {
case "":
return m
case "lib32":
return m | multilib32
case "lib64":
return m | multilib64
default:
panic(fmt.Errorf("Unknown Multilib field in ArchType, expected 'lib32' or 'lib64', found %q", multilib))
}
}
func (m multilibUsage) String() string {
switch m {
case multilibNone:
return ""
case multilib32:
return "32"
case multilib64:
return "64"
case multilibBoth:
return "both"
default:
panic(fmt.Errorf("Unknown multilib value, found %b, expected one of %b, %b, %b or %b",
m, multilibNone, multilib32, multilib64, multilibBoth))
}
}
type baseInfo struct { type baseInfo struct {
Properties android.SdkMemberProperties Properties android.SdkMemberProperties
} }
@@ -865,8 +890,11 @@ func (osInfo *osTypeSpecificInfo) optimizeProperties(commonValueExtractor *commo
return return
} }
multilib := multilibNone
var archPropertiesList []android.SdkMemberProperties var archPropertiesList []android.SdkMemberProperties
for _, archInfo := range osInfo.archInfos { for _, archInfo := range osInfo.archInfos {
multilib = multilib.addArchType(archInfo.archType)
// Optimize the arch properties first. // Optimize the arch properties first.
archInfo.optimizeProperties(commonValueExtractor) archInfo.optimizeProperties(commonValueExtractor)
@@ -876,19 +904,7 @@ func (osInfo *osTypeSpecificInfo) optimizeProperties(commonValueExtractor *commo
commonValueExtractor.extractCommonProperties(osInfo.Properties, archPropertiesList) commonValueExtractor.extractCommonProperties(osInfo.Properties, archPropertiesList)
// Choose setting for compile_multilib that is appropriate for the arch variants supplied. // Choose setting for compile_multilib that is appropriate for the arch variants supplied.
var multilib string osInfo.Properties.Base().Compile_multilib = multilib.String()
archVariantCount := len(osInfo.archInfos)
if archVariantCount == 2 {
multilib = "both"
} else if archVariantCount == 1 {
if strings.HasSuffix(osInfo.archInfos[0].archType.Name, "64") {
multilib = "64"
} else {
multilib = "32"
}
}
osInfo.Properties.Base().Compile_multilib = multilib
} }
// Add the properties for an os to a property set. // Add the properties for an os to a property set.