From 24b246a7a884eb6963f5dfa0f22d82c371e51984 Mon Sep 17 00:00:00 2001 From: Justin Yun Date: Thu, 16 Mar 2023 10:36:16 +0900 Subject: [PATCH] Fix the make name of rust snapshots Rust snapshot must have proper suffix for androidmk to avoid conflict with the existing modules. Bug: 230780263 Bug: 235895567 Test: m nothing Change-Id: I35794196553621cd722c067d7965b2a61aa351bd --- cc/cc.go | 1 - cc/snapshot_prebuilt.go | 4 ++-- rust/androidmk.go | 12 ++++++++++-- rust/rust.go | 13 ++++++++++++- rust/vendor_snapshot_test.go | 33 ++++++++++++++++++++++++--------- 5 files changed, 48 insertions(+), 15 deletions(-) diff --git a/cc/cc.go b/cc/cc.go index 0e88c5686..c5dff1daa 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -3475,7 +3475,6 @@ func MakeLibName(ctx android.ModuleContext, c LinkableInterface, ccDep LinkableI nonSystemVariantsExist := ccDep.HasNonSystemVariants() || isLLndk if ccDepModule != nil { - // TODO(ivanlozano) Support snapshots for Rust-produced C library variants. // Use base module name for snapshots when exporting to Makefile. if snapshotPrebuilt, ok := ccDepModule.linker.(SnapshotInterface); ok { baseName := ccDepModule.BaseModuleName() diff --git a/cc/snapshot_prebuilt.go b/cc/snapshot_prebuilt.go index 32878ca3f..bb6e257e5 100644 --- a/cc/snapshot_prebuilt.go +++ b/cc/snapshot_prebuilt.go @@ -522,6 +522,8 @@ func (p *snapshotLibraryDecorator) nativeCoverage() bool { return false } +var _ snapshotSanitizer = (*snapshotLibraryDecorator)(nil) + func (p *snapshotLibraryDecorator) isSanitizerAvailable(t SanitizerType) bool { switch t { case cfi: @@ -644,8 +646,6 @@ func RecoverySnapshotHeaderFactory() android.Module { return module.Init() } -var _ snapshotSanitizer = (*snapshotLibraryDecorator)(nil) - // Module definitions for snapshots of executable binaries. // // Modules (vendor|recovery)_snapshot_binary are defined here. They have their prebuilt executable diff --git a/rust/androidmk.go b/rust/androidmk.go index 20e991967..5e680b03d 100644 --- a/rust/androidmk.go +++ b/rust/androidmk.go @@ -43,6 +43,10 @@ func (mod *Module) SubAndroidMk(data *android.AndroidMkEntries, obj interface{}) } } +func (mod *Module) AndroidMkSuffix() string { + return mod.Properties.RustSubName + mod.Properties.SubName +} + func (mod *Module) AndroidMkEntries() []android.AndroidMkEntries { if mod.Properties.HideFromMake || mod.hideApexVariantFromMake { @@ -79,8 +83,7 @@ func (mod *Module) AndroidMkEntries() []android.AndroidMkEntries { mod.SubAndroidMk(&ret, mod.sanitize) } - ret.SubName += mod.Properties.RustSubName - ret.SubName += mod.Properties.SubName + ret.SubName += mod.AndroidMkSuffix() return []android.AndroidMkEntries{ret} } @@ -152,6 +155,11 @@ func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.An }) } +func (library *snapshotLibraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { + ctx.SubAndroidMk(ret, library.libraryDecorator) + ret.SubName = library.SnapshotAndroidMkSuffix() +} + func (procMacro *procMacroDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { ctx.SubAndroidMk(ret, procMacro.baseCompiler) diff --git a/rust/rust.go b/rust/rust.go index 8a13ba364..a200617de 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -1111,6 +1111,17 @@ func (mod *Module) Prebuilt() *android.Prebuilt { return nil } +func rustMakeLibName(ctx android.ModuleContext, c cc.LinkableInterface, dep cc.LinkableInterface, depName string) string { + if rustDep, ok := dep.(*Module); ok { + // Use base module name for snapshots when exporting to Makefile. + if snapshotPrebuilt, ok := rustDep.compiler.(cc.SnapshotInterface); ok { + baseName := rustDep.BaseModuleName() + return baseName + snapshotPrebuilt.SnapshotAndroidMkSuffix() + rustDep.AndroidMkSuffix() + } + } + return cc.MakeLibName(ctx, c, dep, depName) +} + func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { var depPaths PathDeps @@ -1142,7 +1153,7 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { if rustDep, ok := dep.(*Module); ok && !rustDep.CcLibraryInterface() { //Handle Rust Modules - makeLibName := cc.MakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName) + makeLibName := rustMakeLibName(ctx, mod, rustDep, depName+rustDep.Properties.RustSubName) switch depTag { case dylibDepTag: diff --git a/rust/vendor_snapshot_test.go b/rust/vendor_snapshot_test.go index 7be00425e..e1b3c86a2 100644 --- a/rust/vendor_snapshot_test.go +++ b/rust/vendor_snapshot_test.go @@ -424,6 +424,14 @@ func TestVendorSnapshotUse(t *testing.T) { compile_multilib: "32", srcs: ["bin.rs"], } + + rust_library { + name: "librust_vendor_available", + crate_name: "rust_vendor", + vendor_available: true, + srcs: ["client.rs"], + } + ` vndkBp := ` @@ -499,13 +507,6 @@ func TestVendorSnapshotUse(t *testing.T) { system_shared_libs: [], } - rust_library { - name: "librust_vendor_available", - crate_name: "rust_vendor", - vendor_available: true, - srcs: ["client.rs"], - } - rust_ffi_shared { name: "libclient", crate_name: "client", @@ -963,7 +964,7 @@ func TestVendorSnapshotUse(t *testing.T) { } libclientAndroidMkRlibs := ctx.ModuleForTests("libclient", sharedVariant).Module().(*Module).Properties.AndroidMkRlibs - if g, w := libclientAndroidMkRlibs, []string{"librust_vendor_available.vendor_rlib.30.arm64.rlib-std", "libstd.vendor_rlib.30.arm64"}; !reflect.DeepEqual(g, w) { + if g, w := libclientAndroidMkRlibs, []string{"librust_vendor_available.vendor.rlib-std", "libstd.vendor"}; !reflect.DeepEqual(g, w) { t.Errorf("wanted libclient libclientAndroidMkRlibs %q, got %q", w, g) } @@ -978,10 +979,24 @@ func TestVendorSnapshotUse(t *testing.T) { } libclientRustAndroidMkRlibs := ctx.ModuleForTests("libclient_rust", rlibVariant).Module().(*Module).Properties.AndroidMkRlibs - if g, w := libclientRustAndroidMkRlibs, []string{"librust_vendor_available.vendor_rlib.30.arm64.rlib-std", "libstd.vendor_rlib.30.arm64"}; !reflect.DeepEqual(g, w) { + if g, w := libclientRustAndroidMkRlibs, []string{"librust_vendor_available.vendor.rlib-std", "libstd.vendor"}; !reflect.DeepEqual(g, w) { t.Errorf("wanted libclient libclientAndroidMkRlibs %q, got %q", w, g) } + // rust vendor snapshot must have ".vendor" suffix in AndroidMk + librustVendorAvailableSnapshotModule := ctx.ModuleForTests("librust_vendor_available.vendor_rlib.30.arm64", rlibVariant).Module() + librustVendorSnapshotMkName := android.AndroidMkEntriesForTest(t, ctx, librustVendorAvailableSnapshotModule)[0].EntryMap["LOCAL_MODULE"][0] + expectedRustVendorSnapshotName := "librust_vendor_available.vendor.rlib-std" + if librustVendorSnapshotMkName != expectedRustVendorSnapshotName { + t.Errorf("Unexpected rust vendor snapshot name in AndroidMk: %q, expected: %q\n", librustVendorSnapshotMkName, expectedRustVendorSnapshotName) + } + + rustVendorBinModule := ctx.ModuleForTests("bin_without_snapshot", binaryVariant).Module() + rustVendorBinMkRlibName := android.AndroidMkEntriesForTest(t, ctx, rustVendorBinModule)[0].EntryMap["LOCAL_RLIB_LIBRARIES"][0] + if rustVendorBinMkRlibName != expectedRustVendorSnapshotName { + t.Errorf("Unexpected rust rlib name in AndroidMk: %q, expected: %q\n", rustVendorBinMkRlibName, expectedRustVendorSnapshotName) + } + binWithoutSnapshotLdFlags := ctx.ModuleForTests("bin_without_snapshot", binaryVariant).Rule("rustc").Args["linkFlags"] libVndkStaticOutputPaths := cc.GetOutputPaths(ctx, staticVariant, []string{"libvndk.vendor_static.30.arm64"}) if !strings.Contains(binWithoutSnapshotLdFlags, libVndkStaticOutputPaths[0].String()) {