Merge "Copy shared_libs and system_shared_libs to module snapshot"

This commit is contained in:
Paul Duffin
2020-03-13 14:21:48 +00:00
committed by Gerrit Code Review
10 changed files with 384 additions and 72 deletions

View File

@@ -186,9 +186,33 @@ type SnapshotBuilder interface {
// is correctly output for both versioned and unversioned prebuilts in the // is correctly output for both versioned and unversioned prebuilts in the
// snapshot. // snapshot.
// //
// "required: true" means that the property must only contain references
// to other members of the sdk. Passing a reference to a module that is not a
// member of the sdk will result in a build error.
//
// "required: false" means that the property can contain references to modules
// that are either members or not members of the sdk. If a reference is to a
// module that is a non member then the reference is left unchanged, i.e. it
// is not transformed as references to members are.
//
// The handling of the member names is dependent on whether it is an internal or
// exported member. An exported member is one whose name is specified in one of
// the member type specific properties. An internal member is one that is added
// due to being a part of an exported (or other internal) member and is not itself
// an exported member.
//
// Member names are handled as follows:
// * When creating the unversioned form of the module the name is left unchecked
// unless the member is internal in which case it is transformed into an sdk
// specific name, i.e. by prefixing with the sdk name.
//
// * When creating the versioned form of the module the name is transformed into
// a versioned sdk specific name, i.e. by prefixing with the sdk name and
// suffixing with the version.
//
// e.g. // e.g.
// bpPropertySet.AddPropertyWithTag("libs", []string{"member1", "member2"}, builder.SdkMemberReferencePropertyTag()) // bpPropertySet.AddPropertyWithTag("libs", []string{"member1", "member2"}, builder.SdkMemberReferencePropertyTag(true))
SdkMemberReferencePropertyTag() BpPropertyTag SdkMemberReferencePropertyTag(required bool) BpPropertyTag
} }
type BpPropertyTag interface{} type BpPropertyTag interface{}

View File

@@ -95,6 +95,16 @@ type nativeBinaryInfoProperties struct {
// outputFile is not exported as it is always arch specific. // outputFile is not exported as it is always arch specific.
outputFile android.Path outputFile android.Path
// The set of shared libraries
//
// This field is exported as its contents may not be arch specific.
SharedLibs []string
// The set of system shared libraries
//
// This field is exported as its contents may not be arch specific.
SystemSharedLibs []string
} }
func (p *nativeBinaryInfoProperties) PopulateFromVariant(variant android.SdkAware) { func (p *nativeBinaryInfoProperties) PopulateFromVariant(variant android.SdkAware) {
@@ -102,6 +112,14 @@ func (p *nativeBinaryInfoProperties) PopulateFromVariant(variant android.SdkAwar
p.archType = ccModule.Target().Arch.ArchType.String() p.archType = ccModule.Target().Arch.ArchType.String()
p.outputFile = ccModule.OutputFile().Path() p.outputFile = ccModule.OutputFile().Path()
if ccModule.linker != nil {
specifiedDeps := specifiedDeps{}
specifiedDeps = ccModule.linker.linkerSpecifiedDeps(specifiedDeps)
p.SharedLibs = specifiedDeps.sharedLibs
p.SystemSharedLibs = specifiedDeps.systemSharedLibs
}
} }
func (p *nativeBinaryInfoProperties) AddToPropertySet(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, propertySet android.BpPropertySet) { func (p *nativeBinaryInfoProperties) AddToPropertySet(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, propertySet android.BpPropertySet) {
@@ -114,4 +132,12 @@ func (p *nativeBinaryInfoProperties) AddToPropertySet(sdkModuleContext android.M
builder.CopyToSnapshot(p.outputFile, nativeBinaryPathFor(*p)) builder.CopyToSnapshot(p.outputFile, nativeBinaryPathFor(*p))
} }
if len(p.SharedLibs) > 0 {
propertySet.AddPropertyWithTag("shared_libs", p.SharedLibs, builder.SdkMemberReferencePropertyTag(false))
}
if len(p.SystemSharedLibs) > 0 {
propertySet.AddPropertyWithTag("system_shared_libs", p.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false))
}
} }

