Extract the osTypeSpecificInfo code from module creation loop

Extract the functionality to create an osTypeSpecificInfo struct,
to optimize the properties, and add its properties to a property set
into methods of the *osTypeSpecificInfo struct.

This change is in preparation for adding support for link type which
is another dimension within arch type which itself sits within os type.

Bug: 153306490
Test: m nothing
Bug: 142918168
Merged-In: I025ee90e1461f7389bf4a9d056b281453068cf87
Change-Id: I025ee90e1461f7389bf4a9d056b281453068cf87
This commit is contained in:
Paul Duffin 2020-03-12 20:40:35 +00:00
parent 4a4b2d0b1b
commit 57ee1774cb

View file

@ -793,6 +793,8 @@ type baseInfo struct {
type osTypeSpecificInfo struct { type osTypeSpecificInfo struct {
baseInfo baseInfo
osType android.OsType
// The list of arch type specific info for this os type. // The list of arch type specific info for this os type.
// //
// Nil if there is one variant whose arch type is common // Nil if there is one variant whose arch type is common
@ -801,6 +803,160 @@ type osTypeSpecificInfo struct {
type variantPropertiesFactoryFunc func() android.SdkMemberProperties type variantPropertiesFactoryFunc func() android.SdkMemberProperties
// Create a new osTypeSpecificInfo for the specified os type and its properties
// structures populated with information from the variants.
func newOsTypeSpecificInfo(osType android.OsType, variantPropertiesFactory variantPropertiesFactoryFunc, osTypeVariants []android.SdkAware) *osTypeSpecificInfo {
osInfo := &osTypeSpecificInfo{
osType: osType,
}
osSpecificVariantPropertiesFactory := func() android.SdkMemberProperties {
properties := variantPropertiesFactory()
properties.Base().Os = osType
return properties
}
// Create a structure into which properties common across the architectures in
// this os type will be stored.
osInfo.Properties = osSpecificVariantPropertiesFactory()
// Group the variants by arch type.
var variantsByArchName = make(map[string][]android.SdkAware)
var archTypes []android.ArchType
for _, variant := range osTypeVariants {
archType := variant.Target().Arch.ArchType
archTypeName := archType.Name
if _, ok := variantsByArchName[archTypeName]; !ok {
archTypes = append(archTypes, archType)
}
variantsByArchName[archTypeName] = append(variantsByArchName[archTypeName], variant)
}
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(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 {
// Create an arch specific info for each supported architecture type.
for _, archType := range archTypes {
archTypeName := archType.Name
archVariants := variantsByArchName[archTypeName]
archInfo := newArchSpecificInfo(archType, osSpecificVariantPropertiesFactory, archVariants)
osInfo.archInfos = append(osInfo.archInfos, archInfo)
}
}
return osInfo
}
// Optimize the properties by extracting common properties from arch type specific
// properties into os type specific properties.
func (osInfo *osTypeSpecificInfo) optimizeProperties(commonValueExtractor *commonValueExtractor) {
// Nothing to do if there is only a single common architecture.
if len(osInfo.archInfos) == 0 {
return
}
var archPropertiesList []android.SdkMemberProperties
for _, archInfo := range osInfo.archInfos {
archPropertiesList = append(archPropertiesList, archInfo.Properties)
}
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
}
// Add the properties for an os to a property set.
//
// Maps the properties related to the os variants through to an appropriate
// module structure that will produce equivalent set of variants when it is
// processed in a build.
func (osInfo *osTypeSpecificInfo) addToPropertySet(
builder *snapshotBuilder,
bpModule android.BpModule,
targetPropertySet android.BpPropertySet) {
var osPropertySet android.BpPropertySet
var archPropertySet android.BpPropertySet
var archOsPrefix string
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:
// module_type {
// name: "...",
// ...
// <common properties>
// ...
// <single os type specific properties>
//
// arch: {
// <arch specific sections>
// }
//
osPropertySet = bpModule
archPropertySet = osPropertySet.AddPropertySet("arch")
// Arch specific properties need to be added to an arch specific section
// within arch.
archOsPrefix = ""
} else {
// Create a structure that looks like:
// module_type {
// name: "...",
// ...
// <common properties>
// ...
// target: {
// <arch independent os specific sections, e.g. android>
// ...
// <arch and os specific sections, e.g. android_x86>
// }
//
osType := osInfo.osType
osPropertySet = targetPropertySet.AddPropertySet(osType.Name)
archPropertySet = targetPropertySet
// Arch specific properties need to be added to an os and arch specific
// section prefixed with <os>_.
archOsPrefix = osType.Name + "_"
}
// Add the os specific but arch independent properties to the module.
osInfo.Properties.AddToPropertySet(builder.ctx, builder, osPropertySet)
// 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
// architecture.
for _, archInfo := range osInfo.archInfos {
archInfo.addToPropertySet(builder, archPropertySet, archOsPrefix)
}
}
type archTypeSpecificInfo struct { type archTypeSpecificInfo struct {
baseInfo baseInfo
@ -867,75 +1023,14 @@ func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, build
var osSpecificPropertiesList []android.SdkMemberProperties var osSpecificPropertiesList []android.SdkMemberProperties
for osType, osTypeVariants := range variantsByOsType { for osType, osTypeVariants := range variantsByOsType {
// Group the properties for each variant by arch type within the os. osInfo := newOsTypeSpecificInfo(osType, variantPropertiesFactory, osTypeVariants)
osInfo := &osTypeSpecificInfo{}
osTypeToInfo[osType] = osInfo osTypeToInfo[osType] = osInfo
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 // Add the os specific properties to a list of os type specific yet architecture
// independent properties structs. // independent properties structs.
osInfo.Properties = osSpecificVariantPropertiesFactory()
osSpecificPropertiesList = append(osSpecificPropertiesList, osInfo.Properties) osSpecificPropertiesList = append(osSpecificPropertiesList, osInfo.Properties)
// Group the variants by arch type. // Optimize the properties across all the variants for a specific os type.
var variantsByArchName = make(map[string][]android.SdkAware) osInfo.optimizeProperties(commonValueExtractor)
var archTypes []android.ArchType
for _, variant := range osTypeVariants {
archType := variant.Target().Arch.ArchType
archTypeName := archType.Name
if _, ok := variantsByArchName[archTypeName]; !ok {
archTypes = append(archTypes, archType)
}
variantsByArchName[archTypeName] = append(variantsByArchName[archTypeName], variant)
}
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(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 {
// Create an arch specific info for each supported architecture type.
for _, archType := range archTypes {
archTypeName := archType.Name
archVariants := variantsByArchName[archTypeName]
archInfo := newArchSpecificInfo(archType, osSpecificVariantPropertiesFactory, archVariants)
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)
// 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. // Extract properties which are common across all architectures and os types.
@ -955,61 +1050,7 @@ func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, build
continue continue
} }
var osPropertySet android.BpPropertySet osInfo.addToPropertySet(builder, bpModule, targetPropertySet)
var archPropertySet android.BpPropertySet
var archOsPrefix string
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:
// module_type {
// name: "...",
// ...
// <common properties>
// ...
// <single os type specific properties>
//
// arch: {
// <arch specific sections>
// }
//
osPropertySet = bpModule
archPropertySet = osPropertySet.AddPropertySet("arch")
// Arch specific properties need to be added to an arch specific section
// within arch.
archOsPrefix = ""
} else {
// Create a structure that looks like:
// module_type {
// name: "...",
// ...
// <common properties>
// ...
// target: {
// <arch independent os specific sections, e.g. android>
// ...
// <arch and os specific sections, e.g. android_x86>
// }
//
osPropertySet = targetPropertySet.AddPropertySet(osType.Name)
archPropertySet = targetPropertySet
// Arch specific properties need to be added to an os and arch specific
// section prefixed with <os>_.
archOsPrefix = osType.Name + "_"
}
osInfo.Properties.AddToPropertySet(sdkModuleContext, builder, osPropertySet)
// 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 {
archInfo.addToPropertySet(builder, archPropertySet, archOsPrefix)
}
} }
} }