From b6e6f99521cee714c066fa33369d8d38f5cca17a Mon Sep 17 00:00:00 2001 From: Cole Faust Date: Thu, 17 Aug 2023 17:42:26 -0700 Subject: [PATCH] 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 --- rust/androidmk.go | 2 +- rust/binary_test.go | 2 +- rust/rust.go | 12 ++++++++++-- rust/rust_test.go | 2 +- rust/vendor_snapshot_test.go | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/rust/androidmk.go b/rust/androidmk.go index 5e680b03d..c684e810b 100644 --- a/rust/androidmk.go +++ b/rust/androidmk.go @@ -61,7 +61,7 @@ func (mod *Module) AndroidMkEntries() []android.AndroidMkEntries { entries.AddStrings("LOCAL_RLIB_LIBRARIES", mod.Properties.AndroidMkRlibs...) entries.AddStrings("LOCAL_DYLIB_LIBRARIES", mod.Properties.AndroidMkDylibs...) 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_SOONG_LINK_TYPE", mod.makeLinkType) if mod.UseVndk() { diff --git a/rust/binary_test.go b/rust/binary_test.go index fc4c56037..dff94ac95 100644 --- a/rust/binary_test.go +++ b/rust/binary_test.go @@ -185,7 +185,7 @@ func TestStaticBinaryFlags(t *testing.T) { if !android.InList("libc", fizzMod.Properties.AndroidMkStaticLibs) { 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") } } diff --git a/rust/rust.go b/rust/rust.go index dab35323a..fe5b30317 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -66,7 +66,6 @@ type BaseProperties struct { AndroidMkRlibs []string `blueprint:"mutated"` AndroidMkDylibs []string `blueprint:"mutated"` AndroidMkProcMacroLibs []string `blueprint:"mutated"` - AndroidMkSharedLibs []string `blueprint:"mutated"` AndroidMkStaticLibs []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 apexSdkVersion android.ApiLevel + + transitiveAndroidMkSharedLibs *android.DepSet[string] } 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) { depName := ctx.OtherModuleName(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) } + transitiveAndroidMkSharedLibs = append(transitiveAndroidMkSharedLibs, rustDep.transitiveAndroidMkSharedLibs) + if android.IsSourceDepTagWithOutputTag(depTag, "") { // Since these deps are added in path_properties.go via AddDependencies, we need to ensure the correct // OS/Arch variant is used. @@ -1382,7 +1388,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // Record baseLibName for snapshots. mod.Properties.SnapshotSharedLibs = append(mod.Properties.SnapshotSharedLibs, cc.BaseLibName(depName)) - mod.Properties.AndroidMkSharedLibs = append(mod.Properties.AndroidMkSharedLibs, makeLibName) + directAndroidMkSharedLibs = append(directAndroidMkSharedLibs, makeLibName) exportDep = true case cc.IsHeaderDepTag(depTag): 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 for _, dep := range directRlibDeps { rlibDepFiles = append(rlibDepFiles, RustLibrary{Path: dep.UnstrippedOutputFile(), CrateName: dep.CrateName()}) diff --git a/rust/rust_test.go b/rust/rust_test.go index 704bfe785..835114c13 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -267,7 +267,7 @@ func TestDepsTracking(t *testing.T) { 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)") } diff --git a/rust/vendor_snapshot_test.go b/rust/vendor_snapshot_test.go index 387d17043..1e7e7d322 100644 --- a/rust/vendor_snapshot_test.go +++ b/rust/vendor_snapshot_test.go @@ -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) { 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) } - 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) { t.Errorf("wanted libclient32 AndroidMkSharedLibs %q, got %q", w, g) }