Merge "Add support for using cc_library in sdk/module_exports"
This commit is contained in:
@@ -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 {
|
func (m *ModuleBase) InRamdisk() bool {
|
||||||
return m.base().commonProperties.ImageVariation == RamdiskVariation
|
return m.base().commonProperties.ImageVariation == RamdiskVariation
|
||||||
}
|
}
|
||||||
|
@@ -195,6 +195,7 @@ func LibraryFactory() android.Module {
|
|||||||
module.sdkMemberTypes = []android.SdkMemberType{
|
module.sdkMemberTypes = []android.SdkMemberType{
|
||||||
sharedLibrarySdkMemberType,
|
sharedLibrarySdkMemberType,
|
||||||
staticLibrarySdkMemberType,
|
staticLibrarySdkMemberType,
|
||||||
|
staticAndSharedLibrarySdkMemberType,
|
||||||
}
|
}
|
||||||
return module.Init()
|
return module.Init()
|
||||||
}
|
}
|
||||||
|
@@ -43,10 +43,20 @@ var staticLibrarySdkMemberType = &librarySdkMemberType{
|
|||||||
linkTypes: []string{"static"},
|
linkTypes: []string{"static"},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var staticAndSharedLibrarySdkMemberType = &librarySdkMemberType{
|
||||||
|
SdkMemberTypeBase: android.SdkMemberTypeBase{
|
||||||
|
PropertyName: "native_libs",
|
||||||
|
SupportsSdk: true,
|
||||||
|
},
|
||||||
|
prebuiltModuleType: "cc_prebuilt_library",
|
||||||
|
linkTypes: []string{"static", "shared"},
|
||||||
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
// Register sdk member types.
|
// Register sdk member types.
|
||||||
android.RegisterSdkMemberType(sharedLibrarySdkMemberType)
|
android.RegisterSdkMemberType(sharedLibrarySdkMemberType)
|
||||||
android.RegisterSdkMemberType(staticLibrarySdkMemberType)
|
android.RegisterSdkMemberType(staticLibrarySdkMemberType)
|
||||||
|
android.RegisterSdkMemberType(staticAndSharedLibrarySdkMemberType)
|
||||||
}
|
}
|
||||||
|
|
||||||
type librarySdkMemberType struct {
|
type librarySdkMemberType struct {
|
||||||
@@ -342,9 +352,12 @@ func (p *nativeLibInfoProperties) PopulateFromVariant(variant android.SdkAware)
|
|||||||
|
|
||||||
p.name = variant.Name()
|
p.name = variant.Name()
|
||||||
p.archType = ccModule.Target().Arch.ArchType.String()
|
p.archType = ccModule.Target().Arch.ArchType.String()
|
||||||
p.ExportedIncludeDirs = exportedIncludeDirs
|
|
||||||
p.exportedGeneratedIncludeDirs = exportedGeneratedIncludeDirs
|
// Make sure that the include directories are unique.
|
||||||
p.ExportedSystemIncludeDirs = ccModule.ExportedSystemIncludeDirs()
|
p.ExportedIncludeDirs = android.FirstUniquePaths(exportedIncludeDirs)
|
||||||
|
p.exportedGeneratedIncludeDirs = android.FirstUniquePaths(exportedGeneratedIncludeDirs)
|
||||||
|
p.ExportedSystemIncludeDirs = android.FirstUniquePaths(ccModule.ExportedSystemIncludeDirs())
|
||||||
|
|
||||||
p.ExportedFlags = ccModule.ExportedFlags()
|
p.ExportedFlags = ccModule.ExportedFlags()
|
||||||
if ccModule.linker != nil {
|
if ccModule.linker != nil {
|
||||||
specifiedDeps := specifiedDeps{}
|
specifiedDeps := specifiedDeps{}
|
||||||
|
@@ -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) {
|
func TestHostSnapshotWithMultiLib64(t *testing.T) {
|
||||||
// b/145598135 - Generating host snapshots for anything other than linux is not supported.
|
// b/145598135 - Generating host snapshots for anything other than linux is not supported.
|
||||||
SkipIfNotLinux(t)
|
SkipIfNotLinux(t)
|
||||||
|
@@ -21,6 +21,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"android/soong/apex"
|
"android/soong/apex"
|
||||||
|
"android/soong/cc"
|
||||||
"github.com/google/blueprint"
|
"github.com/google/blueprint"
|
||||||
"github.com/google/blueprint/proptools"
|
"github.com/google/blueprint/proptools"
|
||||||
|
|
||||||
@@ -866,6 +867,9 @@ func (osInfo *osTypeSpecificInfo) optimizeProperties(commonValueExtractor *commo
|
|||||||
|
|
||||||
var archPropertiesList []android.SdkMemberProperties
|
var archPropertiesList []android.SdkMemberProperties
|
||||||
for _, archInfo := range osInfo.archInfos {
|
for _, archInfo := range osInfo.archInfos {
|
||||||
|
// Optimize the arch properties first.
|
||||||
|
archInfo.optimizeProperties(commonValueExtractor)
|
||||||
|
|
||||||
archPropertiesList = append(archPropertiesList, archInfo.Properties)
|
archPropertiesList = append(archPropertiesList, archInfo.Properties)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -961,32 +965,107 @@ type archTypeSpecificInfo struct {
|
|||||||
baseInfo
|
baseInfo
|
||||||
|
|
||||||
archType android.ArchType
|
archType android.ArchType
|
||||||
|
|
||||||
|
linkInfos []*linkTypeSpecificInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new archTypeSpecificInfo for the specified arch type and its properties
|
// Create a new archTypeSpecificInfo for the specified arch type and its properties
|
||||||
// structures populated with information from the variants.
|
// structures populated with information from the variants.
|
||||||
func newArchSpecificInfo(archType android.ArchType, variantPropertiesFactory variantPropertiesFactoryFunc, archVariants []android.SdkAware) *archTypeSpecificInfo {
|
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.
|
// Create an arch specific info into which the variant properties can be copied.
|
||||||
archInfo := &archTypeSpecificInfo{archType: archType}
|
archInfo := &archTypeSpecificInfo{archType: archType}
|
||||||
|
|
||||||
// Create the properties into which the arch type specific properties will be
|
// Create the properties into which the arch type specific properties will be
|
||||||
// added.
|
// added.
|
||||||
archInfo.Properties = variantPropertiesFactory()
|
archInfo.Properties = variantPropertiesFactory()
|
||||||
|
|
||||||
|
if len(archVariants) == 1 {
|
||||||
archInfo.Properties.PopulateFromVariant(archVariants[0])
|
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
|
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.
|
// Add the properties for an arch type to a property set.
|
||||||
func (archInfo *archTypeSpecificInfo) addToPropertySet(builder *snapshotBuilder, archPropertySet android.BpPropertySet, archOsPrefix string) {
|
func (archInfo *archTypeSpecificInfo) addToPropertySet(builder *snapshotBuilder, archPropertySet android.BpPropertySet, archOsPrefix string) {
|
||||||
archTypeName := archInfo.archType.Name
|
archTypeName := archInfo.archType.Name
|
||||||
archTypePropertySet := archPropertySet.AddPropertySet(archOsPrefix + archTypeName)
|
archTypePropertySet := archPropertySet.AddPropertySet(archOsPrefix + archTypeName)
|
||||||
archInfo.Properties.AddToPropertySet(builder.ctx, builder, archTypePropertySet)
|
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) {
|
func (s *sdk) createMemberSnapshot(sdkModuleContext android.ModuleContext, builder *snapshotBuilder, member *sdkMember, bpModule android.BpModule) {
|
||||||
|
Reference in New Issue
Block a user