Filter-out deps of unsupported arch
When a common-arch module (ex: phony) has the "required" dependencies on native modules (ex: cc_library), both 32 and 64-bit variants of the native modules are added as dependencies. This by itself is fine and actually is intended, otherwise there's no way for us to install both arch variants via required deps. However, this imposes a problem when the common-arch module is depended on by a filesystem module with compile_multilib: "first". Here, the expectation is that only the first variant (64-bit) of the native module is instaled, but in reality both variants are installed. To handle this situation, make sure that the packaging routine filters out packaging specs from unsupported architecture. Bug: N/A Test: go test ./... under soong/filesyste Change-Id: Ie1ad5ace2e5d88e00183a115f4a76e5df87a8166
This commit is contained in:
parent
635e1218bd
commit
c6a773df64
3 changed files with 93 additions and 0 deletions
|
@ -497,6 +497,7 @@ func (m *moduleContext) packageFile(fullInstallPath InstallPath, srcPath Path, e
|
|||
partition: fullInstallPath.partition,
|
||||
skipInstall: m.skipInstall(),
|
||||
aconfigPaths: m.getAconfigPaths(),
|
||||
archType: m.target.Arch.ArchType,
|
||||
}
|
||||
m.packagingSpecs = append(m.packagingSpecs, spec)
|
||||
return spec
|
||||
|
@ -622,6 +623,7 @@ func (m *moduleContext) InstallSymlink(installPath InstallPath, name string, src
|
|||
partition: fullInstallPath.partition,
|
||||
skipInstall: m.skipInstall(),
|
||||
aconfigPaths: m.getAconfigPaths(),
|
||||
archType: m.target.Arch.ArchType,
|
||||
})
|
||||
|
||||
return fullInstallPath
|
||||
|
@ -665,6 +667,7 @@ func (m *moduleContext) InstallAbsoluteSymlink(installPath InstallPath, name str
|
|||
partition: fullInstallPath.partition,
|
||||
skipInstall: m.skipInstall(),
|
||||
aconfigPaths: m.getAconfigPaths(),
|
||||
archType: m.target.Arch.ArchType,
|
||||
})
|
||||
|
||||
return fullInstallPath
|
||||
|
|
|
@ -51,6 +51,9 @@ type PackagingSpec struct {
|
|||
|
||||
// Paths of aconfig files for the built artifact
|
||||
aconfigPaths *Paths
|
||||
|
||||
// ArchType of the module which produced this packaging spec
|
||||
archType ArchType
|
||||
}
|
||||
|
||||
func (p *PackagingSpec) Equals(other *PackagingSpec) bool {
|
||||
|
@ -260,11 +263,31 @@ func (p *PackagingBase) AddDeps(ctx BottomUpMutatorContext, depTag blueprint.Dep
|
|||
|
||||
func (p *PackagingBase) GatherPackagingSpecsWithFilter(ctx ModuleContext, filter func(PackagingSpec) bool) map[string]PackagingSpec {
|
||||
m := make(map[string]PackagingSpec)
|
||||
|
||||
var arches []ArchType
|
||||
for _, target := range p.getSupportedTargets(ctx) {
|
||||
arches = append(arches, target.Arch.ArchType)
|
||||
}
|
||||
|
||||
// filter out packaging specs for unsupported architecture
|
||||
filterArch := func(ps PackagingSpec) bool {
|
||||
for _, arch := range arches {
|
||||
if arch == ps.archType {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
ctx.VisitDirectDeps(func(child Module) {
|
||||
if pi, ok := ctx.OtherModuleDependencyTag(child).(PackagingItem); !ok || !pi.IsPackagingItem() {
|
||||
return
|
||||
}
|
||||
for _, ps := range child.TransitivePackagingSpecs() {
|
||||
if !filterArch(ps) {
|
||||
continue
|
||||
}
|
||||
|
||||
if filter != nil {
|
||||
if !filter(ps) {
|
||||
continue
|
||||
|
|
|
@ -497,3 +497,70 @@ func TestTrackPhonyAsRequiredDep(t *testing.T) {
|
|||
android.AssertStringListContains(t, "missing entry", fs.entries, e)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFilterOutUnsupportedArches(t *testing.T) {
|
||||
result := fixture.RunTestWithBp(t, `
|
||||
android_filesystem {
|
||||
name: "fs_64_only",
|
||||
deps: ["foo"],
|
||||
}
|
||||
|
||||
android_filesystem {
|
||||
name: "fs_64_32",
|
||||
compile_multilib: "both",
|
||||
multilib: {
|
||||
first: {
|
||||
deps: ["foo"],
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
cc_binary {
|
||||
name: "foo",
|
||||
required: ["phony"],
|
||||
}
|
||||
|
||||
phony {
|
||||
name: "phony",
|
||||
required: [
|
||||
"libbar",
|
||||
"app",
|
||||
],
|
||||
}
|
||||
|
||||
cc_library {
|
||||
name: "libbar",
|
||||
}
|
||||
|
||||
android_app {
|
||||
name: "app",
|
||||
srcs: ["a.java"],
|
||||
platform_apis: true,
|
||||
}
|
||||
`)
|
||||
testcases := []struct {
|
||||
fsName string
|
||||
expected []string
|
||||
unexpected []string
|
||||
}{
|
||||
{
|
||||
fsName: "fs_64_only",
|
||||
expected: []string{"app/app/app.apk", "bin/foo", "lib64/libbar.so"},
|
||||
unexpected: []string{"lib/libbar.so"},
|
||||
},
|
||||
{
|
||||
fsName: "fs_64_32",
|
||||
expected: []string{"app/app/app.apk", "bin/foo", "lib64/libbar.so", "lib/libbar.so"},
|
||||
unexpected: []string{},
|
||||
},
|
||||
}
|
||||
for _, c := range testcases {
|
||||
fs := result.ModuleForTests(c.fsName, "android_common").Module().(*filesystem)
|
||||
for _, e := range c.expected {
|
||||
android.AssertStringListContains(t, "missing entry", fs.entries, e)
|
||||
}
|
||||
for _, e := range c.unexpected {
|
||||
android.AssertStringListDoesNotContain(t, "unexpected entry", fs.entries, e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue