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
This commit is contained in:
Jiyong Park 2018-07-11 10:49:27 +09:00
parent 4a719a0ef0
commit 37b252096a
3 changed files with 50 additions and 0 deletions

View file

@ -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())

View file

@ -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) {

View file

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