Add transitive shared libs to LOCAL_SHARED_LIBRARIES for rust modules

Rust modules are different from C++ modules in that they will install
their transitive shared libs alongside a binary. C++ modules don't
do this, you have to install the transitive shared lib manually. (but
they do install direct shared libs)

It does this by using InstallDepNeeded, a mechanism that adds
dependencies from installed files to the installed copies of
dependencies if InstallDepNeeded() returns true. This mechanism does
not end up tracking the installed files all the way to
FULL_SYSTEMIMAGE_DEPS.

We're attempting to make FULL_SYSTEMIMAGE_DEPS more accurate so that
we can track the files that should be installed properly, and remove
the need for `m installclean`.

Listing the libraries a binary uses in LOCAL_SHARED_LIBRARIES does
properly track them and end up listing them in FULL_SYSTEMIMAGE_DEPS.

Bug: 205632228
Test: Building the systemimage with a change to delete anything not in FULL_SYSTEMIMAGE_DEPS
Change-Id: I4ba75b40b3ac77250297209a851bc9ba377782f5
This commit is contained in:
Cole Faust 2023-08-17 17:42:26 -07:00
parent b0e1035417
commit b6e6f99521
5 changed files with 15 additions and 7 deletions

View file

@ -61,7 +61,7 @@ func (mod *Module) AndroidMkEntries() []android.AndroidMkEntries {
entries.AddStrings("LOCAL_RLIB_LIBRARIES", mod.Properties.AndroidMkRlibs...) entries.AddStrings("LOCAL_RLIB_LIBRARIES", mod.Properties.AndroidMkRlibs...)
entries.AddStrings("LOCAL_DYLIB_LIBRARIES", mod.Properties.AndroidMkDylibs...) entries.AddStrings("LOCAL_DYLIB_LIBRARIES", mod.Properties.AndroidMkDylibs...)
entries.AddStrings("LOCAL_PROC_MACRO_LIBRARIES", mod.Properties.AndroidMkProcMacroLibs...) entries.AddStrings("LOCAL_PROC_MACRO_LIBRARIES", mod.Properties.AndroidMkProcMacroLibs...)
entries.AddStrings("LOCAL_SHARED_LIBRARIES", mod.Properties.AndroidMkSharedLibs...) entries.AddStrings("LOCAL_SHARED_LIBRARIES", mod.transitiveAndroidMkSharedLibs.ToList()...)
entries.AddStrings("LOCAL_STATIC_LIBRARIES", mod.Properties.AndroidMkStaticLibs...) entries.AddStrings("LOCAL_STATIC_LIBRARIES", mod.Properties.AndroidMkStaticLibs...)
entries.AddStrings("LOCAL_SOONG_LINK_TYPE", mod.makeLinkType) entries.AddStrings("LOCAL_SOONG_LINK_TYPE", mod.makeLinkType)
if mod.UseVndk() { if mod.UseVndk() {

View file

@ -185,7 +185,7 @@ func TestStaticBinaryFlags(t *testing.T) {
if !android.InList("libc", fizzMod.Properties.AndroidMkStaticLibs) { if !android.InList("libc", fizzMod.Properties.AndroidMkStaticLibs) {
t.Errorf("static binary not linking against libc as a static library") t.Errorf("static binary not linking against libc as a static library")
} }
if len(fizzMod.Properties.AndroidMkSharedLibs) > 0 { if len(fizzMod.transitiveAndroidMkSharedLibs.ToList()) > 0 {
t.Errorf("static binary incorrectly linking against shared libraries") t.Errorf("static binary incorrectly linking against shared libraries")
} }
} }

View file

@ -66,7 +66,6 @@ type BaseProperties struct {
AndroidMkRlibs []string `blueprint:"mutated"` AndroidMkRlibs []string `blueprint:"mutated"`
AndroidMkDylibs []string `blueprint:"mutated"` AndroidMkDylibs []string `blueprint:"mutated"`
AndroidMkProcMacroLibs []string `blueprint:"mutated"` AndroidMkProcMacroLibs []string `blueprint:"mutated"`
AndroidMkSharedLibs []string `blueprint:"mutated"`
AndroidMkStaticLibs []string `blueprint:"mutated"` AndroidMkStaticLibs []string `blueprint:"mutated"`
ImageVariationPrefix string `blueprint:"mutated"` ImageVariationPrefix string `blueprint:"mutated"`
@ -168,6 +167,8 @@ type Module struct {
// For apex variants, this is set as apex.min_sdk_version // For apex variants, this is set as apex.min_sdk_version
apexSdkVersion android.ApiLevel apexSdkVersion android.ApiLevel
transitiveAndroidMkSharedLibs *android.DepSet[string]
} }
func (mod *Module) Header() bool { func (mod *Module) Header() bool {
@ -1217,6 +1218,9 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
}) })
} }
var transitiveAndroidMkSharedLibs []*android.DepSet[string]
var directAndroidMkSharedLibs []string
ctx.VisitDirectDeps(func(dep android.Module) { ctx.VisitDirectDeps(func(dep android.Module) {
depName := ctx.OtherModuleName(dep) depName := ctx.OtherModuleName(dep)
depTag := ctx.OtherModuleDependencyTag(dep) depTag := ctx.OtherModuleDependencyTag(dep)
@ -1255,6 +1259,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName) mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName)
} }
transitiveAndroidMkSharedLibs = append(transitiveAndroidMkSharedLibs, rustDep.transitiveAndroidMkSharedLibs)
if android.IsSourceDepTagWithOutputTag(depTag, "") { if android.IsSourceDepTagWithOutputTag(depTag, "") {
// Since these deps are added in path_properties.go via AddDependencies, we need to ensure the correct // Since these deps are added in path_properties.go via AddDependencies, we need to ensure the correct
// OS/Arch variant is used. // OS/Arch variant is used.
@ -1382,7 +1388,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
// Record baseLibName for snapshots. // Record baseLibName for snapshots.
mod.Properties.SnapshotSharedLibs = append(mod.Properties.SnapshotSharedLibs, cc.BaseLibName(depName)) mod.Properties.SnapshotSharedLibs = append(mod.Properties.SnapshotSharedLibs, cc.BaseLibName(depName))
mod.Properties.AndroidMkSharedLibs = append(mod.Properties.AndroidMkSharedLibs, makeLibName) directAndroidMkSharedLibs = append(directAndroidMkSharedLibs, makeLibName)
exportDep = true exportDep = true
case cc.IsHeaderDepTag(depTag): case cc.IsHeaderDepTag(depTag):
exportedInfo := ctx.OtherModuleProvider(dep, cc.FlagExporterInfoProvider).(cc.FlagExporterInfo) exportedInfo := ctx.OtherModuleProvider(dep, cc.FlagExporterInfoProvider).(cc.FlagExporterInfo)
@ -1419,6 +1425,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
} }
}) })
mod.transitiveAndroidMkSharedLibs = android.NewDepSet[string](android.PREORDER, directAndroidMkSharedLibs, transitiveAndroidMkSharedLibs)
var rlibDepFiles RustLibraries var rlibDepFiles RustLibraries
for _, dep := range directRlibDeps { for _, dep := range directRlibDeps {
rlibDepFiles = append(rlibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: dep.CrateName()}) rlibDepFiles = append(rlibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: dep.CrateName()})

