shared_lib dependency from a static lib crosses the APEX boundary
cc_library_static {
name: "libfoo",
shared_libs: ["libbar"],
}
cc_library {
name: "libbar",
}
If libfoo is part of an APEX, then libbar is no longer considered as a
member of the APEX, because it isn't actually linked to libfoo.
To distinguish such a shared lib dependency from a static library from a
shared lib dependency from a shared library, a new dep type
SharedFromStaticDepTag is introduced. It is treated exactly the same as
SharedDepTag, except when we determine whether a dependency is crossing
the APEX boundary or not.
This allows us to check the apex_available property more correctly.
Previously, modules were incorrectly considered as being used for an
APEX due to the shared lib dependency from a static lib.
As a good side effect, this also reduces the number of APEX variants.
Specifically, on aosp_arm64, the number of the generated modules were
reduced from 44745 to 44180.
Exempt-From-Owner-Approval: cherry-pick from internal
Bug: 147671264
Test: m
Merged-In: I899ccb9eae1574effef77ca1bc3a0df145983861
(cherry picked from commit 931b676a69
)
Change-Id: I899ccb9eae1574effef77ca1bc3a0df145983861
This commit is contained in:
parent
0f80c1848a
commit
d7536ba58d
19
cc/cc.go
19
cc/cc.go
|
@ -1777,6 +1777,9 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) {
|
||||||
|
|
||||||
for _, lib := range deps.SharedLibs {
|
for _, lib := range deps.SharedLibs {
|
||||||
depTag := SharedDepTag
|
depTag := SharedDepTag
|
||||||
|
if c.static() {
|
||||||
|
depTag = SharedFromStaticDepTag
|
||||||
|
}
|
||||||
if inList(lib, deps.ReexportSharedLibHeaders) {
|
if inList(lib, deps.ReexportSharedLibHeaders) {
|
||||||
depTag = sharedExportDepTag
|
depTag = sharedExportDepTag
|
||||||
}
|
}
|
||||||
|
@ -2194,7 +2197,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
|
||||||
depFile := android.OptionalPath{}
|
depFile := android.OptionalPath{}
|
||||||
|
|
||||||
switch depTag {
|
switch depTag {
|
||||||
case ndkStubDepTag, SharedDepTag, sharedExportDepTag:
|
case ndkStubDepTag, SharedDepTag, SharedFromStaticDepTag, sharedExportDepTag:
|
||||||
ptr = &depPaths.SharedLibs
|
ptr = &depPaths.SharedLibs
|
||||||
depPtr = &depPaths.SharedLibsDeps
|
depPtr = &depPaths.SharedLibsDeps
|
||||||
depFile = ccDep.Toc()
|
depFile = ccDep.Toc()
|
||||||
|
@ -2547,9 +2550,17 @@ func (c *Module) AndroidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Write
|
||||||
|
|
||||||
func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
|
func (c *Module) DepIsInSameApex(ctx android.BaseModuleContext, dep android.Module) bool {
|
||||||
if depTag, ok := ctx.OtherModuleDependencyTag(dep).(DependencyTag); ok {
|
if depTag, ok := ctx.OtherModuleDependencyTag(dep).(DependencyTag); ok {
|
||||||
if cc, ok := dep.(*Module); ok && cc.HasStubsVariants() && depTag.Shared && depTag.Library {
|
if cc, ok := dep.(*Module); ok {
|
||||||
// dynamic dep to a stubs lib crosses APEX boundary
|
if cc.HasStubsVariants() && depTag.Shared && depTag.Library {
|
||||||
return false
|
// dynamic dep to a stubs lib crosses APEX boundary
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if depTag.FromStatic {
|
||||||
|
// shared_lib dependency from a static lib is considered as crossing
|
||||||
|
// the APEX boundary because the dependency doesn't actually is
|
||||||
|
// linked; the dependency is used only during the compilation phase.
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -67,12 +67,17 @@ type DependencyTag struct {
|
||||||
ReexportFlags bool
|
ReexportFlags bool
|
||||||
|
|
||||||
ExplicitlyVersioned bool
|
ExplicitlyVersioned bool
|
||||||
|
|
||||||
|
FromStatic bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
SharedDepTag = DependencyTag{Name: "shared", Library: true, Shared: true}
|
SharedDepTag = DependencyTag{Name: "shared", Library: true, Shared: true}
|
||||||
StaticDepTag = DependencyTag{Name: "static", Library: true}
|
StaticDepTag = DependencyTag{Name: "static", Library: true}
|
||||||
|
|
||||||
|
// Same as SharedDepTag, but from a static lib
|
||||||
|
SharedFromStaticDepTag = DependencyTag{Name: "shared from static", Library: true, Shared: true, FromStatic: true}
|
||||||
|
|
||||||
CrtBeginDepTag = DependencyTag{Name: "crtbegin"}
|
CrtBeginDepTag = DependencyTag{Name: "crtbegin"}
|
||||||
CrtEndDepTag = DependencyTag{Name: "crtend"}
|
CrtEndDepTag = DependencyTag{Name: "crtend"}
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue