Extract the os specific snapshot module properties handling

Previously, the code was inlined in the addSnapshotModule() method
which made it difficult to follow, did not have clear separation
between the different pieces and duplicated functionality. This
change combines the dynamic and static properties together and then
separates the processing into collation, optimization and property
set updating methods.

Bug: 186290299
Test: m nothing
Change-Id: I311eebca2337cb67634e63d71da12305f4370c07
This commit is contained in:
Paul Duffin 2021-04-24 11:32:59 +01:00
parent fbe470e7d3
commit 2d1bb89fe3
1 changed files with 87 additions and 40 deletions

View File

@ -367,46 +367,25 @@ func (s *sdk) addSnapshotModule(ctx android.ModuleContext, builder *snapshotBuil
addHostDeviceSupportedProperties(s.ModuleBase.DeviceSupported(), s.ModuleBase.HostSupported(), snapshotModule) addHostDeviceSupportedProperties(s.ModuleBase.DeviceSupported(), s.ModuleBase.HostSupported(), snapshotModule)
var dynamicMemberPropertiesContainers []propertiesContainer combinedPropertiesList := s.collateSnapshotModuleInfo(sdkVariants)
osTypeToMemberProperties := make(map[android.OsType]interface{}) commonCombinedProperties := s.optimizeSnapshotModuleProperties(ctx, combinedPropertiesList)
for _, sdkVariant := range sdkVariants {
properties := sdkVariant.dynamicMemberTypeListProperties
osTypeToMemberProperties[sdkVariant.Target().Os] = properties
dynamicMemberPropertiesContainers = append(dynamicMemberPropertiesContainers, &dynamicMemberPropertiesContainer{sdkVariant, properties})
}
// Extract the common lists of members into a separate struct. s.addSnapshotPropertiesToPropertySet(builder, snapshotModule, commonCombinedProperties)
commonDynamicMemberProperties := s.dynamicSdkMemberTypes.createMemberListProperties()
extractor := newCommonValueExtractor(commonDynamicMemberProperties)
extractCommonProperties(ctx, extractor, commonDynamicMemberProperties, dynamicMemberPropertiesContainers)
// Optimize other per-variant properties, besides the dynamic member lists.
var variantPropertiesContainers []propertiesContainer
osTypeToStaticProperties := make(map[android.OsType]*snapshotModuleStaticProperties)
for _, sdkVariant := range sdkVariants {
props := &snapshotModuleStaticProperties{
Compile_multilib: sdkVariant.multilibUsages.String(),
}
variantPropertiesContainers = append(variantPropertiesContainers, &dynamicMemberPropertiesContainer{sdkVariant, props})
osTypeToStaticProperties[sdkVariant.Target().Os] = props
}
commonStaticProperties := &snapshotModuleStaticProperties{}
extractor = newCommonValueExtractor(commonStaticProperties)
extractCommonProperties(ctx, extractor, commonStaticProperties, variantPropertiesContainers)
// Add properties common to all os types.
s.addSnapshotPropertiesToPropertySet(builder, snapshotModule, commonStaticProperties, commonDynamicMemberProperties)
targetPropertySet := snapshotModule.AddPropertySet("target") targetPropertySet := snapshotModule.AddPropertySet("target")
// Create a mapping from osType to combined properties.
osTypeToCombinedProperties := map[android.OsType]*combinedSnapshotModuleProperties{}
for _, combined := range combinedPropertiesList {
osTypeToCombinedProperties[combined.sdkVariant.Os()] = combined
}
// Iterate over the os types in a fixed order. // Iterate over the os types in a fixed order.
for _, osType := range s.getPossibleOsTypes() { for _, osType := range s.getPossibleOsTypes() {
if properties, ok := osTypeToMemberProperties[osType]; ok { if combined, ok := osTypeToCombinedProperties[osType]; ok {
osPropertySet := targetPropertySet.AddPropertySet(osType.Name) osPropertySet := targetPropertySet.AddPropertySet(osType.Name)
staticProperties := osTypeToStaticProperties[osType] s.addSnapshotPropertiesToPropertySet(builder, osPropertySet, combined)
s.addSnapshotPropertiesToPropertySet(builder, osPropertySet, staticProperties, properties)
} }
} }
@ -483,13 +462,81 @@ type snapshotModuleStaticProperties struct {
Compile_multilib string `android:"arch_variant"` Compile_multilib string `android:"arch_variant"`
} }
func (s *sdk) addSnapshotPropertiesToPropertySet(builder *snapshotBuilder, propertySet android.BpPropertySet, staticProperties *snapshotModuleStaticProperties, dynamicMemberTypeListProperties interface{}) { // combinedSnapshotModuleProperties are the properties that are associated with the snapshot module.
type combinedSnapshotModuleProperties struct {
// The sdk variant from which this information was collected.
sdkVariant *sdk
// Static snapshot module properties.
staticProperties *snapshotModuleStaticProperties
// The dynamically generated member list properties.
dynamicProperties interface{}
}
// collateSnapshotModuleInfo collates all the snapshot module info from supplied sdk variants.
func (s *sdk) collateSnapshotModuleInfo(sdkVariants []*sdk) []*combinedSnapshotModuleProperties {
var list []*combinedSnapshotModuleProperties
for _, sdkVariant := range sdkVariants {
staticProperties := &snapshotModuleStaticProperties{
Compile_multilib: sdkVariant.multilibUsages.String(),
}
dynamicProperties := sdkVariant.dynamicMemberTypeListProperties
list = append(list, &combinedSnapshotModuleProperties{
sdkVariant: sdkVariant,
staticProperties: staticProperties,
dynamicProperties: dynamicProperties,
})
}
return list
}
func (s *sdk) optimizeSnapshotModuleProperties(ctx android.ModuleContext, list []*combinedSnapshotModuleProperties) *combinedSnapshotModuleProperties {
// Extract the dynamic properties and add them to a list of propertiesContainer.
propertyContainers := []propertiesContainer{}
for _, i := range list {
propertyContainers = append(propertyContainers, sdkVariantPropertiesContainer{
sdkVariant: i.sdkVariant,
properties: i.dynamicProperties,
})
}
// Extract the common members, removing them from the original properties.
commonDynamicProperties := s.dynamicSdkMemberTypes.createMemberListProperties()
extractor := newCommonValueExtractor(commonDynamicProperties)
extractCommonProperties(ctx, extractor, commonDynamicProperties, propertyContainers)
// Extract the static properties and add them to a list of propertiesContainer.
propertyContainers = []propertiesContainer{}
for _, i := range list {
propertyContainers = append(propertyContainers, sdkVariantPropertiesContainer{
sdkVariant: i.sdkVariant,
properties: i.staticProperties,
})
}
commonStaticProperties := &snapshotModuleStaticProperties{}
extractor = newCommonValueExtractor(commonStaticProperties)
extractCommonProperties(ctx, extractor, &commonStaticProperties, propertyContainers)
return &combinedSnapshotModuleProperties{
sdkVariant: nil,
staticProperties: commonStaticProperties,
dynamicProperties: commonDynamicProperties,
}
}
func (s *sdk) addSnapshotPropertiesToPropertySet(builder *snapshotBuilder, propertySet android.BpPropertySet, combined *combinedSnapshotModuleProperties) {
staticProperties := combined.staticProperties
multilib := staticProperties.Compile_multilib multilib := staticProperties.Compile_multilib
if multilib != "" && multilib != "both" { if multilib != "" && multilib != "both" {
// Compile_multilib defaults to both so only needs to be set when it's specified and not both. // Compile_multilib defaults to both so only needs to be set when it's specified and not both.
propertySet.AddProperty("compile_multilib", multilib) propertySet.AddProperty("compile_multilib", multilib)
} }
dynamicMemberTypeListProperties := combined.dynamicProperties
for _, memberListProperty := range s.memberListProperties() { for _, memberListProperty := range s.memberListProperties() {
names := memberListProperty.getter(dynamicMemberTypeListProperties) names := memberListProperty.getter(dynamicMemberTypeListProperties)
if len(names) > 0 { if len(names) > 0 {
@ -1545,17 +1592,17 @@ type propertiesContainer interface {
optimizableProperties() interface{} optimizableProperties() interface{}
} }
// A wrapper for dynamic member properties to allow them to be optimized. // A wrapper for sdk variant related properties to allow them to be optimized.
type dynamicMemberPropertiesContainer struct { type sdkVariantPropertiesContainer struct {
sdkVariant *sdk sdkVariant *sdk
dynamicMemberProperties interface{} properties interface{}
} }
func (c dynamicMemberPropertiesContainer) optimizableProperties() interface{} { func (c sdkVariantPropertiesContainer) optimizableProperties() interface{} {
return c.dynamicMemberProperties return c.properties
} }
func (c dynamicMemberPropertiesContainer) String() string { func (c sdkVariantPropertiesContainer) String() string {
return c.sdkVariant.String() return c.sdkVariant.String()
} }