Merge "Add CommonOS variant for sdk"
This commit is contained in:
@@ -607,6 +607,10 @@ var (
|
||||
Android = NewOsType("android", Device, false)
|
||||
Fuchsia = NewOsType("fuchsia", Device, false)
|
||||
|
||||
// A pseudo OSType for a common os variant, which is OSType agnostic and which
|
||||
// has dependencies on all the OS variants.
|
||||
CommonOS = NewOsType("common_os", Generic, false)
|
||||
|
||||
osArchTypeMap = map[OsType][]ArchType{
|
||||
Linux: []ArchType{X86, X86_64},
|
||||
LinuxBionic: []ArchType{X86_64},
|
||||
@@ -775,12 +779,64 @@ func osMutator(mctx BottomUpMutatorContext) {
|
||||
osNames[i] = os.String()
|
||||
}
|
||||
|
||||
modules := mctx.CreateVariations(osNames...)
|
||||
for i, m := range modules {
|
||||
m.(Module).base().commonProperties.CompileOS = moduleOSList[i]
|
||||
m.(Module).base().setOSProperties(mctx)
|
||||
createCommonOSVariant := base.commonProperties.CreateCommonOSVariant
|
||||
if createCommonOSVariant {
|
||||
// A CommonOS variant was requested so add it to the list of OS's variants to
|
||||
// create. It needs to be added to the end because it needs to depend on the
|
||||
// the other variants in the list returned by CreateVariations(...) and inter
|
||||
// variant dependencies can only be created from a later variant in that list to
|
||||
// an earlier one. That is because variants are always processed in the order in
|
||||
// which they are returned from CreateVariations(...).
|
||||
osNames = append(osNames, CommonOS.Name)
|
||||
moduleOSList = append(moduleOSList, CommonOS)
|
||||
}
|
||||
|
||||
modules := mctx.CreateVariations(osNames...)
|
||||
for i, m := range modules {
|
||||
m.base().commonProperties.CompileOS = moduleOSList[i]
|
||||
m.base().setOSProperties(mctx)
|
||||
}
|
||||
|
||||
if createCommonOSVariant {
|
||||
// A CommonOS variant was requested so add dependencies from it (the last one in
|
||||
// the list) to the OS type specific variants.
|
||||
last := len(modules) - 1
|
||||
commonOSVariant := modules[last]
|
||||
commonOSVariant.base().commonProperties.CommonOSVariant = true
|
||||
for _, module := range modules[0:last] {
|
||||
// Ignore modules that are enabled. Note, this will only avoid adding
|
||||
// dependencies on OsType variants that are explicitly disabled in their
|
||||
// properties. The CommonOS variant will still depend on disabled variants
|
||||
// if they are disabled afterwards, e.g. in archMutator if
|
||||
if module.Enabled() {
|
||||
mctx.AddInterVariantDependency(commonOsToOsSpecificVariantTag, commonOSVariant, module)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Identifies the dependency from CommonOS variant to the os specific variants.
|
||||
type commonOSTag struct{ blueprint.BaseDependencyTag }
|
||||
|
||||
var commonOsToOsSpecificVariantTag = commonOSTag{}
|
||||
|
||||
// Get the OsType specific variants for the current CommonOS variant.
|
||||
//
|
||||
// The returned list will only contain enabled OsType specific variants of the
|
||||
// module referenced in the supplied context. An empty list is returned if there
|
||||
// are no enabled variants or the supplied context is not for an CommonOS
|
||||
// variant.
|
||||
func GetOsSpecificVariantsOfCommonOSVariant(mctx BaseModuleContext) []Module {
|
||||
var variants []Module
|
||||
mctx.VisitDirectDeps(func(m Module) {
|
||||
if mctx.OtherModuleDependencyTag(m) == commonOsToOsSpecificVariantTag {
|
||||
if m.Enabled() {
|
||||
variants = append(variants, m)
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
return variants
|
||||
}
|
||||
|
||||
// archMutator splits a module into a variant for each Target requested by the module. Target selection
|
||||
@@ -821,6 +877,15 @@ func archMutator(mctx BottomUpMutatorContext) {
|
||||
}
|
||||
|
||||
os := base.commonProperties.CompileOS
|
||||
if os == CommonOS {
|
||||
// Make sure that the target related properties are initialized for the
|
||||
// CommonOS variant.
|
||||
addTargetProperties(module, commonTargetMap[os.Name], nil, true)
|
||||
|
||||
// Do not create arch specific variants for the CommonOS variant.
|
||||
return
|
||||
}
|
||||
|
||||
osTargets := mctx.Config().Targets[os]
|
||||
image := base.commonProperties.ImageVariation
|
||||
// Filter NativeBridge targets unless they are explicitly supported
|
||||
@@ -881,15 +946,17 @@ func archMutator(mctx BottomUpMutatorContext) {
|
||||
|
||||
modules := mctx.CreateVariations(targetNames...)
|
||||
for i, m := range modules {
|
||||
m.(Module).base().commonProperties.CompileTarget = targets[i]
|
||||
m.(Module).base().commonProperties.CompileMultiTargets = multiTargets
|
||||
if i == 0 {
|
||||
m.(Module).base().commonProperties.CompilePrimary = true
|
||||
}
|
||||
addTargetProperties(m, targets[i], multiTargets, i == 0)
|
||||
m.(Module).base().setArchProperties(mctx)
|
||||
}
|
||||
}
|
||||
|
||||
func addTargetProperties(m Module, target Target, multiTargets []Target, primaryTarget bool) {
|
||||
m.base().commonProperties.CompileTarget = target
|
||||
m.base().commonProperties.CompileMultiTargets = multiTargets
|
||||
m.base().commonProperties.CompilePrimary = primaryTarget
|
||||
}
|
||||
|
||||
func decodeMultilib(base *ModuleBase, class OsClass) (multilib, extraMultilib string) {
|
||||
switch class {
|
||||
case Device:
|
||||
|
@@ -359,6 +359,9 @@ func NewConfig(srcDir, buildDir string) (Config, error) {
|
||||
return Config{}, err
|
||||
}
|
||||
|
||||
// Make the CommonOS OsType available for all products.
|
||||
targets[CommonOS] = []Target{commonTargetMap[CommonOS.Name]}
|
||||
|
||||
var archConfig []archConfig
|
||||
if Bool(config.Mega_device) {
|
||||
archConfig = getMegaDeviceConfig()
|
||||
|
@@ -452,6 +452,22 @@ type commonProperties struct {
|
||||
HostOrDeviceSupported HostOrDeviceSupported `blueprint:"mutated"`
|
||||
ArchSpecific bool `blueprint:"mutated"`
|
||||
|
||||
// If set to true then a CommonOS variant will be created which will have dependencies
|
||||
// on all its OsType specific variants. Used by sdk/module_exports to create a snapshot
|
||||
// that covers all os and architecture variants.
|
||||
//
|
||||
// The OsType specific variants can be retrieved by calling
|
||||
// GetOsSpecificVariantsOfCommonOSVariant
|
||||
//
|
||||
// Set at module initialization time by calling InitCommonOSAndroidMultiTargetsArchModule
|
||||
CreateCommonOSVariant bool `blueprint:"mutated"`
|
||||
|
||||
// If set to true then this variant is the CommonOS variant that has dependencies on its
|
||||
// OsType specific variants.
|
||||
//
|
||||
// Set by osMutator.
|
||||
CommonOSVariant bool `blueprint:"mutated"`
|
||||
|
||||
SkipInstall bool `blueprint:"mutated"`
|
||||
|
||||
NamespaceExportedToMake bool `blueprint:"mutated"`
|
||||
@@ -584,6 +600,14 @@ func InitAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defa
|
||||
m.base().commonProperties.UseTargetVariants = false
|
||||
}
|
||||
|
||||
// As InitAndroidMultiTargetsArchModule except it creates an additional CommonOS variant that
|
||||
// has dependencies on all the OsType specific variants.
|
||||
func InitCommonOSAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib Multilib) {
|
||||
InitAndroidArchModule(m, hod, defaultMultilib)
|
||||
m.base().commonProperties.UseTargetVariants = false
|
||||
m.base().commonProperties.CreateCommonOSVariant = true
|
||||
}
|
||||
|
||||
// A ModuleBase object contains the properties that are common to all Android
|
||||
// modules. It should be included as an anonymous field in every module
|
||||
// struct definition. InitAndroidModule should then be called from the module's
|
||||
@@ -775,6 +799,11 @@ func (m *ModuleBase) ArchSpecific() bool {
|
||||
return m.commonProperties.ArchSpecific
|
||||
}
|
||||
|
||||
// True if the current variant is a CommonOS variant, false otherwise.
|
||||
func (m *ModuleBase) IsCommonOSVariant() bool {
|
||||
return m.commonProperties.CommonOSVariant
|
||||
}
|
||||
|
||||
func (m *ModuleBase) OsClassSupported() []OsClass {
|
||||
switch m.commonProperties.HostOrDeviceSupported {
|
||||
case HostSupported:
|
||||
@@ -1103,8 +1132,11 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext)
|
||||
blueprintCtx.GetMissingDependencies()
|
||||
|
||||
// For the final GenerateAndroidBuildActions pass, require that all visited dependencies Soong modules and
|
||||
// are enabled.
|
||||
ctx.baseModuleContext.strictVisitDeps = true
|
||||
// are enabled. Unless the module is a CommonOS variant which may have dependencies on disabled variants
|
||||
// (because the dependencies are added before the modules are disabled). The
|
||||
// GetOsSpecificVariantsOfCommonOSVariant(...) method will ensure that the disabled variants are
|
||||
// ignored.
|
||||
ctx.baseModuleContext.strictVisitDeps = !m.IsCommonOSVariant()
|
||||
|
||||
if ctx.config.captureBuild {
|
||||
ctx.ruleParams = make(map[blueprint.Rule]blueprint.RuleParams)
|
||||
|
@@ -17,6 +17,7 @@ package sdk
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"android/soong/android"
|
||||
"android/soong/cc"
|
||||
)
|
||||
|
||||
@@ -54,7 +55,7 @@ func TestSdkIsCompileMultilibBoth(t *testing.T) {
|
||||
arm64Output := result.Module("sdkmember", "android_arm64_armv8-a_shared").(*cc.Module).OutputFile()
|
||||
|
||||
var inputs []string
|
||||
buildParams := result.Module("mysdk", "android_common").BuildParamsForTests()
|
||||
buildParams := result.Module("mysdk", android.CommonOS.Name).BuildParamsForTests()
|
||||
for _, bp := range buildParams {
|
||||
if bp.Input != nil {
|
||||
inputs = append(inputs, bp.Input.String())
|
||||
@@ -250,7 +251,7 @@ func TestSnapshotWithCcDuplicateHeaders(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "android_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAllCopyRules(`
|
||||
include/Test.h -> include/include/Test.h
|
||||
.intermediates/mynativelib1/android_arm64_armv8-a_shared/mynativelib1.so -> arm64/lib/mynativelib1.so
|
||||
@@ -287,7 +288,7 @@ func TestSnapshotWithCcSharedLibraryCommonProperties(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "android_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -356,7 +357,7 @@ func TestSnapshotWithCcBinary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mymodule_exports", "android_common", "",
|
||||
result.CheckSnapshot("mymodule_exports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -422,7 +423,7 @@ func TestSnapshotWithCcSharedLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "android_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -510,7 +511,7 @@ func TestHostSnapshotWithCcSharedLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -597,7 +598,7 @@ func TestSnapshotWithCcStaticLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "android_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -685,7 +686,7 @@ func TestHostSnapshotWithCcStaticLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -784,7 +785,7 @@ func TestHostSnapshotWithMultiLib64(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -856,7 +857,7 @@ func TestSnapshotWithCcHeadersLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "android_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -909,7 +910,7 @@ func TestHostSnapshotWithCcHeadersLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
|
@@ -42,7 +42,7 @@ func TestModuleExportsSnapshot(t *testing.T) {
|
||||
"package/Android.bp": []byte(packageBp),
|
||||
})
|
||||
|
||||
result.CheckSnapshot("myexports", "android_common", "package",
|
||||
result.CheckSnapshot("myexports", "package",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
|
@@ -141,7 +141,7 @@ func TestSnapshotWithJavaHeaderLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "android_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -196,7 +196,7 @@ func TestHostSnapshotWithJavaHeaderLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -250,7 +250,7 @@ func TestSnapshotWithJavaImplLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "android_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -305,7 +305,7 @@ func TestHostSnapshotWithJavaImplLibrary(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -356,7 +356,7 @@ func TestSnapshotWithJavaTest(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "android_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -409,7 +409,7 @@ func TestHostSnapshotWithJavaTest(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -503,7 +503,7 @@ func TestSnapshotWithDroidstubs(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "android_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -526,7 +526,7 @@ module_exports_snapshot {
|
||||
|
||||
`),
|
||||
checkAllCopyRules(""),
|
||||
checkMergeZip(".intermediates/myexports/android_common/tmp/java/myjavaapistubs_stubs_sources.zip"),
|
||||
checkMergeZip(".intermediates/myexports/common_os/tmp/java/myjavaapistubs_stubs_sources.zip"),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -552,7 +552,7 @@ func TestHostSnapshotWithDroidstubs(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("myexports", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("myexports", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -580,7 +580,7 @@ module_exports_snapshot {
|
||||
}
|
||||
`),
|
||||
checkAllCopyRules(""),
|
||||
checkMergeZip(".intermediates/myexports/linux_glibc_common/tmp/java/myjavaapistubs_stubs_sources.zip"),
|
||||
checkMergeZip(".intermediates/myexports/common_os/tmp/java/myjavaapistubs_stubs_sources.zip"),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -612,7 +612,7 @@ func TestSnapshotWithJavaSystemModules(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "android_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
@@ -702,7 +702,7 @@ func TestHostSnapshotWithJavaSystemModules(t *testing.T) {
|
||||
}
|
||||
`)
|
||||
|
||||
result.CheckSnapshot("mysdk", "linux_glibc_common", "",
|
||||
result.CheckSnapshot("mysdk", "",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
|
35
sdk/sdk.go
35
sdk/sdk.go
@@ -53,6 +53,13 @@ type sdk struct {
|
||||
// The set of exported members.
|
||||
exportedMembers map[string]struct{}
|
||||
|
||||
// Information about the OsType specific member variants associated with this variant.
|
||||
//
|
||||
// Set by OsType specific variants when their GenerateAndroidBuildActions is invoked
|
||||
// and used by the CommonOS variant when its GenerateAndroidBuildActions is invoked, which
|
||||
// is guaranteed to occur afterwards.
|
||||
memberRefs []sdkMemberRef
|
||||
|
||||
properties sdkProperties
|
||||
|
||||
snapshotFile android.OptionalPath
|
||||
@@ -201,7 +208,7 @@ func newSdkModule(moduleExports bool) *sdk {
|
||||
// properties for the member type specific list properties.
|
||||
s.dynamicMemberTypeListProperties = s.dynamicSdkMemberTypes.createMemberListProperties()
|
||||
s.AddProperties(&s.properties, s.dynamicMemberTypeListProperties)
|
||||
android.InitAndroidMultiTargetsArchModule(s, android.HostAndDeviceSupported, android.MultilibCommon)
|
||||
android.InitCommonOSAndroidMultiTargetsArchModule(s, android.HostAndDeviceSupported, android.MultilibCommon)
|
||||
android.InitDefaultableModule(s)
|
||||
android.AddLoadHook(s, func(ctx android.LoadHookContext) {
|
||||
type props struct {
|
||||
@@ -252,10 +259,29 @@ func (s *sdk) snapshot() bool {
|
||||
}
|
||||
|
||||
func (s *sdk) GenerateAndroidBuildActions(ctx android.ModuleContext) {
|
||||
if !s.snapshot() {
|
||||
if s.snapshot() {
|
||||
// We don't need to create a snapshot out of sdk_snapshot.
|
||||
// That doesn't make sense. We need a snapshot to create sdk_snapshot.
|
||||
s.snapshotFile = android.OptionalPathForPath(s.buildSnapshot(ctx))
|
||||
return
|
||||
}
|
||||
|
||||
// This method is guaranteed to be called on OsType specific variants before it is called
|
||||
// on their corresponding CommonOS variant.
|
||||
if !s.IsCommonOSVariant() {
|
||||
// Collect the OsType specific members are add them to the OsType specific variant.
|
||||
s.memberRefs = s.collectMembers(ctx)
|
||||
} else {
|
||||
// Get the OsType specific variants on which the CommonOS depends.
|
||||
osSpecificVariants := android.GetOsSpecificVariantsOfCommonOSVariant(ctx)
|
||||
var sdkVariants []*sdk
|
||||
for _, m := range osSpecificVariants {
|
||||
if sdkVariant, ok := m.(*sdk); ok {
|
||||
sdkVariants = append(sdkVariants, sdkVariant)
|
||||
}
|
||||
}
|
||||
|
||||
// Generate the snapshot from the member info.
|
||||
s.snapshotFile = android.OptionalPathForPath(s.buildSnapshot(ctx, sdkVariants))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -320,7 +346,8 @@ func (t sdkMemberVersionedDepTag) ExcludeFromVisibilityEnforcement() {}
|
||||
// Step 1: create dependencies from an SDK module to its members.
|
||||
func memberMutator(mctx android.BottomUpMutatorContext) {
|
||||
if s, ok := mctx.Module().(*sdk); ok {
|
||||
if s.Enabled() {
|
||||
// Add dependencies from enabled and non CommonOS variants to the sdk member variants.
|
||||
if s.Enabled() && !s.IsCommonOSVariant() {
|
||||
for _, memberListProperty := range s.memberListProperties() {
|
||||
names := memberListProperty.getter(s.dynamicMemberTypeListProperties)
|
||||
if len(names) > 0 {
|
||||
|
@@ -145,7 +145,7 @@ func TestSnapshotVisibility(t *testing.T) {
|
||||
"package/Android.bp": []byte(packageBp),
|
||||
})
|
||||
|
||||
result.CheckSnapshot("mysdk", "android_common", "package",
|
||||
result.CheckSnapshot("mysdk", "package",
|
||||
checkAndroidBpContents(`
|
||||
// This is auto-generated. DO NOT EDIT.
|
||||
|
||||
|
@@ -246,9 +246,12 @@ func (r *testSdkResult) ModuleForTests(name string, variant string) android.Test
|
||||
// Takes a list of functions which check different facets of the snapshot build rules.
|
||||
// Allows each test to customize what is checked without duplicating lots of code
|
||||
// or proliferating check methods of different flavors.
|
||||
func (r *testSdkResult) CheckSnapshot(name string, variant string, dir string, checkers ...snapshotBuildInfoChecker) {
|
||||
func (r *testSdkResult) CheckSnapshot(name string, dir string, checkers ...snapshotBuildInfoChecker) {
|
||||
r.t.Helper()
|
||||
|
||||
// The sdk CommonOS variant is always responsible for generating the snapshot.
|
||||
variant := android.CommonOS.Name
|
||||
|
||||
sdk := r.Module(name, variant).(*sdk)
|
||||
|
||||
snapshotBuildInfo := r.getSdkSnapshotBuildInfo(sdk)
|
||||
|
@@ -104,18 +104,9 @@ func (gf *generatedFile) build(pctx android.PackageContext, ctx android.BuilderC
|
||||
|
||||
// Collect all the members.
|
||||
//
|
||||
// The members are first grouped by type and then grouped by name. The order of
|
||||
// the types is the order they are referenced in android.SdkMemberTypesRegistry.
|
||||
// The names are in the order in which the dependencies were added.
|
||||
//
|
||||
// Returns the members as well as the multilib setting to use.
|
||||
func (s *sdk) collectMembers(ctx android.ModuleContext) ([]*sdkMember, string) {
|
||||
byType := make(map[android.SdkMemberType][]*sdkMember)
|
||||
byName := make(map[string]*sdkMember)
|
||||
|
||||
lib32 := false // True if any of the members have 32 bit version.
|
||||
lib64 := false // True if any of the members have 64 bit version.
|
||||
|
||||
// Returns a list containing type (extracted from the dependency tag) and the variant.
|
||||
func (s *sdk) collectMembers(ctx android.ModuleContext) []sdkMemberRef {
|
||||
var memberRefs []sdkMemberRef
|
||||
ctx.WalkDeps(func(child android.Module, parent android.Module) bool {
|
||||
tag := ctx.OtherModuleDependencyTag(child)
|
||||
if memberTag, ok := tag.(android.SdkMemberTypeDependencyTag); ok {
|
||||
@@ -126,24 +117,7 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) ([]*sdkMember, string) {
|
||||
ctx.ModuleErrorf("module %q is not valid in property %s", ctx.OtherModuleName(child), memberType.SdkPropertyName())
|
||||
}
|
||||
|
||||
name := ctx.OtherModuleName(child)
|
||||
member := byName[name]
|
||||
if member == nil {
|
||||
member = &sdkMember{memberType: memberType, name: name}
|
||||
byName[name] = member
|
||||
byType[memberType] = append(byType[memberType], member)
|
||||
}
|
||||
|
||||
multilib := child.Target().Arch.ArchType.Multilib
|
||||
if multilib == "lib32" {
|
||||
lib32 = true
|
||||
} else if multilib == "lib64" {
|
||||
lib64 = true
|
||||
}
|
||||
|
||||
// Only append new variants to the list. This is needed because a member can be both
|
||||
// exported by the sdk and also be a transitive sdk member.
|
||||
member.variants = appendUniqueVariants(member.variants, child.(android.SdkAware))
|
||||
memberRefs = append(memberRefs, sdkMemberRef{memberType, child.(android.SdkAware)})
|
||||
|
||||
// If the member type supports transitive sdk members then recurse down into
|
||||
// its dependencies, otherwise exit traversal.
|
||||
@@ -153,6 +127,47 @@ func (s *sdk) collectMembers(ctx android.ModuleContext) ([]*sdkMember, string) {
|
||||
return false
|
||||
})
|
||||
|
||||
return memberRefs
|
||||
}
|
||||
|
||||
// Organize the members.
|
||||
//
|
||||
// The members are first grouped by type and then grouped by name. The order of
|
||||
// the types is the order they are referenced in android.SdkMemberTypesRegistry.
|
||||
// The names are in the order in which the dependencies were added.
|
||||
//
|
||||
// Returns the members as well as the multilib setting to use.
|
||||
func (s *sdk) organizeMembers(ctx android.ModuleContext, memberRefs []sdkMemberRef) ([]*sdkMember, string) {
|
||||
byType := make(map[android.SdkMemberType][]*sdkMember)
|
||||
byName := make(map[string]*sdkMember)
|
||||
|
||||
lib32 := false // True if any of the members have 32 bit version.
|
||||
lib64 := false // True if any of the members have 64 bit version.
|
||||
|
||||
for _, memberRef := range memberRefs {
|
||||
memberType := memberRef.memberType
|
||||
variant := memberRef.variant
|
||||
|
||||
name := ctx.OtherModuleName(variant)
|
||||
member := byName[name]
|
||||
if member == nil {
|
||||
member = &sdkMember{memberType: memberType, name: name}
|
||||
byName[name] = member
|
||||
byType[memberType] = append(byType[memberType], member)
|
||||
}
|
||||
|
||||
multilib := variant.Target().Arch.ArchType.Multilib
|
||||
if multilib == "lib32" {
|
||||
lib32 = true
|
||||
} else if multilib == "lib64" {
|
||||
lib64 = true
|
||||
}
|
||||
|
||||
// Only append new variants to the list. This is needed because a member can be both
|
||||
// exported by the sdk and also be a transitive sdk member.
|
||||
member.variants = appendUniqueVariants(member.variants, variant)
|
||||
}
|
||||
|
||||
var members []*sdkMember
|
||||
for _, memberListProperty := range s.memberListProperties() {
|
||||
membersOfType := byType[memberListProperty.memberType]
|
||||
@@ -207,7 +222,13 @@ func versionedSdkMemberName(ctx android.ModuleContext, memberName string, versio
|
||||
|
||||
// buildSnapshot is the main function in this source file. It creates rules to copy
|
||||
// the contents (header files, stub libraries, etc) into the zip file.
|
||||
func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath {
|
||||
func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) android.OutputPath {
|
||||
|
||||
var memberRefs []sdkMemberRef
|
||||
for _, sdkVariant := range sdkVariants {
|
||||
memberRefs = append(memberRefs, sdkVariant.memberRefs...)
|
||||
}
|
||||
|
||||
snapshotDir := android.PathForModuleOut(ctx, "snapshot")
|
||||
|
||||
bp := newGeneratedFile(ctx, "snapshot", "Android.bp")
|
||||
@@ -228,7 +249,7 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext) android.OutputPath {
|
||||
}
|
||||
s.builderForTests = builder
|
||||
|
||||
members, multilib := s.collectMembers(ctx)
|
||||
members, multilib := s.organizeMembers(ctx, memberRefs)
|
||||
for _, member := range members {
|
||||
member.memberType.BuildSnapshot(ctx, builder, member)
|
||||
}
|
||||
@@ -592,6 +613,11 @@ func (s *snapshotBuilder) unversionedSdkMemberNames(members []string) []string {
|
||||
return references
|
||||
}
|
||||
|
||||
type sdkMemberRef struct {
|
||||
memberType android.SdkMemberType
|
||||
variant android.SdkAware
|
||||
}
|
||||
|
||||
var _ android.SdkMember = (*sdkMember)(nil)
|
||||
|
||||
type sdkMember struct {
|
||||
|
Reference in New Issue
Block a user