View File

@@ -370,6 +370,15 @@ type linker interface {
nativeCoverage() bool nativeCoverage() bool
coverageOutputFilePath() android.OptionalPath coverageOutputFilePath() android.OptionalPath
// Get the deps that have been explicitly specified in the properties.
// Only updates the
linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps
}
type specifiedDeps struct {
sharedLibs []string
systemSharedLibs []string
} }
type installer interface { type installer interface {

View File

@@ -817,6 +817,23 @@ func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps {
return deps return deps
} }
func (library *libraryDecorator) linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps {
specifiedDeps = library.baseLinker.linkerSpecifiedDeps(specifiedDeps)
var properties StaticOrSharedProperties
if library.static() {
properties = library.StaticProperties.Static
} else if library.shared() {
properties = library.SharedProperties.Shared
}
specifiedDeps.sharedLibs = append(specifiedDeps.sharedLibs, properties.Shared_libs...)
specifiedDeps.systemSharedLibs = append(specifiedDeps.systemSharedLibs, properties.System_shared_libs...)
specifiedDeps.sharedLibs = android.FirstUniqueStrings(specifiedDeps.sharedLibs)
specifiedDeps.systemSharedLibs = android.FirstUniqueStrings(specifiedDeps.systemSharedLibs)
return specifiedDeps
}
func (library *libraryDecorator) linkStatic(ctx ModuleContext, func (library *libraryDecorator) linkStatic(ctx ModuleContext,
flags Flags, deps PathDeps, objs Objects) android.Path { flags Flags, deps PathDeps, objs Objects) android.Path {

View File

@@ -19,6 +19,7 @@ import (
"android/soong/android" "android/soong/android"
"github.com/google/blueprint" "github.com/google/blueprint"
"github.com/google/blueprint/proptools"
) )
// This file contains support for using cc library modules within an sdk. // This file contains support for using cc library modules within an sdk.
@@ -108,8 +109,11 @@ func (mt *librarySdkMemberType) AddPrebuiltModule(sdkModuleContext android.Modul
} }
func (mt *librarySdkMemberType) FinalizeModule(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember, bpModule android.BpModule) { func (mt *librarySdkMemberType) FinalizeModule(sdkModuleContext android.ModuleContext, builder android.SnapshotBuilder, member android.SdkMember, bpModule android.BpModule) {
bpModule.AddProperty("stl", "none") ccModule := (member.Variants()[0]).(*Module)
bpModule.AddProperty("system_shared_libs", []string{}) stl := ccModule.stl.Properties.Stl
if stl != nil {
bpModule.AddProperty("stl", proptools.String(stl))
}
} }
func (mt *librarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties { func (mt *librarySdkMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
@@ -193,6 +197,14 @@ func addPossiblyArchSpecificProperties(sdkModuleContext android.ModuleContext, b
outputProperties.AddProperty("srcs", []string{nativeLibraryPath}) outputProperties.AddProperty("srcs", []string{nativeLibraryPath})
} }
if len(libInfo.SharedLibs) > 0 {
outputProperties.AddPropertyWithTag("shared_libs", libInfo.SharedLibs, builder.SdkMemberReferencePropertyTag(false))
}
if len(libInfo.SystemSharedLibs) > 0 {
outputProperties.AddPropertyWithTag("system_shared_libs", libInfo.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false))
}
// Map from property name to the include dirs to add to the prebuilt module in the snapshot. // Map from property name to the include dirs to add to the prebuilt module in the snapshot.
includeDirs := make(map[string][]string) includeDirs := make(map[string][]string)
@@ -299,6 +311,16 @@ type nativeLibInfoProperties struct {
// This field is exported as its contents may not be arch specific. // This field is exported as its contents may not be arch specific.
ExportedFlags []string ExportedFlags []string
// The set of shared libraries
//
// This field is exported as its contents may not be arch specific.
SharedLibs []string
// The set of system shared libraries
//
// This field is exported as its contents may not be arch specific.
SystemSharedLibs []string
// outputFile is not exported as it is always arch specific. // outputFile is not exported as it is always arch specific.
outputFile android.Path outputFile android.Path
} }
@@ -323,6 +345,13 @@ func (p *nativeLibInfoProperties) PopulateFromVariant(variant android.SdkAware)
p.exportedGeneratedIncludeDirs = exportedGeneratedIncludeDirs p.exportedGeneratedIncludeDirs = exportedGeneratedIncludeDirs
p.ExportedSystemIncludeDirs = ccModule.ExportedSystemIncludeDirs() p.ExportedSystemIncludeDirs = ccModule.ExportedSystemIncludeDirs()
p.ExportedFlags = ccModule.ExportedFlags() p.ExportedFlags = ccModule.ExportedFlags()
if ccModule.linker != nil {
specifiedDeps := specifiedDeps{}
specifiedDeps = ccModule.linker.linkerSpecifiedDeps(specifiedDeps)
p.SharedLibs = specifiedDeps.sharedLibs
p.SystemSharedLibs = specifiedDeps.systemSharedLibs
}
p.exportedGeneratedHeaders = ccModule.ExportedGeneratedHeaders() p.exportedGeneratedHeaders = ccModule.ExportedGeneratedHeaders()
} }

