From 44f1d8404be0159ea95f74b0645157e74fe1b86e Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Fri, 26 Jun 2020 20:17:02 +0100 Subject: [PATCH] Stop java_sdk_library_import from depending on source modules Previously, java_sdk_library_import added the dependencies on its child components in the deps mutator after prebuilts without a matching source module are renamed to the source module name. That meant that the java_sdk_library_import has to use the source module name and ended up depending on the source module unless it was preferred. This change adds a new component deps mutator that runs before the PrebuiltRenameMutator so that the java_sdk_library_import can add dependencies onto the prebuilt modules. It also updates an affected test. Bug: 159902351 Test: m nothing Change-Id: I3576c4873302743e51aff547ea1497bef6d748ac --- android/module.go | 12 ++++++++++++ android/mutator.go | 27 ++++++++++++++++++++++++++- apex/apex_test.go | 1 + java/java_test.go | 3 ++- java/sdk_library.go | 20 ++++++++++++++++---- sdk/testing.go | 1 + 6 files changed, 58 insertions(+), 6 deletions(-) diff --git a/android/module.go b/android/module.go index 564c54662..f80f37eab 100644 --- a/android/module.go +++ b/android/module.go @@ -228,6 +228,16 @@ type Module interface { // For more information, see Module.GenerateBuildActions within Blueprint's module_ctx.go GenerateAndroidBuildActions(ModuleContext) + // Add dependencies to the components of a module, i.e. modules that are created + // by the module and which are considered to be part of the creating module. + // + // This is called before prebuilts are renamed so as to allow a dependency to be + // added directly to a prebuilt child module instead of depending on a source module + // and relying on prebuilt processing to switch to the prebuilt module if preferred. + // + // A dependency on a prebuilt must include the "prebuilt_" prefix. + ComponentDepsMutator(ctx BottomUpMutatorContext) + DepsMutator(BottomUpMutatorContext) base() *ModuleBase @@ -769,6 +779,8 @@ type ModuleBase struct { prefer32 func(ctx BaseModuleContext, base *ModuleBase, class OsClass) bool } +func (m *ModuleBase) ComponentDepsMutator(BottomUpMutatorContext) {} + func (m *ModuleBase) DepsMutator(BottomUpMutatorContext) {} func (m *ModuleBase) AddProperties(props ...interface{}) { diff --git a/android/mutator.go b/android/mutator.go index 77d5f433e..9454485a9 100644 --- a/android/mutator.go +++ b/android/mutator.go @@ -115,6 +115,18 @@ var preArch = []RegisterMutatorFunc{ // a DefaultableHook. RegisterDefaultsPreArchMutators, + // Add dependencies on any components so that any component references can be + // resolved within the deps mutator. + // + // Must be run after defaults so it can be used to create dependencies on the + // component modules that are creating in a DefaultableHook. + // + // Must be run before RegisterPrebuiltsPreArchMutators, i.e. before prebuilts are + // renamed. That is so that if a module creates components using a prebuilt module + // type that any dependencies (which must use prebuilt_ prefixes) are resolved to + // the prebuilt module and not the source module. + RegisterComponentsMutator, + // Create an association between prebuilt modules and their corresponding source // modules (if any). // @@ -252,8 +264,21 @@ func (mutator *mutator) Parallel() MutatorHandle { return mutator } +func RegisterComponentsMutator(ctx RegisterMutatorsContext) { + ctx.BottomUp("component-deps", componentDepsMutator).Parallel() +} + +// A special mutator that runs just prior to the deps mutator to allow the dependencies +// on component modules to be added so that they can depend directly on a prebuilt +// module. +func componentDepsMutator(ctx BottomUpMutatorContext) { + if m := ctx.Module(); m.Enabled() { + m.ComponentDepsMutator(ctx) + } +} + func depsMutator(ctx BottomUpMutatorContext) { - if m, ok := ctx.Module().(Module); ok && m.Enabled() { + if m := ctx.Module(); m.Enabled() { m.DepsMutator(ctx) } } diff --git a/apex/apex_test.go b/apex/apex_test.go index befb81483..c2cb2006d 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -233,6 +233,7 @@ func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*andr ctx.RegisterModuleType("apex_set", apexSetFactory) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) + ctx.PreArchMutators(android.RegisterComponentsMutator) ctx.PostDepsMutators(android.RegisterOverridePostDepsMutators) cc.RegisterRequiredBuildComponentsForTest(ctx) diff --git a/java/java_test.go b/java/java_test.go index def42dbb8..23dcd53ab 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -86,6 +86,7 @@ func testContext() *android.TestContext { RegisterStubsBuildComponents(ctx) RegisterSdkLibraryBuildComponents(ctx) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) + ctx.PreArchMutators(android.RegisterComponentsMutator) RegisterPrebuiltApisBuildComponents(ctx) @@ -684,11 +685,11 @@ func TestJavaSdkLibraryImport_WithSource(t *testing.T) { }) checkModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{ + `prebuilt_sdklib.stubs`, `sdklib.impl`, // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the // dependency is added after prebuilts may have been renamed and so has to use // the renamed name. - `sdklib.stubs`, `sdklib.xml`, }) } diff --git a/java/sdk_library.go b/java/sdk_library.go index 8f8f8ce63..1fd109ab8 100644 --- a/java/sdk_library.go +++ b/java/sdk_library.go @@ -973,7 +973,8 @@ func IsXmlPermissionsFileDepTag(depTag blueprint.DependencyTag) bool { var implLibraryTag = sdkLibraryComponentTag{name: "impl-library"} -func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { +// Add the dependencies on the child modules in the component deps mutator. +func (module *SdkLibrary) ComponentDepsMutator(ctx android.BottomUpMutatorContext) { for _, apiScope := range module.getGeneratedApiScopes(ctx) { // Add dependencies to the stubs library ctx.AddVariationDependencies(nil, apiScope.stubsTag, module.stubsLibraryModuleName(apiScope)) @@ -998,7 +999,12 @@ func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { // Add dependency to the rule for generating the xml permissions file ctx.AddDependency(module, xmlPermissionsFileTag, module.xmlPermissionsModuleName()) } + } +} +// Add other dependencies as normal. +func (module *SdkLibrary) DepsMutator(ctx android.BottomUpMutatorContext) { + if module.requiresRuntimeImplementationLibrary() { // Only add the deps for the library if it is actually going to be built. module.Library.deps(ctx) } @@ -1874,20 +1880,26 @@ func (module *SdkLibraryImport) createPrebuiltStubsSources(mctx android.Defaulta props.Prefer = proptools.BoolPtr(module.prebuilt.Prefer()) } -func (module *SdkLibraryImport) DepsMutator(ctx android.BottomUpMutatorContext) { +// Add the dependencies on the child module in the component deps mutator so that it +// creates references to the prebuilt and not the source modules. +func (module *SdkLibraryImport) ComponentDepsMutator(ctx android.BottomUpMutatorContext) { for apiScope, scopeProperties := range module.scopeProperties { if len(scopeProperties.Jars) == 0 { continue } // Add dependencies to the prebuilt stubs library - ctx.AddVariationDependencies(nil, apiScope.stubsTag, module.stubsLibraryModuleName(apiScope)) + ctx.AddVariationDependencies(nil, apiScope.stubsTag, "prebuilt_"+module.stubsLibraryModuleName(apiScope)) if len(scopeProperties.Stub_srcs) > 0 { // Add dependencies to the prebuilt stubs source library - ctx.AddVariationDependencies(nil, apiScope.stubsSourceTag, module.stubsSourceModuleName(apiScope)) + ctx.AddVariationDependencies(nil, apiScope.stubsSourceTag, "prebuilt_"+module.stubsSourceModuleName(apiScope)) } } +} + +// Add other dependencies as normal. +func (module *SdkLibraryImport) DepsMutator(ctx android.BottomUpMutatorContext) { implName := module.implLibraryModuleName() if ctx.OtherModuleExists(implName) { diff --git a/sdk/testing.go b/sdk/testing.go index 436175419..40abdcd0f 100644 --- a/sdk/testing.go +++ b/sdk/testing.go @@ -84,6 +84,7 @@ func testSdkContext(bp string, fs map[string][]byte) (*android.TestContext, andr android.RegisterPackageBuildComponents(ctx) ctx.PreArchMutators(android.RegisterVisibilityRuleChecker) ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) + ctx.PreArchMutators(android.RegisterComponentsMutator) ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer) ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer)