Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit eaf8e2de authored by Paul Duffin's avatar Paul Duffin Committed by Gerrit Code Review
Browse files

Merge "Add abstraction for tracking compile multilib usages"

parents b1eb4d4a 9c3760eb
Loading
Loading
Loading
Loading
+48 −32
Original line number Diff line number Diff line
@@ -144,8 +144,7 @@ func (s *sdk) organizeMembers(ctx android.ModuleContext, memberRefs []sdkMemberR
	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.
	multilib := multilibNone

	for _, memberRef := range memberRefs {
		memberType := memberRef.memberType
@@ -159,12 +158,7 @@ func (s *sdk) organizeMembers(ctx android.ModuleContext, memberRefs []sdkMemberR
			byType[memberType] = append(byType[memberType], member)
		}

		multilib := variant.Target().Arch.ArchType.Multilib
		if multilib == "lib32" {
			lib32 = true
		} else if multilib == "lib64" {
			lib64 = true
		}
		multilib = multilib.addArchType(variant.Target().Arch.ArchType)

		// 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.
@@ -177,17 +171,7 @@ func (s *sdk) organizeMembers(ctx android.ModuleContext, memberRefs []sdkMemberR
		members = append(members, membersOfType...)
	}

	// Compute the setting of multilib.
	var multilib string
	if lib32 && lib64 {
		multilib = "both"
	} else if lib32 {
		multilib = "32"
	} else if lib64 {
		multilib = "64"
	}

	return members, multilib
	return members, multilib.String()
}

func appendUniqueVariants(variants []android.SdkAware, newVariant android.SdkAware) []android.SdkAware {
@@ -787,6 +771,47 @@ func (m *sdkMember) Variants() []android.SdkAware {
	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 {
	Properties android.SdkMemberProperties
}
@@ -865,8 +890,11 @@ func (osInfo *osTypeSpecificInfo) optimizeProperties(commonValueExtractor *commo
		return
	}

	multilib := multilibNone
	var archPropertiesList []android.SdkMemberProperties
	for _, archInfo := range osInfo.archInfos {
		multilib = multilib.addArchType(archInfo.archType)

		// Optimize the arch properties first.
		archInfo.optimizeProperties(commonValueExtractor)

@@ -876,19 +904,7 @@ func (osInfo *osTypeSpecificInfo) optimizeProperties(commonValueExtractor *commo
	commonValueExtractor.extractCommonProperties(osInfo.Properties, archPropertiesList)

	// Choose setting for compile_multilib that is appropriate for the arch variants supplied.
	var 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
	osInfo.Properties.Base().Compile_multilib = multilib.String()
}

// Add the properties for an os to a property set.