diff options
| -rw-r--r-- | sdk/update.go | 142 |
1 files changed, 77 insertions, 65 deletions
diff --git a/sdk/update.go b/sdk/update.go index 779ba1a6e..d077e40a3 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -794,10 +794,9 @@ type osTypeSpecificInfo struct { baseInfo // The list of arch type specific info for this os type. - archTypes []*archTypeSpecificInfo - - // True if the member has common arch variants for this os type. - commonArch bool + // + // Nil if there is one variant whose arch type is common + archInfos []*archTypeSpecificInfo } type archTypeSpecificInfo struct { @@ -819,18 +818,18 @@ func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, build } osCount := len(variantsByOsType) - createVariantPropertiesStruct := func(os android.OsType) android.SdkMemberProperties { + variantPropertiesFactory := func() android.SdkMemberProperties { properties := memberType.CreateVariantPropertiesStruct() base := properties.Base() base.Os_count = osCount - base.Os = os return properties } osTypeToInfo := make(map[android.OsType]*osTypeSpecificInfo) // The set of properties that are common across all architectures and os types. - commonProperties := createVariantPropertiesStruct(android.CommonOS) + commonProperties := variantPropertiesFactory() + commonProperties.Base().Os = android.CommonOS // Create common value extractor that can be used to optimize the properties. commonValueExtractor := newCommonValueExtractor(commonProperties) @@ -844,63 +843,81 @@ func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, build osInfo := &osTypeSpecificInfo{} osTypeToInfo[osType] = osInfo - // Create a structure into which properties common across the architectures in - // this os type will be stored. Add it to the list of os type specific yet - // architecture independent properties structs. - osInfo.Properties = createVariantPropertiesStruct(osType) + osSpecificVariantPropertiesFactory := func() android.SdkMemberProperties { + properties := variantPropertiesFactory() + properties.Base().Os = osType + return properties + } + + // Add the os specific properties to a list of os type specific yet architecture + // independent properties structs. + osInfo.Properties = osSpecificVariantPropertiesFactory() osSpecificPropertiesList = append(osSpecificPropertiesList, osInfo.Properties) - commonArch := false + // Group the variants by arch type. + var variantsByArchName = make(map[string][]android.SdkAware) + var archTypes []android.ArchType for _, variant := range osTypeVariants { - var properties android.SdkMemberProperties - - // Get the info associated with the arch type inside the os info. archType := variant.Target().Arch.ArchType - - if archType.Name == "common" { - // The arch type is common so populate the common properties directly. - properties = osInfo.Properties - - commonArch = true - } else { - archInfo := &archTypeSpecificInfo{archType: archType} - properties = createVariantPropertiesStruct(osType) - archInfo.Properties = properties - - osInfo.archTypes = append(osInfo.archTypes, archInfo) + archTypeName := archType.Name + if _, ok := variantsByArchName[archTypeName]; !ok { + archTypes = append(archTypes, archType) } - properties.PopulateFromVariant(variant) + variantsByArchName[archTypeName] = append(variantsByArchName[archTypeName], variant) } - if commonArch { + if commonVariants, ok := variantsByArchName["common"]; ok { if len(osTypeVariants) != 1 { - panic("Expected to only have 1 variant when arch type is common but found " + string(len(variants))) + panic("Expected to only have 1 variant when arch type is common but found " + string(len(osTypeVariants))) } + + // A common arch type only has one variant and its properties should be treated + // as common to the os type. + osInfo.Properties.PopulateFromVariant(commonVariants[0]) } else { - var archPropertiesList []android.SdkMemberProperties - for _, archInfo := range osInfo.archTypes { - archPropertiesList = append(archPropertiesList, archInfo.Properties) - } + // Create an arch specific info for each supported architecture type. + for _, archType := range archTypes { + archTypeName := archType.Name - commonValueExtractor.extractCommonProperties(osInfo.Properties, archPropertiesList) - - // Choose setting for compile_multilib that is appropriate for the arch variants supplied. - var multilib string - archVariantCount := len(osInfo.archTypes) - if archVariantCount == 2 { - multilib = "both" - } else if archVariantCount == 1 { - if strings.HasSuffix(osInfo.archTypes[0].archType.Name, "64") { - multilib = "64" - } else { - multilib = "32" + archVariants := variantsByArchName[archTypeName] + if len(archVariants) != 1 { + panic(fmt.Errorf("expected one arch specific variant but found %d", len(variants))) } + + // Create an arch specific info into which the variant properties can be copied. + archInfo := &archTypeSpecificInfo{archType: archType} + + // Create the properties into which the arch type specific properties will be + // added. + archInfo.Properties = osSpecificVariantPropertiesFactory() + archInfo.Properties.PopulateFromVariant(archVariants[0]) + + osInfo.archInfos = append(osInfo.archInfos, archInfo) } + } + + var archPropertiesList []android.SdkMemberProperties + for _, archInfo := range osInfo.archInfos { + archPropertiesList = append(archPropertiesList, archInfo.Properties) + } + + commonValueExtractor.extractCommonProperties(osInfo.Properties, archPropertiesList) - osInfo.commonArch = commonArch - osInfo.Properties.Base().Compile_multilib = multilib + // 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 } // Extract properties which are common across all architectures and os types. @@ -921,9 +938,10 @@ func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, build } var osPropertySet android.BpPropertySet + var archPropertySet android.BpPropertySet var archOsPrefix string - if len(osTypeToInfo) == 1 { - // There is only one os type present in the variants sp don't bother + if osInfo.Properties.Base().Os_count == 1 { + // There is only one os type present in the variants so don't bother // with adding target specific properties. // Create a structure that looks like: @@ -939,6 +957,7 @@ func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, build // } // osPropertySet = bpModule + archPropertySet = osPropertySet.AddPropertySet("arch") // Arch specific properties need to be added to an arch specific section // within arch. @@ -957,6 +976,7 @@ func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, build // } // osPropertySet = targetPropertySet.AddPropertySet(osType.Name) + archPropertySet = targetPropertySet // Arch specific properties need to be added to an os and arch specific // section prefixed with <os>_. @@ -964,23 +984,15 @@ func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, build } osInfo.Properties.AddToPropertySet(sdkModuleContext, builder, osPropertySet) - if !osInfo.commonArch { - // Either add the arch specific sections into the target or arch sections - // depending on whether they will also be os specific. - var archPropertySet android.BpPropertySet - if archOsPrefix == "" { - archPropertySet = osPropertySet.AddPropertySet("arch") - } else { - archPropertySet = targetPropertySet - } - // Add arch (and possibly os) specific sections for each set of - // arch (and possibly os) specific properties. - for _, av := range osInfo.archTypes { - archTypePropertySet := archPropertySet.AddPropertySet(archOsPrefix + av.archType.Name) + // Add arch (and possibly os) specific sections for each set of arch (and possibly + // os) specific properties. + // + // The archInfos list will be empty if the os contains variants for the common + for _, archInfo := range osInfo.archInfos { + archTypePropertySet := archPropertySet.AddPropertySet(archOsPrefix + archInfo.archType.Name) - av.Properties.AddToPropertySet(sdkModuleContext, builder, archTypePropertySet) - } + archInfo.Properties.AddToPropertySet(sdkModuleContext, builder, archTypePropertySet) } } } |