From 37b252096a84c4c139436bf81b23ca3aa0857385 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Wed, 11 Jul 2018 10:49:27 +0900 Subject: [PATCH] Don't create non-primary arch variant for recovery-only module To save space, only the primary arch variant is installed to the recovery partition. This has been done in the imageMutator by not creating recovery variant for the non-primary arch. However, this caused a problem for recover-only module, i.e., recovery: true. Such module ends up creating no variant for the non-primary arch. Since every other modules are at least in one image variant, any dependency fro such module with no image variant can't be satisfied. In order to solve the problem, archMutator is modified to create only the primary arch for recovery-only modules. Bug: 111321972 Test: m -j (TestRecovery added) Change-Id: Ie32ae06fb094efcfd8531cdf6071139d292d93ab --- android/arch.go | 4 ++++ android/testing.go | 10 ++++++++++ cc/cc_test.go | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/android/arch.go b/android/arch.go index ebe9897c1..d84c829d4 100644 --- a/android/arch.go +++ b/android/arch.go @@ -330,6 +330,10 @@ func archMutator(mctx BottomUpMutatorContext) { // Windows builds always prefer 32-bit prefer32 = true } + // only the primary arch in the recovery partition + if module.InstallInRecovery() { + targets = []Target{mctx.Config().Targets[Device][0]} + } targets, err := decodeMultilib(multilib, targets, prefer32) if err != nil { mctx.ModuleErrorf("%s", err.Error()) diff --git a/android/testing.go b/android/testing.go index f5d33e11a..ca7e7ce6b 100644 --- a/android/testing.go +++ b/android/testing.go @@ -92,6 +92,16 @@ func (ctx *TestContext) ModuleForTests(name, variant string) TestingModule { return TestingModule{module} } +func (ctx *TestContext) ModuleVariantsForTests(name string) []string { + var variants []string + ctx.VisitAllModules(func(m blueprint.Module) { + if ctx.ModuleName(m) == name { + variants = append(variants, ctx.ModuleSubDir(m)) + } + }) + return variants +} + // MockFileSystem causes the Context to replace all reads with accesses to the provided map of // filenames to contents stored as a byte slice. func (ctx *TestContext) MockFileSystem(files map[string][]byte) { diff --git a/cc/cc_test.go b/cc/cc_test.go index 1b12ad470..3d162e7e8 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -75,16 +75,19 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. toolchain_library { name: "libatomic", vendor_available: true, + recovery_available: true, } toolchain_library { name: "libcompiler_rt-extras", vendor_available: true, + recovery_available: true, } toolchain_library { name: "libgcc", vendor_available: true, + recovery_available: true, } cc_library { @@ -92,6 +95,7 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. no_libgcc: true, nocrt: true, system_shared_libs: [], + recovery_available: true, } llndk_library { name: "libc", @@ -102,6 +106,7 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. no_libgcc: true, nocrt: true, system_shared_libs: [], + recovery_available: true, } llndk_library { name: "libm", @@ -112,6 +117,7 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. no_libgcc: true, nocrt: true, system_shared_libs: [], + recovery_available: true, } llndk_library { name: "libdl", @@ -124,6 +130,7 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. system_shared_libs: [], stl: "none", vendor_available: true, + recovery_available: true, } cc_library { name: "libc++", @@ -132,6 +139,7 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. system_shared_libs: [], stl: "none", vendor_available: true, + recovery_available: true, vndk: { enabled: true, support_system_process: true, @@ -144,14 +152,17 @@ func createTestContext(t *testing.T, config android.Config, bp string) *android. system_shared_libs: [], stl: "none", vendor_available: true, + recovery_available: true, } cc_object { name: "crtbegin_so", + recovery_available: true, } cc_object { name: "crtend_so", + recovery_available: true, } cc_library { @@ -1651,3 +1662,28 @@ func TestVendorPublicLibraries(t *testing.T) { } } + +func TestRecovery(t *testing.T) { + ctx := testCc(t, ` + cc_library_shared { + name: "librecovery", + recovery: true, + } + cc_library_shared { + name: "librecovery32", + recovery: true, + compile_multilib:"32", + } + `) + + variants := ctx.ModuleVariantsForTests("librecovery") + const arm64 = "android_arm64_armv8-a_recovery_shared" + if len(variants) != 1 || !android.InList(arm64, variants) { + t.Errorf("variants of librecovery must be \"%s\" only, but was %#v", arm64, variants) + } + + variants = ctx.ModuleVariantsForTests("librecovery32") + if android.InList(arm64, variants) { + t.Errorf("multilib was set to 32 for librecovery32, but its variants has %s.", arm64) + } +}