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:
parent
4a4b2d0b1b
commit
57ee1774cb
1 changed files with 160 additions and 119 deletions
279
sdk/update.go
279
sdk/update.go
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue