Loading android/module.go +10 −0 Original line number Diff line number Diff line Loading @@ -985,6 +985,16 @@ func (m *ModuleBase) ImageVariation() blueprint.Variation { } } func (m *ModuleBase) getVariationByMutatorName(mutator string) string { for i, v := range m.commonProperties.DebugMutators { if v == mutator { return m.commonProperties.DebugVariations[i] } } return "" } func (m *ModuleBase) InRamdisk() bool { return m.base().commonProperties.ImageVariation == RamdiskVariation } Loading cc/library.go +1 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,7 @@ func LibraryFactory() android.Module { module.sdkMemberTypes = []android.SdkMemberType{ sharedLibrarySdkMemberType, staticLibrarySdkMemberType, staticAndSharedLibrarySdkMemberType, } return module.Init() } Loading cc/library_sdk_member.go +16 −3 Original line number Diff line number Diff line Loading @@ -43,10 +43,20 @@ var staticLibrarySdkMemberType = &librarySdkMemberType{ linkTypes: []string{"static"}, } var staticAndSharedLibrarySdkMemberType = &librarySdkMemberType{ SdkMemberTypeBase: android.SdkMemberTypeBase{ PropertyName: "native_libs", SupportsSdk: true, }, prebuiltModuleType: "cc_prebuilt_library", linkTypes: []string{"static", "shared"}, } func init() { // Register sdk member types. android.RegisterSdkMemberType(sharedLibrarySdkMemberType) android.RegisterSdkMemberType(staticLibrarySdkMemberType) android.RegisterSdkMemberType(staticAndSharedLibrarySdkMemberType) } type librarySdkMemberType struct { Loading Loading @@ -342,9 +352,12 @@ func (p *nativeLibInfoProperties) PopulateFromVariant(variant android.SdkAware) p.name = variant.Name() p.archType = ccModule.Target().Arch.ArchType.String() p.ExportedIncludeDirs = exportedIncludeDirs p.exportedGeneratedIncludeDirs = exportedGeneratedIncludeDirs p.ExportedSystemIncludeDirs = ccModule.ExportedSystemIncludeDirs() // Make sure that the include directories are unique. p.ExportedIncludeDirs = android.FirstUniquePaths(exportedIncludeDirs) p.exportedGeneratedIncludeDirs = android.FirstUniquePaths(exportedGeneratedIncludeDirs) p.ExportedSystemIncludeDirs = android.FirstUniquePaths(ccModule.ExportedSystemIncludeDirs()) p.ExportedFlags = ccModule.ExportedFlags() if ccModule.linker != nil { specifiedDeps := specifiedDeps{} Loading sdk/cc_sdk_test.go +87 −0 Original line number Diff line number Diff line Loading @@ -1196,6 +1196,93 @@ include/Test.h -> include/include/Test.h ) } func TestSnapshotWithCcLibrary(t *testing.T) { result := testSdkWithCc(t, ` module_exports { name: "myexports", native_libs: ["mynativelib"], } cc_library { name: "mynativelib", srcs: [ "Test.cpp", ], export_include_dirs: ["include"], system_shared_libs: [], stl: "none", } `) result.CheckSnapshot("myexports", "", checkAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library { name: "myexports_mynativelib@current", sdk_member_name: "mynativelib", installable: false, stl: "none", export_include_dirs: ["include/include"], arch: { arm64: { static: { srcs: ["arm64/lib/mynativelib.a"], }, shared: { srcs: ["arm64/lib/mynativelib.so"], }, }, arm: { static: { srcs: ["arm/lib/mynativelib.a"], }, shared: { srcs: ["arm/lib/mynativelib.so"], }, }, }, } cc_prebuilt_library { name: "mynativelib", prefer: false, stl: "none", export_include_dirs: ["include/include"], arch: { arm64: { static: { srcs: ["arm64/lib/mynativelib.a"], }, shared: { srcs: ["arm64/lib/mynativelib.so"], }, }, arm: { static: { srcs: ["arm/lib/mynativelib.a"], }, shared: { srcs: ["arm/lib/mynativelib.so"], }, }, }, } module_exports_snapshot { name: "myexports@current", native_libs: ["myexports_mynativelib@current"], } `), checkAllCopyRules(` include/Test.h -> include/include/Test.h .intermediates/mynativelib/android_arm64_armv8-a_static/mynativelib.a -> arm64/lib/mynativelib.a .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so .intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> arm/lib/mynativelib.a .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so`), ) } func TestHostSnapshotWithMultiLib64(t *testing.T) { // b/145598135 - Generating host snapshots for anything other than linux is not supported. SkipIfNotLinux(t) Loading sdk/update.go +84 −5 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import ( "strings" "android/soong/apex" "android/soong/cc" "github.com/google/blueprint" "github.com/google/blueprint/proptools" Loading Loading @@ -866,6 +867,9 @@ func (osInfo *osTypeSpecificInfo) optimizeProperties(commonValueExtractor *commo var archPropertiesList []android.SdkMemberProperties for _, archInfo := range osInfo.archInfos { // Optimize the arch properties first. archInfo.optimizeProperties(commonValueExtractor) archPropertiesList = append(archPropertiesList, archInfo.Properties) } Loading Loading @@ -961,32 +965,107 @@ type archTypeSpecificInfo struct { baseInfo archType android.ArchType linkInfos []*linkTypeSpecificInfo } // Create a new archTypeSpecificInfo for the specified arch type and its properties // structures populated with information from the variants. func newArchSpecificInfo(archType android.ArchType, variantPropertiesFactory variantPropertiesFactoryFunc, archVariants []android.SdkAware) *archTypeSpecificInfo { if len(archVariants) != 1 { panic(fmt.Errorf("expected one arch specific variant but found %d", len(archVariants))) } // 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 = variantPropertiesFactory() if len(archVariants) == 1 { archInfo.Properties.PopulateFromVariant(archVariants[0]) } else { // There is more than one variant for this arch type which must be differentiated // by link type. for _, linkVariant := range archVariants { linkType := getLinkType(linkVariant) if linkType == "" { panic(fmt.Errorf("expected one arch specific variant as it is not identified by link type but found %d", len(archVariants))) } else { linkInfo := newLinkSpecificInfo(linkType, variantPropertiesFactory, linkVariant) archInfo.linkInfos = append(archInfo.linkInfos, linkInfo) } } } return archInfo } // Get the link type of the variant // // If the variant is not differentiated by link type then it returns "", // otherwise it returns one of "static" or "shared". func getLinkType(variant android.Module) string { linkType := "" if linkable, ok := variant.(cc.LinkableInterface); ok { if linkable.Shared() && linkable.Static() { panic(fmt.Errorf("expected variant %q to be either static or shared but was both", variant.String())) } else if linkable.Shared() { linkType = "shared" } else if linkable.Static() { linkType = "static" } else { panic(fmt.Errorf("expected variant %q to be either static or shared but was neither", variant.String())) } } return linkType } // Optimize the properties by extracting common properties from link type specific // properties into arch type specific properties. func (archInfo *archTypeSpecificInfo) optimizeProperties(commonValueExtractor *commonValueExtractor) { if len(archInfo.linkInfos) == 0 { return } var propertiesList []android.SdkMemberProperties for _, linkInfo := range archInfo.linkInfos { propertiesList = append(propertiesList, linkInfo.Properties) } commonValueExtractor.extractCommonProperties(archInfo.Properties, propertiesList) } // Add the properties for an arch type to a property set. func (archInfo *archTypeSpecificInfo) addToPropertySet(builder *snapshotBuilder, archPropertySet android.BpPropertySet, archOsPrefix string) { archTypeName := archInfo.archType.Name archTypePropertySet := archPropertySet.AddPropertySet(archOsPrefix + archTypeName) archInfo.Properties.AddToPropertySet(builder.ctx, builder, archTypePropertySet) for _, linkInfo := range archInfo.linkInfos { linkPropertySet := archTypePropertySet.AddPropertySet(linkInfo.linkType) linkInfo.Properties.AddToPropertySet(builder.ctx, builder, linkPropertySet) } } type linkTypeSpecificInfo struct { baseInfo linkType string } // Create a new linkTypeSpecificInfo for the specified link type and its properties // structures populated with information from the variant. func newLinkSpecificInfo(linkType string, variantPropertiesFactory variantPropertiesFactoryFunc, linkVariant android.SdkAware) *linkTypeSpecificInfo { linkInfo := &linkTypeSpecificInfo{ baseInfo: baseInfo{ // Create the properties into which the link type specific properties will be // added. Properties: variantPropertiesFactory(), }, linkType: linkType, } linkInfo.Properties.PopulateFromVariant(linkVariant) return linkInfo } func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, builder *snapshotBuilder, member *sdkMember, bpModule android.BpModule) { Loading Loading
android/module.go +10 −0 Original line number Diff line number Diff line Loading @@ -985,6 +985,16 @@ func (m *ModuleBase) ImageVariation() blueprint.Variation { } } func (m *ModuleBase) getVariationByMutatorName(mutator string) string { for i, v := range m.commonProperties.DebugMutators { if v == mutator { return m.commonProperties.DebugVariations[i] } } return "" } func (m *ModuleBase) InRamdisk() bool { return m.base().commonProperties.ImageVariation == RamdiskVariation } Loading
cc/library.go +1 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,7 @@ func LibraryFactory() android.Module { module.sdkMemberTypes = []android.SdkMemberType{ sharedLibrarySdkMemberType, staticLibrarySdkMemberType, staticAndSharedLibrarySdkMemberType, } return module.Init() } Loading
cc/library_sdk_member.go +16 −3 Original line number Diff line number Diff line Loading @@ -43,10 +43,20 @@ var staticLibrarySdkMemberType = &librarySdkMemberType{ linkTypes: []string{"static"}, } var staticAndSharedLibrarySdkMemberType = &librarySdkMemberType{ SdkMemberTypeBase: android.SdkMemberTypeBase{ PropertyName: "native_libs", SupportsSdk: true, }, prebuiltModuleType: "cc_prebuilt_library", linkTypes: []string{"static", "shared"}, } func init() { // Register sdk member types. android.RegisterSdkMemberType(sharedLibrarySdkMemberType) android.RegisterSdkMemberType(staticLibrarySdkMemberType) android.RegisterSdkMemberType(staticAndSharedLibrarySdkMemberType) } type librarySdkMemberType struct { Loading Loading @@ -342,9 +352,12 @@ func (p *nativeLibInfoProperties) PopulateFromVariant(variant android.SdkAware) p.name = variant.Name() p.archType = ccModule.Target().Arch.ArchType.String() p.ExportedIncludeDirs = exportedIncludeDirs p.exportedGeneratedIncludeDirs = exportedGeneratedIncludeDirs p.ExportedSystemIncludeDirs = ccModule.ExportedSystemIncludeDirs() // Make sure that the include directories are unique. p.ExportedIncludeDirs = android.FirstUniquePaths(exportedIncludeDirs) p.exportedGeneratedIncludeDirs = android.FirstUniquePaths(exportedGeneratedIncludeDirs) p.ExportedSystemIncludeDirs = android.FirstUniquePaths(ccModule.ExportedSystemIncludeDirs()) p.ExportedFlags = ccModule.ExportedFlags() if ccModule.linker != nil { specifiedDeps := specifiedDeps{} Loading
sdk/cc_sdk_test.go +87 −0 Original line number Diff line number Diff line Loading @@ -1196,6 +1196,93 @@ include/Test.h -> include/include/Test.h ) } func TestSnapshotWithCcLibrary(t *testing.T) { result := testSdkWithCc(t, ` module_exports { name: "myexports", native_libs: ["mynativelib"], } cc_library { name: "mynativelib", srcs: [ "Test.cpp", ], export_include_dirs: ["include"], system_shared_libs: [], stl: "none", } `) result.CheckSnapshot("myexports", "", checkAndroidBpContents(` // This is auto-generated. DO NOT EDIT. cc_prebuilt_library { name: "myexports_mynativelib@current", sdk_member_name: "mynativelib", installable: false, stl: "none", export_include_dirs: ["include/include"], arch: { arm64: { static: { srcs: ["arm64/lib/mynativelib.a"], }, shared: { srcs: ["arm64/lib/mynativelib.so"], }, }, arm: { static: { srcs: ["arm/lib/mynativelib.a"], }, shared: { srcs: ["arm/lib/mynativelib.so"], }, }, }, } cc_prebuilt_library { name: "mynativelib", prefer: false, stl: "none", export_include_dirs: ["include/include"], arch: { arm64: { static: { srcs: ["arm64/lib/mynativelib.a"], }, shared: { srcs: ["arm64/lib/mynativelib.so"], }, }, arm: { static: { srcs: ["arm/lib/mynativelib.a"], }, shared: { srcs: ["arm/lib/mynativelib.so"], }, }, }, } module_exports_snapshot { name: "myexports@current", native_libs: ["myexports_mynativelib@current"], } `), checkAllCopyRules(` include/Test.h -> include/include/Test.h .intermediates/mynativelib/android_arm64_armv8-a_static/mynativelib.a -> arm64/lib/mynativelib.a .intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so .intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> arm/lib/mynativelib.a .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so`), ) } func TestHostSnapshotWithMultiLib64(t *testing.T) { // b/145598135 - Generating host snapshots for anything other than linux is not supported. SkipIfNotLinux(t) Loading
sdk/update.go +84 −5 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import ( "strings" "android/soong/apex" "android/soong/cc" "github.com/google/blueprint" "github.com/google/blueprint/proptools" Loading Loading @@ -866,6 +867,9 @@ func (osInfo *osTypeSpecificInfo) optimizeProperties(commonValueExtractor *commo var archPropertiesList []android.SdkMemberProperties for _, archInfo := range osInfo.archInfos { // Optimize the arch properties first. archInfo.optimizeProperties(commonValueExtractor) archPropertiesList = append(archPropertiesList, archInfo.Properties) } Loading Loading @@ -961,32 +965,107 @@ type archTypeSpecificInfo struct { baseInfo archType android.ArchType linkInfos []*linkTypeSpecificInfo } // Create a new archTypeSpecificInfo for the specified arch type and its properties // structures populated with information from the variants. func newArchSpecificInfo(archType android.ArchType, variantPropertiesFactory variantPropertiesFactoryFunc, archVariants []android.SdkAware) *archTypeSpecificInfo { if len(archVariants) != 1 { panic(fmt.Errorf("expected one arch specific variant but found %d", len(archVariants))) } // 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 = variantPropertiesFactory() if len(archVariants) == 1 { archInfo.Properties.PopulateFromVariant(archVariants[0]) } else { // There is more than one variant for this arch type which must be differentiated // by link type. for _, linkVariant := range archVariants { linkType := getLinkType(linkVariant) if linkType == "" { panic(fmt.Errorf("expected one arch specific variant as it is not identified by link type but found %d", len(archVariants))) } else { linkInfo := newLinkSpecificInfo(linkType, variantPropertiesFactory, linkVariant) archInfo.linkInfos = append(archInfo.linkInfos, linkInfo) } } } return archInfo } // Get the link type of the variant // // If the variant is not differentiated by link type then it returns "", // otherwise it returns one of "static" or "shared". func getLinkType(variant android.Module) string { linkType := "" if linkable, ok := variant.(cc.LinkableInterface); ok { if linkable.Shared() && linkable.Static() { panic(fmt.Errorf("expected variant %q to be either static or shared but was both", variant.String())) } else if linkable.Shared() { linkType = "shared" } else if linkable.Static() { linkType = "static" } else { panic(fmt.Errorf("expected variant %q to be either static or shared but was neither", variant.String())) } } return linkType } // Optimize the properties by extracting common properties from link type specific // properties into arch type specific properties. func (archInfo *archTypeSpecificInfo) optimizeProperties(commonValueExtractor *commonValueExtractor) { if len(archInfo.linkInfos) == 0 { return } var propertiesList []android.SdkMemberProperties for _, linkInfo := range archInfo.linkInfos { propertiesList = append(propertiesList, linkInfo.Properties) } commonValueExtractor.extractCommonProperties(archInfo.Properties, propertiesList) } // Add the properties for an arch type to a property set. func (archInfo *archTypeSpecificInfo) addToPropertySet(builder *snapshotBuilder, archPropertySet android.BpPropertySet, archOsPrefix string) { archTypeName := archInfo.archType.Name archTypePropertySet := archPropertySet.AddPropertySet(archOsPrefix + archTypeName) archInfo.Properties.AddToPropertySet(builder.ctx, builder, archTypePropertySet) for _, linkInfo := range archInfo.linkInfos { linkPropertySet := archTypePropertySet.AddPropertySet(linkInfo.linkType) linkInfo.Properties.AddToPropertySet(builder.ctx, builder, linkPropertySet) } } type linkTypeSpecificInfo struct { baseInfo linkType string } // Create a new linkTypeSpecificInfo for the specified link type and its properties // structures populated with information from the variant. func newLinkSpecificInfo(linkType string, variantPropertiesFactory variantPropertiesFactoryFunc, linkVariant android.SdkAware) *linkTypeSpecificInfo { linkInfo := &linkTypeSpecificInfo{ baseInfo: baseInfo{ // Create the properties into which the link type specific properties will be // added. Properties: variantPropertiesFactory(), }, linkType: linkType, } linkInfo.Properties.PopulateFromVariant(linkVariant) return linkInfo } func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, builder *snapshotBuilder, member *sdkMember, bpModule android.BpModule) { Loading