View File

@@ -490,6 +490,12 @@ func (linker *baseLinker) link(ctx ModuleContext,
panic(fmt.Errorf("baseLinker doesn't know how to link")) panic(fmt.Errorf("baseLinker doesn't know how to link"))
} }
func (linker *baseLinker) linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps {
specifiedDeps.sharedLibs = append(specifiedDeps.sharedLibs, linker.Properties.Shared_libs...)
specifiedDeps.systemSharedLibs = append(specifiedDeps.systemSharedLibs, linker.Properties.System_shared_libs...)
return specifiedDeps
}
// Injecting version symbols // Injecting version symbols
// Some host modules want a version number, but we don't want to rebuild it every time. Optionally add a step // Some host modules want a version number, but we don't want to rebuild it every time. Optionally add a step
// after linking that injects a constant placeholder with the current version number. // after linking that injects a constant placeholder with the current version number.

View File

@@ -255,5 +255,5 @@ func (mt *systemModulesSdkMemberType) BuildSnapshot(sdkModuleContext android.Mod
pbm := builder.AddPrebuiltModule(member, "java_system_modules_import") pbm := builder.AddPrebuiltModule(member, "java_system_modules_import")
// Add the references to the libraries that form the system module. // Add the references to the libraries that form the system module.
pbm.AddPropertyWithTag("libs", systemModule.properties.Libs, builder.SdkMemberReferencePropertyTag()) pbm.AddPropertyWithTag("libs", systemModule.properties.Libs, builder.SdkMemberReferencePropertyTag(true))
} }

View File

@@ -309,7 +309,6 @@ cc_prebuilt_library_shared {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_shared { cc_prebuilt_library_shared {
@@ -326,7 +325,6 @@ cc_prebuilt_library_shared {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
sdk_snapshot { sdk_snapshot {
@@ -555,7 +553,6 @@ cc_prebuilt_library_shared {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_shared { cc_prebuilt_library_shared {
@@ -577,7 +574,6 @@ cc_prebuilt_library_shared {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
sdk_snapshot { sdk_snapshot {
@@ -599,6 +595,189 @@ include/Test.h -> include/include/Test.h
) )
} }
func TestSnapshotWithCcSharedLibrarySharedLibs(t *testing.T) {
result := testSdkWithCc(t, `
sdk {
name: "mysdk",
native_shared_libs: [
"mynativelib",
"myothernativelib",
"mysystemnativelib",
],
}
cc_library {
name: "mysystemnativelib",
srcs: [
"Test.cpp",
],
system_shared_libs: [],
stl: "none",
}
cc_library_shared {
name: "myothernativelib",
srcs: [
"Test.cpp",
],
system_shared_libs: [
// A reference to a library that is not an sdk member. Uses libm as that
// is in the default set of modules available to this test and so is available
// both here and also when the generated Android.bp file is tested in
// CheckSnapshot(). This ensures that the system_shared_libs property correctly
// handles references to modules that are not sdk members.
"libm",
],
stl: "none",
}
cc_library {
name: "mynativelib",
srcs: [
"Test.cpp",
],
shared_libs: [
// A reference to another sdk member.
"myothernativelib",
],
target: {
android: {
shared: {
shared_libs: [
// A reference to a library that is not an sdk member. The libc library
// is used here to check that the shared_libs property is handled correctly
// in a similar way to how libm is used to check system_shared_libs above.
"libc",
],
},
},
},
system_shared_libs: [],
stl: "none",
}
`)
result.CheckSnapshot("mysdk", "",
checkAndroidBpContents(`
// This is auto-generated. DO NOT EDIT.
cc_prebuilt_library_shared {
name: "mysdk_mynativelib@current",
sdk_member_name: "mynativelib",
installable: false,
shared_libs: [
"mysdk_myothernativelib@current",
"libc",
],
arch: {
arm64: {
srcs: ["arm64/lib/mynativelib.so"],
},
arm: {
srcs: ["arm/lib/mynativelib.so"],
},
},
stl: "none",
}
cc_prebuilt_library_shared {
name: "mynativelib",
prefer: false,
shared_libs: [
"myothernativelib",
"libc",
],
arch: {
arm64: {
srcs: ["arm64/lib/mynativelib.so"],
},
arm: {
srcs: ["arm/lib/mynativelib.so"],
},
},
stl: "none",
}
cc_prebuilt_library_shared {
name: "mysdk_myothernativelib@current",
sdk_member_name: "myothernativelib",
installable: false,
system_shared_libs: ["libm"],
arch: {
arm64: {
srcs: ["arm64/lib/myothernativelib.so"],
},
arm: {
srcs: ["arm/lib/myothernativelib.so"],
},
},
stl: "none",
}
cc_prebuilt_library_shared {
name: "myothernativelib",
prefer: false,
system_shared_libs: ["libm"],
arch: {
arm64: {
srcs: ["arm64/lib/myothernativelib.so"],
},
arm: {
srcs: ["arm/lib/myothernativelib.so"],
},
},
stl: "none",
}
cc_prebuilt_library_shared {
name: "mysdk_mysystemnativelib@current",
sdk_member_name: "mysystemnativelib",
installable: false,
arch: {
arm64: {
srcs: ["arm64/lib/mysystemnativelib.so"],
},
arm: {
srcs: ["arm/lib/mysystemnativelib.so"],
},
},
stl: "none",
}
cc_prebuilt_library_shared {
name: "mysystemnativelib",
prefer: false,
arch: {
arm64: {
srcs: ["arm64/lib/mysystemnativelib.so"],
},
arm: {
srcs: ["arm/lib/mysystemnativelib.so"],
},
},
stl: "none",
}
sdk_snapshot {
name: "mysdk@current",
native_shared_libs: [
"mysdk_mynativelib@current",
"mysdk_myothernativelib@current",
"mysdk_mysystemnativelib@current",
],
}
`),
checkAllCopyRules(`
.intermediates/mynativelib/android_arm64_armv8-a_shared/mynativelib.so -> arm64/lib/mynativelib.so
.intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so
.intermediates/myothernativelib/android_arm64_armv8-a_shared/myothernativelib.so -> arm64/lib/myothernativelib.so
.intermediates/myothernativelib/android_arm_armv7-a-neon_shared/myothernativelib.so -> arm/lib/myothernativelib.so
.intermediates/mysystemnativelib/android_arm64_armv8-a_shared/mysystemnativelib.so -> arm64/lib/mysystemnativelib.so
.intermediates/mysystemnativelib/android_arm_armv7-a-neon_shared/mysystemnativelib.so -> arm/lib/mysystemnativelib.so
`),
)
}
func TestHostSnapshotWithCcSharedLibrary(t *testing.T) { func TestHostSnapshotWithCcSharedLibrary(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)
@@ -652,7 +831,6 @@ cc_prebuilt_library_shared {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_shared { cc_prebuilt_library_shared {
@@ -673,7 +851,6 @@ cc_prebuilt_library_shared {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
sdk_snapshot { sdk_snapshot {
@@ -753,7 +930,6 @@ cc_prebuilt_library_shared {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_shared { cc_prebuilt_library_shared {
@@ -773,7 +949,6 @@ cc_prebuilt_library_shared {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
sdk_snapshot { sdk_snapshot {
@@ -833,7 +1008,6 @@ cc_prebuilt_library_static {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_static { cc_prebuilt_library_static {
@@ -851,7 +1025,6 @@ cc_prebuilt_library_static {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
module_exports_snapshot { module_exports_snapshot {
@@ -924,7 +1097,6 @@ cc_prebuilt_library_static {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_static { cc_prebuilt_library_static {
@@ -944,7 +1116,6 @@ cc_prebuilt_library_static {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
module_exports_snapshot { module_exports_snapshot {
@@ -1020,7 +1191,6 @@ cc_prebuilt_library_static {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_static { cc_prebuilt_library_static {
@@ -1036,7 +1206,6 @@ cc_prebuilt_library_static {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
module_exports_snapshot { module_exports_snapshot {
@@ -1084,7 +1253,6 @@ cc_prebuilt_library_headers {
sdk_member_name: "mynativeheaders", sdk_member_name: "mynativeheaders",
export_include_dirs: ["include/include"], export_include_dirs: ["include/include"],
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_headers { cc_prebuilt_library_headers {
@@ -1092,7 +1260,6 @@ cc_prebuilt_library_headers {
prefer: false, prefer: false,
export_include_dirs: ["include/include"], export_include_dirs: ["include/include"],
stl: "none", stl: "none",
system_shared_libs: [],
} }
sdk_snapshot { sdk_snapshot {
@@ -1139,7 +1306,6 @@ cc_prebuilt_library_headers {
host_supported: true, host_supported: true,
export_include_dirs: ["include/include"], export_include_dirs: ["include/include"],
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_headers { cc_prebuilt_library_headers {
@@ -1149,7 +1315,6 @@ cc_prebuilt_library_headers {
host_supported: true, host_supported: true,
export_include_dirs: ["include/include"], export_include_dirs: ["include/include"],
stl: "none", stl: "none",
system_shared_libs: [],
} }
sdk_snapshot { sdk_snapshot {
@@ -1211,7 +1376,6 @@ cc_prebuilt_library_headers {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
cc_prebuilt_library_headers { cc_prebuilt_library_headers {
@@ -1228,7 +1392,6 @@ cc_prebuilt_library_headers {
}, },
}, },
stl: "none", stl: "none",
system_shared_libs: [],
} }
sdk_snapshot { sdk_snapshot {

View File

@@ -50,9 +50,6 @@ type sdk struct {
// list properties, e.g. java_libs. // list properties, e.g. java_libs.
dynamicMemberTypeListProperties interface{} dynamicMemberTypeListProperties interface{}
// The set of exported members.
exportedMembers map[string]struct{}
// Information about the OsType specific member variants associated with this variant. // Information about the OsType specific member variants associated with this variant.
// //
// Set by OsType specific variants when their GenerateAndroidBuildActions is invoked // Set by OsType specific variants when their GenerateAndroidBuildActions is invoked
@@ -233,26 +230,19 @@ func (s *sdk) memberListProperties() []*sdkMemberListProperty {
} }
func (s *sdk) getExportedMembers() map[string]struct{} { func (s *sdk) getExportedMembers() map[string]struct{} {
if s.exportedMembers == nil { // Collect all the exported members.
// Collect all the exported members. exportedMembers := make(map[string]struct{})
s.exportedMembers = make(map[string]struct{})
for _, memberListProperty := range s.memberListProperties() { for _, memberListProperty := range s.memberListProperties() {
names := memberListProperty.getter(s.dynamicMemberTypeListProperties) names := memberListProperty.getter(s.dynamicMemberTypeListProperties)
// Every member specified explicitly in the properties is exported by the sdk. // Every member specified explicitly in the properties is exported by the sdk.
for _, name := range names { for _, name := range names {
s.exportedMembers[name] = struct{}{} exportedMembers[name] = struct{}{}
}
} }
} }
return s.exportedMembers return exportedMembers
}
func (s *sdk) isInternalMember(memberName string) bool {
_, ok := s.getExportedMembers()[memberName]
return !ok
} }
func (s *sdk) snapshot() bool { func (s *sdk) snapshot() bool {

View File

@@ -226,17 +226,23 @@ func versionedSdkMemberName(ctx android.ModuleContext, memberName string, versio
// the contents (header files, stub libraries, etc) into the zip file. // the contents (header files, stub libraries, etc) into the zip file.
func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) android.OutputPath { func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) android.OutputPath {
exportedMembers := make(map[string]struct{}) allMembersByName := make(map[string]struct{})
exportedMembersByName := make(map[string]struct{})
var memberRefs []sdkMemberRef var memberRefs []sdkMemberRef
for _, sdkVariant := range sdkVariants { for _, sdkVariant := range sdkVariants {
memberRefs = append(memberRefs, sdkVariant.memberRefs...) memberRefs = append(memberRefs, sdkVariant.memberRefs...)
// Record the names of all the members, both explicitly specified and implicitly
// included.
for _, memberRef := range sdkVariant.memberRefs {
allMembersByName[memberRef.variant.Name()] = struct{}{}
}
// Merge the exported member sets from all sdk variants. // Merge the exported member sets from all sdk variants.
for key, _ := range sdkVariant.getExportedMembers() { for key, _ := range sdkVariant.getExportedMembers() {
exportedMembers[key] = struct{}{} exportedMembersByName[key] = struct{}{}
} }
} }
s.exportedMembers = exportedMembers
snapshotDir := android.PathForModuleOut(ctx, "snapshot") snapshotDir := android.PathForModuleOut(ctx, "snapshot")
@@ -247,14 +253,16 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) andro
} }
builder := &snapshotBuilder{ builder := &snapshotBuilder{
ctx: ctx, ctx: ctx,
sdk: s, sdk: s,
version: "current", version: "current",
snapshotDir: snapshotDir.OutputPath, snapshotDir: snapshotDir.OutputPath,
copies: make(map[string]string), copies: make(map[string]string),
filesToZip: []android.Path{bp.path}, filesToZip: []android.Path{bp.path},
bpFile: bpFile, bpFile: bpFile,
prebuiltModules: make(map[string]*bpModule), prebuiltModules: make(map[string]*bpModule),
allMembersByName: allMembersByName,
exportedMembersByName: exportedMembersByName,
} }
s.builderForTests = builder s.builderForTests = builder
@@ -402,7 +410,7 @@ func (s *sdk) addMemberPropertiesToPropertySet(builder *snapshotBuilder, propert
for _, memberListProperty := range s.memberListProperties() { for _, memberListProperty := range s.memberListProperties() {
names := memberListProperty.getter(dynamicMemberTypeListProperties) names := memberListProperty.getter(dynamicMemberTypeListProperties)
if len(names) > 0 { if len(names) > 0 {
propertySet.AddProperty(memberListProperty.propertyName(), builder.versionedSdkMemberNames(names)) propertySet.AddProperty(memberListProperty.propertyName(), builder.versionedSdkMemberNames(names, false))
} }
} }
} }
@@ -415,7 +423,13 @@ type propertyTag struct {
// //
// This will cause the references to be rewritten to a versioned reference in the version // This will cause the references to be rewritten to a versioned reference in the version
// specific instance of a snapshot module. // specific instance of a snapshot module.
var sdkMemberReferencePropertyTag = propertyTag{"sdkMemberReferencePropertyTag"} var requiredSdkMemberReferencePropertyTag = propertyTag{"requiredSdkMemberReferencePropertyTag"}
// A BpPropertyTag to add to a property that contains references to other sdk members.
//
// This will cause the references to be rewritten to a versioned reference in the version
// specific instance of a snapshot module.
var optionalSdkMemberReferencePropertyTag = propertyTag{"optionalSdkMemberReferencePropertyTag"}
// A BpPropertyTag that indicates the property should only be present in the versioned // A BpPropertyTag that indicates the property should only be present in the versioned
// module. // module.
@@ -433,14 +447,15 @@ func (t unversionedToVersionedTransformation) transformModule(module *bpModule)
// Use a versioned name for the module but remember the original name for the // Use a versioned name for the module but remember the original name for the
// snapshot. // snapshot.
name := module.getValue("name").(string) name := module.getValue("name").(string)
module.setProperty("name", t.builder.versionedSdkMemberName(name)) module.setProperty("name", t.builder.versionedSdkMemberName(name, true))
module.insertAfter("name", "sdk_member_name", name) module.insertAfter("name", "sdk_member_name", name)
return module return module
} }
func (t unversionedToVersionedTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { func (t unversionedToVersionedTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) {
if tag == sdkMemberReferencePropertyTag { if tag == requiredSdkMemberReferencePropertyTag || tag == optionalSdkMemberReferencePropertyTag {
return t.builder.versionedSdkMemberNames(value.([]string)), tag required := tag == requiredSdkMemberReferencePropertyTag
return t.builder.versionedSdkMemberNames(value.([]string), required), tag
} else { } else {
return value, tag return value, tag
} }
@@ -454,7 +469,7 @@ type unversionedTransformation struct {
func (t unversionedTransformation) transformModule(module *bpModule) *bpModule { func (t unversionedTransformation) transformModule(module *bpModule) *bpModule {
// If the module is an internal member then use a unique name for it. // If the module is an internal member then use a unique name for it.
name := module.getValue("name").(string) name := module.getValue("name").(string)
module.setProperty("name", t.builder.unversionedSdkMemberName(name)) module.setProperty("name", t.builder.unversionedSdkMemberName(name, true))
// Set prefer: false - this is not strictly required as that is the default. // Set prefer: false - this is not strictly required as that is the default.
module.insertAfter("name", "prefer", false) module.insertAfter("name", "prefer", false)
@@ -463,8 +478,9 @@ func (t unversionedTransformation) transformModule(module *bpModule) *bpModule {
} }
func (t unversionedTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) { func (t unversionedTransformation) transformProperty(name string, value interface{}, tag android.BpPropertyTag) (interface{}, android.BpPropertyTag) {
if tag == sdkMemberReferencePropertyTag { if tag == requiredSdkMemberReferencePropertyTag || tag == optionalSdkMemberReferencePropertyTag {
return t.builder.unversionedSdkMemberNames(value.([]string)), tag required := tag == requiredSdkMemberReferencePropertyTag
return t.builder.unversionedSdkMemberNames(value.([]string), required), tag
} else if tag == sdkVersionedOnlyPropertyTag { } else if tag == sdkVersionedOnlyPropertyTag {
// The property is not allowed in the unversioned module so remove it. // The property is not allowed in the unversioned module so remove it.
return nil, nil return nil, nil
@@ -559,6 +575,12 @@ type snapshotBuilder struct {
prebuiltModules map[string]*bpModule prebuiltModules map[string]*bpModule
prebuiltOrder []*bpModule prebuiltOrder []*bpModule
// The set of all members by name.
allMembersByName map[string]struct{}
// The set of exported members by name.
exportedMembersByName map[string]struct{}
} }
func (s *snapshotBuilder) CopyToSnapshot(src android.Path, dest string) { func (s *snapshotBuilder) CopyToSnapshot(src android.Path, dest string) {
@@ -612,7 +634,7 @@ func (s *snapshotBuilder) AddPrebuiltModule(member android.SdkMember, moduleType
variant := member.Variants()[0] variant := member.Variants()[0]
if s.sdk.isInternalMember(name) { if s.isInternalMember(name) {
// An internal member is only referenced from the sdk snapshot which is in the // An internal member is only referenced from the sdk snapshot which is in the
// same package so can be marked as private. // same package so can be marked as private.
m.AddProperty("visibility", []string{"//visibility:private"}) m.AddProperty("visibility", []string{"//visibility:private"})
@@ -676,40 +698,66 @@ func addHostDeviceSupportedProperties(deviceSupported bool, hostSupported bool,
} }
} }
func (s *snapshotBuilder) SdkMemberReferencePropertyTag() android.BpPropertyTag { func (s *snapshotBuilder) SdkMemberReferencePropertyTag(required bool) android.BpPropertyTag {
return sdkMemberReferencePropertyTag if required {
return requiredSdkMemberReferencePropertyTag
} else {
return optionalSdkMemberReferencePropertyTag
}
}
func (s *snapshotBuilder) OptionalSdkMemberReferencePropertyTag() android.BpPropertyTag {
return optionalSdkMemberReferencePropertyTag
} }
// Get a versioned name appropriate for the SDK snapshot version being taken. // Get a versioned name appropriate for the SDK snapshot version being taken.
func (s *snapshotBuilder) versionedSdkMemberName(unversionedName string) string { func (s *snapshotBuilder) versionedSdkMemberName(unversionedName string, required bool) string {
if _, ok := s.allMembersByName[unversionedName]; !ok {
if required {
s.ctx.ModuleErrorf("Required member reference %s is not a member of the sdk", unversionedName)
}
return unversionedName
}
return versionedSdkMemberName(s.ctx, unversionedName, s.version) return versionedSdkMemberName(s.ctx, unversionedName, s.version)
} }
func (s *snapshotBuilder) versionedSdkMemberNames(members []string) []string { func (s *snapshotBuilder) versionedSdkMemberNames(members []string, required bool) []string {
var references []string = nil var references []string = nil
for _, m := range members { for _, m := range members {
references = append(references, s.versionedSdkMemberName(m)) references = append(references, s.versionedSdkMemberName(m, required))
} }
return references return references
} }
// Get an internal name unique to the sdk. // Get an internal name unique to the sdk.
func (s *snapshotBuilder) unversionedSdkMemberName(unversionedName string) string { func (s *snapshotBuilder) unversionedSdkMemberName(unversionedName string, required bool) string {
if s.sdk.isInternalMember(unversionedName) { if _, ok := s.allMembersByName[unversionedName]; !ok {
if required {
s.ctx.ModuleErrorf("Required member reference %s is not a member of the sdk", unversionedName)
}
return unversionedName
}
if s.isInternalMember(unversionedName) {
return s.ctx.ModuleName() + "_" + unversionedName return s.ctx.ModuleName() + "_" + unversionedName
} else { } else {
return unversionedName return unversionedName
} }
} }
func (s *snapshotBuilder) unversionedSdkMemberNames(members []string) []string { func (s *snapshotBuilder) unversionedSdkMemberNames(members []string, required bool) []string {
var references []string = nil var references []string = nil
for _, m := range members { for _, m := range members {
references = append(references, s.unversionedSdkMemberName(m)) references = append(references, s.unversionedSdkMemberName(m, required))
} }
return references return references
} }
func (s *snapshotBuilder) isInternalMember(memberName string) bool {
_, ok := s.exportedMembersByName[memberName]
return !ok
}
type sdkMemberRef struct { type sdkMemberRef struct {
memberType android.SdkMemberType memberType android.SdkMemberType
variant android.SdkAware variant android.SdkAware