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:
parent
4a719a0ef0
commit
37b252096a
3 changed files with 50 additions and 0 deletions
|
@ -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())
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue