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) + } +}