View file

@ -267,7 +267,7 @@ func TestDepsTracking(t *testing.T) {
t.Errorf("Proc_macro dependency not detected (dependency missing from AndroidMkProcMacroLibs)") t.Errorf("Proc_macro dependency not detected (dependency missing from AndroidMkProcMacroLibs)")
} }
if !android.InList("libshared", module.Properties.AndroidMkSharedLibs) { if !android.InList("libshared", module.transitiveAndroidMkSharedLibs.ToList()) {
t.Errorf("Shared library dependency not detected (dependency missing from AndroidMkSharedLibs)") t.Errorf("Shared library dependency not detected (dependency missing from AndroidMkSharedLibs)")
} }

View file

@ -1063,7 +1063,7 @@ func TestVendorSnapshotUse(t *testing.T) {
} }
} }
libclientAndroidMkSharedLibs := ctx.ModuleForTests("libclient", sharedVariant).Module().(*Module).Properties.AndroidMkSharedLibs libclientAndroidMkSharedLibs := ctx.ModuleForTests("libclient", sharedVariant).Module().(*Module).transitiveAndroidMkSharedLibs.ToList()
if g, w := libclientAndroidMkSharedLibs, []string{"libvndk.vendor", "libvendor_available.vendor", "lib64", "liblog.vendor", "libc.vendor", "libm.vendor", "libdl.vendor"}; !reflect.DeepEqual(g, w) { if g, w := libclientAndroidMkSharedLibs, []string{"libvndk.vendor", "libvendor_available.vendor", "lib64", "liblog.vendor", "libc.vendor", "libm.vendor", "libdl.vendor"}; !reflect.DeepEqual(g, w) {
t.Errorf("wanted libclient AndroidMkSharedLibs %q, got %q", w, g) t.Errorf("wanted libclient AndroidMkSharedLibs %q, got %q", w, g)
} }
@ -1078,7 +1078,7 @@ func TestVendorSnapshotUse(t *testing.T) {
t.Errorf("wanted libclient libclientAndroidMkDylibs %q, got %q", w, libclientAndroidMkDylibs) t.Errorf("wanted libclient libclientAndroidMkDylibs %q, got %q", w, libclientAndroidMkDylibs)
} }
libclient32AndroidMkSharedLibs := ctx.ModuleForTests("libclient", shared32Variant).Module().(*Module).Properties.AndroidMkSharedLibs libclient32AndroidMkSharedLibs := ctx.ModuleForTests("libclient", shared32Variant).Module().(*Module).transitiveAndroidMkSharedLibs.ToList()
if g, w := libclient32AndroidMkSharedLibs, []string{"libvndk.vendor", "libvendor_available.vendor", "lib32", "liblog.vendor", "libc.vendor", "libm.vendor", "libdl.vendor"}; !reflect.DeepEqual(g, w) { if g, w := libclient32AndroidMkSharedLibs, []string{"libvndk.vendor", "libvendor_available.vendor", "lib32", "liblog.vendor", "libc.vendor", "libm.vendor", "libdl.vendor"}; !reflect.DeepEqual(g, w) {
t.Errorf("wanted libclient32 AndroidMkSharedLibs %q, got %q", w, g) t.Errorf("wanted libclient32 AndroidMkSharedLibs %q, got %q", w, g)
} }