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:
parent
b0e1035417
commit
b6e6f99521
5 changed files with 15 additions and 7 deletions
|
@ -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() {
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
12
rust/rust.go
12
rust/rust.go
|
@ -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()})
|
||||||
|
|
|
@ -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)")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue