summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Justin Yun <justinyun@google.com> 2023-03-16 10:36:16 +0900
committer Justin Yun <justinyun@google.com> 2023-03-16 11:05:41 +0900
commit24b246a7a884eb6963f5dfa0f22d82c371e51984 (patch)
tree4db5d8f8f600db6b987890fab886962293049a9c
parenteabe937355676de6490cfa6804b279e66919a252 (diff)
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
-rw-r--r--cc/cc.go1
-rw-r--r--cc/snapshot_prebuilt.go4
-rw-r--r--rust/androidmk.go12
-rw-r--r--rust/rust.go13
-rw-r--r--rust/vendor_snapshot_test.go33
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()) {