diff options
Diffstat (limited to 'sdk')
-rw-r--r-- | sdk/cc_sdk_test.go | 38 | ||||
-rw-r--r-- | sdk/java_sdk_test.go | 4 | ||||
-rw-r--r-- | sdk/sdk.go | 41 | ||||
-rw-r--r-- | sdk/testing.go | 5 | ||||
-rw-r--r-- | sdk/update.go | 32 |
5 files changed, 77 insertions, 43 deletions
diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index 497f14bde..17afdb804 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -73,7 +73,6 @@ func TestSdkCompileMultilibOverride(t *testing.T) { result := testSdkWithCc(t, ` sdk { name: "mysdk", - device_supported: false, host_supported: true, native_shared_libs: ["sdkmember"], compile_multilib: "64", @@ -81,7 +80,6 @@ func TestSdkCompileMultilibOverride(t *testing.T) { cc_library_shared { name: "sdkmember", - device_supported: false, host_supported: true, srcs: ["Test.cpp"], stl: "none", @@ -96,14 +94,16 @@ func TestSdkCompileMultilibOverride(t *testing.T) { cc_prebuilt_library_shared { name: "mysdk_sdkmember@current", sdk_member_name: "sdkmember", - device_supported: false, host_supported: true, installable: false, stl: "none", compile_multilib: "64", - arch: { - x86_64: { - srcs: ["x86_64/lib/sdkmember.so"], + target: { + android_arm64: { + srcs: ["android/arm64/lib/sdkmember.so"], + }, + linux_glibc_x86_64: { + srcs: ["linux_glibc/x86_64/lib/sdkmember.so"], }, }, } @@ -111,31 +111,29 @@ cc_prebuilt_library_shared { cc_prebuilt_library_shared { name: "sdkmember", prefer: false, - device_supported: false, host_supported: true, stl: "none", compile_multilib: "64", - arch: { - x86_64: { - srcs: ["x86_64/lib/sdkmember.so"], + target: { + android_arm64: { + srcs: ["android/arm64/lib/sdkmember.so"], + }, + linux_glibc_x86_64: { + srcs: ["linux_glibc/x86_64/lib/sdkmember.so"], }, }, } sdk_snapshot { name: "mysdk@current", - device_supported: false, host_supported: true, native_shared_libs: ["mysdk_sdkmember@current"], - target: { - linux_glibc: { - compile_multilib: "64", - }, - }, + compile_multilib: "64", } `), checkAllCopyRules(` -.intermediates/sdkmember/linux_glibc_x86_64_shared/sdkmember.so -> x86_64/lib/sdkmember.so +.intermediates/sdkmember/android_arm64_armv8-a_shared/sdkmember.so -> android/arm64/lib/sdkmember.so +.intermediates/sdkmember/linux_glibc_x86_64_shared/sdkmember.so -> linux_glibc/x86_64/lib/sdkmember.so `)) } @@ -1527,11 +1525,7 @@ module_exports_snapshot { device_supported: false, host_supported: true, native_static_libs: ["myexports_mynativelib@current"], - target: { - linux_glibc: { - compile_multilib: "64", - }, - }, + compile_multilib: "64", }`), checkAllCopyRules(` include/Test.h -> include/include/Test.h diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index a2198e97b..931ca3c56 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -204,8 +204,8 @@ func TestBasicSdkWithJavaLibrary(t *testing.T) { } `) - sdkMemberV1 := result.ctx.ModuleForTests("sdkmember_mysdk_1", "android_common_myapex").Rule("combineJar").Output - sdkMemberV2 := result.ctx.ModuleForTests("sdkmember_mysdk_2", "android_common_myapex2").Rule("combineJar").Output + sdkMemberV1 := result.ctx.ModuleForTests("sdkmember_mysdk_1", "android_common").Rule("combineJar").Output + sdkMemberV2 := result.ctx.ModuleForTests("sdkmember_mysdk_2", "android_common").Rule("combineJar").Output javalibForMyApex := result.ctx.ModuleForTests("myjavalib", "android_common_myapex") javalibForMyApex2 := result.ctx.ModuleForTests("myjavalib", "android_common_myapex2") diff --git a/sdk/sdk.go b/sdk/sdk.go index 3e760080e..759102028 100644 --- a/sdk/sdk.go +++ b/sdk/sdk.go @@ -406,13 +406,17 @@ func memberInterVersionMutator(mctx android.BottomUpMutatorContext) { // Step 4: transitively ripple down the SDK requirements from the root modules like APEX to its // descendants func sdkDepsMutator(mctx android.TopDownMutatorContext) { - if m, ok := mctx.Module().(android.SdkAware); ok { + if parent, ok := mctx.Module().(interface { + android.DepIsInSameApex + android.RequiredSdks + }); ok { // Module types for Mainline modules (e.g. APEX) are expected to implement RequiredSdks() // by reading its own properties like `uses_sdks`. - requiredSdks := m.RequiredSdks() + requiredSdks := parent.RequiredSdks() if len(requiredSdks) > 0 { mctx.VisitDirectDeps(func(m android.Module) { - if dep, ok := m.(android.SdkAware); ok { + // Only propagate required sdks from the apex onto its contents. + if dep, ok := m.(android.SdkAware); ok && parent.DepIsInSameApex(mctx, dep) { dep.BuildWithSdks(requiredSdks) } }) @@ -423,15 +427,28 @@ func sdkDepsMutator(mctx android.TopDownMutatorContext) { // Step 5: if libfoo.mysdk.11 is in the context where version 11 of mysdk is requested, the // versioned module is used instead of the un-versioned (in-development) module libfoo func sdkDepsReplaceMutator(mctx android.BottomUpMutatorContext) { - if m, ok := mctx.Module().(android.SdkAware); ok && m.IsInAnySdk() { - if sdk := m.ContainingSdk(); !sdk.Unversioned() { - if m.RequiredSdks().Contains(sdk) { - // Note that this replacement is done only for the modules that have the same - // variations as the current module. Since current module is already mutated for - // apex references in other APEXes are not affected by this replacement. - memberName := m.MemberName() - mctx.ReplaceDependencies(memberName) - } + if versionedSdkMember, ok := mctx.Module().(android.SdkAware); ok && versionedSdkMember.IsInAnySdk() { + if sdk := versionedSdkMember.ContainingSdk(); !sdk.Unversioned() { + // Only replace dependencies to <sdkmember> with <sdkmember@required-version> + // if the depending module requires it. e.g. + // foo -> sdkmember + // will be transformed to: + // foo -> sdkmember@1 + // if and only if foo is a member of an APEX that requires version 1 of the + // sdk containing sdkmember. + memberName := versionedSdkMember.MemberName() + + // Replace dependencies on sdkmember with a dependency on the current module which + // is a versioned prebuilt of the sdkmember if required. + mctx.ReplaceDependenciesIf(memberName, func(from blueprint.Module, tag blueprint.DependencyTag, to blueprint.Module) bool { + // from - foo + // to - sdkmember + replace := false + if parent, ok := from.(android.RequiredSdks); ok { + replace = parent.RequiredSdks().Contains(sdk) + } + return replace + }) } } } diff --git a/sdk/testing.go b/sdk/testing.go index 34ea8f0cc..b53558d9f 100644 --- a/sdk/testing.go +++ b/sdk/testing.go @@ -97,6 +97,11 @@ func testSdkContext(bp string, fs map[string][]byte, extraOsTypes []android.OsTy ctx.PreArchMutators(android.RegisterVisibilityRuleChecker) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) ctx.PreArchMutators(android.RegisterComponentsMutator) + + android.RegisterPrebuiltMutators(ctx) + + // Register these after the prebuilt mutators have been registered to match what + // happens at runtime. ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer) ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer) diff --git a/sdk/update.go b/sdk/update.go index b8d73c63f..25d50d217 100644 --- a/sdk/update.go +++ b/sdk/update.go @@ -323,19 +323,37 @@ func (s *sdk) buildSnapshot(ctx android.ModuleContext, sdkVariants []*sdk) andro // Add properties common to all os types. s.addMemberPropertiesToPropertySet(builder, snapshotModule, commonDynamicMemberProperties) + // Optimize other per-variant properties, besides the dynamic member lists. + type variantProperties struct { + Compile_multilib string `android:"arch_variant"` + } + var variantPropertiesContainers []propertiesContainer + variantToProperties := make(map[*sdk]*variantProperties) + for _, sdkVariant := range sdkVariants { + props := &variantProperties{ + Compile_multilib: sdkVariant.multilibUsages.String(), + } + variantPropertiesContainers = append(variantPropertiesContainers, &dynamicMemberPropertiesContainer{sdkVariant, props}) + variantToProperties[sdkVariant] = props + } + commonVariantProperties := variantProperties{} + extractor = newCommonValueExtractor(commonVariantProperties) + extractCommonProperties(ctx, extractor, &commonVariantProperties, variantPropertiesContainers) + if commonVariantProperties.Compile_multilib != "" && commonVariantProperties.Compile_multilib != "both" { + // Compile_multilib defaults to both so only needs to be set when it's + // specified and not both. + snapshotModule.AddProperty("compile_multilib", commonVariantProperties.Compile_multilib) + } + // Iterate over the os types in a fixed order. targetPropertySet := snapshotModule.AddPropertySet("target") for _, osType := range s.getPossibleOsTypes() { if sdkVariant, ok := osTypeToMemberProperties[osType]; ok { osPropertySet := targetPropertySet.AddPropertySet(sdkVariant.Target().Os.Name) - // Compile_multilib defaults to both and must always be set to both on the - // device and so only needs to be set when targeted at the host and is neither - // unspecified or both. - multilib := sdkVariant.multilibUsages - if (osType.Class == android.Host || osType.Class == android.HostCross) && - multilib != multilibNone && multilib != multilibBoth { - osPropertySet.AddProperty("compile_multilib", multilib.String()) + variantProps := variantToProperties[sdkVariant] + if variantProps.Compile_multilib != "" && variantProps.Compile_multilib != "both" { + osPropertySet.AddProperty("compile_multilib", variantProps.Compile_multilib) } s.addMemberPropertiesToPropertySet(builder, osPropertySet, sdkVariant.dynamicMemberTypeListProperties) |