diff options
author | 2024-11-20 22:18:11 +0000 | |
---|---|---|
committer | 2024-12-13 18:12:57 +0000 | |
commit | f4589017b4bf593c73741deeeaff1831882f9f29 (patch) | |
tree | 62fb64dbf1b5a3a95002f7a9208eca95185e0477 /rust/library_test.go | |
parent | f7bbd2fe40e43f7fda7e08d08eeb9c2a93552ad9 (diff) |
rust: Add version scripts and symbol exports
This allows Rust modules to define a version_script for shared library
variants.
This requires using a wrapper for the linker (clang++) to intercept
the flags which rustc emits.
This also adds the ability to export additional symbols in addition
to those exported by rustc by default, e.g. whole_static_library
symbols.
Bug: 314309643
Test: New Soong tests pass.
Test: m
Test: m <simple version script module>
Test: m <simple extra symbols module>
Change-Id: I93c9552e5e1181df4663d194c4df4b7053553dd4
Diffstat (limited to 'rust/library_test.go')
-rw-r--r-- | rust/library_test.go | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/rust/library_test.go b/rust/library_test.go index 35a420cd5..adbf4feff 100644 --- a/rust/library_test.go +++ b/rust/library_test.go @@ -441,3 +441,60 @@ func TestRustFFIExportedIncludes(t *testing.T) { libfooStatic := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_static").Rule("cc") android.AssertStringDoesContain(t, "cFlags for lib module", libfooStatic.Args["cFlags"], " -Irust_includes ") } + +func TestRustVersionScript(t *testing.T) { + ctx := testRust(t, ` + rust_library { + name: "librs", + srcs: ["bar.rs"], + crate_name: "rs", + extra_exported_symbols: "librs.map.txt", + } + rust_ffi { + name: "libffi", + srcs: ["foo.rs"], + crate_name: "ffi", + version_script: "libffi.map.txt", + } + `) + + //linkFlags + librs := ctx.ModuleForTests("librs", "android_arm64_armv8-a_dylib").Rule("rustc") + libffi := ctx.ModuleForTests("libffi", "android_arm64_armv8-a_shared").Rule("rustc") + + if !strings.Contains(librs.Args["linkFlags"], "-Wl,--version-script=librs.map.txt") { + t.Errorf("missing expected -Wl,--version-script= linker flag for libextended shared lib, linkFlags: %#v", + librs.Args["linkFlags"]) + } + if strings.Contains(librs.Args["linkFlags"], "-Wl,--android-version-script=librs.map.txt") { + t.Errorf("unexpected -Wl,--android-version-script= linker flag for libextended shared lib, linkFlags: %#v", + librs.Args["linkFlags"]) + } + + if !strings.Contains(libffi.Args["linkFlags"], "-Wl,--android-version-script=libffi.map.txt") { + t.Errorf("missing -Wl,--android-version-script= linker flag for libreplaced shared lib, linkFlags: %#v", + libffi.Args["linkFlags"]) + } + if strings.Contains(libffi.Args["linkFlags"], "-Wl,--version-script=libffi.map.txt") { + t.Errorf("unexpected -Wl,--version-script= linker flag for libextended shared lib, linkFlags: %#v", + libffi.Args["linkFlags"]) + } +} + +func TestRustVersionScriptPropertyErrors(t *testing.T) { + testRustError(t, "version_script: can only be set for rust_ffi modules", ` + rust_library { + name: "librs", + srcs: ["bar.rs"], + crate_name: "rs", + version_script: "libbar.map.txt", + }`) + testRustError(t, "version_script and extra_exported_symbols", ` + rust_ffi { + name: "librs", + srcs: ["bar.rs"], + crate_name: "rs", + version_script: "libbar.map.txt", + extra_exported_symbols: "libbar.map.txt", + }`) +} |